• 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
    
    • 1

    关键是要更新wsl。

    wsl --update
    
    • 1

    步骤:ubuntu 安装

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

    wsl --list --online
    
    • 1

    中选择一个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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    修改完毕后,使用命令更新:

    sudo apt-get update
    sudo apt-get upgrade
    
    • 1
    • 2

    步骤:Gcc安装

    sudo apt-get install build-essential
    sudo apt-get install gcc g++
    
    • 1
    • 2

    步骤:docker安装

    使用原生的docker,不要使用docker-dosktop,因为后者无法调用GPU。

    根据官网 安装提供的说明安装。

    docker安装完毕后可以用如下命令测试:

    docker -v  #看docker版本
    sudo docker run hello-world
    
    • 1
    • 2

    若提示错误:

    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'.
    
    • 1
    • 2
    • 3

    通常关闭docker服务并重启可以解决:

    sudo service docker stop
    sudo service docker start
    
    • 1
    • 2

    测试也可以用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"
    
    • 1
    • 2

    使用本机的浏览器来使用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"
      ]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    步骤: 安装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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    或者:

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    安装完毕后重启docker服务:

    sudo service docker stop
    sudo service docker start
    
    • 1
    • 2

    步骤: 测试docker的GPU调用

    可以有多重方法测试docker的GPU调用,比如:

    (1)nvidia-smi

    sudo docker run --rm --gpus all nvidia/cuda:11.0.3-base-ubuntu20.04 nvidia-smi
    
    • 1

    (2)k8s

    sudo docker run --gpus all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark
    
    • 1

    (3)tensorflow的测试

    docker run -it --gpus all -p 8888:8888 tensorflow/tensorflow:latest-gpu-py3-jupyter
    
    • 1

    成功运行可以看到以上界面,在windows系统的浏览器中输入localhost:8888/tree运行。

    (4)pytorch的测试

    sudo docker run --gpus all -it --name pytorch bitnami/pytorch /bin/bash
    
    • 1

    然后拷贝一个基于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
    
    • 1
    • 2

    注意安装时若出错,则去掉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}}
    
    • 1
    • 2

    更新环境变量配置

     source ~/.bashrc
    
    • 1

    完成后可以使用nvcc -V命令查看。

    步骤:ubuntu下安装cudnn

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

    注意需要使用nvidia账号登陆,临时注册一个即可。

    根据 安装说明 可知,我们可以使用不同的方式,选择tar版本的下载是比较快的方式,命令也少。

    下载tar版本的cudnn后,进入该文件所在目录并解压:

    tar -xvf cudnn-linux-x86_64-8.x.x.x_cudaX.Y-archive.tar.xz
    
    • 1

    然后用如下命令复制即可(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*
    
    • 1
    • 2
    • 3

    步骤: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
    
    • 1
    • 2
    • 3

    docker的启停操作

    sudo service docker stop
    sudo service docker start
    sudo service docker restart
    
    • 1
    • 2
    • 3

    sudo systemctl stop docker
    sudo systemctl start docker
    
    • 1
    • 2

    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
    
    • 1
    • 2

    从镜像启动容器并进入容器:

    sudo docker run -it 镜像名[:带标签]  /bin/bash
    
    • 1

    docker 操作免sudo

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

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

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

    sudo groupadd docker
    
    • 1

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

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

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

    dcoker的路径或端口映射

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

    sudo docker run --gpus all -it -v [宿主机路径]:[容器中的路径]  镜像名[:带标签]  /bin/bash
    
    • 1

    其中--gpus all是调用GPU,-v是路径映射

    docker run -i -t -p 8888:8888 anacondajupyter:v1 /bin/bash
    
    • 1

    其中-p是做端口映射

    dcoker的文件操作

    从宿主机复制文件到容器

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

    从容器复制文件到宿主机

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

    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
    
    • 1

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

    安装软件用

    conda install 
    
    • 1

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

    新建虚拟环境	conda create --name  	多个包名用空格分开
    切换conda环境	conda activate env_name	
    退出虚拟环境	conda deactivate	
    列出所有虚拟环境 conda info --envs
    
    • 1
    • 2
    • 3
    • 4

    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
    
    • 1
    • 2
    • 3

    手动运行容器中的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 &
    
    • 1
    • 2
    • 3
    • 4

    然后在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
  • 相关阅读:
    Http/https代理和抓包分析
    notepad++下载 地址真实有效
    【Oracle】Oracle系列之八--SQL查询
    Mybatis 拦截器 说明和使用 (一)
    【猿创征文】Vue3 企业级优雅实战 - 组件库框架 - 7 组件库文档的开发和构建
    Elk-Metricbeat配置Nginx的日志分析 (Metricbeat-part2)
    compile: version “go1.19“ does not match go tool version “go1.18.1“
    简单了解一下国产GPU
    前端—— 分层模型和应用协议
    Maven笔记
  • 原文地址:https://blog.csdn.net/xenonhu/article/details/126452682