GPU环境配置

1,996 阅读2分钟

工欲善其事必先利其器,为了进行fast.ai课程的学习,需要搭建一个使用GPU进行模型训练的环境。fast.ai官方推荐了许多的云服务器,如果手上没有现成的GPU可用的话,建议使用官方推荐的服务器,好像也不是很贵。fast.ai官方文档:为什么使用GPU?

因为我的实验室有服务器可以用,而且配置了两块性能比较强的Quadro GP100,所以就想自己配置一个可以用于深度学习的环境,过程也踩了一些坑,发现国内关于fast.ai课程的记录还不是很多,故此记录下来方便后来者。

1.安装Anaconda

其实现在配置一个环境的难度并不大,因为可以利用Anaconda的虚拟Python环境为你搞定一切!没搞定?那就把环境删了重来把。Anaconda的安装比较简单,网上教程也很多,其实直接去官网下载对应版本的就可以www.anaconda.com/distributio…

笔者是在Centos6.7上安装的,将安装包下载下来直接$ bash Anaconda3-2019.10-Linux-x86_64.sh,接下来会有几个交互,大概是用户协议阿什么的,一路回车加yes。注意最后一个是自动向~/.bashrc写入环境变量,默认为no,笔者这里选了yes,没发现什么问题,只需执行下面第2步即可。如果选no的话需要自己去添加环境变量。

添加环境变量的方法:

  1. 编辑文件$ vim ~/.bashrc,在末尾加入一行export PATH=/home/{your username}/anaconda3/bin:$PATH,这里注意一定要在末尾,如果加在if语句之前是不生效的。
  2. 更新环境变量source ~/.bashrc,如果安装时最后一个选项选了no,也是要更新环境变量的。

1.1 添加国内源

Anaconda默认的国外下载源是很慢的,这里将下载源改为国内清华源。

在~/.condarc文件中写入下列内容,来自清华源官网

channels:
  - defaults
show_channel_urls: true
default_channels:
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
custom_channels:
  conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud

2.创建虚拟环境

可以通过命令conda -h来查看conda自带的帮助手册。

常用的命令如下

  • 创建环境:conda create --name {your env name} python=3.x
  • 查看现有的环境:conda info --env
  • 删除环境:conda remove -n {your env name} --all
  • 激活环境:conda activate {your env name}
  • 退出环境:conda deactivate

先创建一个环境,然后激活环境,在自己创建的环境中安装pytorchfastai,官网有安装命令。

这里建议用pip下载pytorch和fastai,因为conda有bug!!!详情见本文3.4节。

pytorch官网:

CUDA框架一般选择最新的就好。

fastai:

3.配置Jupyter

3.1 配置Jupyter远程登陆

为了远程连接服务器上的jupyter,需要改一下jupyter的配置文件。

默认情况下,配置文件~/.jupyter/jupyter_notebook_config.py并不存在,需要自行创建。

  • 使用这个命令生成配置文件:jupyter notebook --generate-config
  • 设置登录密码:jupyter notebook password
  • 修改配置文件:

将下面的内容取消注释并修改

# 允许登录的ip
c.NotebookApp.ip='*'
# 第二步设置的密码
c.NotebookApp.password = 'your passwd'
# 开启jupyter notebook时是否自动打开浏览器
c.NotebookApp.open_browser = False
#可自行指定一个端口, 访问时使用该端口
c.NotebookApp.port =8888 
# 配置Jupyter打开时的默认路径
c.NotebookApp.notebook_dir = '{path you want}'

进行完这三步操作以后,就可以使用服务器ip:端口号的格式在本机上远程访问服务器的jupyter了。

3.2 将conda虚拟环境加入到Jupyter Notebook Kernel中

为了在jupyter中使用我们在conda里创建的虚拟环境,这里还需要一步操作将环境加载到notebook中。

安装一个插件即可:conda install nb_conda

安装后就能在红圈处看到自己的环境了。

如果添加了新的环境但是没有刷新出来,运行以下命令刷新

# 禁用nb_conda
jupyter serverextension disable nb_conda
# 启用nb_conda
jupyter serverextension enable nb_conda

3.3 使用Screen让窗口后台运行

