V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
layumi
V2EX  ›  分享发现

Pytorch 有什么节省内存(显存)的小技巧?

  •  
  •   layumi · 2019-02-01 07:18:40 +08:00 · 6596 次点击
    这是一个创建于 2156 天前的主题,其中的信息可能已经有所发展或是发生改变。
    原链接: https://www.zhihu.com/question/274635237

    在不修改网络结构的情况下, 有如下操作:

    1. 同意 @Jiaming, 尽可能使用 inplace 操作, 比如 relu 可以使用 inplace=True

    2. 进一步,比如 ResNet 和 DenseNet 可以将 batchnorm 和 relu 打包成 inplace,在 bp 时再重新计算。使用到了 pytorch 新的 checkpoint 特性,有以下两个代码。由于需要重新计算 bn 后的结果,所以会慢一些。
    gpleiss/efficient_densenet_pytorch ( https://github.com/gpleiss/efficient_densenet_pytorch)
    mapillary/inplace_abn ( https://github.com/mapillary/inplace_abn)

    3. 每次循环结束时 删除 loss,可以节约很少显存,但聊胜于无。可见如下 issue

    Tensor to Variable and memory freeing best practices ( https://discuss.pytorch.org/t/tensor-to-variable-and-memory-freeing-best-practices/6000/2)


    4. 使用 float16 精度混合计算。我用过
    @NVIDIA 英伟达
    apex,很好用,可以节约将近 50%的显存,但是要小心一些不安全的操作如 mean 和 sum,溢出 fp16。

    NVIDIA/apex ( https://github.com/NVIDIA/apex)


    5. 对于不需要 bp 的 forward,如 validation 请使用 torch.no_grad , 注意 model.eval() 不等于 torch.no_grad() 请看如下讨论。

    'model.eval()' vs 'with torch.no_grad()' ( https://discuss.pytorch.org/t/model-eval-vs-with-torch-no-grad/19615)


    6. torch.cuda.empty_cache() 这是 del 的进阶版,使用 nvidia-smi 会发现显存有明显的变化。但是训练时最大的显存占用似乎没变。大家可以试试。

    How can we release GPU memory cache? ( https://discuss.pytorch.org/t/how-can-we-release-gpu-memory-cache/14530)


    另外,会影响精度的骚操作还有:

    把一个 batchsize=64 分为两个 32 的 batch,两次 forward 以后,backward 一次。但会影响 batchnorm 等和 batchsize 相关的层。



    相关链接:

    老外写的提高 pytorch 效率的方法,包含 data prefetch 等

    Optimizing PyTorch training code ( https://www.sagivtech.com/2017/09/19/optimizing-pytorch-training-code/)
    2 条回复    2019-04-18 16:26:04 +08:00
    dezhou9
        1
    dezhou9  
       2019-02-01 13:53:34 +08:00 via Android
    我笔记本有 1.6 个 g,够用了啊。
    dalalaa
        2
    dalalaa  
       2019-04-18 16:26:04 +08:00
    这个混合精度训练看起来很高端
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1137 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 18:37 · PVG 02:37 · LAX 10:37 · JFK 13:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.