入门级个人机器学习工作站攒机心得

A–引言:各位在北美打拼的兄弟姐妹们你们好,楼主是一枚在美帝读书的学生,主攻天文数据处理,研究中有部分机器学习内容。因为这几年尝试搭建了自己的服务器用于研究目的,所以把自己的心得分享一下。本文是纯新手向,如有不妥当的地方请大家指出。
B–目的: 因为楼主的研究中会需要比较多的计算资源,而学校的服务器要用sbatch/qsub去排队等候,老板的服务器又没有GPU(物理系是真穷 ),所以在2017年的时候楼主决定开始建设自己的服务器。所以本文的目的是想给想要以很低价格搭建一个性能不错的服务器的小伙伴们一些建议。
这台服务器需要满足一下需求:

  1. CPU性能不能太弱,至少要有比主流15寸笔记本多2倍的计算能力
  2. 内存不能小于32GB,当然越多越好。
  3. 包含GPU,因为使用tensorflow/pytorch的时候有GPU可以提供可观的计算能力。GPU显存需要足够大而且不要太贵(在此谢谢老黄多谢你把旗舰GPU价格涨到1000刀+。。。)
  4. 可以放置多块硬盘用于存储
  5. 结实,不容易坏
  6. 便宜。。。

C–楼主的setup:遥想在2017年的时候,楼主开始学习使用pytorch代替numpy(暴漏了语言倾向,楼主主攻python)。楼主惊奇的发现,即使使用CPU,pytorch也要比numpy快上一节。比如在使用Monte Carlo 需要generate大量random number的时候,纯CPU下面的表现pytorch比numpy快上3倍。在使用GPU的时候,如果不计算从内存读写数据到显存的时间,pytorch会有更明显的加速(可能要10倍)。这就让楼主有了买入GPU的想法。但是2017年正值挖矿大潮,GPU价格大涨,我记得1060都要350刀。连老爷爷级别的r9 290都被拿出来再就业,真是好可怕。万幸的是楼主在本地的bestbuy买到了一块价格不错的GTX 1060 6GB,所以才能让服务器搭建大业继续。扯远了,下面是楼主的setup:

  1. 对于主机,楼主选择了淘汰的二手工作站,因为这些工作站大多源于大公司淘汰,一般这些公司5年就会淘汰一批工作站,而且普遍成色很好,ebay上大把的卖。
    楼主选择了惠普的 Z420 工作站,配备单路Xeon E5 v2 处理,价格在300-500左右。最后选择了一款配备32GB(8*4) DDR3 ECC 内存,10核心E5 2680v2 处理器的Z420, 没有显卡,硬盘。最终花费450 刀。
  2. 这款Z420 带有600W电源,但是因为是Z420 G2, 所以只有一条6pin电源接口,好在GTX1060 只需要一条就够了,所以楼主给工作站配备了在bestbuy买到的GTX1060,花费249刀.
  3. 对于硬盘,楼主从垃圾堆里面搞到了一块128GB的SSD,还有一个500GB的硬盘用来存储数据。
  4. 最终这台机器花费450+250=700,硬盘没有算在内。
  5. 对于系统, 楼主选择安装 centos。 因为相对于Ubuntu,centos拥有和redhat(超级计算机第一操作系统)一样的binary,所以很适合科学计算。因为不同的linux发行版编译器版本不同,所以选择适合计算的版本比较重要。并不是说ubuntu就不可以,只是楼主为了稳定起见,选择了centos。
  6. 在系统安装好之后,楼主尝试利用学校办公室的固定ip地址,开启openssh,这样就可以使用ssh远程登录(可以咨询系里面的IT部门,他们会帮你搞定。也可以放在自己家里,连在路由器上面)。(附录: ssh是什么:https://en.wikipedia.org/wiki/Secure_Shell 另外不建议使用public ip address,容易收到攻击)

小结:于是楼主拥有了一台有10核心CPU(E5 2680v2, 25MB三级缓存),32GB DDR3内存,GTX1060 6GB的服务器。楼主小心翼翼的把它放在的办公室的一个角落,出风口对着我的办公室室友
对于这台服务器,CPU的速度比楼主的15寸mbp 快2 倍(即使不考虑笔记本散热问题)。在跑Monte Carlo或者random forest这种可以完美利用CPU多核心的程序时,可以提供和学校服务器类似的效果(学校的服务器每一个node普遍有12-14 核心,因为如果使用多个node,第一要排队比较久,第二使用open-mpi的时候,在不同node之间通讯速度受到网络限制,一般node之间的infiniteband只有10Gbps的速度,所以数据交互很有问题,当然也可以优化代码让不同的node之间独立运算,但是相对麻烦不在此讨论)。
GTX1060拥有6GB显存,比GTX1050ti强很多,足够最基本的GPU计算。使用tf自带的bench cifar10 差不多8000 samples/s (和K80 类似)
32GB内存虽然略小,但是有后续升级空间(Z420有8条内存插槽,比dell同级别工作站多一倍,楼主暂时使用了4条,以后方便升级),而且还算够用。

时光飞逝来到了9102年,楼主还是没有毕业。。。 但是这台服务器已经稳定的工作了两年多,而且楼主买了一个有两条6pin接口的Z420 电源,把显卡升级成了GTX1070Ti(需要2条6pin接口),楼主打算让这台服务器服役到毕业,在下面楼主会分享自己的一些经验,如有不妥请指出。

重点来了

D–在9102年楼主的攒机建议:
1.主机选择:
消费级平台or 志强?:楼主十分推荐选择二手的Xeon工作站平台,因为这些工作站在ebay上面有很多,而且质量相对靠谱,价格便宜。比较典型的有: (括号内是价格估算,并不准确)
惠普: Z420/440(300-500刀), Z620/640 (500-900刀)和 Z820/840(800-1500刀)。 傻多戴: Dell T3610/3620(300-500刀), T5610/5810 (500-900刀)和 T7610/7810/7910(800-1500刀). 美帝良心想:不太了解。。。但是我知道有C 和P系列。
可以看到这些工作站可以分成三档,这些工作站的区别在于:第一档装备单路Xeon E5处理器,电源一般只有1个6pin接口。 第二档装备一个或者两个Xeon E5 处理器,电源有2个6pin接口。(第二个处理器惠普通过扩展版实现,dell有的是直接双路,有的是只有单路)。第三档是土豪档,拥有双路E5 而且机身空间很大,可以装最多三块高性能显卡。
对于处理器区别,同一档内数字较小的(比如Z420)装备的E5 v1/v),单cpu最多8/12 核心,ddr3内存,支持AVX指令集。 数字较大的(比如Z440)装备 E5v3 /v4,支持avx2指令集,ddr4内存,最多14/18 核心。 对于2019年来说,支持avx指令集的cpu几乎成为了计算的必备品(比如tensorflow,如果不支持avx指令集,那么没法安装最新版本),所以楼主没有考虑更老的工作站比如Z400/600/800, 即使他们的性价比很高。现阶段DDR3 ECC内存比DDR4 ECC便宜不少,但是DDR4 ECC内存价格也不离谱,16*8=128GB只要500刀左右。

