如何从内存中删除 FastAI 模型列表?

How to delete a list of FastAI models from memory?

提问人:Francisco Ferraz 提问时间:11/13/2023 更新时间:11/14/2023 访问量:26

问:

我正在开发一个测试模块,看看在内存崩溃之前我可以加载多少个 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

如何从内存中删除模型?提前致谢。

python pytorch ram fast-ai vram

评论

1赞 juanpa.arrivillaga 11/14/2023
在 Python 中,您无法从内存中删除对象。它是一种内存管理语言。在 CPython 中,引用计数是主要的垃圾回收策略。
1赞 juanpa.arrivillaga 11/14/2023
而且,你的循环有一个错误。无论如何,你*只是想要self.model_list.clear()
0赞 Francisco Ferraz 11/16/2023
好的,所以显然一个接一个地删除列表中的对象并没有得到所有的引用,但使用 确实如此。这解决了它。谢谢@juanpa.arrivillaga <3。self.model_list.clear()

答:

1赞 mighty_mike 11/14/2023 #1

引用“Expert Python Programming”中的一句话:

这种内存管理器的方法大致基于一个简单的 语句:如果给定对象不再被引用,则将其删除。 换言之,函数中的所有本地引用都将在 口译员:

• 离开函数

• 确保对象不再被使用。

在正常情况下,除尘器会做得很好。但是一个 del 调用可用于通过手动删除来帮助垃圾回收器 手动对对象的引用。

所以你走在正确的轨道上,但你还需要注意一件事:

您需要对与模型交互的所有其他对象执行 del,因为这些对象也包含对相同对象的引用。调用 del 只会递减引用计数并从使用中删除特定引用,但在引用计数达到 0 之前,不会对内存中的实际对象进行垃圾回收。

评论

2赞 juanpa.arrivillaga 11/14/2023
即使进行了垃圾回收,进程 RAM 利用率也不一定会下降