由于生活所迫,决定自费搭建一台深度学习工作站。刚好老黄的Ampere架构显卡马上要发布了,听说RTX3080就能吊打RTX2080ti,RTX3090甚至有24G显存……

硬件选择

CPU

一个问题,首当其冲(我知道这么用不对我就是要这么用)的就是选择AMD还是Intel。在B站搜索“深度学习工作站”,按点击量排行的第一,B站up主@币与AI在视频打造水冷四张RTX 2080Ti的深度学习工作站中,使用了AMD线程撕裂者2950X(16C32T,zen+),并且后期还升级为了AMD线程撕裂者3970X(32C64T,zen2)。我也私信了该up主,up主表示当时选择AMD是因为Intel的CPU价格高昂,并且深度学习时大部分工作由GPU完成,CPU只是负责预处理等小部分工作,核心数量比mkl库重要。
就算如此,我还是怂的一批,AMD的CPU使用numpy需要自行编译OpenBlas版本,否则会被mkl负优化到怀疑人生。另外pytorch依赖于numpy,安装numpy会自动安装mkl-numpy,用AMD的CPU会比较麻烦。虽然有一种说法是通过“set MKL_DEBUG_CPU_TYPE=5”可以打上补丁,但终究是怕出幺蛾子,因此如果价格相近会优先考虑Intel。
看了一下当前的价格,AMD这边可选Ryzen r9 3950XThreadRipper 3960X。前者基于X570平台,缺点是最多只能插三卡,带宽是PCIE 4.0 x8/x8/x4,虽然RTX 3000应该是支持PCIE 4.0了,PCIE 4.0 x4等效PCIE 3.0 x8。后者基于TRX40平台,能插四张卡,带宽是PCIE 4.0 x16/x8/x16/x8,其实已经算很好看了,缺点是贵!什么,你说2950X?这个不支持PCIE4.0而且只有zen+架构IPC低频率低还贵(咸鱼5000不到的样子)的就算了吧,更何况,它是AMD!另外其实也看过双路E5 2680v3洋垃圾,因为很多超微准系统都用,但是由于它的单核性能实在过于弱鸡(全核2.6GHz不支持超频还是Haswell架构),单核只有x299、zen2的一半水平,还是算了吧,一来我做过实验证明用于深度学习的CPU并不是核多就够了(如下图),主频同样会有影响;二来万一买前生产力买后打游戏呢!低频U怎么打游戏?手动滑稽。
QQ截图20200908123505.png
总结一下所有选择:

Intel i9 7940x Intel i9 7980xe Intel i9 10940x AMD r9 3950x AMD TR 3960x
核心 14 18 14 16 24
PCIE 3.0 x8/x8/x16/x8 3.0 x8/x8/x16/x8 3.0 x8/x8/x16/x8 4.0 x8/x8/x4 4.0 x16/x8/x16/x8
CPU价格 全新3200 二手5200 全新5200 全新4700 全新9600
主板 x299 Creator x299 Creator x299 Creator C8H 技嘉Designer
主板价格 3900 3900 3900 3000(c8h) 5000
总价 7100 9100 9100 7700 14600

其实简单看一下就看得出,Intel家的x299 U,9代相比7代加了个钎焊,10代相比9代加了完整的AVX512,说白了就是挤牙膏,体制也几乎没进步,但价格却水涨船高。现在7代x299 U的价格感觉已经挺低了,本着CPU根本用不坏的心态,买二手七代U它不香么?AMD这边,3950x的性价比确实高,性能和7980xe差不多却便宜好多,但是少了四通道内存和四显卡支持;TR 3960x确实强,不论是CPU性能还是PCIE通道,但是毕竟深度学习主要吃卡,实在不想在CPU上花这么多钱。
其实最后纠结7940x和7980xe,最后还是心痒痒上了x299顶天的旗舰7980xe,虽然多2000只能买个二手的,但是可以挑体制而且可以挑开盖上过液金的(没错方便超频),x299的U买来不超是真的废,主频太低了。

主板

