0%

[工作站] 我的第一台个人深度学习工作站之配置环境篇

工作站的配置有两种方式:

  • 传统方法;
  • Docker。

理论上 Docker 更好一点,因为 nvidia-docker2 是一个已经配置好的环境,不需要手动安装 CUDA 和 cuDNN,而且不需要了可以删除,更新也很方便。然而本文中将采用传统方法对工作站进行配置。使用 Docker 可以参考这篇文章

安装系统

我选择的是 Ubuntu 20.04。我在 MacOS 上制作引导盘,方法在这里。一路安装都很简单,有几个建议:

  1. 在选择安装模式的时候选择“Minimal Installation”,不安装更新和第三方软件,一会系统安装好了以后手动更新。
    两个确认框都取消
  2. 在分区时选择默认分区就好了,不需要 LVM,不要选择 ZFS。
  3. 在设置用户的时候选择 “Log in automatically”。

系统更新

安装好了 Ubuntu 并设置好网络以后,我们要做的第一件事就是更新系统、安装基础组件。工作站配置好了以后就不要轻易更新了,以免破坏环境。

1
2
>>> sudo apt-get update && sudo apt-get upgrade && sudo apt-get autoremove
>>> sudo apt install build-essential vim git curl wget make

设置 SSH

  1. 安装 SSH:sudo apt install Openssh-server
  2. 启动 SSH:sudo /etc/init.d/ssh start
  3. 开机自动启动 SSH:sudo systemctl enable ssh
  4. 在客户端生成 SSH 秘钥
    ssh-keygen 或 强秘钥 ssh-keygen -t rsa -b 4096
  5. 在客户端上传秘钥至服务器:ssh-copy-id remote-user@server-ip
  6. 关闭 SSH 密码登录 sudo vim /etc/ssh/sshd_config
    找到 #PasswordAuthentication yes 修改为 PasswordAuthentication no
    找到 ChallengeResponseAuthentication 修改为 ChallengeResponseAuthentication no
  7. 重启 SSH 服务
    sudo service ssh restartsudo systemctl restart ssh
  8. (可选)备份 SSH key
    cp ~/.ssh/id_rsa* /path/to/safe/location/

设置好 SSH 以后,我们可以在个人电脑上登录工作站。

设置防火墙

下面来设置一下防火墙,防止有坏人来捣乱。

1
2
3
>>> sudo ufw allow OpenSSH
>>> sudo ufw allow 22 # 开放端口 22
>>> ufw enable

安装显卡驱动

Ubuntu 提供了一个很简单的命令来安装显卡驱动。

1
2
>>> sudo ubuntu-drivers autoinstall
>>> sudo reboot # 重启工作站

安装 cuda 11.1

这里安装最新的 CUDA Toolkit 11.1。记得安装的时候把”安装驱动程序“取消。

  1. 安装 cuda
    1
    2
    >>> wget https://developer.download.nvidia.com/compute/cuda/11.1.1/local_installers/cuda_11.1.1_455.32.00_linux.run
    >>> sudo sh cuda_11.1.1_455.32.00_linux.run
  2. 将以下内容加进 /etc/profile:
    1
    2
    export  PATH=/usr/local/cuda-11.1/bin:$PATH
    export LD_LIBRARY_PATH=/usr/local/cuda-11.1/lib64$LD_LIBRARY_PATH
  3. 重启电脑 sudo reboot
  4. 检查cuda 版本
    1
    2
    3
    4
    5
    6
    >>> nvcc -V
    nvcc: NVIDIA (R) Cuda compiler driver
    Copyright (c) 2005-2020 NVIDIA Corporation
    Built on Mon_Oct_12_20:09:46_PDT_2020
    Cuda compilation tools, release 11.1, V11.1.105
    Build cuda_11.1.TC455_06.29190527_0
  5. 测试
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    >>> cuda-install-samples-11.1.sh ~
    Copying samples to /home/nlp/NVIDIA_CUDA-11.1_Samples now...
    Finished copying samples.
    >>> cd /home/nlp/NVIDIA_CUDA-11.1_Samples/
    >>> make # 耗时约 20 分钟
    >>> ./1_Utilities/deviceQuery/deviceQuery # 如果通过测试会显示如下信息
    ./1_Utilities/deviceQuery/deviceQuery Starting...

    CUDA Device Query (Runtime API) version (CUDART static linking)

    Detected 2 CUDA Capable device(s)
    ...
    deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 11.0, CUDA Runtime Version = 11.1, NumDevs = 2
    Result = PASS

安装 cuDNN 8.0.4

