AI长漫漫,Linux路更艰——记一次Linux新手入门AI的艰难过程

虽说我刚开始并不是很想专门写一篇文章来记录的,毕竟不就炼个丹嘛,网上各种教程满天飞,甚至不少大佬直接连懒人包都做好了,就差喂你嘴里了,我再来写岂不是有水博客的嫌疑?但是,网上的所有教程几乎都是针对Windows操作系统的用户的,对于Linux用户,尤其是和我一样的新手,难免会遇上各种各样的问题。经过我大约一周时间的摸爬滚打,终于受不了了,于是就有了这篇文章。对了,和以前不同,这次我真的是在边操作边写的,要问为什么,当然是把系统玩蹦了,又得从重装系统开始一步一步来了。这隔着屏幕的无奈,相信你们也能感受到o(╥﹏╥)o。希望用我的前车之鉴警示后人和未来的我。So,Windows yes!Linux fuck you!

简介&&开箱节目

国际惯例,我还是简单介绍一下硬件。既然要炼丹,就要整一张显卡。由于家境贫寒,加上只是尝鲜而已,因此我选择了NVIDIA P104-100纯纯大矿卡。如果没有错的话,这应该是市面上最便宜的8G显存的显卡了吧。

对于P104,著名文学大师高尔基是这么评价的:“你以为的美女一手自用99新显卡,其实早已成为矿老板的星怒”。古希腊哲学大师阿基米德也曾说过:“给我一张P104,我能挖穿整个矿场”。就连著名评论家,美国五星上将麦克阿瑟也坦言:“不是4090我买不起,而是P104她更有性价比”。大型纪录片之P104传奇,将持续为您播出。

先说说优点吧,1、价格便宜。这张卡天生就是作为矿卡卖给矿老板挖矿的,现在矿潮结束,P104及它的姐妹P106、P102、30/40HX等大量流入二手市场,基本都是当电子垃圾级别来卖的,便宜得狠。我买这张P104只花了120块钱,这还是涨价后的价格,可见其有多便宜,正好适合想入门AI却不想多花钱的人;2、大显存。8G显存可以说是一个分水岭,大于8G和小于8G简直一个天一个地的差别,而P104恰好有8G显存,跑大部分AI训练足矣;3、不俗的算力。P104有着与GTX1070相同的阉割版gp104核心,拥有6.5T Flops的单精度浮点性能,对入门AI来说再适合不过。

当然,有得必有失。由于是专门的矿卡,P104不仅被砍了视频输出和解码,就连PCIE通道也只剩下可怜的1.1×4,就算使用魔改驱动通过核显进行输出,这大残的PCIE通道也让它发挥不出应有的性能,用来打游戏甚至不如比它便宜20块,但PCIE通道有x16的P106。所以想用来打游戏的话,还是尽早放弃吧;再者,这些矿卡都是经历过至少两次矿潮的“两朝元老”,全天24h高强度训练,还能活到你手上已经是个奇迹了,保不准哪天他就嗝屁了。

下面具体展示一下我购入的P104。

开箱

虽说是不值钱的矿卡,但卖家包装还是很用心,质保也很到位,给到了14天包换和3个月保修。

正面

我买的是一块影驰的卡,单8pin,双风扇。这种矿卡建议选择供电接口少的,供电接口多意味着功耗更大,为了那5%的性能而多花20%-30%的功耗和更大的发热和噪音,显然不值得。

背面

整张卡正面和背面成色还不错,卖家清灰做的不错,散热鳍片残留些许的灰也证明了并非水洗。

挡板

挡板有明显氧化痕迹,毕竟18年出厂的卡还二进矿场,正常。