选主板其实是建立在选好CPU的基础上的,就比如这次我就是先闲鱼淘到CPU以后再买主板的。主板主要就看中两款,一款华硕x299 WS SAGE2,另一款微星x299 Creator,价格的话两个主板差不多。
华硕x299 WS SAGE2要说优点,因为用了2个PLX芯片,支持四路PCIE 3.0x16或七路PCIE 3.0x8,这个拓展性相当恐怖(不过7条PCIE间距为单槽,插7个单槽卡肯定不可能的只能转接很麻烦),另外华硕的售后还是挺不错的。缺点倒是可以列一堆:供电只有8相带7980xe估计要起飞;没无线;网口只有2个千兆口。
微星x299 Creator,虽然我被微星迫击炮炸怕了,家里的b450炸了,实验室的b360炸了,家里的送修后回来还是坏的,实验室新买了一块b360结果后置typec接口时坏的,但不得不提x299 Creator是真的香!虽然只支持PCIE 3.0x8,每张卡带宽少了一半,但是14相供电比8相强太多了,另外网卡一个千兆一个万兆,内置wifi6,有两个USB 3.2gen2x2口。
其实还有一个选择是咸鱼1800的二手初代华硕R6E,有华硕保修应该还是没特别怕用坏,R6E同样支持四卡,不像R6EO和R6EE只有三个显卡槽,但是R6E同样只有8相供电,而且只有wifi5,再套上个二手的名头,还是没有选择它。

显卡

其实显卡才是这套配置的是大头,奈何RTX 3000还没发布,49年入国军是绝对不可能的,2080ti是绝对不会买的。这块先空缺留待新卡发布~~
可以先谈谈显卡散热选择的问题,众所周知,在3卡及3卡以上的系统中,显卡只有两种选择:涡轮卡、水冷卡。diss一下实验室的1号机,3张ROG GTX1080顶级非公,然后呢?被挤在中间的卡待机65度满载95度+降频。首先30系列卡TDP更高了,涡轮卡不知道散热会不会尿崩,而且涡轮卡频率一般低一点。水冷当然是好,但是万一,我说万一,它漏液了呢?另外如果自己改分体水冷的话肯定是没保修了= =
===========================分割线============================
2020.11.11更新
果然没买2080ti是正确的,3070性能就打平2080ti了2080ti爆哭……
距离3080发布的9.2,发售的9.17已经过去两个月了,经历了有史以来非常严峻的缺货、JS屯货、JD耍猴事件。3070 8G GD6 5800+的CUDA卖3899,3080 10G GD6X 8700+的CUDA卖5499,3090 24G GD6X 10400+的CUDA卖11999。
截至目前市场价为:3070丐加价150旗舰不加,3080加价600-1200,3090丐破发,3080ti已公布并将于21年1月上市,和3090一样的核心,砍了4G显存到20G GD6X和64bit显存位宽和NVLink接口。感谢AMD让我们用上实惠的N卡!
双十一用软件抢只抢到5个3070,3080毛都看不到。3070当场付款了2个,但是后来在淘宝发现有6699的3080 AD OC,好吧就加了400忍了上车,于是3070就退了。先用着看,摸摸自己的需求,需不需要大显存以及多少卡,另外涡轮卡和水冷卡也都还没出,明年等80ti出了再考虑升级。
然后第二天在咸鱼看到了如下信息:(我真的笑死)
image.pngimage.png
然后有缘人原价面交了一张影驰Gamer后又6099收了另一张Gamer后退了AD OC 233333。

内存

内存能买的其实很多,但想买B-die的内存是真的找不到便宜的,而且单条16G的都很少,幻光戟这种16G卖1000的就算了吧。虽然32G应该也许也够了,但好歹它叫服务器,工作站,实验室的两台都有64G,就一步到位64G吧,另外考虑到拓展性和后续升级,还是想要416而不是88,我又不是玩RGB插满好看。
本着便宜,能省就省的原则,我依然盯向了科赋CJR普条——没错我家里用的也是它。便宜是真的便宜,挑了淘宝上最便宜的时候下手,324一根16G的CJR,四根1296。优点是它真的好便宜而且是CJR颗粒很好超,缺点是没马甲不知道散热会不会有问题(这个其实众说纷坛也有很多人说马甲影响散热的)。
还是想推荐一下这个内存的,家里的用了快一年了没翻车,3700x+b450下超3733c16很稳。毕竟没人会和便宜过不去。

硬盘

咸鱼随便买了个还过得去的垃圾影驰铁甲战将480G sata盘用来装Windows,跑分剪视频打游戏。看了评测这个盘比光威悍将强不少。230买的,5毛1G都不到的价格,要什么自行车!
由于主用linux深度学习,linux盘买的比较好,西数黑盘sn750 1T,淘宝上1199,京东上1299。咸鱼捡了个930的全新未拆封,反正能查SN码售后有西数兜着,又不是PM981这种OEM盘,白捡的便宜当然要捡。
有钱任性,不买机械。

电源

