在linux上配置GPU深度学习环境
配置云服务器
系统 : ubuntu 18.04
1 | # 更新所有环境 |
这里需要知道,如果我们在云端配置的环境,需要将云端的jupyter notebook的运行端口映射到本地来,可以这样做:
1 | ssh -L8888:localhost:8888 ubuntu@100.20.65.33 |
如果使用aws配置远端服务器,在本地连接时使用:
$ chomd 400 Downloads/d2l.pem
$ ssh -i Downloads/d2l.pem ubuntu@54.245.23.40
以上两条命令中将密钥path和ip地址都替换成自己的。
docker中的tensorflow-gpu配置
首先在宿主机(本机)安装好NVIDIA GPU
的驱动程序,然后对于每一个容器都要各自安装对应版本的cuda
和cudnn
。
下载TensorFlow Docker镜像
官方 TensorFlow Docker 映像位于 tensorflow/tensorflow Docker Hub 代码库中。映像版本按照以下格式进行标记:
标记 | 说明 |
---|---|
latest |
TensorFlow CPU 二进制映像的最新版本。(默认版本) |
nightly |
TensorFlow 映像的每夜版。(不稳定) |
version |
指定 TensorFlow 二进制映像的版本,例如:2.1.0 |
devel |
TensorFlow master
开发环境的每夜版。包含 TensorFlow 源代码。 |
custom-op |
用于开发 TF 自定义操作的特殊实验性映像。详见此处。 |
每个基本标记都有会添加或更改功能的变体:
标记变体 | 说明 |
---|---|
tag-gpu |
支持 GPU 的指定标记版本。(详见下文) |
tag-jupyter |
针对 Jupyter 的指定标记版本(包含 TensorFlow 教程笔记本) |
您可以一次使用多个变体。例如,以下命令会将 TensorFlow 版本映像下载到计算机上:
1 | docker pull tensorflow/tensorflow # latest stable release |
注意如果要用gpu版本的tensorflow,需要pull带有gpu tag的镜像.
docker pull tensorflow/tensorflow:latest-gpu
。如果不带gpu标签,会默认下载CPU版本的tensorflow。
验证tensorflow gpu
查看是否有GPU:
1 | import tensorflow as tf |
docker中安装多种cuda版本并切换
去cuda
官网下载所需版本,以.run
结尾。楼主系统为linux
。
进入到放置 cuda_9.0.176_384.81_linux.run
的目录:
1 | sudo chmod +x cuda_9.0.176_384.81_linux.run # 为 cuda_9.0.176_384.81_linux.run 添加可执行权限 |
在安装过程中截取其中比较重要的几个选择:
1 | Do you accept the previously read EULA? |
选择的汇总: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15Driver: Not Selected
Toolkit: Installed in /usr/local/cuda-9.0
Samples: Not Selected
Please make sure that
- PATH includes /usr/local/cuda-9.0/bin
- LD_LIBRARY_PATH includes /usr/local/cuda-9.0/lib64, or, add /usr/local/cuda-9.0/lib64 to /etc/ld.so.conf and run ldconfig as root
To uninstall the CUDA Toolkit, run the uninstall script in /usr/local/cuda-9.0/bin
Please see CUDA_Installation_Guide_Linux.pdf in /usr/local/cuda-9.0/doc/pdf for detailed information on setting up CUDA.
***WARNING: Incomplete installation! This installation did not install the CUDA Driver. A driver of version at least 384.00 is required for CUDA 9.0 functionality to work.
To install the driver using this installer, run the following command, replacing <CudaInstaller> with the name of this run file:
sudo <CudaInstaller>.run -silent -driver/usr/local
目录下看到:
1 | cuda-11.1 # 之前安装的cuda-11.1 |
多版本切换:
1 | #在切换cuda版本时 |
上面的前提是linux
系统的环境变量中(~./bashrc文件)
,cuda
的路径是/usr/local/cuda
tensorflow_decision_forests使用
我一开始pull了tensorflow-gpu版本的docker环境,想用一下tensorflow的tensorflow_decision_forests库,该库是随机森林的集合库,内有很多算法可以用。官方使用document在[https://www.tensorflow.org/decision_forests/tutorials/beginner_colab?hl=zh_cn]。
我一开始没注意,后来发现我在docker环境中直接用pip安装该库时,帮我又安装了cpu版本的tensorflow,这样就和我的gpu版本冲突了,然后去网上搜了一下,发现该库现在还有很多使用限制:1. 仅仅支持linux,不支持windows和mac 2. 仅支持cpu ,还没有gpu版本,见[https://github.com/tensorflow/decision-forests/issues/38].作者的意思是用gpu训练会更复杂,更详细的我就没看了。
然后我的做法是在该tensorflow-gpu的docker环境中使用virtualenv创建一个tensorfow的cpu虚拟环境,然后再用pip安装TF-DF这个包。避免污染docker主环境中的tensorflow-gpu。
之所以不用miniconda,是因为conda会默认替代掉我容器自带的python以及安装好的tensorflow-gpu。我只是想用一下TFDF这个库,不想太折腾。
此处贴virtualenv的命令:
1 | pip install virtualenv |
本地机器vscode配置使用远程服务器中运行的容器
参考 [https://zhuanlan.zhihu.com/p/80099904]
其中有几个地方需要注意一下的是:
如果遇到在本地机器vscode中使用插件remote ssh连接不上容器的问题时,需要
vim /etc/ssh/sshd_config ,将PermitRootLogin的值改为yes(去掉前面的#号)
远程容器里面还需要有python插件,才能在本地机器vscode中debug代码
上面博主服务器端口映射的是容器的22端口,我没有尝试过用其他端口映射。22端口是ssh登陆的默认端口。
cudnn深度学习库的安装和验证
参考[https://blog.csdn.net/caicaiatnbu/article/details/87626491]
注意点:
- 下载对应的linux版本的cudnn
conda安装cuda和cudnn
如果使用的是conda的环境,可以单独使用conda install cuda来在虚拟环境中安装不同于本机版本的cuda和cudnn,而不需要使用我上面提到的那种方式(每次换cuda版本需要更换/usr/local/cuda的软链接的方式)。
conda创建了虚拟环境后,激活进入虚拟环境
1 | conda install cudatoolkit=10.2 |
以上命令安装了10.2版本的cuda,然后可以使用cuda search cudnn
找一下合适版本的cudnn,然后还是用cuda install cudnn=版本号
来安装
注意:这里用conda安装的cuda和cudnn,是无法像在本机使用nvcc -V来检查版本的,所以即使你在虚拟环境激活的情况下使用 nvcc -V的命令会返回无此命令或者是返回的还是本机cuda的版本号!
那可能有人会问,如果想在conda虚拟环境下测试cuda和cudnn是否安装成功怎么办?
目前的办法是:
1 | # In[]: |
参考[https://blog.csdn.net/qq_37774098/article/details/109895048]
docker拉取的pytorch-gpu版找不到cuda和cudnn的位置,为何?
参考 https://blog.csdn.net/ljp1919/article/details/106209358
tensorflow和pytorch验证GPU是否可用
tensorflow
1 | import tensorflow as tf |
pytorch
1 | import torch |
1 | import torch |
附录:docker使用
创建容器:
1 | docker run --gpus all -d -v /:/host -p 3333:22 tensorflow/tensorflow:2.4.0-gpu tail -f /var/log/dpkg.log # 创建容器并启动 |
进入容器:
1 | docker exec -it [container_id] /bin/bash |
停止容器运行
1 | docker kill -s KILL [container_id] |
删除一个或多个容器
1 | docker rm -f db01 db02 # 强制删除,容器可以是在运行着的状态 |
docker save 与 docker export 区别参考:[https://jingsam.github.io/2017/08/26/docker-save-and-docker-export.html]
1 | docker save -o images.tar postgres:9.6 # 打包postgres镜像 |
docker save的应用场景是,如果你的应用是使用docker-compose.yml编排的多个镜像组合,但你要部署的客户服务器并不能连外网。这时,你可以使用docker save将用到的镜像打个包,然后拷贝到客户服务器上使用docker load载入。
1 | docker export -o postgres-export.tar postgres # 将容器postgres打包成一个tar |
docker export的应用场景主要用来制作基础镜像,比如你从一个ubuntu镜像启动一个容器,然后安装一些软件和进行一些设置后,使用docker export保存为一个基础镜像。然后,把这个镜像分发给其他人使用,比如作为基础的开发环境。