深度学习实验环境搭建记录
近段时间有需要将实验迁移到新的机器上进行,正好也总结一下深度学习实验环境的搭建过程。
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
SSH 登录你的远程服务器;
打开 Anaconda 官网,找到对应的系统版本,右键选择 “Copy Link Location”;
在终端中输入以下命令下载 Anaconda 的安装脚本:
1 |
|
等到下载完成后,运行 Anaconda 安装脚本:
1
$ bash Anaconda3-2019.07-Linux-x86_64.sh
有一步询问是否要 init conda,记得选是,接着终端会告诉你更改了哪个环境变量文件,如我这里提示更改的是
.bashrc
;要想使
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 |
|
这样就可以基于已有的基础环境新建新的实验环境了(可以按需要在新的实验环境中安装额外的依赖包而不影响基础环境)。
PyTorch 环境
创建名为 PyTorch 的虚拟环境并激活进入:
1
2(base)$ conda create -n pytorch
(base)$ conda activate pytorch从 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 |
|
通过 Kernel 选项卡直接切换 Anaconda 虚拟环境
1 |
|
允许 Jupyter Notebook 接受网络访问(可选)
允许来自外部的网络访问可能会使服务器遭到攻击,请务必做好安全措施。
记得将虚拟环境切换到 base。
1
(pytorch)$ conda deactivate
生成默认的配置文件
1
(base)$ jupyter notebook --generate-config
此时终端会提示生成的配置文件在哪,注意复制文件路径,如我的是
./jupyter/jupyter_notebook_config.py
。在终端输入
ipython
,设置你自己的 Jupyter 访问密码,注意复制输出的sha1:xxxxxxxx
哈希字符串:1
2
3
4
5In [1]: from notebook.auth import passwd
In [2]: passwd()
Enter password:
Verify password:
Out[2]: 'sha1:xxxxxxxxxxxxxxxxx'打开并编辑从第 2 步中生成的配置文件:
1
(base)$ vim ./jupyter/jupyter_notebook_config.py
找到以下几项更改为:
1
2
3
4c.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后台运行 Jupyter Notebook:
1
(base)$ screen jupyter notebook
打开浏览器访问
YOUR_IP:8888
即可使用 Jupyter Notebook.
Appendix: 常用指令
查看 CUDA 版本
1 |
|
查看 GPU 使用情况
1 |
|
如果要周期性地查看 GPU 使用情况,比如每 5 秒查看一次:
1 |
|
注意看的时候以中间的 Mem
而不是 Util
为主,因为有时候机器正在往 GPU 中载入数据而未进行运算,强制使用某张 Mem
占用高的卡可能会在运行时出现 RuntimeError: CUDA error: out of memory
的报错信息。
查看系统进程
1 |
|