Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pytorch:can';t控制垃圾收集器和模型释放_Python_Memory Management_Pytorch_Garbage Collection_Huggingface Transformers - Fatal编程技术网

Python Pytorch:can';t控制垃圾收集器和模型释放

Python Pytorch:can';t控制垃圾收集器和模型释放,python,memory-management,pytorch,garbage-collection,huggingface-transformers,Python,Memory Management,Pytorch,Garbage Collection,Huggingface Transformers,我试图控制Pytorch模型的分配和解除分配(来自transformers库)。我想在模型完成后解除分配。这就是我所尝试的: 将变压器作为t导入 导入tracemalloc 导入gc 进口火炬 课堂总结: 定义初始化(自): self.device='cuda:0'如果torch.cuda.is_可用()则为'cpu' self.\u model=t.BartForConditionalGeneration.from\u pretrained('facebook/bart large cnn')

我试图控制Pytorch模型的分配和解除分配(来自transformers库)。我想在模型完成后解除分配。这就是我所尝试的:

将变压器作为t导入
导入tracemalloc
导入gc
进口火炬
课堂总结:
定义初始化(自):
self.device='cuda:0'如果torch.cuda.is_可用()则为'cpu'
self.\u model=t.BartForConditionalGeneration.from\u pretrained('facebook/bart large cnn')。to(self.device)
self.\u tokenizer=t.BartTokenizer.from\u pretrained('facebook/bart大型cnn'))
定义(自我):
打印('我被删除')
def运行(自):
ARTICLE\u TO\u summary=“我的朋友很酷,但他们吃太多碳水化合物。”
inputs=self.\u标记器([ARTICLE\u TO\u summary],max\u length=1024,return\u tensors='pt')。TO(self.device)
summary_id=self._model.generate(输入['input_id'],波束数=4,最大长度=5,提前停止=True)
在摘要\u id中为g返回[self.\u tokenizer.decode(g,skip\u special\u tokens=True,clean\u tokenization\u spaces=False)]
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
tracemalloc.start()
BARTModel=BartSummary()
data=BARTModel.run()
当前,峰值=tracemalloc.get\u tracked\u memory()
打印(f“之前的当前内存为{Current/10**6}MB;峰值为{Peak/10**6}MB”)
德尔巴特模型
gc.collect()
当前,峰值=tracemalloc.get\u tracked\u memory()
打印(f“使用后的当前内存为{Current/10**6}MB;峰值为{Peak/10**6}MB”)
这是我运行所有程序时得到的结果:

之前的当前内存为90.008281MB;峰值为90.010476MB
使用后的当前内存为89.883413MB;峰值为90.010476MB
我被删除了

我假设在调用垃圾收集器时,
BartModel
从内存中删除,并打印
I am deleted
,然后最终得到内存分配的最后一个度量。很明显,执行的顺序不同,这是为什么?为什么
我被删除了
是最后一个,而不是第二个?是否有办法控制解除分配?

您发布的代码将以异常终止。它不会产生你声称的产出。编写问题时,始终从实际运行的文件中复制粘贴代码;不要尝试重新键入,也不要尝试在未实际运行已编辑表单的情况下进行编辑。很抱歉,键入时遗漏了一些内容。现在应该可以了。“打字时”-不。停止打字。从您实际运行的文件中复制并粘贴。是的,现在我刚刚这么做了。初稿是打字的。很抱歉造成误解如果这正是您运行的代码,那么必须保存对
实例的引用。不过,我看不到任何地方可以漏掉参考资料。