介绍ubuntu系统下配置docker下GPU使用环境的文章很多,本文算是一个比较性梳理。
主要比较一下wsl2中的ubuntu和ubuntu系统下的差异。
需要注意的是,尽管两者都能够配置好GPU支撑环境,但两者有一个重大的差别是,直接使用ubuntu系统会具有更大的兼容性,特别是当docker使用的镜像中的cuda版本与当前系统中的cuda版本不一致时。
详细介绍的文章很多,这里不再一一说明,只说明步骤和一些注意事项。
有些系统没有自带windows终端,默认是powershell,并不太方便。
最方便的是windows终端,可以从windows商店,下载安装。
wsl属于系统的功能组件,所以需要从:更多 Windows 功能 -> 找到并勾选 「Hyper-V」和「适用于 Linux 的 Windows 子系统」来安装,并重启。
使用命令查看一下状态:
wsl.exe --status
关键是要更新wsl。
wsl --update
ubuntu 安装可以从windows商店安装,也可以从wsl安装,从命令:
wsl --list --online
中选择一个ubuntu20.04安装即可。
为便于更快的更新,我们最好使用过内的源。方法是编辑/etc/apt/sources.list文件添加国内源。比如阿里的:
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
修改完毕后,使用命令更新:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install build-essential
sudo apt-get install gcc g++
使用原生的docker,不要使用docker-dosktop,因为后者无法调用GPU。
根据官网 安装提供的说明安装。
docker安装完毕后可以用如下命令测试:
docker -v #看docker版本
sudo docker run hello-world
若提示错误:
sudo docker run hello-world
docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.
See 'docker run --help'.
通常关闭docker服务并重启可以解决:
sudo service docker stop
sudo service docker start
测试也可以用anaconda镜像:
docker pull continuumio/anaconda3
docker run -i -t -p 8888:8888 continuumio/anaconda3 /bin/bash -c "/opt/conda/bin/conda install jupyter -y --quiet && mkdir /opt/notebooks && /opt/conda/bin/jupyter notebook --notebook-dir=/opt/notebooks --ip='*' --port=8888 --no-browser"
使用本机的浏览器来使用jupyter
为便于在拉取镜像时加速下载,可docker配置国内镜像地址。
方法是修改/etc/docker/daemon.json
文件,加入国内的镜像源,比如:
{
"registry-mirrors": [
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
]
}
从【官网】下载 wsl2用的nvidia cuda在windows下安装。
因为这是针对wsl的驱动,因此wsl中的ubuntu等其他linux系统就不需要再安装nvidia 驱动了。
而且驱动中带的cuda可以使得wsl下的ubuntu可以直接运行cuda程序(Once a Windows NVIDIA GPU driver is installed on the system, CUDA becomes available within WSL 2.)。
但若要编译cuda程序,则ubuntu下还需要安装cuda toolkit。
从官网 选择WSL-Ubuntu下载并安装即可。
通常情况下这一步可以不同做。因为使用docker拉取的镜像内部的环境和程序通常是编译好的。
根据nvidia关于docker的【架构说明】,
可以知道NVIDIA Container Toolkit 是我们需要的,可以通过
安装nvidia-docker2
或nvidia-container-runtime
来获得,两者都是依赖于NVIDIA Container Toolkit,但两者用法不同。
安装nvidia-docker2
或nvidia-container-runtime
都是可以的,由于nvidia-docker2提供了docker的自动设置,所以通常我们安装nvidia-docker2就好了。
命令为:
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
&& curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update
sudo apt-get install -y nvidia-docker2
或者:
curl -s -L https://nvidia.github.io/nvidia-container-runtime/gpgkey | \
sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-container-runtime/$distribution/nvidia-container-runtime.list | \
sudo tee /etc/apt/sources.list.d/nvidia-container-runtime.list
sudo apt-get update
sudo apt-get install nvidia-container-runtime
安装完毕后重启docker服务:
sudo service docker stop
sudo service docker start
可以有多重方法测试docker的GPU调用,比如:
(1)nvidia-smi
sudo docker run --rm --gpus all nvidia/cuda:11.0.3-base-ubuntu20.04 nvidia-smi
(2)k8s
sudo docker run --gpus all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark
(3)tensorflow的测试
docker run -it --gpus all -p 8888:8888 tensorflow/tensorflow:latest-gpu-py3-jupyter
成功运行可以看到以上界面,在windows系统的浏览器中输入localhost:8888/tree运行。
(4)pytorch的测试
sudo docker run --gpus all -it --name pytorch bitnami/pytorch /bin/bash
然后拷贝一个基于pytorch的深度学习训练文件到容器内并运行,然后观察运行结果,并可以从windows的任务管理器观察GPU调用情况。
类似的详细介绍的文章很多,这里不再一一说明,只说明步骤和一些注意事项。
双系统安装根据硬盘的分区结构有MBR和GPT两种方式,MBR的方式是比较老的方式,近几年已经不怎么用了,安装的时候比较简单,给电脑空出一部分硬盘来,利用ubuntu的iso进行u盘安装即可。
而GPT的方式也不复杂,唯一差别是在ubuntu安装的过程中硬盘分区时需要给ubuntu指定efi引导分区即可。
至于ubuntu的安装u盘可以使用ultraiso、Rufus等工具来制作,iso文件从镜像下载。
然后设置电脑bios从U盘启动,按ubuntu的安装引导步骤安装即可。
同wsl2下的ubuntu下的操作
同wsl2下的ubuntu下的操作
终端使用nvidia-smi命令查看支持的cuda版本。
如果无法查看,则说明尚未安装nvidia驱动。
因此需要安装显卡驱动,选择ubuntu的软件与更新,点击附加驱动,选择对应版本的驱动即可自动安装(选择较高的专用版本,便于与新的cuda配合)。
从【官网】 选择合适的版本。
选择run版本,则可以在命令行完成操作,比如:
wget https://developer.download.nvidia.com/compute/cuda/11.7.1/local_installers/cuda_11.7.1_515.65.01_linux.run
sudo sh cuda_11.7.1_515.65.01_linux.run
注意安装时若出错,则去掉cuda带的显卡驱动。
输入gedit ~/.bashrc命令打开文件并设置环境变量。
export PATH=/usr/local/cuda-11.7/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-11.7/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
更新环境变量配置
source ~/.bashrc
完成后可以使用nvcc -V
命令查看。
从【官网】 选择合适的版本。
注意需要使用nvidia账号登陆,临时注册一个即可。
根据 安装说明 可知,我们可以使用不同的方式,选择tar版本的下载是比较快的方式,命令也少。
下载tar版本的cudnn后,进入该文件所在目录并解压:
tar -xvf cudnn-linux-x86_64-8.x.x.x_cudaX.Y-archive.tar.xz
然后用如下命令复制即可(Copy the following files into the CUDA toolkit directory)
sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda/include
sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*
同wsl2下的ubuntu下的操作
同wsl2下的ubuntu下的操作
同wsl2下的ubuntu下的操作
同wsl2下的ubuntu下的操作
两种方式的主要差别在于:wsl2模式下不需要安装unbuntu下的显卡驱动,以及cudakit和cudnn,而直接ubuntu系统下则需要。
而wsl2需要在windows下安装NVIDIA CUDA on WSL driver, 而直接ubuntu系统下不需要。
其他的则是相同的。
从功能实践看,对于一般的情况,两种方式都能达成目的。比如在docker下使用pytorch进行GPU训练都没有问题。
但有一个问题是,从其它电脑上拷贝来的镜像,它是低版本的cuda 10.2的,想用在ubuntu下启用,发现wsl2下启动不起来,而直接ubuntu下则可以,两者的cuda版本都是11.7,具体的原因我没有测试出来。
说明这种情况下,还是直接的ubuntu系统更具兼容性。
lsb_release -a #Ubuntu查看自身版本:
docker -v #docker
sudo docker version
sudo service docker stop
sudo service docker start
sudo service docker restart
或
sudo systemctl stop docker
sudo systemctl start docker
查看镜像:sudo docker images | grep deep
删除镜像:sudo docker rmi [image]
或者:sudo docker image rm [image]
从将容器打包成镜像 sudo docker commit 容器id 镜像名:镜像版本
保存镜像 sudo docker save 镜像名:镜像版本 -o xxx.tar
本地安装docker镜像 docker load -i xxx.tar
查看所有容器:sudo docker container ls --all
查看所有容器容器 sudo docker ps -a
关闭容器 sudo docker stop 容器名
移除容器 sudo docker rm 容器名
从停止的容器启动容器并进入容器
sudo docker start 容器名
sudo docker exec -it 容器名 /bin/bash
从镜像启动容器并进入容器:
sudo docker run -it 镜像名[:带标签] /bin/bash
默认情况下,ubuntu中的docker 操作命令需要sudo权限。可以通过权限设置使得不用再输入sudo。
grep docker /etc/group
若不存在,则通过如下命令加入:
sudo groupadd docker
加入后,再次查看可以看到:
docker:x:1001:usercur,root
# 将当前用户添加到docker组中
sudo usermod -aG docker $USER
#或将登陆用户加入到docker用户组中
sudo gpasswd -a $USER docker
# 刷新docker组,使其改动直接生效
newgrp docker
docker ps -a
docker run hello-world
而wsl中ubuntu下的的docker ,默认已经将登陆用户加入docker用户组,所以直接使用docker 命令即可。
从镜像启动容器并进入容器并映射宿主机路径:
sudo docker run --gpus all -it -v [宿主机路径]:[容器中的路径] 镜像名[:带标签] /bin/bash
其中--gpus all
是调用GPU,-v
是路径映射
docker run -i -t -p 8888:8888 anacondajupyter:v1 /bin/bash
其中-p
是做端口映射
从宿主机复制文件到容器
sudo docker cp 文件路径含文件名 容器名:文件路径含文件名
从容器复制文件到宿主机
sudo docker cp 容器名:文件路径含文件名 文件路径含文件名
默认的宿主机的ip地址为:172.17.0.1
而不是127.0.0.1
直接使用apt-get install即可。
使用anaconda是最方便的。
注意安装的时候直接为当前用户安装即可,不需要sudo。
bash ~/Downloads/Anaconda3-2019.10-Linux-x86_64.sh
根据提示安装即可,默认的终端自动激活环境也是方便的。
安装软件用
conda install
如下四个环境相关的命令最常用
新建虚拟环境 conda create --name 多个包名用空格分开
切换conda环境 conda activate env_name
退出虚拟环境 conda deactivate
列出所有虚拟环境 conda info --envs
anconda也可以配置国内源以提升下载速度:
conda config --add channels 'https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/'
conda config --add channels 'https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/'
conda config --set show_channel_urls yes
进入容器后手动运行jupyter
docker exec -it 7da9ad3a0be2 /bin/bash
conda install jupyter -y --quiet
mkdir /opt/notebooks
jupyter notebook --allow-root --notebook-dir=/opt/notebooks --ip='*' --port=8888 --no-browser &
然后在window下的浏览器中输入上述命令的输出提示即可。
本文梳理了wsl2下的ubuntu和直接的ubuntu系统下的docker使用GPU的步骤,为GPU使用环境配置提供支持。