有道听途说说30系列显卡可能从2*8pin供电接口改成12pin,不知道真假,那就观望一下再说把。照现在看到的话,长城2000瓦GW-EPS2000BL是性价比的代表,全模组金牌只要1399淘宝1150咸鱼;振华Leadex P2000,高贵的代表,淘宝几乎没有3000以下的,咸鱼捡便宜可能能2000多拿下。
由于还没买正在观望中,先白嫖实验室的报废电源,由于主板有3个8pin的CPU供电口,只插1个可能会炸,但实验室的垃圾报废电源一个500w一个450w,全部只有1个8pin的CPU供电口。那就两个一起用呗,这样就有2个8pin CPU供电了233333333
以上是错误的方法,两个电源是不会同步启动的,要让多个电源同步启动需要手动做并联,非常麻烦。追封者有一款耦合电源在电源内部实现了多电源支持,但是听卖的老板说还是可能会烧。嫌麻烦就先买了个2000w的再说,有振华P2000和EVGA G+ 2000两个选项,但前者贵1000所以选了后者(总比长城好),反正放实验室电费不用我付转化率也不要紧hhhhhhh

总结

型号 价格 渠道
CPU Intel i9 7980xe 5299 咸鱼二手
主板 微星x299 Creator 3879 淘宝
内存 科赋CJR普条16G*4 1296 淘宝
显卡 影驰RTX3080 Gamer*2 12098 咸鱼全新京东货
固态1 西数黑盘sn750 1T 930 咸鱼全新未拆
固态2 影驰铁甲战将 480G 230 咸鱼二手
机械 0
电源 EVGA G+2000w 1979 淘宝
散热 恩杰x73 360一体水冷 948 京东
机箱 追封者719 999 咸鱼转淘宝交易
总计 27658

超频

首先,不超频是不可能的,就算用来当服务器也一定会超频的。首当其冲(我知道这么用不对我就是要这么用)的是超CPU,卖家说可以1.14v超4.5过R20,于是我拿到手也先1.14锁4.5开机尝试,散热先嫖了个实验室的利民银箭,也算顶级风冷了。结果别说R20,跑CPU-Z都破百了,R20直接触发温度保护了。实名表扬x299 Creator主板上有裸板开机、重启按钮和CPU温度监控数码管。
好了我知道风冷超4.5是做梦了,先是1.07v超4.2过了R20但是温度秒破百,后来1.05v超4.2也过了R20,温度还是破百。4.2G下R20 9650分,对比下家里4.2G的3700x,R20能跑5000分,同频的18核Intel还干不过16核AMD啧啧啧……还是等之后上个水冷再说吧。
内存随手拉了个3600 C16-19-19-36 CR1,能过带宽测试但是Memtest会秒报错,放宽时序到16-20-20-38 CR2能过Memtest。上到3800发现时序放宽到C18-20-20-38 CR2也不是很稳,dimm1.45v,sa1.15v,io1.15v。也不想折腾了,就3600c16用着了,dimm1.37v,sa1.05,io1.05v。
另外听说x299要超缓存,不然cache性能很差,L3几乎没比内存快多少。mesh默频我这里是0.81v 2.4g,一般体质差mesh只能超到2.8,体质好的能到3.3~3.4。mesh我没仔细调,1.1v 3.0g是稳的,1.15v 3.2g能开机但跑缓存会蓝屏,没仔细调。为了控制发热设置在1.08v 3.0g的RING。
===========================分割线============================
2020.11.11更新:
换了顶级360一体水,提升不算特别大,温度只低了7,8度。1.05v 4.2G只能过3遍R20再跑会蓝屏,温度97度,功耗267w。最终求稳1.02v 4.1G过10遍R20日常用了,此时R20功耗252w温度91度。需要注意的是R20用的是AVX指令而AIDA64 FPU用的是AVX512,掉频率到3.0~3.5G功耗都有280w。
↑↑↑↑↑后来发现是冷头没拧到最紧,拧到最紧后1.1v 4.3能过10圈R20,功耗300w温度92度。结果跑pytorch有时候会死机,后续加到1.12v后没再出现问题。

双系统安装

