本文为过去近一个月,我跑PyTorch模型训练所获得的经验和教训。
本文所述“优化”是指提高训练速度、降低训练时间 ,效果是指模型的评价指标结果。
- 检查每一个环节的输出。如果等训练完成才发现前面的环节有问题,那就白玩了。
- 避免重复的、耗时的环节,以预处理缓存替代。
- 不要让大批量训练数据耗尽内存。可以考虑利用LMDB等把数据缓存到文件系统。
- 先用小批量数据验证速度和效果。
- 如果模型效果离你预期的相差太远,尝试把模型加宽、加深,提高学习率。
- 降低特征维度、降低模型复杂度是最好的优化方法。
- 限制变长序列数据(文本)的最大长度——序列组的最大长度直接决定了矩阵的大小,间接决定了训练所耗内存(显存)和计算量。如果训练一般情况所占内存不多,但突然out of memory,很可能就是这个原因。
- 文档所述的各种优化办法,很可能:不被你的硬件支持、运行不起来、没优化效果。但文档不会告诉你这些。事实上,把基本特性玩好,对大多数场景而言都足够了。
- 保存每一个epoch的模型状态,下次加载最佳状态继续训练。这个方法的带来利好多多:方便白剽免费的训练资源、可以中断训练以调整参数或补充训练数据、让电脑下班休息……。
- 小心for循环和列表生成式,这可能是最耗时的逻辑——尽可能批量处理。如果某场景不支持批量处理——很可能不是不支持,而是自己的知识储备不够。
- 提高准确率的更好方法是:找出准确率较低的领域,补充该领域的训练数据;剔除训练数据中有问题的部分。