BMCourse
BMCourse copied to clipboard
深度学习代码debug方法
在这里集合一些深度学习代码debug方法,欢迎大家补充自己的见解和优质帖子。
知乎: https://zhuanlan.zhihu.com/p/55334148
- debug时,batchsize和hidden 不要设置得能整除,有同学batchsize 和 hidden都设置成32, 这样维度错了也不知道。为了避免该问题可以在debug阶段设置成33和32; (其他维度也一样,不要能整除)不要整除而不是不相等是因为pytorch有自动广播机制。
- 遇到疯狂输出的cuda error,例如
一般是列表索引越界,可以设置环境变量 CUDA_LAUNCH_BLOCKING=1来debug,具体可以参考网上很多帖子 - 首先检查输入是否正确,对于NLP任务,可以将id复原为token,看句子是不是想要的那样。
- 查看模型梯度是否正常,如下
每个tuple里,第一个是模块名字,第二个是grad绝对值求和,第三个是参数求和; 如果 需要由grad的模块的grad绝对值求和为零,就说明有问题;如果两次打印之间模型参数求和没有变化,可能也有问题,说明学习率可能过小。[(name, parameter.grad.abs().sum(), parameter.sum()) for name,parameter in model.named_parameters()] - 使用单个样本调试。 可以将数据集大小改为1 (也就是反复过这一个数据),去掉测试代码,只看训练loss,如果这种情况loss不降,说明优化流程有问题,例如没有开梯度,没有optimizer.step()等等
- 在完成单个样本调试之后,可以逐步加大样本量,如果这时候loss变得难以下降,一般是优化器有问题,可以通过换优化器,换学习率,让模型在10~100这个量级上的数据能快速过拟合。
- 在
pip install ipython之后,可以在代码中需要交互debug的地方加入语句from IPython import embed; embed(), 程序就可以停在这儿供你访问程序中的变量,查看它们是否正常。