• 【colab pytorch】其它注意事项


    • 不要使用太大的线性层。因为nn.Linear(m,n)使用的是 [公式] 的内存,线性层太大很容易超出现有显存。
    • 不要在太长的序列上使用RNN。因为RNN反向传播使用的是BPTT算法,其需要的内存和输入序列的长度呈线性关系。
    • model(x) 前用 model.train() 和 model.eval() 切换网络状态。
    • 不需要计算梯度的代码块用 with torch.no_grad() 包含起来。
    • model.eval() 和 torch.no_grad() 的区别在于,model.eval() 是将网络切换为测试状态,例如 BN 和dropout在训练和测试阶段使用不同的计算方法。torch.no_grad() 是关闭 PyTorch 张量的自动求导机制,以减少存储使用和加速计算,得到的结果无法进行 loss.backward()。
    • model.zero_grad()会把整个模型的参数的梯度都归零, 而optimizer.zero_grad()只会把传入其中的参数的梯度归零.
    • torch.nn.CrossEntropyLoss 的输入不需要经过 Softmax。torch.nn.CrossEntropyLoss 等价于 torch.nn.functional.log_softmax + torch.nn.NLLLoss。
    • loss.backward() 前用 optimizer.zero_grad() 清除累积梯度。
    • torch.utils.data.DataLoader 中尽量设置 pin_memory=True,对特别小的数据集如 MNIST 设置 pin_memory=False 反而更快一些。num_workers 的设置需要在实验中找到最快的取值。
    • 用 del 及时删除不用的中间变量,节约 GPU 存储。
    • 使用 inplace 操作可节约 GPU 存储,如

      x = torch.nn.functional.relu(x, inplace=True)

    • 减少 CPU 和 GPU 之间的数据传输。例如如果你想知道一个 epoch 中每个 mini-batch 的 loss 和准确率,先将它们累积在 GPU 中等一个 epoch 结束之后一起传输回 CPU 会比每个 mini-batch 都进行一次 GPU 到 CPU 的传输更快。
    • 使用半精度浮点数 half() 会有一定的速度提升,具体效率依赖于 GPU 型号。需要小心数值精度过低带来的稳定性问题。
    • 时常使用 assert tensor.size() == (N, D, H, W) 作为调试手段,确保张量维度和你设想中一致。
    • 除了标记 y 外,尽量少使用一维张量,使用 n*1 的二维张量代替,可以避免一些意想不到的一维张量计算结果。
    • 统计代码各部分耗时

      with torch.autograd.profiler.profile(enabled=True, use_cuda=False) as profile
        print(profile) 

    • 使用TorchSnooper来调试PyTorch代码,程序在执行的时候,就会自动 print 出来每一行的执行结果的 tensor 的形状、数据类型、设备、是否需要梯度的信息。

    摘自:http://bbs.cvmart.net/topics/1472?from=timeline

  • 相关阅读:
    C SHARP.net 中DataSet.Fill实现不很理想,摸索中
    java程序代码 Exchenge.java
    java中的BREAK和CONTINUE语句的应用
    C++ 和 Java 中的变参
    BS程序代码与安全与基本攻击/防御模式
    MySql与Java的时间类型
    Ant 阅读笔记
    进度,效率,与个人事务管理 Personal Task 1.0
    Struts 实现的I18N
    解决站点关键数据,状态数据,无须持久化数据的一些思路
  • 原文地址:https://www.cnblogs.com/xiximayou/p/12506049.html
Copyright © 2020-2023  润新知