安装以前要先注册新用户

  1. 在注册后,到 https://developer.nvidia.com/rdp/cudnn-download 下载 libcudnn8_8.0.4.30-1+cuda11.1_amd64.deblibcudnn8-dev_8.0.4.30-1+cuda11.1_amd64.deblibcudnn8-samples_8.0.4.30-1+cuda11.1_amd64.deb。可以在个人电脑上下载然后 scp 给工作站,下同。
  2. 解包:
    1
    >>> sudo dpkg -i libcudnn*
  3. 检查 cudnn:
    1
    2
    3
    4
    5
    6
    7
    >>> cp -r /usr/src/cudnn_samples_v8/ $HOME
    >>> cd $HOME/cudnn_samples_v8/mnistCUDNN
    >>> make clean && make
    ...
    >>> ./mnistCUDNN
    ...
    Test passed!

    安装 Miniconda

    没必要安装 Anaconda(用不到 GUI),安装 Miniconda 就可以了。
  4. https://docs.conda.io/en/latest/miniconda.html#linux-installers 下载 Miniconda3 Linux 64-bit。运行
    1
    2
    3
    >>> bash Miniconda3-latest-Linux-x86_64.sh
    >>> source ~/.bashrc 更新 bash 环境
    >>> conda update conda
  5. 安装虚拟环境
    1
    >>> conda create --name nlp python=3.8

配置远程 Jupyter lab

安装 Jupyter lab 后可以选择 Jupyter lab 还是 Jupyter notebook,方法是在登录的域名后面加 “/lab?” 或者 “/tree?”。

  1. 生成配置文件:
    1
    2
    3
    >>> pip install jupyterlab nodejs
    >>> jupyter lab --generate-config # 生成配置文件
    Writing default config to: /home/nlp/.jupyter/jupyter_notebook_config.py
  2. 设置登录密码:
    1
    2
    3
    4
    5
    # 首先进入 python 命令行
    >>> python3
    # 在命令行下输入
    >>> from notebook.auth import passwd; passwd()
    # 按照提示输入密码,这是 jupyter 的登陆密码
  3. 设置成功会出现形如下面的哈希(hash)密码, 保存好,下面会用到
    1
    'argon2:$argon2id$v=19$m=10240,t=10,p=8$mYbUFvU1Csiwz3UGlsRwEA$q7r2mSN5RbFwjbhZCew4fg'
  4. 配置 Jupyter lab:
    1
    2
    3
    4
    5
    6
    7
    8
    >>> sudo vim /home/nlp/.jupyter/jupyter_notebook_config.py # 配置 Jupyter lab
    c.NotebookApp.ip = '*'
    c.NotebookApp.token = ''
    c.NotebookApp.password = 'argon2:$argon2id$v=19$m=10240,t=10,p=8$mYbUFvU1Csiwz3UGlsRwEA$q7r2mSN5RbFwjbhZCew4fg'
    c.NotebookApp.open_browser = False
    c.NotebookApp.notebook_dir = '/home/nlp/Documents' # 设置默认根目录
    c.NotebookApp.allow_remote_access = True
    c.NotebookApp.port = 8889 # 设置端口
  5. 防火墙开放端口
    1
    >>> sudo ufw allow 8889
  6. 注册虚拟环境
    1
    2
    3
    >>> conda activate nlp
    >>> conda install ipykernel notebook
    >>> python -m ipykernel install --user --name nlp --display-name "NLP"
    设置以后在 SSH 状态中输入 “jupyter lab” 后在浏览器地址栏里输入 “域名:IP” 就可以启动 Jupyter lab 了。 因为工作站很少关机,在 ssh 以后输入 nohup jupyter lab & 就可以让 Jupyter lab 保持在后台运行。

设置 Jupyter notebook 开机自动在后台启动(可选)

