工作站的配置有两种方式:
- 传统方法;
- Docker。
理论上 Docker 更好一点,因为 nvidia-docker2
是一个已经配置好的环境,不需要手动安装 CUDA 和 cuDNN,而且不需要了可以删除,更新也很方便。然而本文中将采用传统方法对工作站进行配置。使用 Docker 可以参考这篇文章。
安装系统
我选择的是 Ubuntu 20.04。我在 MacOS 上制作引导盘,方法在这里。一路安装都很简单,有几个建议:
- 在选择安装模式的时候选择“Minimal Installation”,不安装更新和第三方软件,一会系统安装好了以后手动更新。
- 在分区时选择默认分区就好了,不需要 LVM,不要选择 ZFS。
- 在设置用户的时候选择 “Log in automatically”。
系统更新
安装好了 Ubuntu 并设置好网络以后,我们要做的第一件事就是更新系统、安装基础组件。工作站配置好了以后就不要轻易更新了,以免破坏环境。
1 | >>> sudo apt-get update && sudo apt-get upgrade && sudo apt-get autoremove |
设置 SSH
- 安装 SSH:
sudo apt install Openssh-server
- 启动 SSH:
sudo /etc/init.d/ssh start
- 开机自动启动 SSH:
sudo systemctl enable ssh
- 在客户端生成 SSH 秘钥
ssh-keygen
或 强秘钥ssh-keygen -t rsa -b 4096
- 在客户端上传秘钥至服务器:
ssh-copy-id remote-user@server-ip
- 关闭 SSH 密码登录
sudo vim /etc/ssh/sshd_config
找到#PasswordAuthentication yes
修改为 PasswordAuthentication no
找到ChallengeResponseAuthentication
修改为ChallengeResponseAuthentication no
- 重启 SSH 服务
sudo service ssh restart
或sudo systemctl restart ssh
- (可选)备份 SSH key
cp ~/.ssh/id_rsa* /path/to/safe/location/
设置好 SSH 以后,我们可以在个人电脑上登录工作站。
设置防火墙
下面来设置一下防火墙,防止有坏人来捣乱。
1 | >>> sudo ufw allow OpenSSH |
安装显卡驱动
Ubuntu 提供了一个很简单的命令来安装显卡驱动。
1 | >>> sudo ubuntu-drivers autoinstall |
安装 cuda 11.1
这里安装最新的 CUDA Toolkit 11.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 - 将以下内容加进 /etc/profile:
1
2export PATH=/usr/local/cuda-11.1/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-11.1/lib64$LD_LIBRARY_PATH - 重启电脑
sudo reboot
- 检查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 - 测试
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
安装以前要先注册新用户。
- 在注册后,到
https://developer.nvidia.com/rdp/cudnn-download
下载libcudnn8_8.0.4.30-1+cuda11.1_amd64.deb
,libcudnn8-dev_8.0.4.30-1+cuda11.1_amd64.deb
和libcudnn8-samples_8.0.4.30-1+cuda11.1_amd64.deb
。可以在个人电脑上下载然后scp
给工作站,下同。 - 解包:
1
>>> sudo dpkg -i libcudnn*
- 检查 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 就可以了。 - 到
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 - 安装虚拟环境
1
>>> conda create --name nlp python=3.8
配置远程 Jupyter lab
安装 Jupyter lab 后可以选择 Jupyter lab 还是 Jupyter notebook,方法是在登录的域名后面加 “/lab?” 或者 “/tree?”。
- 生成配置文件:
1
2
3>>> pip install jupyterlab nodejs
>>> jupyter lab --generate-config # 生成配置文件
Writing default config to: /home/nlp/.jupyter/jupyter_notebook_config.py - 设置登录密码:
1
2
3
4
5# 首先进入 python 命令行
>>> python3
# 在命令行下输入
>>> from notebook.auth import passwd; passwd()
# 按照提示输入密码,这是 jupyter 的登陆密码 - 设置成功会出现形如下面的哈希(hash)密码, 保存好,下面会用到
1
'argon2:$argon2id$v=19$m=10240,t=10,p=8$mYbUFvU1Csiwz3UGlsRwEA$q7r2mSN5RbFwjbhZCew4fg'
- 配置 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 # 设置端口 - 防火墙开放端口
1
>>> sudo ufw allow 8889
- 注册虚拟环境设置以后在 SSH 状态中输入 “jupyter lab” 后在浏览器地址栏里输入 “域名:IP” 就可以启动 Jupyter lab 了。 因为工作站很少关机,在 ssh 以后输入
1
2
3>>> conda activate nlp
>>> conda install ipykernel notebook
>>> python -m ipykernel install --user --name nlp --display-name "NLP"nohup jupyter lab &
就可以让 Jupyter lab 保持在后台运行。
设置 Jupyter notebook 开机自动在后台启动(可选)
这里要注意是开机自动启动的是 Jupyter notebook,设定好以后就不能启动 Jupyter lab 了。我更喜欢 Jupyter lab,所以调试好以后又删掉了。反正工作站不关机,把 Jupyter lab 挂在后台也不麻烦。
- 在 terminal 中输入
1
>>> sudo vim /lib/systemd/system/ipython-notebook.service
- 在编辑器里粘贴如下:
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 - 依次输入
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 - 验证 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 | +-----------------------------------------------------------------------------+ |
然后分别使用一张 2060 和两张 2060 显卡在工作站上测试,脚本在此。batch size 设置为 64 的话会爆显存,所以设置成了 32。单卡在运行时的显卡状态为
1 | +-----------------------------------------------------------------------------+ |
每个 epoch 用时大约 27 分钟。双卡在运行时的状态为
1 | +-----------------------------------------------------------------------------+ |
每个 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 时间减少了一半。一个字,香!