首先装Windows这没啥好多说的了。本来我妄图用同一个启动盘装Windows和linux,后来发现这是我做梦,装linux必须把原来的格式化了写镜像才行。之后要再换成Windows启动盘只能再把linux镜像格了。
参考:https://www.cnblogs.com/masbay/p/10745170.html
首先下载ubuntu镜像,可以直接从ubuntu官网下,下个种子用迅雷下速度还是很快的。我下了最新的20.04 desktop版本,还有个server版本,貌似不带UI但是会带一些其它比如SQL等服务器应用。虽然这个机器我们用作深度学习服务器但还是装desktop版本合适一点。
然后用rufus或者UltraISO(软碟通)向U盘中写入镜像,和Win PE一样启动安装即可。这里踩了个坑,插上U盘启动后提示initramfs unpacking failed,然后就黑屏了再也没反应了,后来把U盘插其它电脑上是能用的所以应该不是镜像的问题。没具体定位到是什么问题,听说是Nvidia显卡的缘故。但是有以下几点可能是造成问题的原因:

  1. 试了下把Win10启动从CSM改成仅UEFI就行了。另外装Win+linux双系统要在Windows下和BIOS里关Fast Boot,不然听说会有问题,没深究照做了。
  2. 在用U盘引导启动的时候,先按E进入启动前命令的文本编辑器,在linux下那行加“nouveau.modeset=0”后再F10启动。
  3. 还是不行的话,U盘引导的时候不要选第一个“Ubuntu”,而选第二个带安全的图形模式。装完系统后正常进系统可能是黑屏+花点,这时候开机引导操作系统的时候不要选第一个“Ubuntu”,选第二个“Ubuntu高级选项”,进去以后再引导系统。进系统后把显卡驱动装上应该就可以了。

装linux双系统的教程其实网上一大把,过程很简单,坑点主要在于别忘了建EFI引导分区!
<<<挂载点-无 逻辑分区 空间起始位置 文件系统类型 efi 文件系统 大小1~2GB>>>
分区的话,一般/boot分1GB,/swap我分了4GB毕竟物理内存够大了(虚拟内存),/分了50GB,/home剩
下所有,算上efi分区总共有5个分区。分区参考:https://blog.csdn.net/chencaw/article/details/101106073。其实只分/swap和/两个分区也不是不可以,只不过/分区和/home分区分开的话重装可以不动/home分区。
BIOS中启动项里,所有的硬盘都会被归为UEFI Hard Disk一项,需要制定启动先windows盘还是ubuntu盘需要在BIOS里的UEFI Hard Disk BBS Priority里调整顺序,选择ubuntu启动后再选择启动的操作系统。

另外由于我主屏是个4K屏,需要在linux里设置缩放,但是缩放只有100%、200%、300%、400%四个选项也太蠢了点吧!输入法切换是没有快捷键的,但是中文输入法按shift是能中英文切换的。ubuntu自带了火狐浏览器竟然能上网这也太神奇了。

局域网配置

首先sudo apt update和sudo apt upgrade就不说了。

SSH

sudo apt install openssh-client # 安装ssh包
sudo apt install openssh-server
sudo /etc/init.d/ssh start # 启动ssh服务
ps -e | grep ssh # 查看ssh是否启动

FTP

sudo apt install vsftpd # 安装ssh包
sudo vim /etc/vsftpd.conf # 更改ftp配置文件
*注意添加allow_writeable_chroot=YES**,否则会报ftp会报500错误

  1. listen=NO
  2. listen_ipv6=YES
  3. #是否允许匿名访问,NO为不允许
  4. anonymous_enable=NO
  5. #是否允许本地用户访问,就是linux本机中存在的用户,YES允许
  6. local_enable=YES
  7. #去掉下边这句的注释"#"。是否开启写模式,YES为开启
  8. write_enable=YES
  9. #是否启动userlist为通过模式,YES的话只有存在于userlist文件中的用户才能登录ftp,NO的话,白名单失效,和下面一个参数配合使用
  10. userlist_enable=YES
  11. # If enabled, vsftpd will display directory listings with the time
  12. # in your local time zone. The default is to display GMT. The
  13. # times returned by the MDTM FTP command are also affected by this
  14. # option.
  15. use_localtime=YES
  16. # ftp 日志记录允许
  17. xferlog_enable=YES
  18. # 启用20号端口作为数据传送的端口
  19. connect_from_port_20=YES
  20. #是否限制本地所有用户切换根目录的权限,YES为开启限制,即登录后的用户不能访问ftp根目录以外的目录,这个如果是自己用就直接注释掉chroot"开头的下边这三句吧(为了自己方便),有其他用户的话就打开。
  21. chroot_local_user=YES
  22. secure_chroot_dir=/var/run/vsftpd/empty
  23. pam_service_name=vsftpd
  24. rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
  25. rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
  26. ssl_enable=NO
  27. # 添加以下语句允许写入
  28. allow_writeable_chroot=YES

sudo /etc/init.d/vsftpd restart # 重启ftp服务

本地回路局域网配置

