提问人:Francisco Ferraz 提问时间:11/13/2023 更新时间:11/14/2023 访问量:26
如何从内存中删除 FastAI 模型列表?
How to delete a list of FastAI models from memory?
问:
我正在开发一个测试模块,看看在内存崩溃之前我可以加载多少个 FastAI 模型。
目前,一旦模型已满,我就无法从内存中删除模型。这是我尝试过的:
import gc
from fastai.vision.all import load_learner
class ClassificationInference:
def __init__(self):
self.model_list = []
def load_model(self, model_name: str) -> None:
model_file = os.path.join("trained_model",
"saved_model", f"{model_name}.pkl")
model = load_learner(model_file)
self.model_list.append(model)
def remove_all_models(self) -> None:
for i in range(len(self.model_list)):
if i >= len(self.model_list):
break
del self.model_list[i]
del self.model_list
self.model_list = None
torch.cuda.empty_cache()
gc.collect()
self.model_list = []
我正在使用以下命令测量 RAM 使用情况:
max_gpu = torch.cuda.get_device_properties(None).total_memory
max_ram = psutil.virtual_memory().total
current_gpu = torch.cuda.memory_allocated(None)
current_ram = psutil.virtual_memory().used
percentage_gpu = (current_gpu / max_gpu) * 100
percentage_ram = (current_ram / max_ram) * 100
print(f"Percentage before start: (RAM: {percentage_ram}, "
f"GPU: {percentage_gpu})")
执行后,RAM百分比与以前相同。remove_all_models
如何从内存中删除模型?提前致谢。
答:
1赞
mighty_mike
11/14/2023
#1
引用“Expert Python Programming”中的一句话:
这种内存管理器的方法大致基于一个简单的 语句:如果给定对象不再被引用,则将其删除。 换言之,函数中的所有本地引用都将在 口译员:
• 离开函数
• 确保对象不再被使用。
在正常情况下,除尘器会做得很好。但是一个 del 调用可用于通过手动删除来帮助垃圾回收器 手动对对象的引用。
所以你走在正确的轨道上,但你还需要注意一件事:
您需要对与模型交互的所有其他对象执行 del,因为这些对象也包含对相同对象的引用。调用 del 只会递减引用计数并从使用中删除特定引用,但在引用计数达到 0 之前,不会对内存中的实际对象进行垃圾回收。
评论
2赞
juanpa.arrivillaga
11/14/2023
即使进行了垃圾回收,进程 RAM 利用率也不一定会下降
评论
self.model_list.clear()
self.model_list.clear()