这里要注意是开机自动启动的是 Jupyter notebook,设定好以后就不能启动 Jupyter lab 了。我更喜欢 Jupyter lab,所以调试好以后又删掉了。反正工作站不关机,把 Jupyter lab 挂在后台也不麻烦。

  1. 在 terminal 中输入
    1
    >>> sudo vim /lib/systemd/system/ipython-notebook.service
  2. 在编辑器里粘贴如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [Unit]
    Description=IPython notebook
    [Service]
    Type=simple
    PIDFile=/var/run/ipython-notebook.pid
    # 环境是 Jupyter 的默认环境,可以在编辑器内更改
    Environment="PATH=/home/*用户名*/miniconda3/envs/*kernel 环境名*/bin:/home/*用户名*/miniconda3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
    ExecStart=/home/*用户名*/miniconda3/envs/*kernel 环境名*/bin/jupyter-notebook --no-browser --notebook-dir=/home/nlp/Documents --NotebookApp.token=*token* --ip=0.0.0.0
    User=*用户名*
    Group=*用户组名*
    WorkingDirectory=/home/*用户名* # 此处可根据需要自由设定
    [Install]
    WantedBy=multi-user.target
  3. 依次输入
    1
    2
    3
    4
    >>> sudo systemctl daemon-reload
    >>> sudo systemctl enable ipython-notebook
    Created symlink /etc/systemd/system/multi-user.target.wants/jupyter.service → /lib/systemd/system/jupyter.service.
    >>> sudo systemctl start ipython-notebook
  4. 验证 Jupyter notebook 是否设置成功,输入sudo systemctl status ipython-notebook,成 成功的话会输出如下类似的信息:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    ● ipython-notebook.service - IPython notebook
    Loaded: loaded (/lib/systemd/system/ipython-notebook.service; enabled; vendor preset: enabled)
    Active: active (running) since Mon 2020-11-02 20:53:51 EST; 7s ago
    Main PID: 3838 (jupyter-noteboo)
    Tasks: 1 (limit: 19026)
    Memory: 60.1M
    CGroup: /system.slice/ipython-notebook.service
    └─3838 /home/nlp/miniconda3/envs/notebook_env/bin/python /home/nlp/miniconda3/envs/notebook_env/bin/jupyter-notebook --no-browser --notebook-dir=/home/nlp --NotebookApp.token=argon2:$argon2id$v=1>

    Nov 02 20:53:51 WORKSTATION systemd[1]: Started IPython notebook.
    Nov 02 20:53:51 WORKSTATION jupyter-notebook[3838]: [I 20:53:51.858 NotebookApp] [nb_conda_kernels] enabled, 3 kernels found
    Nov 02 20:53:52 WORKSTATION jupyter-notebook[3838]: [I 20:53:52.036 NotebookApp] Serving notebooks from local directory: /home/nlp
    Nov 02 20:53:52 WORKSTATION jupyter-notebook[3838]: [I 20:53:52.037 NotebookApp] Jupyter Notebook 6.1.4 is running at:
    Nov 02 20:53:52 WORKSTATION jupyter-notebook[3838]: [I 20:53:52.037 NotebookApp] http://WORKSTATION:8889/?token=...
    Nov 02 20:53:52 WORKSTATION jupyter-notebook[3838]: [I 20:53:52.037 NotebookApp] or http://127.0.0.1:8889/?token=...
    Nov 02 20:53:52 WORKSTATION jupyter-notebook[3838]: [I 20:53:52.037 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).

安装 Python 包、配置 Jupyter、Vim、IDE

现在工作站基本上配置好啦!之后安装各种包,配置 Jupyter、Vim 和各种 IDE 就看各位的喜好啦。我用的 IDE 是 VS code(不想搞破解版 PyCharm),安装 Remote - SSH 就可以远程炼丹啦。

Bonus: Benchmark

工作站配置好了,来简单做一下 benchmark。作为对照的是 Google Colab,Colab 上的 GPU 是随机分配的,这次分配到的是 Tesla T4。脚本在此。每个 epoch 用时大约 40 分钟。

1
2
3
4
5
6
7
8
9
10
11
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 455.32.00 Driver Version: 418.67 CUDA Version: 10.1 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 Tesla T4 Off | 00000000:00:04.0 Off | 0 |
| N/A 45C P8 11W / 70W | 0MiB / 15079MiB | 0% Default |
| | | ERR! |
+-------------------------------+----------------------+----------------------+

然后分别使用一张 2060 和两张 2060 显卡在工作站上测试,脚本在此。batch size 设置为 64 的话会爆显存,所以设置成了 32。单卡在运行时的显卡状态为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 450.80.02 Driver Version: 450.80.02 CUDA Version: 11.0 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 GeForce RTX 2060 Off | 00000000:08:00.0 On | N/A |
| 90% 83C P2 163W / 170W | 5077MiB / 5926MiB | 96% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
| 1 GeForce RTX 2060 Off | 00000000:09:00.0 Off | N/A |
| 46% 44C P8 7W / 170W | 9MiB / 5934MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+

每个 epoch 用时大约 27 分钟。双卡在运行时的状态为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 450.80.02 Driver Version: 450.80.02 CUDA Version: 11.0 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 GeForce RTX 2060 Off | 00000000:08:00.0 On | N/A |
| 92% 84C P2 162W / 170W | 5702MiB / 5926MiB | 93% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
| 1 GeForce RTX 2060 Off | 00000000:09:00.0 Off | N/A |
| 88% 82C P2 161W / 170W | 3148MiB / 5934MiB | 34% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+

每个 epoch 用时大约 17 分钟,脚本在此。可以看到两张显卡的显存的利用不同(5702MiB vs 3146MiB),这种不平衡已经超过本文的讨论范围了。


可以看到,Colab 唯一的优势在于显存比较大,算力被入门级的 2060 完爆。我的这台工作站待机时两个 GPU 功耗为 17W,24 小时待机也没有负担。根据谣言,3060 Ti 的性能与 2080 Super 相当,那么根据 Tom’s Hardware 的 GPU 性能排行榜,3060 Ti 相比 2060 预计有 50% 的性能提升,使用一张 3060 Ti 时每个 epoch 用时会在 20 分钟左右,相比 Colab 时间减少了一半。一个字,香!

欢迎关注我的其它发布渠道