由于x299 Creator主板集成了万兆网卡,那当然不能浪费啊,于是淘宝买了个杂牌COMFAST PCIE万兆网卡插在自己主机上,直接用网线连接server通过本地回路构建万兆局域网。
本地回路用的是192.168.0.xxx的ip,其中主机设置为192.168.0.1,从机可以设置为192.16.0.2~254中任意的ip。子网掩码均为255.255.255.0,网关均为192.168.0.1。
Windows机器作为主机的配置如下(DNS不用填):
image.png
ubuntu系统中可以轻松地从桌面UI进行配置,ubuntu的设置中一般有wifi和network两个选项,分别对应无线网和有线网。
万兆局域网搭建以后,首先ssh协议的损耗是比较大的,用scp传的话只能跑到2.5Gbps左右,用ftp才能跑满带宽。MobaXTerm的ssh就更拉跨了,1Gbps都跑不到。ftp软件试了fileZilla、flashFxp、MobaXTerm,速度都一样。
我碰到的问题是,网卡状态显示的已经是10Gbps了,server运行Windows系统开共享文件夹也能达到双工10Gbps,但是server运行ubuntu系统的时候,只有server传host是10Gbps的速率,host传server只有3Gbps左右的速度。但是我把我电脑搬到后面和2号机的万兆网卡直连就能有双工10Gbps的速率……怀疑过系统问题,重装了和2号机一样的18.04版本ubuntu后无果;怀疑买到假的西数黑盘,在server和host端都开了ramdisk后无果。尝试了网上各种方法比如开9000巨帧等等,均无果。重装回20.04系统也没用。
烦,不管了,就这么用吧又不是不能用,假装买了个2.5G网卡。

Zerotier(翻车,实验室内网过的NAT太多无法打洞)

这个软件有点意思,是耿老师推荐的。它实现了将所有需要连入局域网的主机都和云端连为一体,通过云端服务器转发实现物理上不在局域网内的机器实现局域网通信。
使用直接百度zerotier,跟着官网的步骤走就行了。linux端安装方法:

  1. curl -s https://install.zerotier.com/ | sudo bash # 下载并安装
  2. sudo systemctl enable zerotier-one.service # 开机自启动
  3. sudo systemctl start zerotier-one.service # 启动服务
  4. sudo zerotier-cli join xxxxxxxxxxxx # 加入网络,xxxx为zerotier官网注册的网络id

按理来说所有机器装上zerotier就可以了,但是zerotier官方的服务器在境外且非常不稳定,很多时候都需要我们自己搭云端的moon服务器。赶着腾讯云的学生优惠108一年入了坑。

moon端配置

首先和上面说到的leaf端一样安装,但不需要加入网络,接着导出json文件。

  1. curl -s https://install.zerotier.com/ | sudo bash # 下载并安装
  2. cd /var/lib/zerotier-one # 生成moon.json文件,包含moon信息
  3. sudo zerotier-idtool initmoon identity.public > moon.json

接下来在json文件中写入外网ip:vim moon.json。本来stableEndpoints后面是空的,在里面填入外网ip,比如:”stableEndpoints”: [ “23.23.23.23/9993” ],其中9993为UDP端口,需要在云服务器的防火墙中开启9993的UDP端**口!!!**
接着生成.moon文件并拷贝至zerotier文件夹下,并重启服务:

  1. $ sudo zerotier-idtool genmoon moon.json # 生成.moon文件
  2. $ mkdir /var/lib/zerotier-one/moons.d # 在zerotier文件夹下创建moons.d文件夹
  3. $ mv 000000xxxxxxxxxx.moon moons.d # 将.moon文件移入moons.d文件夹
  4. $ service zerotier-one restart # 重启zerotier服务

leaf端配置

Linux: 直接在zerotier目录下(通常为/var/lib/zerotier-one),创建moons.d文件夹,并且将生成的000000xxxxxx.moon文件拷入,然后service zerotier-one restart重启服务即可。
Windows:找到zerotier的目录(通常为C:\ProgramData\Zerotier\One),在其下建立moons.d文件夹,然后将moon服务器下生成的000000xxxxxx.moon文件拷入(win和linux用的.moon是相同的)。然后再重启该服务即可(开始菜单输入“服务”,zerotier-one右键重新启动即可)

检测配置结果:zerotier-cli listpeers

autossh端口转发(翻车,会频繁掉线)

