windows下wsl2中的ubuntu和ubuntu系统下docker使用gpu的异同

windows下wsl2中的ubuntu和ubuntu系统下docker使用gpu的异同

介绍ubuntu系统下配置docker下GPU使用环境的文章很多,本文算是一个比较性梳理。
主要比较一下wsl2中的ubuntu和ubuntu系统下的差异。
需要注意的是,尽管两者都能够配置好GPU支撑环境,但两者有一个重大的差别是,直接使用ubuntu系统会具有更大的兼容性,特别是当docker使用的镜像中的cuda版本与当前系统中的cuda版本不一致时。

1. window下wsl2中安装ubuntu和docker以及GPU支撑环境

详细介绍的文章很多,这里不再一一说明,只说明步骤和一些注意事项。

步骤:windows终端

有些系统没有自带windows终端,默认是powershell,并不太方便。

最方便的是windows终端,可以从windows商店,下载安装。

步骤:wsl2安装

wsl属于系统的功能组件,所以需要从:更多 Windows 功能 -> 找到并勾选 「Hyper-V」和「适用于 Linux 的 Windows 子系统」来安装,并重启。

使用命令查看一下状态:

wsl.exe  --status

关键是要更新wsl。

wsl --update

步骤:ubuntu 安装

ubuntu 安装可以从windows商店安装,也可以从wsl安装,从命令:

wsl --list --online

中选择一个ubuntu20.04安装即可。

步骤:ubuntu 更新国内源

为便于更快的更新,我们最好使用过内的源。方法是编辑/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

步骤:Gcc安装

sudo apt-get install build-essential
sudo apt-get install gcc g++

步骤:docker安装

使用原生的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 配置国内镜像地址

为便于在拉取镜像时加速下载,可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驱动(NVIDIA CUDA on WSL driver)

【官网】下载 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拉取的镜像内部的环境和程序通常是编译好的。

步骤: 安装docker的nvidia 支持

根据nvidia关于docker的【架构说明】,
可以知道NVIDIA Container Toolkit 是我们需要的,可以通过
安装nvidia-docker2nvidia-container-runtime来获得,两者都是依赖于NVIDIA Container Toolkit,但两者用法不同。

安装nvidia-docker2nvidia-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调用

可以有多重方法测试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调用情况。

2. ubuntu系统下安装docker以及GPU支撑环境

类似的详细介绍的文章很多,这里不再一一说明,只说明步骤和一些注意事项。

步骤:双系统安装ubuntu

双系统安装根据硬盘的分区结构有MBR和GPT两种方式,MBR的方式是比较老的方式,近几年已经不怎么用了,安装的时候比较简单,给电脑空出一部分硬盘来,利用ubuntu的iso进行u盘安装即可。
而GPT的方式也不复杂,唯一差别是在ubuntu安装的过程中硬盘分区时需要给ubuntu指定efi引导分区即可。

至于ubuntu的安装u盘可以使用ultraisoRufus等工具来制作,iso文件从镜像下载。

然后设置电脑bios从U盘启动,按ubuntu的安装引导步骤安装即可。

步骤:ubuntu设置国内镜像

同wsl2下的ubuntu下的操作

步骤:Gcc安装

同wsl2下的ubuntu下的操作

步骤:ubuntu下安装显卡驱动

终端使用nvidia-smi命令查看支持的cuda版本。
如果无法查看,则说明尚未安装nvidia驱动。

因此需要安装显卡驱动,选择ubuntu的软件与更新,点击附加驱动,选择对应版本的驱动即可自动安装(选择较高的专用版本,便于与新的cuda配合)。

步骤:ubuntu下安装cuda-kit

【官网】 选择合适的版本。

选择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命令查看。

步骤:ubuntu下安装cudnn

【官网】 选择合适的版本。

注意需要使用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*

步骤:ubuntu下安装docker

同wsl2下的ubuntu下的操作

步骤:ubuntu下安装docker设置国内镜像

同wsl2下的ubuntu下的操作

步骤:ubuntu下安装nvidia-docker2或nvidia-container-runtime

同wsl2下的ubuntu下的操作