开箱节目结束后,开始正式上机。要装上的机器是我上一篇文章组的百元神机,配置为i3 2120+8G DDR3+120G固态+450w杂牌电源。这里可能有人会说“P104必须要上4代以上的平台,2代太老用不了”,实际上,如果用来装魔改驱动核显输出使用的话,确实不建议用4代之前的平台,会出很多bug,但是,我现在这张P104仅用于计算,不用于画面处理,当然没必要改注册表打魔改驱动什么的,也就不会存在能不能用的问题了,换句话说,如果只用于计算,不管多老的平台,只要是这张卡能插上去,打上官方驱动,他就能正常使用。

“小插曲”

要是不出意外的话,就要发生意外了。当我满心欢喜插上电脑开机后,在系统中竟然识别不到显卡!!驱动也打不上。起初我还以为是系统(debian12)问题,就重装了系统(debian11),结果还是识别不到。我不死心,用u盘进入PE系统,想着windows系统上总能识别出来了吧。结果还是识别不到!!于是我才开始怀疑硬件上的问题。难不成显卡没插紧?拔了再重插,没用。Bios没设置好?把bios都摸光了一遍,没用?显卡是坏的?通电后显卡风扇正常转,况且卖家不可能直接发坏的过来,要这样不就是给自己找麻烦吗?经过几个小时的查找资料和尝试,终于找到了原因。原来是因为P104虽然是x16的接口,但却只能走x4通道,插上后大部分较新的主板都会自动适应x4的协议,而对于一些较老的主板(如我本次使用的h61),就不能自适应x4协议,导致主板识别不到显卡。既然做不到自适应,那么我们就只能“手动适应”,方法是用胶带将显卡接口上第20针(包括20)后面的触点屏蔽起来

结果呢?自然是轻松秒杀!虽然我很讨厌CSDN,但我还是要在此感谢这位CSDN网友的文章,要是没有这篇文章的指点的话,我估计又得兜兜转转好几天。解决了这个“小插曲”,我们就可以正式进入下一步了。

安装显卡驱动&&CUDA

前面都是开胃菜,接下来才是重量级。如果是windows系统的话,那安装驱动和CUDA简直如喝水一样简单,但在linux下就疑似过于复杂化了。更气人的是,我当时安装CUDA的时候竟然找不到debian12的CUDA安装包,无奈只能回退debian11,结果过几天后再去看,就已经出现debian12的安装包了,早不发晚不发,偏偏等我重装完系统后发,你说气人不?而且这逼debian11还有个bug,就是一段时间不使用网络后,网卡就会自动休眠,还找不到关闭休眠选项!导致我的DDNS根本用不了,后面不得不设置自动任务每隔一段时间curl一下才解决。

咳咳,偏题了,下面直接进入安装环节。由于安装CUDA会顺带给你安装显卡驱动,我这里就不再单独去安装显卡驱动了(单独安装驱动也是麻烦得很,又是安装内核又是禁用Nouveau的,当时我安装的时候真就报错满天飞)。由于我懒得配置代理,网络安装会很慢,索性就使用了本地安装,用主力机将本地安装包下载下来,再传到这台炼丹机进行安装。就按如下代码运行就好,最后一步中途会让你选择是否安装显卡驱动,选是就行。我当时应该就是在安装显卡驱动时,不明不白地把某个系统服务disable了,导致图形化界面用不了,无奈只能重装。

#wget https://developer.download.nvidia.com/compute/cuda/12.3.0/local_installers/cuda-repo-debian11-12-3-local_12.3.0-545.23.06-1_amd64.deb
sudo dpkg -i cuda-repo-debian11-12-3-local_12.3.0-545.23.06-1_amd64.deb
sudo cp /var/cuda-repo-debian11-12-3-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt install software-properties-common
sudo add-apt-repository contrib
sudo apt-get update
sudo apt-get -y install cuda-toolkit-12-3

安装成功后,输入以下代码查看cuda版本

nvcc -V

如果提示找不到,可以输入下面的命令,查看cuda是否正确安装,有显示的话说明安装成功

whereis cuda

接下来运行以下代码

nano ~/.bashrc 

在末尾加入如下几行,保存退出