Optinal:要不要考虑ryzen?妈妈告诉我amd yes,8核心2700x超频一下可以干掉12 核心的e5 2697v2: 楼主觉得ryzen是一块很棒的cpu,非常适合需要多核心的工作比如视频渲染。但是因为是搭建计算服务器,所以ryzen(或者说主流桌面级别cpu)的一些缺点会暴漏出来:第一:ryzen支持双通道内存,但是志强处理器支持4通道内存,在带宽上讲,Xeon有先天优势。如果涉及in-memory计算,志强的优势会体现出来。 比如楼主以前跑过一个KD-tree search 多线程,每个线程都要访问内存里面的binary table。 这个时候内存大压力就很大了,楼主可以明显地感到三通道DDR3 的X56752 不如一块四通道E5 2697v2. 第二:pcie 通道,ryzen拥有20条pcie 通道,其中可以用于显卡的应该在16条左右,在玩游戏的时候支持两块显卡问题不大,因为8条pcie per gpu对于游戏来说足够了。 但是在机器学习的时候,从内存读取数据到显存的瓶颈就在于pcie通道的速度。(pcie3.0 * 8 只有8g/s, Xeon四通道DDR3 1600 就可以到60gb/s)虽然读写只占据总时间的一小部分,但是越快越好呢:)。 第三:桌面级平台不适合724 小时开机 第四: 虽然ryzen名义上支持ECC 内存,但是主板厂商却比较暧昧,好多时候主板不支持ECC,导致ryzen只能用普通的DDR4. 第五: 组装一个AMD 平台虽然便宜,但是还没有买工作站整机便宜呢。