zerotier是一种打洞的方法,需要通信的主机与moon交互后相互知道对方的位置后就能直接开始交互。但是对于NAT复杂的环境,“打洞”失败的概率很高(像实验室这种由两个路由器还在学校局域网范围内,zerotier稳定性就非常差)。
另一种方法是用云服务器做端口转发,所有的交互都是经过云服务器转发的,缺点是受限于云服务器带宽。这里用到了autossh,因为普通ssh断了以后不会主动重连,而这个连接是需要内网服务器主动与云服务器连接的,autossh会自动在断开后重新连接。

参考:https://www.litreily.top/2018/11/25/autossh/

  1. 修改云服务器配置

修改/etc/ssh/sshd_config,加入“GetewayPorts yes”后退出,然后“sudo service sshd restart”重启ssh服务。

  1. 在内网机器上配置autossh ```bash $ sudo apt install autossh # 安装autossh

$ /usr/bin/autossh -p 22 -M 27400 -NR “*:1233:localhost:22” root@xxx.xxx.xxx.xxx -p 22

  1. # 这里的27400端口用于监测ssh是否还成功连接,随便填就行
  2. # root@xxx.xxx.xxx.xxx需要改为自己公网云服务器的信息
  3. # 1233端口为云服务器用于转发的端口,可以随便填但需要在云服务器的防火墙里打开这个端口
  1. 可以在云服务器上通过“sudo netstat -tunlp | grep 1233”,可以看到占用了1233端口的进程,如果没代表配置不成功。如果内网服务器上显示“remote port forwarding failed”而云服务器上显示有占用了1233端口的进程,那就kill它。
  2. ```bash
  3. $ ssh -p 1233 lzy@localhost # 用这个端口可以连接处于内网的机器,
  4. 任意机器可以先ssh上云服务器再这么登录内网机器
  1. 内网机器密钥(内网机器登云服务器就不用输密码了,之后有用) ```bash $ ssh-keygen $ ssh-copy-id root@xxx.xxx.xxx.xxx

$ ssh root@xxx.xxx.xxx.xxx # 这时候应该发现已经不需要你输密码就能登云服务器了

  1. 4. 内网机器autossh开机自启动
  2. 建立service文件:/lib/systemd/system/autossh.service,输入以下内容,记得自己改以下ExecStart内容:
  3. ```bash
  4. [Unit]
  5. Description=Auto SSH Tunnel
  6. Wants=network-online.target
  7. After=network-online.target
  8. [Service]
  9. User=root
  10. Type=simple
  11. Environment="AUTOSSH_GATETIME=0"
  12. ExecStart=/usr/bin/autossh -p 22 -M 27400 -NR "*:1233:localhost:22" root@xxx.xxx.xxx.xxx -p 22
  13. ExecReload=/bin/kill -HUP $MAINPID
  14. ExecStop=/bin/kill -TERM $MAINPID
  15. KillMode=process
  16. Restart=always
  17. [Install]
  18. WantedBy=multi-user.target
  19. WantedBy=graphical.target

然后启动这个服务:

  1. systemctl enable NetworkManager-wait-online
  2. systemctl enable autossh.service # 开机自启动
  3. systemctl start autossh.service # 启动服务
  4. service autossh status # 查看frpc的运行状态
  5. # systemctl disable autossh.service # 关闭开机自启动

frp内网穿透

  1. 根据系统下载frp,linux下载linux_amd64版本:https://github.com/fatedier/frp/releases

  2. 将压缩包复制到所有参与内网机器(内网机器、云服务器)的/usr/local目录,解压。(注意改下路径里fpr版本号为你实际下载的版本号别复制了直接跑)

    1. cd /usr/local
    2. tar -zxvf frp_0.13.0_linux_amd64.tar.gz
    3. cd ./frp_0.13.0_linux_amd64

    里面包含了frpc、frps两个部分,分别对应frp-client和frp-server。在server上删去client分支,在client上删去server分支,防止误执行。另外要为需要的分支添加执行权限(chmod +x)。
    在云服务器(server端)上:

    1. rm -rf ./frpc ./frpc.ini ./frpc_full.ini
    2. chmod +x ./frps

    在内网机器(client端)上

    1. rm -rf ./frps ./frps.ini ./frps_full.ini
    2. chmod +x ./frpc
  3. 更改配置

在云服务器(server端)上配置frps.ini:

  1. [common]
  2. bind_port = 7000 # 监听端口,随便填,不是暴露给外网的端口,默认7000建议别改
  3. token = 123456 # token是密钥,随便填,但是内网中所有机器的token必须一样
  4. # 控制台配置,配好后可以在外网通过xxx.xxx.xxx.xxx:7500,用户名user密码password登录
  5. dashboard_addr = 0.0.0.0
  6. dashboard_port = 7500
  7. dashboard_user = user
  8. dahboard_pwd = password

