搭建个人深度学习工作站(捡垃圾)

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{写入} 启动写入硬盘映像写入方式:USBHDD+或者USBHDD便捷启动写入新的驱动器引导扇区syslinux写入
      • 后续等待写入完成即可
  • 安装系统,基本就是按部就班,网络上各种教程非常多,就不过多赘述了。

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
      

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
      
      若安装成功,会打印出显卡信息
  • 安装 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
    • 安装:
        chmod +x Anaconda3-2023.09-0-Linux-x86_64.sh
        ./Anaconda3-2023.09-0-Linux-x86_64.sh
      
      后续就一路 enter 安装下去即可。最后会问是否要初始化conda,输入yes确认,重开终端窗口之后,就可以看到conda环境可用了(base代表默认环境)
    • 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
      
      安装完成后可以新建一个容器测试一下:
        sudo docker run -it --name test_nvidia_docker --gpus all nvidia/cuda:10.1-base 
      
      进入容器之后可以跑一下nvidia-smi命令看看 GPU 状态

5 工作站维护

  • 工作站系统备份还原
    • 备份
      由于 Linux 本身具有万物皆文件的设计理念,另外 root 用户对几乎全部的系统文件都有访问和更改的权限,因此可以直接打包整个根文件系统来备份。
      在打包的时候,需要排除掉一些不需要的文件和与新系统文件冲突的文件,包括/tmp、/proc、/lost+found 等目录。对于需要备份的目录:
        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 /
      
      可以得到一个名为backup.tgz的压缩文件,这个文件包含我们需要备份的系统的全部内容
    • 还原
      如果系统没有出问题可以正常启动的话,那直接在刚刚的压缩包找到想还原的文件替换就好了。而如果系统无法启动了,或者说想换一块硬盘克隆一样的系统,那么可以按一下步骤操作:
      • 重装干净的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
        
      这一步完成后,再用我们在新系统中备份的fatab及grub.cfg 文件去替换压缩包中解压出来的同名文件,sudo reboot重启后就发现系统已经恢复到备份时的状态,包括各种框架,环境,系统设置~