Optional2:CPU 核心数量?: 楼主推荐选择至少8个核心的GPU,因为现在E5v2价格很低, 12核心的E5 2695v只要200刀,更多的CPU核心意味着更大的三级缓存,即使使用tensorflow也可以通过workers=-1利用多个CPU核心。楼主建议E5 2695v2(Xeon v2),或者E5 2678/2680 v3。 这些CPU核心多,价格又不高。

  1. 重头戏:GPU选择:因为是搭建机器学习的工作站,所以拥有一块性能很棒的gpu十分重要,但是因为本文是基于有限预算的前提下,所以价格占据很重的比例。

显卡的重要参数(只考虑机器学习的情况): a.fp32 速度 b. 显存大小 c. 显存 速度+位宽 d. 有无tensor core e. 是否支持 fp16 (2:1)
显存: 决定了你一次训练模型最大读取数量,越大越好(前提是够快)。太小的显存可能会导致比较大的模型训练失败, 楼主建议6GB起。
tensore core:和专业的V100一样,专门用来计算矩阵,在一个循环可以计算二个4*4 fp16 矩阵乘法,有点类似intel 的avx512, 但是更有效。
fp16: 俗称半精度,如果各位老司机关注过apple的imac pro,就会发现2017年的时候apple着重宣传了vega56/64的半精度能力, 是单精度的两倍。好多时候半精度已经足够机器学习,而一个单精度资源可以算两个半精度,可以大大提高效率。AMD很早就支持了这种特性,但这种特性Nvidia只有在P100或者之后的tesla显卡,或者Turing显卡才支持。PS:我试着好几次在MAC OS下从头build tensorflow-gpu结果都失败了,docker都用过了,有大神知道怎么做请指教:)

–入门级:楼主觉得一块有6GB显存的显卡是最低选择,所以入门级显卡里面最低显存数量就是6GB,显存越大,每次可以导入数据更多,也就可以节约时间,而且避免因为显存过小导致没法训练。这个区间的显卡适合希望以很低价格体验GPU的同学选择。

a. GTX 1060-6GB. 虽然这块显卡发布于2016年,已经停产,但是老当益壮,当年可以说是神器,Pascal构架,fp32速度=4.3 TFloat/s(嗯,基本可以干掉K80了), 6GB GDDR5 显存, 192bit,不支持fp16(2:1). 只需要1个6pin接口。价格只要150出头就可以买一个二手,如果全新也只要200. 唯一阻碍这块显卡的就是二手的它可能是矿潮的产物,谁知道它油箱里还有多少油呢? 如果你是老司机,对于买二手显卡非常有信心,那么十分推荐。
b. GTX 1660 Ti。发布于2019年2月22日。。。 是GTX1060的直接继承者,Turing 构架,但是却没有 tensor core 和RT core,fp32速度=5.4 TFloat/s, 6GB GDDR6 显存(比GDDR5快不少,至少快60%), 192bit,支持fp16(2:1)=10.8 TFloat/s. 只需要1个6pin接口。全新价格不含税大约280刀可以买入门版。相对GTX1060来说性价比没那么高,但是却比RTX2060 便宜不少。但是随着老黄的super系列rtx显卡要发布但是加量不加价,这块显卡的性价比有待商榷。显卡很新所以不会有矿卡,适合不想折腾的同学。

–中等级别:这个级别的显卡性能会明显高于上一个级别,而且价格不会特别恐怖,所以比较推荐。