在内网机器(clinet端)上配置frpc.ini:

  1. [common]
  2. server_addr = xxx.xxx.xxx.xxx # 云服务器的公网ip
  3. server_port = 7000 # 云服务器的监听端口,必须和frps.ini里一致,默认7000建议别改
  4. token = 123456 # token是密钥,随便填,但是内网中所有机器的token必须一样
  5. [lzyserver-ssh] # 方括号内是连接名称,A机器用了[ssh]那B机器就不能用[ssh]了,所以加个机器id
  6. type = tcp
  7. local_ip = 127.0.0.1
  8. local_port = 22 # 需要转发的端口,ssh端口为22
  9. remote_port = 6233 # 云服务器暴露给外网的端口,随便填,记得在云服务器防火墙里打开这个端口
  10. # A机器用了6233后B机器就不能用了,必须换一个
  11. [lzyserver-tb1] # 下面两个连接是给tensorboard用的,不用可以去掉
  12. type = tcp
  13. local_ip = 127.0.0.1
  14. local_port = 6001
  15. remote_port = 23301
  16. [lzyserver-tb2]
  17. type = tcp
  18. local_ip = 127.0.0.1
  19. local_port = 6002
  20. remote_port = 23302

其实这时候在server侧nohup frps -c frps.ini &,在client侧nohup frpc -c frpc.ini &,就已经可以通了。
在外网机器中通过以下命令就可以ssh上去了:
ssh -p 6233 内网机器用户名@xxx.xxx.xxx.xxx
在内网机器中tensorboard 巴拉巴拉 —port 6001,然后在外网机器浏览器中也可以看到tensorboard了:
xxx.xxx.xxx.xxx:23301

  1. 配置开机自启动

vim /lib/systemd/system/frps.service (这是云服务器的server侧)
vim /lib/systemd/system/frpc.service (这是云服务器的client侧)

下面以client侧举例,server侧稍微改一下s和c字母就行。(注意改下路径里frp版本号为你实际下载的版本号别复制了直接跑)

  1. [Unit]
  2. Description=frpc service
  3. After=network-online.target
  4. Wants=network-online.target
  5. [Service]
  6. Type=simple
  7. Restart=always # 这行不写的话服务挂了就起不来了
  8. ExecStart=/usr/local/frp_0.34.3_linux_amd64/frpc -c /usr/local/frp_0.34.3_linux_amd64/frpc.ini
  9. ExecStop=/bin/kill $MAINPID
  10. [Install]
  11. WantedBy=multi-user.target

然后开启服务:

  1. systemctl enable NetworkManager-wait-online
  2. systemctl enable frpc.service # 开机自启动
  3. systemctl start frpc.service # 启动服务
  4. service frpc status # 查看frpc的运行状态
  5. # systemctl disable autossh.service # 关闭开机自启动

如果service frpc status里看到没有跑成功,报错“main process exited, code=exited, status=203/EXEC”,是因为frpc/frps没有运行权限,需要添加一下运行权限,参考第二步。
如果开机重启后报错“connect: network is unreachable, code=exited, status=1/EXEC”,是因为网络原因,确保service文件里的After、Wants为“network-online.target”,Restart为“always”。

环境搭建

显卡驱动安装

  1. sudo apt-get remove --purge nvidia* # 移除原有驱动
  2. sudo apt-get install nvidia-driver-450 # 最后的为版本号
  3. nvidia-smi # 检查驱动是否安装完成

nvidia-smi

nvidia-smi命令可以查看GPU信息
watch -n 0.5 nvidia-smi:每0.5秒刷新一次nvidia-smi,非常好用!
nvidia-smi dmon:查看GPU的核心频率与显存频率
nvidia-smi -pl 200:限制TDP为200瓦

CUDA安装

NVIDIA官网下载地址:https://developer.nvidia.com/cuda-toolkit-archive
选择适当的CUDA版本,点进去后可以看到应该用什么命令来装。装的过程中可能提示:“Existing package manager installation of the driver found. It is strongly recommended that you remove this before continuing.”,不用管,continue就行,但是在接下来选择安装项的时候把显卡驱动去掉。
等安装程序完成后,会输出Summary结果,告诉我们要将指定目录加入环境变量。(复制的时候注意改一下版本号)
sudo vim /etc/profile,在末尾添加以下信息:(/etc/profile是为所有用户添加环境变量)

  1. export PATH=$PATH://usr/local/cuda-11.0/bin
  2. export LD_LIBRARY_PATH=/usr/local/cuda-11.0.lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

