WSL2使用Nvidia-Docker实现CUDA版本自由切换

2023-05-16

众所周知,深度学习的环境往往非常麻烦,经常不同的项目所依赖的 torch、tensorflow 包对 CUDA 的版本也有不同的要求,Linux 下进行 CUDA 的管理比较麻烦,是一个比较头疼的问题。

随着 WSL2 对物理机显卡的支持,Nvidia-Docker 也提供了对容器显卡的支持。我们可以通过拉取不同的 Docker 镜像的方式来实现对容器内 CUDA、CUDNN 的自由切换,操作非常简易。

1. Win11 显卡驱动的安装

注意:WSL2中是不需要且不能安装任何显卡驱动的,它的显卡驱动完全依赖于 Win11 中的显卡驱动,因此我们只需要安装你显卡对应的 Win11 版本显卡驱动版本(必须是 Win11 版本的驱动),这个已经有很多教程了,这里就不赘述。如果你安装成功,可以在 Win11 的 cmd 中输入 nvidia-smi可以看到下图。
在这里插入图片描述

因为 WSL2 中的显卡驱动完全依赖于 Win11 的显卡驱动,因此在 WSL2 中输入 nvidia-smi 也可以看到相同驱动版本的输出。
请注意:这里的 nvidia-smi 能作用的范围,只作用于你 Win11 安装显卡驱动时所登录的那个用户名对应到 WSL2 中的用户名。比如我是在 Win11 (guosongyuan) 用户上安装的显卡驱动,那么我只能在 WSL2 的 gsy 用户状态下才能执行该 nvidia-smi 指令,root 用户执行该命令是不能生效的。

在这里插入图片描述

2. 安装 Docker 和 Nvidia-Docker

  1. 安装 Docker 引擎可以参考文档:Docker 引擎官方安装教程;
  2. 安装 Docker 引擎之后,就可以在其基础上安装 Nvidia-Docker 组件:Nvidia-Docker 安装教程。
    这两个步骤非常简单,如果看不懂英语的话直接用谷歌翻译就好。

3. 选择合适的 CUDA 和 CUDNN 的镜像

使用 Nvidia-Docker 的好处就在于,你不需要真的在 WSL 中安装 CUDA 和 CUDNN,这样就可以避免在配置不同项目环境时遇到的很麻烦的环境切换问题。我们只要每次遇到一个新的项目,拉取对应的 CUDA 和 CUDNN 版本即可,即插即用,不想用了直接删除对应的镜像和容器即可,跟删除软件一样方便。

这里以安装 CUDA 11.2.0 版本为例,我们来到 Docker 镜像市场:Docker HUB,在其中搜索关键字 nvidia/cuda,如下图。
在这里插入图片描述

点进入,在 Tags 中搜索对应的 CUDA 版本,注意同一个版本下对应三种不同的类型(devel、runtime、base),我们推荐安装 devel 版本,因为它的环境更齐全,我们这里因为 WSL2 是 Ubuntu 20.04 版本的,所以我们选择镜像的时候选择 ubuntu20.04 后缀的。
这里以 nvidia/cuda:11.2.0-cudnn8-devel-ubuntu20.04 镜像为例,通过 sudo docker pull nvidia/cuda:11.2.0-cudnn8-devel-ubuntu20.04 将镜像拉取下来。

拉取镜像之后,我们可以查看当前镜像中的显卡驱动、CUDA版本和 CUDNN 的版本。

  1. 查看显卡驱动版本:sudo docker run --rm --gpus all nvidia/cuda:11.2.0-cudnn8-devel-ubuntu20.04 nvidia-smi
  2. 查看 CUDA 版本:sudo docker run --rm --gpus all nvidia/cuda:11.2.0-cudnn8-devel-ubuntu20.04 nvcc -V
  3. 查看 CUDNN 版本,因为镜像官方将 CUDA 和 CUDNN 进行了解耦合,因此我们需要分两步进行查询操作。首先通过 sudo docker run --rm --gpus all nvidia/cuda:11.2.0-cudnn8-devel-ubuntu20.04 whereis cudnn,看到 cudnn.h 所在路径 cudnn: /usr/include/cudnn.h。我们根据这个输出结果,把 cudnn.h 之前的 include 路径记住,查询该 include 下的 cudnn_verseion.h 文件:sudo docker run --rm --gpus all nvidia/cuda:11.2.0-cudnn8-devel-ubuntu20.04 cat /usr/include/cudnn_version.h | grep CUDNN_MAJOR -A 2,这样就能看到 CUDNN 的版本号了。
    在这里插入图片描述

4. 利用拉取的镜像构建自己的镜像

我们拉取的镜像中只有最基础的 CUDA 和 CUDNN,还没有配置 Anaconda、换源、git 、pip 等常用工具,因此我们将这些可能用到的常用工具将其打包好。