# cuda
export LD_LIBRARY_PATH=/usr/local/cuda/lib64
export PATH=$PATH:/usr/local/cuda/bin

执行

source ~/.bashrc

然后再输入nvcc -V,这样就有显示了。若想查看显卡驱动是否成功安装,可以使用以下命令查看显卡信息,有输出的话就成功打上了。

nvidia-smi

安装Python3&&环境依赖

上面成功后,接下来可以开始安装Python了。以下介绍两种安装Python3的方法。

首先是编译安装,我们以Python3.8.9为例,首先要到官网下载源码,下载对应版本的源码压缩包,传到服务器里解压就行。Python版本不是越高越好,要看项目是否支持。

之后安装构建Python源代码所需的软件包

sudo apt update
sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev curl

安装gcc编译器和make

sudo apt install gcc
sudo apt install make

进入文件夹,配置后编译

cd Python-3.8.9
./configure --enable-optimizations
sudo make

经过漫长的编译过程后,就可以安装了

sudo make altinstall

查看python版本

python3.8 --version

Python编译安装好后,应该是没有pip的,不能使用pip install命令,解决办法就是运行以下命令

python3.8 -m ensurepip --upgrade

如果觉得编译安装比较繁琐,可以使用包管理器安装。此处以apt为例,直接一条命令搞定。

sudo apt install pip

默认安装的是Python3.9.2,实测影响不大(至少对so-vits 4.1来说),要想指定版本安装,如3.8,可以改成如下命令

sudo apt-get install python-software-properties#安装Python软件工具
sudo add-apt-repository ppa:fkrull/deadsnakes#添加仓库镜像源
sudo apt-get update #更新源
sudo apt-get install python3.8#从本地仓库安装python

安装完python3后,就可以安装环境依赖了。还是以so-vits4.1为例。首先将项目从github上克隆下来。进入so-vits4.1目录,执行以下代码安装环境。就这么简单。

sudo pip install -r requirements.txt

又是漫长的等待。

“小插曲”

由于训练和推理的时候要使用tensorboard和webui服务,分别占用6006和7860端口。但是不知道出了什么原因明明在本地可以正常访问,但在内网的其他设备和公网均无法访问。这个问题说实话很玄学,为什么那么说呢?早在我没买这张P104之前,我在服务器上开了个mc server,当时用的是debian12,即使确定了没有打开任何防火墙也还是出现了如上本机正常访问,内网和公网却无法访问的问题,奇怪的是,当我换一个纯净版的mc server后,竟然又能在内外网正常访问了。我当时只能把它归结于服务器核心的问题,最后实在没有办法,只能绕个大弯,使用Nginx的tcp代理才解决。而这次换到debian11,还是遇到了同样的问题,那么老方法,再配置一遍Nginx吧。

2024/6/3补充:此处为我的问题,tensorboard,webui服务及之前的mc server,默认监听的地址都为127.0.0.1,导致了其只能本地访问,要想从另一台电脑访问服务器(不论内外网),需要将监听地址改为所有地址(0.0.0.0),才能正常从其他设备访问。不过这样同样会面临一个问题,就是要么只能监听所有ipv4,要么监听所有ipv6([::]),想要实现内网通过ipv4访问,外网通过ipv6访问,最终还是需要配置tcp代理功能,可以说殊途同归了吧。

虽说nginx的安装可以使用包管理器一条命令安装,但我还是选择编译安装。为什么呢?因为我到时候还要使用nginx的tcp代理功能,而tcp代理需要使用到stream模块的,而nginx默认是不会安装stream模块的,这时候就需要编译安装来指定安装stream模块。(当然如果只是http代理的话就没必要这样做了)

首先是源码的下载。和python一样,这里不过多介绍。进入目录,运行以下命令,其中 “ –with-stream”这个参数就是指定安装stream模块,其他模块同理。

./configure --with-stream --with-http_ssl_module --without-http_rewrite_module

编译及安装

sudo make
sudo make install