source /etc/profile刷新一下环境变量,然后执行如下命令检测CUDA是否安装成功:nvcc -V

查看CUDA版本:cat /usr/local/cuda/version.txt
查看CUDnn版本:cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2

注意!!!Pytorch里CUDnn默认是关闭自动搜索最佳卷积方式的,必须手动设置flag:

  1. import torch.backends.cudnn as cudnn
  2. cudnn.benchmark = True

Pytorch默认关闭CUDnn时因为,如果不是分类这种简单任务,网络模型专门会变,或者特征图大小专门会变这种情况,CUDnn就需要持续不断地搜索合适的卷积方式,反而降低了效率。
不过开CUDnn会有一个副作用——会导致计算结果有略微随机性,影响固定随机数种子时的完全可复现性。

Anaconda安装

Anaconda官网下载地址:https://repo.anaconda.com/archive/
选择适当的Anaconda版本,下载sh文件后直接sudo sh xxx.sh即可。添加环境变量:vim ~/.bashrc,在末尾加入以下信息:(~/.bashrc只为当前用户添加环境变量)

  1. export PATH="/home/lzy/anaconda3/bin:$PATH"

完了之后source ~/.bashrc刷新一下环境变量。

Anaconda的虚拟环境默认为(base)
conda create -n env_name python=version # 创建名为env_name的虚拟环境
conda activate env_name # 激活名为env_name的虚拟环境
conda deactivate # 退出当前虚拟环境
conda remove -n env_name —all # 删除名为env_name的虚拟环境
conda info -e # 列出所有虚拟环境

Pytorch安装

  1. conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
  2. conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
  3. conda config --set show_channel_urls yes
  4. conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
  5. conda install pytorch torchvision cudatoolkit=x.x

垃圾恩杰水冷的linux控制

真的是,之前没发现恩杰的这种操作,水泵只能用恩杰的软件NXZT CAM控制,并且这个软件只有Windows版本,Linux用户就不配用恩杰的东西么???京东的客服一问三不知,引导至QQ群问技术客服,技术客服嘴臭得很还让我别用Linux用Windows我特么的。。。真的拉黑了,同志们记住了,以后别买恩杰!
接下来是比较硬核的自己找API在Linux下控制冷头的方法。。。

liquidctl安装

liquidctl库的github地址:https://github.com/jonasmalacofilho/liquidctl
这是一个基于python的API,因此依赖python3环境。装之前还有一部分其它的依赖项,详见github。其中hidapi比较烦,不能直接pip:

  1. $ sudo apt-get install python-dev libusb-1.0-0-dev libudev-dev
  2. $ sudo pip install --upgrade setuptools
  3. $ sudo pip install hidapi

依赖项装完后直接pip装liquidctl:

  1. pip install liquidctl

使用方法

github中有根据不同水冷型号的使用guide,支持恩杰、海盗船的好多型号。在此以我使用的恩杰x73举例。执行以下指令均需要su权限。

  1. liquidctl initialize # 初始化
  2. liquidctl status # 查看水泵情况,包括水温、转速等
  3. liquidctl set pump speed 90 # 调整水泵转速为90%,其实还有智能温控方法,不过对象只能是水温不能是CPU
  4. 温度,过于愚蠢,因此不推荐使用
  5. liquidctl set logo color fixed ffffff # 设置log的rgb为白色常亮
  6. liquidctl set ring color spectrum-wave # 设置光环的rgb为色相变化波

开机自启动

github里也有说开机自启动的方法(它好好,打call),我自己尝试了用/etc/rc.local的方法但是失败了。

建一个文件:/etc/systemd/system/liquidcfg.service,写入开机需要运行的内容,以下展示一个我使用的模板。需要注意的是,github里原文中ExecStart中的命令为liquidctl而没有路径,我跑了以后发现会报找不到命令,应该是环境变量的问题。我直接用which liquidctl指令查看了liquidctl被装在哪后往脚本里加了路径就好了。

  1. [Unit]
  2. Description=AIO startup service
  3. [Service]
  4. Type=oneshot
  5. ExecStart=/home/lzy/anaconda3/bin/liquidctl set ring color spectrum-wave
  6. ExecStart=/home/lzy/anaconda3/bin/liquidctl set logo color fixed ffffff
  7. ExecStart=/home/lzy/anaconda3/bin/liquidctl set pump speed 75
  8. [Install]
  9. WantedBy=default.target

水泵60%以下很安静几乎没噪音,70%~85%离50cm有可以听见的噪音,85%以上噪音更明显。我是直接开机拉到75%,有CPU高负载任务时再手动拉满。