搭建个人深度学习工作站(捡垃圾)
1 硬件平台
工作站考虑性价比和后续的扩展性,在二手平台搜索了几天,发现捡垃圾真香。
考虑到深度学习有多卡的需求,平台选择需要有足够多的 pcie 通道,平台选择了 Intel 十代 X 系列 CPU + X299 主板,能够提供 48 条 pcie lane,二手主板+CPU总价低于十四代 i9 CPU。大模型的显存需求比较大,魔改 22GB 显存的 2080ti 看起来很香,就先入手一块试试水,真香之后,再考虑组多卡(2080ti 支持 Nvlink)。另外内存硬盘电源这些还是要求稳,入手了新的。
配置如下:
- CPU:i9-10940x
- GPU:魔改 22GB 2080ti
- 内存:长城马甲条 32GBx2(平台最大支持8槽4通道256GB,后续需要再加)
- 主板:技嘉x299x AORUS MASTER(四个 PCIE 插槽,可以拆分 x16x8x8x8)
- 固态:2TB长城 m.2 SSD(平台可以插3块 m.2 固态,后续需要再加)
- 电源:长城金牌 1250W 模组电源
- 散热器:idcooling 360 水冷+120机箱风扇若干
- 机箱:长城 KM7 塔式机箱
2 系统安装
作为开发机器用来自己捯饬,使用的是 Ubuntu 系统
-
使用的是 ultralOS 来制作 Ubuntu 的系统启动盘
- ultralOS 下载
下载试用版即可。安装完成后,打开 ultralOS,选择继续试用。
当然,如果有能力,也支持购买完全版。 - ubuntu18.04 下载: 清华大学开源软件镜像站-ubuntu18.04
- 使用 ultralOS 打开刚才下载的 iso 文件
- 制作启动盘
- 启动 → 写入硬盘映像 → 写入方式: U S B − H D D + 或者 U S B − H D D → 便捷启动 → 写入新的驱动器引导扇区 → s y s l i n u x → 写入 \boxed{启动} \rightarrow \boxed{写入硬盘映像} \rightarrow \boxed{写入方式:USB-HDD+或者USB-HDD} \rightarrow \boxed{便捷启动} \rightarrow \boxed{写入新的驱动器引导扇区} \rightarrow \boxed{syslinux} \rightarrow \boxed{写入} 启动→写入硬盘映像→写入方式:USB−HDD+或者USB−HDD→便捷启动→写入新的驱动器引导扇区→syslinux→写入
- 后续等待写入完成即可
- ultralOS 下载
-
安装系统,基本就是按部就班,网络上各种教程非常多,就不过多赘述了。
3 系统环境配置
-
更换镜像源
# 备份镜像源列表 cp /etc/apt/sources.list /etc/apt/sources.list.bk # 编辑镜像源列表文件,这里替换的是中科大的镜像源 # 中科大源 deb https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiverse deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiverse deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-security main restricted universe multiverse deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-security main restricted universe multiverse deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse # 国内的其他源 # 阿里源 deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse # 清华源 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
-
必要软件安装
# 更新软件列表 sudo apt-get update sudo apt-get upgrade # install software sudo apt-get install vim sudo apt-get install ssh sudo apt install net-tools sudo apt install git
-
配置 ssh
这里没有配置远程桌面,主要是两方面的考虑:- 一个是自己平时开发基本用不上,使用 ssh 远程连接上去有个 terminal 就基本够用了;
- 另一方面是我的工作站主机就放在桌底墙角,主显示器很容易就可以切换到工作站的视频信号输出,因此没必要远程桌面。
# 查看本机 IP ifconfig # 在 ~/.bashrc 中添加sshd自启动脚本,其他应用程序同理 # 下面的代码添加在 ~/.bashrc 末尾 # 初始化sshd if pgrep -x "sshd" >/dev/null then echo " > sshd started" else sshd >/dev/null echo " > sshd start success" fi
-
安装 python 和 pip
sudo apt install python3 sudo apt install python3-pip
如果需要指定版本的 python,可以在后面安装完 conda 环境之后再安装,也方便管理
- 替换 pip 源
sudo vim ~/.pip/pip.conf # 把文件内容修改为如下内容(清华源) [global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple/ [install] trusted-host = pypi.tuna.tsinghua.edu.cn
- 更改默认python版本
我的习惯是 python 链接到 python2,python3 链接到 python3,python3-pip 链接到 python-pip3# 删除原来的python软链接 sudo rm /usr/bin/python sudo rm /usr/bin/python3 # 新建软链接 sudo ln -s /usr/bin/python2 /usr/bin/python sudo ln -s /usr/bin/pip3 /usr/bin/pip sudo ln -s /usr/bin/python3 /usr/bin/python3
- 替换 pip 源
4 DeepLearning 开发环境配置
-
安装 NVIDIA 显卡驱动
在图形化界面安装比较方便
KaTeX parse error: Expected '}', got '&' at position 16: \boxed{software&̲update} \righta…之后选择 NVIDIA 的最近新的驱动 apply 即可,稍等几分钟就可以安装完成
安装完成之后,更新软件列表sudo apt update sudo apt upgrade
此时运行
nvidia-smi
可能会报错,重启机器即可 -
安装 cuda
如果之前安装了旧版本的cuda和cudnn的话,需要先卸载后再安装:sudo apt-get remove --purge nvidia*
然后按照前面的方法重新安装显卡驱动,安装好了之后开始安装CUDA,如果没有安装过 cuda,可以不卸载
- 在 NVIDIA 官网下载 cuda 安装包:https://developer.nvidia.com/cuda-toolkit-archive。网站进去可能会很慢,下载速度还是很快的
- 我这里用的显卡是 2080ti,因此选择版本是:linux-x86_64-ubuntu-18.04-runfile(local)
- 运行下面的命令进行安装:
安装过程中需要选择要安装选项,不要勾选第一个安装显卡驱动的,因为之前已经安装过了。chmod +x cuda_10.1.105_418.39_linux.run sudo sh ./cuda_10.1.105_418.39_linux.run
- 设置环境变量
使环境变量生效vim ~/.bashrc # 在文件末尾添加 export CUDA_HOME=/usr/local/cuda-10.1/ export LD_LIBRARY_PATH=${CUDA_HOME}/lib64 export PATH=${CUDA_HOME}/bin:${PATH}
source ~/.bashrc
- 查看安装版本信息
nvcc -V
- 也可以编译 sample 程序来验证是否成功
若安装成功,会打印出显卡信息cd NVIDIA_CUDA-10.1_Samples/1_Utilities/deviceQuery make ./deviceQuery
- 在 NVIDIA 官网下载 cuda 安装包:https://developer.nvidia.com/cuda-toolkit-archive。网站进去可能会很慢,下载速度还是很快的
-
安装 CuDNN
在 CUDNN 官网下载 CUDNN:https://developer.nvidia.com/rdp/cudnn-download- 选择和之前cuda版本对应的cudnn版本下载,下载之后是一个 tgz 压缩文件,解压该文件:
tar -xzvf cudnn-10.1-linux-x64-v8.0.5.39.tgz
- 复制相应文件到 cuda 目录:
sudo cp cuda/lib64/* /usr/local/cuda-10.1/lib64 sudo cp cuda/include/* /usr/local/cuda-10.1/include/
- 拷贝完成之后,可以使用以下命令查看CUDNN的版本信息
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
-
安装 conda 环境
不同的训练框架和版本可能会需要不同的python版本相对应,而且有的包比如numpy也对版本有要求。频繁切换 python 和一些包的版本,容易造成包版本冲突的问题,conda 可以给每个配置建立一个虚拟的python环境,在需要的时候可以随时切换,而不需要的时候也能删除不浪费磁盘资源。- conda 官网下载 conda 的 linux 安装包:https://www.anaconda.com/download
- 安装:
后续就一路 enter 安装下去即可。最后会问是否要初始化conda,输入yes确认,重开终端窗口之后,就可以看到conda环境可用了(base代表默认环境)chmod +x Anaconda3-2023.09-0-Linux-x86_64.sh ./Anaconda3-2023.09-0-Linux-x86_64.sh
- conda 创建新环境
conda create --name python_38 python=3.8
- 进入指定的 conda 环境:
conda activate python_38
- 退出当前 conda 环境:
conda deactivate
-
安装 nvidia-docker
有时候不同的项目可能会用到不同的 gcc 版本的编译环境,或者是有不同的工具链需求。如果这些操作都在服务器本地上进行,那时间久了就会让服务器的文件系统非常杂乱,而且还会遇到各种软件版本冲突问题。
docker 可以理解为一个轻量化的虚拟环境,与服务器的本地环境隔离,可以在宿主服务器上新建很多个这种被称为容器的虚拟机,然后在里面配置我们的开发环境,且这些配置好的环境是可以打包成镜像的,方便随时做分享和重用。在使用完不需要的时候,可以直接删除容器。
Nvidia-Docker 可以把GPU暴露给Docker的容器。- Nvidia-Docker 安装:
验证是否安装成功:sudo apt-get update sudo apt-get install docker.io systemctl start docker systemctl enable docker
docker version
- 安装 NVIDIA Container Toolkit
安装完成后可以新建一个容器测试一下:##首先要确保已经安装了nvidia driver # 2. 添加源 distribution=$(. /etc/os-release;echo $ID$VERSION_ID) curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list # 2. 安装并重启 sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit sudo systemctl restart docker
进入容器之后可以跑一下nvidia-smi命令看看 GPU 状态sudo docker run -it --name test_nvidia_docker --gpus all nvidia/cuda:10.1-base
- Nvidia-Docker 安装:
5 工作站维护
- 工作站系统备份还原
- 备份
由于 Linux 本身具有万物皆文件的设计理念,另外 root 用户对几乎全部的系统文件都有访问和更改的权限,因此可以直接打包整个根文件系统来备份。
在打包的时候,需要排除掉一些不需要的文件和与新系统文件冲突的文件,包括/tmp、/proc、/lost+found 等目录。对于需要备份的目录:
可以得到一个名为backup.tgz的压缩文件,这个文件包含我们需要备份的系统的全部内容tar -cvpzf ubuntu_backup@`date +%Y-%m+%d`.tar.gz --exclude=/proc --exclude=/tmp --exclude=/boot --exclude=/lost+found --exclude=/media --exclude=/mnt --exclude=/run /
- 还原
如果系统没有出问题可以正常启动的话,那直接在刚刚的压缩包找到想还原的文件替换就好了。而如果系统无法启动了,或者说想换一块硬盘克隆一样的系统,那么可以按一下步骤操作:- 重装干净的Ubuntu系统,跟上面介绍的一样,使用U盘给目标磁盘重装一个干净的系统,这一步是为了省去自己分配存储空间和挂载的麻烦,如果你自己配置的话那也可以不做这一步
- 再次使用U盘进入系统,这次选择try ubuntu without installing,然后可以看到挂载好的刚刚安装了干净系统的另一个盘,我们在这里对盘里的根文件系统进行一些文件的提取
sudo su # 在tryUbuntu根目录下有media文件夹,里面是U盘文件夹和新安装的系统文件夹,在在里分别用(U盘)和(UBUNTU)表示 cd /media/(U盘) mount -o remount rw ./ # 将新系统根目录下/boot/grub/grub.cfg文件备份到U盘中 sudo cp /media/(Ubuntu)/boot/grub/grub.cfg ./ # 将新系统根目录下/etc/fstab文件备份到U盘中,fstab是与系统开机挂载有关的文件,grub.cfg是与开机引导有关的文件,所以这一步至关重要 sudo cp /media/(UBUNTU)/etc/fstab ./ # 这一步删除新装ubuntu全部的系统文件,有用的fstab及grub.cfg已经备份 cd /media/(UBUNTU) sudo rm -rf ./* # 将U盘中backup.tgz复制到该目录下并解压缩 cp /media/(U盘)/backup.tgz ./ sudo tar xvpfz backup.tgz ./ # 创建打包系统时排除的文件 sudo mkdir proc lost+found mnt sys media
- 备份