a. GTX 1070 Ti。发布于2017年11月2日。。。 为了填补1070和1080的空白,准高端卡,Pascal 构架,fp32速度=8.18 TFloat/s, 8GB GDDR5 显存, 256bit,不支持fp16(2:1).需要2个6pin接口。 全新的应该没有了,二手价大约300刀可以买到,这块显卡发布于矿潮的末期,所以一般来说二手矿卡风险比1060/1070/1080 小不少。相对GTX1060来说性能高了很多,即使rtx2060有tensorcore加成,性能也不落后太多,但是却比RTX2060 便宜,而且还有更大的显存。这块显卡适合有一点动手能力可以接受二手而且不想冒特别大风险的同学。

b. RTX 2060 (?super): RTX系列入门产品,发布于2019年1月。在7月左右老黄会发布它的继任者 RTX 2060 super(可能有8gb显存),但是参数不确定,所以希望各位司机们先不要买rtx2060,等7月分再说。 原本的RTX2060拥有Turing 构架,拥有 tensor core 和RT core,fp32速度=6.45 TFloat/s, 6GB GDDR6 显存(比GDDR5快不少), 192bit,支持fp16(2:1)=12.90 TFloat/s. 需要1个8pin接口或者2个6 pin。全新价格不含税大约350刀可以买入门丐中丐版本。这块显卡一言难尽啊,好处就是居然有V100才有的tensor core,可以加速fp16矩阵计算,而且比1060强不少,坏处就是老黄的显卡集体涨价,首发需要350才能丐中丐,而且容易花屏。建议等7月份它的继任者2060 super,如果rtx 2060 super有8GB显存价格还是350, 那么十分推荐购买。

–高端级别:这个级别的显卡性能会明显高于上一个级别,但是价格也是呢》《
a. GTX 1080 Ti。发布于2017年3月10。当时看到老黄发布这个显卡虎躯一震,感觉直接威胁到了titan 啊,性能强大频率高,显存也很大。转眼到了9102年,这块显卡的性价比依然很高,前提是你能用比较合理的价格买到。Pascal 构架,fp32速度=11.34 TFloat/s, 11GB GDDR5X 显存, 352bit,不支持fp16(2:1)需要1个6pin+1 8pin接口。. 全新的应该没有了,二手价大约550刀可以买到,这块显卡应该没有多少人用来挖矿(因为太贵了),所以一般来说二手矿卡风险比1060/1070/1080 小不少。相对GTX1070ti来说性能高了很多,和rtx2080比也不落太多,而且显存大很多。这块显卡当时可以和titan xp pk,首发699,现在还要550,可见这块显卡依旧很棒。它的优势体现在拥有11GB显存,可以训练更大的模型,或者一次载入更多数据,如果你不介意二手,那么这块显卡依旧很棒。

b. RTX 2080 (?super): RTX消费级系列老二,仅次于2080ti,发布于2018年8月。在今年7月左右老黄会发布它的继任者 RTX 2080 super,但是参数不确定,能确定的是会多一些cuda,但是不会用rtx 2080ti一样的大核心,所以希望各位司机们先不要买,等7月分再说。 原本的RTX2080拥有Turing 构架,拥有 tensor core 和RT core,fp32速度=10.7 TFloat/s, 6GB GDDR6 显存(比GDDR5快不少), 256bit,支持fp16(2:1)=21.4 TFloat/s. 需要1个6pin+1 8pin接口。全新价格不含税大约700刀可以买入门丐中丐版本。非常适合游戏和机器学习,如果不看价格的话。。。老黄你好坏,生生把一块次旗舰显卡卖成了iphone xr的价格,而且700刀还不是最贵的显卡。。。希望ROCm越发展越好,不要让我们只能用N卡跑机器学习。

c. RTX 2080 Ti: 1299 刀的售价买丐中丐,13.45 TFloat/s 的fp32, 支持fp16(2:1)=26.9 TFloat/s. 有RTcore和tensor core, 11GB GDDR6显存,不超频基本打平V100(FP32 大约14TFloat/s), 毁天灭地,就问你怕了没?!

