【问题标题】:how can I clear graphic card memory after training in pytorch?在pytorch中训练后如何清除显卡内存?
【发布时间】:2020-12-08 18:50:50
【问题描述】:

我正在 colab 中处理 pytorch
训练时,pytorch 消耗大量内存
训练后,我保存了模型,并将模型加载到另一个笔记本(注 2)。
在注释 2 中,加载 state_dict 和所有内容后,pytorch 消耗的内存比训练状态少得多。
所以,我想知道训练时“无用”的数据会存储在显卡内存中(在我的情况下,大约 13gb)...
如果是这样,我如何在训练后删除无用的数据?

加。我试图删除训练时使用的变量,但不够大(大约 2gb)

【问题讨论】:

    标签: deep-learning memory-leaks pytorch


    【解决方案1】:

    这是训练时可以预料到的。在训练过程中,操作本身会占用内存。

    例如,考虑以下操作-

    a = np.random.rand(100, 500, 300)
    b = np.random.rand(200, 500, 300)
    c = (a[:, None, :, :] * b[None, :, :, :]).sum(-1).sum(-1)
    

    a、b 和 c 的内存大小分别约为 400 MB。但是,如果您检查

    %memit (a[:, None, :, :] * b[None, :, :, :]).sum(-1).sum(-1)
    

    这是 23 GB!该行本身占用大量内存来实际执行操作,因为涉及大量中间数组。这些数组是临时的,操作结束后会自动删除。所以你删除一些变量对减少足迹没有多大作用。

    解决这个问题的方法是使用内存优化操作。

    例如,使用np.tensordot(a, b, ((1, 2), (1, 2))) 而不是通过广播相乘会留下更好的内存占用。

    因此,您需要做的是确定代码中的哪个操作需要如此巨大的内存,看看您是否可以用内存效率更高的等价物替换它(根据您的具体用例,这甚至可能是不可能的) )。

    【讨论】:

    • 感谢您提供信息。但是,训练过程后不会删除无用数据(在您的示例中为临时数组)。我必须在训练过程后手动清除这些吗?
    • 不,你不需要,这些临时数组由 Numpy 自动管理。您不必手动跟踪或删除它们
    猜你喜欢
    • 2020-01-11
    • 2019-08-14
    • 2019-07-15
    • 2020-02-03
    • 2021-12-06
    • 2018-10-13
    • 2018-10-19
    • 2021-09-11
    • 2021-03-27
    相关资源
    最近更新 更多