深度学习实验环境搭建记录

近段时间有需要将实验迁移到新的机器上进行,正好也总结一下深度学习实验环境的搭建过程。

Step 1: 准备 Anaconda

为什么要使用 Anaconda

我后面会专门写一篇文章讲虚拟环境。

简单地说,因为研究强调可复现性,使用虚拟环境可以减小以下问题带来的影响:

  • 深度学习实验中不同研究员使用的工具往往千差万别(例如有的使用 TensorFlow 有的使用 PyTorch 还有的使用 MXNet),不同的平台依赖不同,性能不同。如果将不同实验的依赖包都装在同一个 Python 解释器下,一些共同依赖的包可能会出现意外升降级,致使实验结果与预想不一致或代码无法运行;
  • 哪怕使用同一个平台的工具,工具的版本不同也会带来很大的差异(如 TensorFlow 1.0 对 API 做了大幅修改,致使不少没有迁移到新版本的代码无法运行)。但是如果要做对比实验,有的代码依赖 TensorFlow 0.9 有的依赖 TensorFlow 1.0,显然我们不希望把时间耗费在适配新 API 接口上而是希望能够无痛运行这两个程序。再者,做研究不像做工程,很多实验只是一种支持某个想法的材料,并不需要长期维护更新到最新接口(当然,一些里程碑式的工作往往会有人支持着版本兼容);
  • 除此之外,我们还希望有效地删除掉不必要的依赖包。虽然节省磁盘空间的动机存疑(因为使用虚拟环境可能会引入重复的包安装在不同位置),但是比起 pip uninstall YOUR_PKG 只能移除 YOUR_PKG 而不能移除 YOUR_PKG 的依赖包来说,conda env remove --name YOUR_ENV 一次就把整个实验环境移除掉会让人舒服多了。

安装 Anaconda

  1. SSH 登录你的远程服务器;

  2. 打开 Anaconda 官网,找到对应的系统版本,右键选择 “Copy Link Location”;

  3. 在终端中输入以下命令下载 Anaconda 的安装脚本:

    1
    $ wget https://repo.anaconda.com/archive/Anaconda3-2019.07-Linux-x86_64.sh  # replace the url with the location you copied from previous step
  4. 等到下载完成后,运行 Anaconda 安装脚本:

    1
    $ bash Anaconda3-2019.07-Linux-x86_64.sh
  5. 有一步询问是否要 init conda,记得选是,接着终端会告诉你更改了哪个环境变量文件,如我这里提示更改的是 .bashrc

  6. 要想使 conda 指令生效,输入:

    1
    $ source ~/.bashrc  # replace the filename with which you observed from previous step

Step 2: 配置环境

我的习惯一搬是创建基类环境(如为三大平台创建 Tensorflow, PyTorch 和 MXNet),然后通过 conda env create -n NEW_ENV_NAME --clone BASE_ENV 来搭建新的实验环境。

如服务器中已有名为 pytorch 的环境,而我想新建一个为 AtlasNet 的实验环境,我会运行:

1
2
3
(base)$ conda env create -n pytorch-atlasnet --clone pytorch
(base)$ conda activate pytorch-atlasnet
# (pytorch-atlasnet)$ conda install OTHER_PKGS

这样就可以基于已有的基础环境新建新的实验环境了(可以按需要在新的实验环境中安装额外的依赖包而不影响基础环境)。

PyTorch 环境

  1. 创建名为 PyTorch 的虚拟环境并激活进入:

    1
    2
    (base)$ conda create -n pytorch
    (base)$ conda activate pytorch
  1. PyTorch 官方安装指导页 上找到对应的安装命令,并在终端中运行(如我的是 Linux + Conda + Python3.7 + CUDA 10):

    1
    (pytorch)$ conda install pytorch torchvision cudatoolkit=10.0 -c pytorch

TensorFlow 环境

因为 TensorFlow 1.0 刚刚发布,API 接口较之前有很大调整,暂时没有把平台迁移到 TensorFlow 1.0 上,后面有时间再做记录,实际上大致过程与配置 PyTorch 环境是类似的。

为虚拟环境增加 Jupyter Notebook

Jupyter Notebook 是一款交互式的代码运行软件,使用它可以很方便地进行代码调试。

Anaconda 默认会为 base 环境安装 Jupyter Notebook,所以我们只需要在自己新建的环境中安装 Jupyter Notebook 并做简单的设置就可以方便切换了,以下例子以我之前新建的 pytorch 环境为例:

1
2
(base)$ conda activate pytorch
(pytorch)$ conda install jupyter notebook

通过 Kernel 选项卡直接切换 Anaconda 虚拟环境

1
2
3
(base)$ conda activate pytorch
(pytorch)$ pip install ipykernel
(pytorch)$ python -m ipykernel install --user --name=pytorch # change the `pytorch` to your environment's name

允许 Jupyter Notebook 接受网络访问(可选)

允许来自外部的网络访问可能会使服务器遭到攻击,请务必做好安全措施。

  1. 记得将虚拟环境切换到 base。

    1
    (pytorch)$ conda deactivate
  1. 生成默认的配置文件

    1
    (base)$ jupyter notebook --generate-config

    此时终端会提示生成的配置文件在哪,注意复制文件路径,如我的是 ./jupyter/jupyter_notebook_config.py

  1. 在终端输入 ipython,设置你自己的 Jupyter 访问密码,注意复制输出的 sha1:xxxxxxxx 哈希字符串:

    1
    2
    3
    4
    5
    In [1]: from notebook.auth import passwd
    In [2]: passwd()
    Enter password:
    Verify password:
    Out[2]: 'sha1:xxxxxxxxxxxxxxxxx'
  1. 打开并编辑从第 2 步中生成的配置文件:

    1
    (base)$ vim ./jupyter/jupyter_notebook_config.py

    找到以下几项更改为:

    1
    2
    3
    4
    c.NotebookApp.ip='*'
    c.NotebookApp.password = u'sha:ce... The hashed string you observed from Step 3'
    c.NotebookApp.open_browser = False
    c.NotebookApp.port =8888 # You can change to whatever port you like
  1. 后台运行 Jupyter Notebook:

    1
    (base)$ screen jupyter notebook
  1. 打开浏览器访问 YOUR_IP:8888 即可使用 Jupyter Notebook.

Appendix: 常用指令

查看 CUDA 版本

1
nvcc --version

查看 GPU 使用情况

1
nvidia-smi

如果要周期性地查看 GPU 使用情况,比如每 5 秒查看一次:

1
watch -n 5 nvidia-smi

nvidia-smi 输出样例

注意看的时候以中间的 Mem 而不是 Util 为主,因为有时候机器正在往 GPU 中载入数据而未进行运算,强制使用某张 Mem 占用高的卡可能会在运行时出现 RuntimeError: CUDA error: out of memory 的报错信息。

查看系统进程

1
htop  # recommend to use `htop` command to replace `top` command