因为我们是使用远程连接的方式开启服务器上的Jupyter的,所以一旦关掉连接的终端,Jupyter也会关闭。这时就需要使用Screen工具让终端后台运行,保持Jupyter始终可以登录。

常用命令:

  • 查看当前的screen:screen -ls
  • 创建一个screen,这时相当于打开了一个新终端:screen -S {screen name}
  • 将当前screen后台,返回打开前的终端:快捷键CTRL+A+D
  • 回到screen:screen -r {screen name}
  • 关闭后台的screen:screen -X -S {name you want to kill} quit

详细信息可以看这里man.linuxde.net/screen

3.4 ImportError: dlopen: cannot load any more object with static TLS

在配置好jupyter以后,我们就可以使用jupyter远程连接服务器进行工作了。

不幸的是,在这里我遇到了一个bug,困扰了我很久。

如图:

在使用相同环境的条件下,我在cmd和ipython中import torch都是正常的,但是到jupyter中就会报错,问题很是诡异。 谷歌上的解决方案非常多,我也试了几个,但都没有效果,最终还是在git中的一个讨论区找到了方法,即conda uninstall pytorch & pip install torch torchvision。大概是anaconda中的bug吧...搜索问题运气真的很重要...

3.5 测试GPU是否可用

  • 查看服务器GPU的使用情况,英伟达的命令:nvidia-smi
  • 设置模型使用的gpu:torch.cuda.set_device(id)
  • cuda是否可用:torch.cuda.is_available()
  • 返回gpu数量:torch.cuda.device_count()
  • 返回gpu名字:torch.cuda.get_device_name(0)
  • 返回当前设备索引:torch.cuda.current_device()

这下开心了!

4.两个底层库的问题

由于我实验室使用的服务器上用的是CentOS6.X的版本,这个版本pytorch和fastai官方已经不支持了,故有两个底层库版本不兼容需要升级。

Pytorch官网上要求CentOS版本7.3以上,但是国内许多服务器应该都还是6.X,稳定嘛。

4.1 升级linux底层库glibc

这是报错,其实就是当前系统的glibc库版本太低。

解决方法:

查看当前可用版本:strings /lib64/libc.so.6 |grep GLIBC_

用rpm升级到2.17:

  • 下载rpm包
$ wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-2.17-55.el6.x86_64.rpm
$ wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-common-2.17-55.el6.x86_64.rpm
$ wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-devel-2.17-55.el6.x86_64.rpm
$ wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-headers-2.17-55.el6.x86_64.rpm
  • 安装
sudo rpm -Uvh glibc-2.17-55.el6.x86_64.rpm \
glibc-common-2.17-55.el6.x86_64.rpm \
glibc-devel-2.17-55.el6.x86_64.rpm \
glibc-headers-2.17-55.el6.x86_64.rpm

4.2 升级C/C++底层库CXXABI

报错信息:ImportError: /lib64/libstdc++.so.6: version 'CXXABI_1.3.9' not found(required by anaconda3/lib/python3.6/site-packages/scipy/sparse/_sparsetools.cpython-36m-x86_64-linux-gnu.so)

也是库版本过低的问题,解决方法:

  • 查看当前可用版本:strings /usr/lib64/libstdc++.so.6 | grep 'CXXABI'

  • 进入python的安装路径下的lib文件夹,我的在~/anaconda3/lib,找到最新版的libstdc++.so.6:ls |grep libstdc++.so.6

我这里是6.0.26

  • 将最新版本复制到/usr/lib64/目录下,删除原来的libstdc++.so.6,并将最新版本命名为libstdc++.so.6,然后连接:
# 复制到
cp libstdc++.so.6.0.26 /usr/lib64/
# 进入目录
cd /usr/lib64
# 删除原来的库
rf -rf /usr/lib64/libstdc++.so.6
# 重新构建库
ln -s libstdc++.so.6.0.26 libstdc++.so.6

5.配置Pycharm远程连接

  1. 在设置中更改工程使用的python环境。
  2. 添加一个SSH环境。
  3. 在服务器目录中找到所需的python环境,这里注意一定要找到自己建立的conda虚拟环境中的python环境,不要找错了。
  4. 更改工程文件映射到服务器的路径(Pycharm需要把工程中的文件上传到服务器上)。