1.并发程序——善用multiprocessing
原因:对一百万张照片进行预处理/进行分析/进行裁切,可以利用并发进行加速
Ps:因为python内部解释器PID锁的原因,因此多线程在python当中并不可以得到加速
也可以采用异步等写出非常复杂的逻辑,总之,善用并发,可以大幅提高工作效率。
参考资料:[1]https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431927781401bb47ccf187b24c3b955157bb12c5882d000 (廖雪峰python教程)
2 https://morvanzhou.github.io/tutorials/python-basic/multiprocessing/ (莫烦python)
2.优化IO
模型训练速度上不去的罪魁祸首就是IO,图片读取的速度是有物理极限的
方法:
- 换用固态硬盘
- 优化读取流程,把分散的文件进行打包
1 .就不多说了,有固态硬盘就尽量用固态,或者直接把所有的图片都读到内存中,再送到GPU中进行训练。(后者缺点,就是字大数据集情况下,试错成本提高,大量数据读入内存需要消耗启动训练的大量时间和大量内存(导致小内存服务器只能试训练一路))
2 .使用深度学习平台自带的数据打包工具进行打包
比如mxnet框架可以提将讲数据打包成以下数据格式,多次训练时直接读取,加速喜人(实测GPU利用率从60%上升到100%)
faces_ms1m_112x112/ train.idx train.rec property lfw.bin cfp_ff.bin cfp_fp.bin agedb_30.bin
关于打包,代码可以参考demo代码,善用多进程,如https://github.com/deepinsight/insightface/blob/master/src/data/dir2rec.py,效率高低的评价标准即为IO是否占满
3.善用函数——挖掘框架本身性能
在框架当中,已经有了一些可以加速的点,以pytorch框架为例
cifarLoader = torch.utils.data.DataLoader(cifarSet, batch_size= 10, shuffle= False, num_workers= 2)
诸如此类的num_workers,就可以指定多线程加速。
并且在训练当中,能用原生函数的,就不要自己实现,尤其是numpy当中的数组操作,慎用for循环,多用列表表达式,效率往往是千倍的差距。
4.慎用多卡——多卡不一定加速
多卡就一定加速吗?不一定,因为卡之间的通信也大量消耗成本!因此加速比需要考虑,8卡训练模型的速度往往不是8倍,而是6倍,同理,四卡训练的加速也不一定是4倍,而是3倍,不要迷信卡多就一定能大幅加速,在性价比面前可能并不划算。
5.炼丹不一定非要开很多个run——可以用bash来自动调参
例如:将重复训练的命令写到一个脚本当中,运行这个脚本就可以依次训练
6.望闻问切——善用brain++ graph分析当前机器性能
CPU占用时断时续,说明IO瓶颈/代码预处理逻辑耗时十分严重,因此可以考虑打包 进行加速,另外在此任务当中,作者使用了4张卡,但其实多卡的效率不一定就比单卡要搞,GPU不是越多越好。
标准范式,GPU占用长期处于100%。
7.常见Linux性能检测命令
查看cpu占用率:top http://www.cnblogs.com/zhoug2020/p/6336453.html
查看gpu占用率:nvidia-smi https://blog.csdn.net/s_sunnyy/article/details/78547516?locationNum=4&fps=1
查看磁盘IO:iostat https://blog.csdn.net/xusensen/article/details/73080887