步骤:ubuntu下测试docker使用GPU

同wsl2下的ubuntu下的操作

3. 两种方式的比较

两种方式的主要差别在于: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系统更具兼容性。

4. ubuntu和docker 相关命令、操作和一些注意事项

查版本

lsb_release -a  #Ubuntu查看自身版本:
docker -v   #docker
sudo docker version

docker的启停操作

sudo service docker stop
sudo service docker start
sudo service docker restart

sudo systemctl stop docker
sudo systemctl start docker

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

docker的容器操作

查看所有容器: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

docker 操作免sudo

默认情况下,ubuntu中的docker 操作命令需要sudo权限。可以通过权限设置使得不用再输入sudo。

  1. 查看是否存在docker用户组
grep docker /etc/group

若不存在,则通过如下命令加入:

sudo groupadd docker

加入后,再次查看可以看到:

docker:x:1001:usercur,root
  1. 将当前用户加入该group内,并更新即可
# 将当前用户添加到docker组中
sudo usermod -aG docker $USER
#或将登陆用户加入到docker用户组中
sudo gpasswd -a $USER docker    
# 刷新docker组,使其改动直接生效
newgrp docker
  1. 测试直接使用docker:
docker ps -a
docker run hello-world

而wsl中ubuntu下的的docker ,默认已经将登陆用户加入docker用户组,所以直接使用docker 命令即可。

dcoker的路径或端口映射

从镜像启动容器并进入容器并映射宿主机路径:

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是做端口映射

dcoker的文件操作

从宿主机复制文件到容器

sudo docker cp 文件路径含文件名 容器名:文件路径含文件名

从容器复制文件到宿主机

sudo docker cp 容器名:文件路径含文件名 文件路径含文件名 

dcoker的网络访问

默认的宿主机的ip地址为:172.17.0.1 而不是127.0.0.1

ubuntu安装本地的deb文件

直接使用apt-get install即可。

python的安装和使用

使用anaconda是最方便的。
注意安装的时候直接为当前用户安装即可,不需要sudo。

bash ~/Downloads/Anaconda3-2019.10-Linux-x86_64.sh

根据提示安装即可,默认的终端自动激活环境也是方便的。

安装软件用

conda install <package_names>

如下四个环境相关的命令最常用

新建虚拟环境	conda create --name <env_name> <package_names>	多个包名用空格分开
切换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

进入容器后手动运行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使用环境配置提供支持。

参考:

  1. https://www.cnblogs.com/wenhsing/p/15743124.html
  2. https://blog.csdn.net/qq_18625805/article/details/109732122
  3. https://docs.docker.com/engine/install/ubuntu/
  4. https://www.jianshu.com/p/be669d9359e2
  5. https://blog.csdn.net/sunbrightness/article/details/116783604
  6. https://docs.nvidia.com/cuda/wsl-user-guide/index.html
  7. https://www.modb.pro/db/198499
  8. https://github.com/NVIDIA/nvidia-docker
  9. https://github.com/NVIDIA/nvidia-container-runtime
  10. https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/arch-overview.html#arch-overview
  11. https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#installing-on-ubuntu-and-debian
  12. https://gitlab.com/nvidia/container-toolkit/container-toolkit/-/tree/main/cmd/nvidia-container-runtime
  13. https://hub.docker.com/r/continuumio/anaconda3
  14. https://blog.csdn.net/hwh295/article/details/113409389
  15. https://blog.csdn.net/xianxi9883/article/details/107358445/
  16. https://blog.csdn.net/xianxi9883/article/details/107358445/
  17. https://baiyue.one/archives/1651.html
  18. https://docs.nvidia.com/cuda/wsl-user-guide/index.html
  19. https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html
  20. https://blog.csdn.net/ashome123/article/details/105822040
  21. https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html
  22. https://blog.csdn.net/moutain9426/article/details/120252641
  23. https://www.cnblogs.com/dereen/p/dl_env.html
  24. https://blog.csdn.net/JinLu_/article/details/125700340
  25. https://blog.csdn.net/qq_29225913/article/details/105347317
  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值