点击上方“CVer”,选择加"星标"置顶
重磅干货,第一时间送达
本文作者:恨铁不成钢琴
https://zhuanlan.zhihu.com/p/258606347
本文已由原作者授权,不得擅自二次转载
深度学习
……在用笔记本的1060连续炼丹5个月之后,我可以断言……
是一个实验为主的学科。
这篇文章的每一句话很可能都是错的
但某些地方,它们总是有用的
哪怕这篇文章没有一个结论正确,来阅读文章的你们,至少也可以借此思考和探究,我们应该考虑系统的哪些方面,究竟有哪些东西能够影响深度学习的性能。
由于这里只是笔记,笔记不会记载课本中的常见知识(了解那些知识应该去读课本!)
这里只会记录和整理一些原本放在我脑子里的东西。
比如一些特别常用但基本不会有人告诉你的命令
sudo nvidia-smi -pm 1#linux专用,什么意思自己查,我只知道用过的都说好
sudo nvidia-smi -pl 320#性能损失3%但可以保证交火时候不撞温度墙……保证不了就把320改成300
1.1.基本设置
1.2.应该考虑系统的哪些优化
1.3.3090的选择
2.1.玩游戏用的windows
2.2.Ubuntu高温死机
2.3.Gentoo……她太高贵,我配不上
2.4.CUDA!
1.1.基本设置
这里的设置很可能并不是最好的设置,根据硬件不同,系统不同,驱动不同,cuda版本不同……各种设置的不同都会导致配置变得不完美,等亮机卡到手之后我会在评论区留下自己的硬件&软件配置,如果其他人实验出了更好的配置(比如用我的配置跑出来的成绩明显差于我公布的数据,且有一个更好的配置备选),可以在评论区留言。你的留言理论上并不会得到回复(因为这样的回复会妨碍其他人的浏览),但至少,你会收到其他人的感激。
目前,我用的是Manjaro(因为安装超级方便),xfce4桌面(据说占用小,但KDE真的好看)
做了好几处调整,比如把内存做成内存盘,比如把各种临时文件夹link到内存盘的某个目录,比如设置了许多快捷键……最重要的修改应该是这一条,固定CUDA,CUDNN版本禁止自动升级(对非30系显卡,这是必须做的):
$ cat /etc/pacman.conf | grep IgnorePkg
# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
#IgnorePkg =
IgnorePkg = cuda cudnn
(如果设置忽略cuda cudnn升级,在执行sudo pacman -Syu时候会有如下提示)
警告:cuda:忽略软件包升级 (10.2.89-2 => 11.0.3-1)
警告:cudnn:忽略软件包升级 (7.6.5.32-2 => 8.0.2.39-2)
Remark 1.Manjaro可以很方便地通过sudo pacman -Syu升级整个系统,但升级cuda或者显卡驱动之后,很可能不能正常开始新训练(已经开始的训练不受影响),所以不推荐实验室公共电脑使用Manjaro——如果你真的馋Manjaro的各种优势,请把/usr/bin/pacman改个名字,否则实验室电脑很可能因为一次升级而被迫重启
如果此时有两个实验,一个刚刚做到一半而另一个刚刚做完……至少会有一个人觉得很不舒服
Remark 2.如果你已经对sudo pacman -Syu成瘾,可以忽略这条,否则,请养成执行sudo pacman -Syu的习惯, 据传如果几年不执行这个命令,某日心血来潮,结果很可能是系统挂掉
pytorch最开始(9月)建议用sm_80+PTX进行编译,我这里发现11.1的cuda+sm80或者sm86都能正常运行,但未测试11.0是什么情况,保险起见可以直接上11.1,如果是勇于尝试的,可以试试11.0会怎么样。
然而我测得的结果是,对我那可怜的笔记本上的1060,用10.2跟11炼丹的效率差距差不多是linux跟windows上的差距……我不得不感叹老黄刀法真好……
如果你需要降级你的cuda和cudnn,请使用下面的代码(降到10.2,如果希望降级到其他版本可以参考这里写的代码,两行pacman选一行就好,不要都选……如果你并没有安装cuda和cudnn,或许可以把-U改成-S,未测试这样更改是否有效,但理应有效。)
#我是用下面这行代码进行降级的。
sudo pacman -U https://archive.archlinux.org/packages/c/cuda/cuda-10.2.89-5-x86_64.pkg.tar.zst https://archive.archlinux.org/packages/c/cudnn/cudnn-7.6.5.32-4-x86_64.pkg.tar.zst
降级系统之后别忘了把IgnorePkg = cuda cudnn这行写进/etc/pacman.conf里面
Note:如果pacman下载速度过慢,可以先把文件使用下载工具下载到本地,再执行
sudo pacman -U $(下载的两个文件)
进行升级
1.2.应该考虑系统的哪些优化
下面的测试,重要性随编号增加而递减
首先应该看的,是系统的稳定性:
1.2.1.GPU温度过高时候会不会死机(测得,ubuntu会,有时会直接掉显卡,但manjaro,哪怕显卡到82度,也从未死机过)
1.2.2.连续训练时GPU温度是否过高(不同系统真的不一样……同一个笔记本我用ubuntu愣是比Manjaro高5度,结果ubuntu频繁死机逼着我写了一个sleep函数……等我发现Manjaro不需要sleep的时候真的是高兴坏了)
然后看系统的性能:
1.2.3.训练一个epoch需要多久(组好3090之后时候我会放出python脚本跟我的测试结果,暂时不会涉及sli因为sli我真的不熟而且我也不确定能不能买到两张水冷卡sli)
1.2.4.初始化并结束第一个epoch的速度有多快(这涉及到搭建模型的效率。mxnet在windows上训练速度感人(快于pytorch),初始化速度真的赶人(几分钟+巨大的内存占用))
1.2.5.数据读取速度有多快(这个很可能成为新显卡的瓶颈,但其实并不重要,毕竟刷SOTA的时候你不可能让你的显卡闲置而CPU吃满)
最后看平台是否用得顺手……这个就因人而异了,毕竟linux上也有steam可以直接开proton玩windows上的游戏——或许最优策略是白天windows玩游戏晚上linux炼丹……我测得的结果是……这样似乎比纯windows训练要快……真的是活见鬼
Remark 3.Manjaro是我测得的最好的系统,但哪个系统最好应该看具体的配置,看硬件兼容性,看各种调校是否到位(比如intel-undervolt降压,用压功耗的方式提升睿频),看是否支持独显集显切换(独显输出画面独显深度学习的唯一结局是网页卡成PPT……我推荐Manjaro的一个原因是,Manjaro自带一个prime-run,能够自由处理独显/集显切换问题)
如果你说,你测得的windows就是比Manjaro要好用,Manjaro跑深度学习的速度只是windows的1/2,windows加载mxnet秒加载,但mxnet训练速度明显慢于pytorch……
如果你遇到类似问题请回复我,我不会回复你因为大家毕竟配置不同。但请你务必留言
——毕竟真的有可能——
比如你住在珠穆朗玛峰峰顶,上了一套水冷系统,跑mxnet没跑多久水冷液就沸腾然后漏出来把主板烧了,而我甚至不知道珠穆朗玛峰峰顶能住人……
你的留言可以帮助后来人选择更合适的配置
1.3.3090的选择
19日下单,终于到手
选择3090的时候,应当注意:
1.是否有购买多块3090的计划,如果是,请在
背板镂空+PCIE延长线(n张显卡配n/2或者2n/3根延长线,并将镂空的背板和风扇进风口隔开)
水冷型号(暂未发售)
这两者之中选择一个。
选错可以直接完成成就:机箱烤红薯,比如
背板镂空,不使用PCIE延长线
背板无镂空(亲自证明了不做散热就是烤红薯,不推荐,选的是微星万图师OC,然而看功耗墙仍然350W且不能用nvidia-smi更改,很有可能只有名字是OC——这样的OC大概不如其他非OC但是背板镂空的版本,毕竟那些版本温度更低)
3080还好,3090选不好,交火可以直接撞温度墙。
由于眼馋算力,我先选了背板无镂空的型号,或许不利于散热,我原以为知道如何调整——但最好的调整方法大概是降功耗或者等冬天
1.4.编译mxnet
编译mxnet的时候会遇到不少问题。
首先在cmake之前记得mkdir build && cd build,否则会污染源代码
如果发现ReadLock报错,需要用sed把set(CMAKE_CXX_STANDARD 11)改成set(CMAKE_CXX_STANDARD 14)
另外需要把 src/operator/tensor/elemwise_binary_broadcast_op_basic.cc 的(第26行)从#include "./elemwise_binary_op.h"改成#include "./elemwise_binary_op-inl.h" [1]
然后就是在自己新建的build目录下cmake .. -DCMAKE _CUDA_ARCHITECTHRES=86开搞
如果cmake进入死循环(比如见鬼的ubuntu),需要在CMakeList.txt手工指定nvcc的路径
mxnet的优点:支持TF32格式,(于是比pytorch快,如果禁用TF32可以看到一点性能的下降(100%->86%))。
缺点:编译时候需要特别处理一下
在这里我会不定期更新一些神奇的问题,包括系统,包括软件,也包括训练经验。
并不会有任何书本知识
但这正是这一节宝贵的地方
2.1.玩游戏用的windows
请记住,windows对dll的支持相当不友好!
windows的设置保证了dll只能加载不能复用
你不能因为“我之前加载过这个dll”这一理由而获得任何性能上的优势
(相比之下,linux可以用sudo nvndia-smi -pm 1保留读取的dll(linux里面起到.dll作用的文件通常是.so)以避免多次加载同一个dll的开销,从而减少1.2.4里面初始化所需要的时间)
另外,我测得的windows下性能奇差无比,不确定原因在cuda还是pip版本本身就有问题
2.2.Ubuntu高温死机
如果直接用搜索引擎的话,你可能会发现,ubuntu相当适合深度学习——因为网上铺天盖地的ubuntu教程
——然而,我不确定你们有没有注意一个问题
如果高考满分750的话
搜索“高考700分经验”,我们只会得到几个状元的经验
搜索“高考600分经验”,我们会得到一批985211的同学的学习经验
搜索“高考500分经验”,我们得到的经验会略少,因为剩下的经验已经不再有竞争力
……
搜索“高考100分经验”?这玩意不是运气好点别作弊有手就行没手拿脚写字都能过线吗?
——于是,“高考100分”这个最简单的东西,最不容易找到有效信息
Remark 4.事实上,搜索结果数量并非我所说的那样……但我实在不想清洗数据了……
Manjaro做深度学习,真的是类似“750分的高考考100分”这样的难度
ubuntu,18.04,安装前要用modprobe或者别的什么把nouveau干掉(否则连安装系统都做不到……)19.10似乎有进步不需要干nouveau,20.04没试过毕竟我最开始计划Linux玩深度学习的时候20.04还没出
安装好ubuntu之后手动修改blacklist干掉nouveau,卸载nouveau相应驱动并安装nvidia闭源驱动,安装cuda,cudnn(又是PPA啊又是别的什么,虽然都是复制粘贴但总归看着麻烦)
如果你用的独显做视频输出,深度学习时候你的电脑可能会卡成PPT
如果你试图安装那个/usr杀手Bumbeeble……反正我为了装Bumbeeble重装了两三次系统……都是未知原因黑屏
训练,显卡温度过高,如果不管直接报错,如果管那只能对显卡限速(限速了还是比windows快……)
最后,因为ubuntu太不稳定,我换用了Manjaro
2.3.Gentoo……她太高贵,我配不上
这是我在有了Manjaro之后做的第二个实验
(毕竟一直眼馋gentoo,觉得Manjaro不够新)
但……Gentoo默认的gcc是9,而Manjaro可以用gcc 10,想用gcc 10需要各种调校
Gentoo默认不能打开-flto优化(因为会出问题),想用gentoo的lto需要非常非常小心
如果出了问题,Manjaro可以去论坛碰碰运气,Gentoo几乎只能使用搜索引擎
性能方面没测出Gentoo与Manjaro有什么差距
但不推荐Gentoo,那是大神的玩具,不是我们的
Gentoo太高贵,非CS专业的基本配不上她的
2.4.CUDA!
最重要的部分当然要放在最后讲。
有时候,换一个cuda版本或许会出现神奇的效果。
比如手工编译mxnet+cuda11,训练网络的时候,一个epoch花了1分13秒(1060显卡)
在windows上也是这个成绩(但windows加载mxnet特别特别慢)
但pip mxnet+cuda10训练网络,一个epoch只需要41秒
……有时候,性能x1.5所需要的只是换一个cuda
我不确定这是否只是个例
但大家其实可以测试一下
如果nvidia-smi显示90+%的GPU-Util,你可以试试将同一个脚本同时执行两次,打开两个训练进程
如果此时你发现这两个训练进程训练一个epoch所需时间的平均数,小于这个脚本平时训练两个epoch所需要的时间——这多半说明你的cuda有问题
——cuda的问题,可以换cuda,也可以换系统。
我建议大家换系统
(毕竟steam有proton,可以打开大部分windows游戏)
https://github.com/apache/incubator-mxnet/pull/18357/commits/86837a0b899813f255f4c954dfd99cd347e1aeea
下载1
在CVer公众号后台回复:PRML,即可下载758页《模式识别和机器学习》PRML电子书和源码。该书是机器学习领域中的第一本教科书,全面涵盖了该领域重要的知识点。本书适用于机器学习、计算机视觉、自然语言处理、统计学、计算机科学、信号处理等方向。
PRML
下载2:CVPR / ECCV 2020开源代码
在CVer公众号后台回复:CVPR2020,即可下载CVPR 2020代码开源的论文合集
在CVer公众号后台回复:ECCV2020,即可下载ECCV 2020代码开源的论文合集
重磅!CVer-论文写作与投稿交流群成立
扫码添加CVer助手,可申请加入CVer-论文写作与投稿 微信交流群,目前已满2400+人,旨在交流顶会(CVPR/ICCV/ECCV/NIPS/ICML/ICLR/AAAI等)、顶刊(IJCV/TPAMI/TIP等)、SCI、EI、中文核心等写作与投稿事宜。
同时也可申请加入CVer大群和细分方向技术群,细分方向已涵盖:目标检测、图像分割、目标跟踪、人脸检测&识别、OCR、姿态估计、超分辨率、SLAM、医疗影像、Re-ID、GAN、NAS、深度估计、自动驾驶、强化学习、车道线检测、模型剪枝&压缩、去噪、去雾、去雨、风格迁移、遥感图像、行为识别、视频理解、图像融合、图像检索、论文投稿&交流、PyTorch和TensorFlow等群。
一定要备注:研究方向+地点+学校/公司+昵称(如论文写作+上海+上交+卡卡),根据格式备注,可更快被通过且邀请进群
▲长按加微信群
▲长按关注CVer公众号
整理不易,请给CVer点赞和在看!