cd到安装目录,默认是这个

cd /usr/local/nginx

再在sbin目录下运行这条命令,不然到时候会报错

sudo ./nginx -c /usr/local/nginx/conf/nginx.conf

打开conf目录下的nginx.conf文件,在http括号里加上一个server服务,如下

server {
        listen       8080;                         //监听本机的8080端口,可以改成别的
        server_name  tensorboard;        //名称

        location / {
            proxy_pass http://127.0.0.1:6006;         //将请求传到本机6006端口
        }


        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

保存退出后,再在sbin目录下运行以下命令更新配置,完成。最好把nginx设成开机自启,不然每次都要手动开启太麻烦了。

sudo ./nginx -s reload

至此,所有准备工作已经全部完成,接下来就可以开心炼丹了!

总结

说实话这篇文章内容有些杂,既不是单纯的硬件评测,又不是教学(毕竟很多东西我自己都不会)。所以,就当做一篇分享记录吧。老手们就权当看个乐呵,遇到相同问题的同志也希望看完后对你有所帮助。最后也不知道要说啥了,就说说这张P104吧。

实测这张P104跑so-vits前期每小时大约能跑到3.4k~3.5k步,后期大概3.3k~3.4k步。就拿我来说,每天从下午1:30开始跑,大约跑到10:30,期间9h,跑个3w步不是问题;而一个中等大小的数据集,基本上跑到8w步效果就已经非常不错了,这样一来保守估计3天就能出一个较高质量的模型,这速度对于我来说已经非常可观了,毕竟有时候找个2h以上的高质量数据集就得花不少时间。但是AI绘图那边估计表现就没那么突出,毕竟不支持半精度浮点,会被20系以上的显卡甩开一条街。但他都只卖120块了,还要啥自行车,总不能拿3000块的三轮和30万的半挂比拉货吧。

让我难受的反倒是功耗和噪音方面。这张矿卡TDP有180w,而我笔记本功耗释放也才160w,光一个显卡就顶一台满载的游戏本功耗了,这要是在一些限电严的宿舍里面,估计很容易把宿舍干跳闸。此外,这卡估计还用的是挖矿专用的bios,开机后不管温度如何,风扇就锁在75%,再加上这个被矿老板开发了5年,今天不转明天转的破烂风扇,噪音那真是一绝,搁老远都听得到。这也就是为什么我每天要1:30舍友都醒之后才开始炼丹,要不然过几天后不是皮炎烂就是被静步刀了。还好可以通过coolgpus将风扇降到30%,此时温度也就68°,噪音也相对小了一些。(能压住是因为训练时显卡压力还不算太大,显卡占用率一直在在80~100%间跳动,感觉是cpu性能不够或者是磁盘IO低的原因,训练扩散模型时温度和风扇转速都高了不少)

总之,如果预算很低又想要入门AI,不嫌弃矿卡,不在意功耗的话,P104绝对是性价比首选,它比起价格差不多的P106-100,不仅算力是他的1.5倍,显存还多了2G;而他的大哥P102,虽然性能更强,显存更多,但是价格翻了一倍,功耗和发热也都是老核弹级别,故障率也非常高。如果不想买矿卡或者觉得功耗太高的话,可以考虑Tesla P4,正儿八经的计算卡,目前300多就能买到,8G显存,GTX 1080同款核心(满血gp104核心,拥有2560个CUDA),但由于功耗被限制在75w,性能比180w的P104稍低,约是1060水平,且没有主动散热,还得自己加个小涡轮扇才行。不过不像P104这些被砍了视频编解码单元,P4不拿来炼丹时还能给家庭影音服务器进行实时视频转码。如果预算再多点,还可以选择矿卡30HX(1660s同款核心,性能和P104差不多)和40HX(性能介于2060s和2070),或者24G显存容量的Tesla P40。预算再往上点的话还是二手2060 12G吧,比这些矿卡和洋垃圾好不少。

发表评论

隐藏
变装