Optional: AMD显卡
AMD显卡真是一言难尽啊,AMD拥有很棒的fp32速度,基本都支持fp16(2:1),显存大,有HBM2,价格低,为什么不吃香呢?因为如果要安装tensorflow之类的包,你需要一个叫ROCm的东西,因为基本上99%的服务器都在用老黄的CUDA,不支持A卡。所以需要ROCm去支持(感谢ROCm社区里面的肥宅们)。但是ROCm没有CUDA/CUDNN那么好安装,而且会出现一些bug。好在经过发展,ROCm变得越来越好,有贴为证:https://www.reddit.com/r/Amd/comments/bcl9s3/linux_radeon_rocm_23_released_with_many/
如果你是一位拥有冒险精神不怕debug的童鞋,可以尝试AMD显卡:

a. RX 580. 不到200的价格,却可以买到 8GB GDDR5显存, fp32=6.1 TFloat/s 的全新显卡。如果你想要追求性价比,对ROCm很有信心,那么这是一块很棒的入门显卡。需要1 8pin 电源。

b. AMD vega VII。 之所以跳过了vega56/64, 是因为矿卡太多了,怕大家翻车。Vega VII发布于2019年2月份,是第一款7nm消费显卡。 拥有恐怖的fp32=13.44Tfloat/s, 支持fp16(2:1) = 26.88Tfloat/s. 16GB HBM2 显存,速度1TB/s(2080ti的GDDR6 大约只有600gb/s),延迟远低于GDDR5/6. 699刀买不了吃亏买不了上当,据AMD说4GB HBM2成本就要80刀。如果你喜欢ROCm,富有创新冒险精神,那么vega VII可以让你用比2080还便宜的价格买一块接近2080ti的显卡。需要2个8 pin电源,还有一颗爱AMD的心。

c. 新发布的 5700/5700XT。拥有fp32=8/10 TFloat/s,8GB GDDR6 显存,以及 379/449 的价格。楼主不是很了解,所以不敢妄加推荐。

Optional2: 几块GPU: 多块小的GPU可以达到比一块大GPU更好的速度,显存也可以加倍,价格也更低,多GPU是未来的趋势。而且随着代码的优化,现在主流软件(tensorflow,pytorch。。)对多GPU的优化越来越好,调用多个GPU也变得更加容易。(比如在tf 2.0 alpha版本,你可以用tf.distribute.MirroredStrategy()调用本地机器所有GPU,tf会自动为你优化数据传输) 但是对于个人服务器多个GPU意味着更大的发热,对于机器要求更高(两块GPU需要更多的供电,可能要买Z820这种比较贵的工作站)。所以对于自己的服务器,首选一块GPU。

  1. 系统:楼主推荐使用Linux。下面是一些Linux的流行发布版。
    a. Centos: 链接: https://www.centos.org/ 楼主最为推荐的版本,稳定好用,和Redhat一样的binary,高效率的编译器。如果你使用学校的服务器,你会发现他们大部分用的就是centos/redhat。
    b. Ubuntu。 链接 https://ubuntu.com/ 最流行的Linux版本,更新快,界面漂亮,相对易用。一言不合还可以安装Ubuntu Kirin。
    c. Fedora 链接 https://getfedora.org/ : 啊,自由的味道~(welcome to freedom)

Optional:如何在Linux下面安装Nvidia 驱动。
首先要说明的是,Linux自带显卡驱动,你需要先把它disable,才可以安装Nvidia驱动. 这里有一个很棒的教程: https://www.tecmint.com/install-nvidia-drivers-in-linux/
安装完成之后你需要重启,之后在terminal 里面输入 nvidia-smi, 检查是否安装成功。

E 小结: 以上是楼主的一些攒机经验,希望对各位想要以很低价格体验机器学习的同学们帮助。其实现在有很多的免费平台可以使用GPU, 比如Kaggle, Google Colab, 甚至还有Google cloud 300 刀的免费credit, 或者Amazon aws。但是这些平台的问题在于无法长时间使用,比如Kaggle最长只能用9小时GPU(虽然可以用P100~),如果用Google cloud的GPU你的 300刀很快就灰飞烟灭了。
即使你拥有学校的计算资源,拥有一台自己的服务器也可以帮你节约一些时间,比如你可以先在自己的服务器调试完毕,跑几个epoch确定代码正确,之后在用sbatch/qsub去排队,这样可以避免跑到一半发现代码有问题这种情况。

最后祝各位一切顺利,攒机攒到手抽筋。
祝各位PhD早日毕业,拿到自己想要的offer。