为了构建镜像,我们在用户目录下创建一个名为 mkimage 的目录,在其中放入我们需要的三个内容: Anaconda3-5.2.0-Linux-x86_64.sh、Dockerfile、sources.list,其中 sources.list 是用来给 Ubuntu apt 换源用的。

sources.list 内容如下:

######################################
###### CONTENT for 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

Dockerfile内容如下:

####################################
###### CONTENT for Dockerfile ######
####################################

# Extends from father image [CHANGE WITH YOUR NEED]
FROM nvidia/cuda:11.2.0-cudnn8-devel-ubuntu20.04

# Set locale
ENV DEBIAN_FRONTEND noninteractive

# Change anaconda source
# ADD means copy file from host machine to containers
ADD sources.list /etc/apt/
ENV PATH /opt/conda/bin:$PATH

# Install basic dependencies
RUN rm /etc/apt/sources.list.d/cuda.list && \
	rm /etc/apt/sources.list.d/nvidia-ml.list
	
RUN apt-get update && apt-get install -y --no-install-recommends \
	bzip2 \
	g++ \
	git \
	vim \
	python-dev \
	python3-pip \
	build-essential \
	wget && \
	rm -rf /var/lib/apt/lists/*

# Install Anaconda for python 3.6
ADD Anaconda3-5.2.0-Linux-x86_64.sh /home/anaconda.sh
RUN /bin/bash /home/anaconda.sh -b -p /opt/conda && \
	ln -s /opt/conda/etc/profile.d/conda.sh /etc/profile.d/conda.sh && \
	rm /home/anaconda.sh

# Change sources for conda, add tsinghua sources and remove defaults
RUN conda config --add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ && \
	conda config --add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ && \
	conda config --add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/ && \
	conda config --add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/ && \
	conda config --add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/pro/ && \
	conda config --remove channels defaults

# Change sources for pip3
RUN mkdir ~/.pip && \
	echo "[global]\nindex-url = http://mirrors.aliyun.com/pypi/simple/\n[install]\ntrusted-host = mirrors.aliyun.com" > ~/.pip/pip.conf

# Initialize workspace
RUN mkdir /workspace
WORKDIR /workspace

CMD ["/bin/bash"]

其中,Anaconda3-5.2.0-Linux-x86_64.sh 可以在 Anaconda Archive 中找到。

然后,我们可以通过下列指令制作镜像 my-nvidia/cuda:11.2

cd ~/mkimage
sudo docker build -f Dockerfile -t my-nvidia/cuda:11.2 .

经过漫长的等待,我们可以看到一个 Successfully 提示消息,证明我们镜像打包成功。
在这里插入图片描述

构建完成后,我们可以通过下面这个指令进行容器的创建:

sudo docker run -it --gpus all --name cuda_11.2 my-nvidia/cuda:11.2 /bin/bash

进入容器之后,我们可以通过 nvidia-sminvcc -Vconda info 查看当前的显卡驱动、CUDA版本和 conda 源信息。
如果使用 conda 安装包的时候出现了conda Malformed version string ‘~’: invalid character(s)报错,可以使用下面的命令更新一下 conda。

conda upgrade -n base -c defaults --override-channels conda
conda update --all

我这里从 PyTorch 官网中下载了一个对应 CUDA 版本的 torch(我创建了一个名为 pytorch 的 conda 虚拟环境),可以看到在容器中 GPU 资源是可以正常被访问的。这样我们以后就可以随时切换 CUDA 版本了,是不是很方便?
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WSL2使用Nvidia-Docker实现CUDA版本自由切换 的相关文章

  • Stable Diffusion+ControlNet+Lora 指导AI+艺术设计的WebUI全流程使用教程

    目录 一 背景知识1 1 Stable Diffusion背景知识1 2 ControlNet 背景知识 二 使用方法2 1 环境配置2 2 运行WebUI 三 背景知识3 1 Stable Diffusion参数详解3 2 Control
  • Ubuntu20.04+Windows10双系统迁移新硬盘并解决引导损坏全流程总结

    目录 一 备份原有系统1 1 压缩原系统的 目录 二 安装新系统三 迁移系统四 引导修复4 1 Ubuntu引导修复4 2 Win10引导修复4 3 双系统grub修复 因工作需要 xff0c 欲将Ubuntu系统迁移到一块全新SSD中 x
  • Ubuntu20.04使用多卡训练HyperNetwork模型和LoRA模型全流程及疑难问题解决方案

    目录 一 LoRA模型多卡训练1 1 安装xformer等库1 2 设置路径1 3 多卡训练 二 HyperNetwork模型多卡训练2 1 HyperNetwork通过WebUI训练 疑难报错解决方案多卡训练报错 软硬件配置 xff1a
  • 【原创】SystemVerilog和Verilog中的表达式位宽

    Verilog和SystemVerilog作为一种 松散类型 的语言已经被很多工程师广泛的用于设计验证领域 xff0c 但是这并不是说各种电路结构或者验证环境中就可以肆无忌惮的随意使用 xff0c 特别是在不同位宽的信号进行计算时 xff0
  • java反射获取子类或者父类的属性值

    方法介绍 1 获取所有属性 span class token keyword private span span class token keyword static span span class token class name Lis
  • momentjs 常用总结

    平时在工作中经常需要对时间进行处理 xff0c 用momentjs 可以快速又方便的对时间格式进行处理 1 let time 61 moment 输出当前国际化时间 相当于 newDate 2 let time 61 moment X fo
  • 第一次CSP模拟-A-咕咕东的奇遇

    咕咕东是个贪玩的孩子 xff0c 有一天 xff0c 他从上古遗迹中得到了一个神奇的圆环 这个圆环由字母表组成首尾相接的环 xff0c 环上有一个指针 xff0c 最初指向字母a 咕咕东每次可以顺时针或者逆时针旋转一格 例如 xff0c a
  • week4作业-C-TT的神秘礼物

    TT 是一位重度爱猫人士 xff0c 每日沉溺于 B 站上的猫咪频道 有一天 xff0c TT 的好友 ZJM 决定交给 TT 一个难题 xff0c 如果 TT 能够解决这个难题 xff0c ZJM 就会买一只可爱猫咪送给 TT 任务内容是
  • UIScrollView的作用原理,实现scrollView传递touch事件给子视图

    span style font family none 我们知道当多个视图进行叠加的时候 xff0c touch事件是作用到最上面的视图上 xff0c 但是如果父视图是UIScrollView xff0c 如果默认 xff0c 可能touc
  • win10虚拟机VMware安装homeassistant镜像

    从今天开始 xff0c 我开始倒腾智能家居 xff0c 谈到智能家居就离不开一个开源的家庭智能控制系统home assistant 这个home assistant可以连接很多智能设备 之后 xff0c 我也会把自己在这过程中学习到的东西或
  • hadoop集群环境搭建

    目录 思路 配置master服务器 配置slave服务器 启动 运行example 常见报错 多次初始化导致master和slave的clusterID的不一致 INFO mapreduce Job Running job job 1647
  • zookeeper集群环境搭建

    目录 第一台主机 其他两台主机 启动 常见报错 Starting zookeeper FAILED TO START 3台Linux虚拟机 xff0c 与 hadoop环境搭建 相同 第一台主机 1 下载安装包 在 Index of apa
  • HBase分布式环境搭建

    目录 第一台主机 其他两台主机 启动 常见报错 SLF4J Class path contains multiple SLF4J bindings 3台Linux虚拟机 xff0c 与 zookeeper环境搭建 相同 xff0c 承接上文
  • Linux报错集锦

    收录平时使用linux时遇到的各种报错 xff0c 方便以后查阅 xff0c 如果大家遇到同样的问题时也能节省一些时间 原文链接 xff08 会有更新 xff09 https thrilling coffee afc notion site
  • 【20200602程序设计思维与实践 Week15 作业】

    目录 B ZJM 与生日礼物题意思路代码 C ZJM 与纸条题意思路代码 B ZJM 与生日礼物 题意 ZJM收到了Q老师送来的生日礼物 xff0c 但是被 Q老师加密了 只有 ZJM 能够回答对Q老师的问题 xff0c Q老师才会把密码告
  • 宝塔Linux搭建靶场(DVWA,pikachu,sqli,upload,xxs)

    靶场下载地址 链接 xff1a https pan baidu com s 1acxeSoI8TcvGXEGOa0a3WA 提取码 xff1a nbxx 安装宝塔Linux环境 Ubuntu安装宝塔Linux命令wget O install
  • anaconda中通过pytesseract识别中文字符

    使用pytesseract识别中文字符 环境的安装可以参考 xff1a https editor csdn net md articleId 61 109255325 首先 xff0c 需要下载相应的数据集 xff0c 可以自行搜索官网 x
  • (3)PCIE中断简介(学无止境)

    1 引言 FPGA与CPU进行数据交互时 xff0c 一般需要进行DMA操作 xff0c 包括读DMA和写DMA操作 读 写DMA一些控制信号一般需要通过中断的方式实现 xff1b 例如 xff1a DMA开始 DMA结束等 2 PCIE中
  • MySQL:ERROR 1193 (HY000): Unknown system variable ‘validate_password_policy‘的解决方法

    当我们设置数据库密码级别的时候 mysql gt set global validate password policy 61 0 mysql gt set global validate password length 61 4 出现这样
  • window下使用ssh以及配置免密登录

    因为最近的项目需要部署到多台服务器上 xff0c 如果一台一台的去操作的话 xff0c 显然太费时费力了 xff0c 由于公司又没有一整套完整的发布部署平台 xff0c 所以我就自己写了个批处理脚本来实现项目的部署以及日志的拉取 xff0c

随机推荐