在 WSL2 中使用 NVIDIA Docker 进行全栈开发和深度学习 TensorFlow pytorch GPU 加速

WSL2使用NVIDIA Docker进行全栈开发和深度学习

1. 前置条件

1.1. 安装系统

Windows 10 版本 2004 及更高版本(内部版本 19041 及更高版本)或 Windows 11

跳过

1.2. 处理好网络环境

安装过程中需要访问国际网络,自行处理好。建议开启 tun 模式

2. 准备 WSL

2.1. 安装 WSL

在管理员模式下打开 PowerShell 或 Windows 命令提示符

wsl --install

安装完成,重启电脑

2.2. 首次打开 WSL

重启完成后,打开 powershell,输入

wsl

此时应该会提示为 Linux 发行版创建“用户名”和“密码”

如果这里提示没有安装 Linux 发行版,那么这里可以再次执行 wsl --install,会自动安装 Ubuntu 22.04 LTS

2.3. 设置 root 密码

sudo passwd

2.4. 换源

切换到 root 用户,执行下面命令换源

cat <<'EOF' > /etc/apt/sources.list
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirror.nju.edu.cn/ubuntu/ jammy main restricted universe multiverse
# deb-src https://mirror.nju.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirror.nju.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
# deb-src https://mirror.nju.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirror.nju.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
# deb-src https://mirror.nju.edu.cn/ubuntu/ jammy-backports main restricted universe multiversedeb https://mirror.nju.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
# deb-src https://mirror.nju.edu.cn/ubuntu/ jammy-security main restricted universe multiverse# deb http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse
# # deb-src http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse# 预发布软件源,不建议启用
# deb https://mirror.nju.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
# # deb-src https://mirror.nju.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
EOF

出处:南京大学镜像站 -> https://mirror.nju.edu.cn/mirrorz-help/ubuntu/?mirror=NJU

2.5.(可选)迁移 WSL 磁盘目录

这里以迁移到 D:\hyper-v\ubu1\ubu1.vhdx 为例

2.6. 设置默认用户

你的用户名 替换成你设置的用户名,然后在 WSL 中执行

sudo echo "[user]\ndefault=你的用户名" >> /etc/wsl.conf

比如我的用户名是 linux,那么我执行的命令就是 sudo echo "[user]\ndefault=linux" >> /etc/wsl.conf

2.7. 导出磁盘镜像

在 Windows poweshell 中执行

wsl --export Ubuntu d:\hyper-v\ubu1\ubu1.vhdx --vhd

2.8. 删除原系统

wsl --unregister Ubuntu

2.9. 导入新系统

wsl --import-in-place ubu1 d:\hyper-v\ubu1\ubu1.vhdx

3. 配置 NVIDIA Docker

3.1. 安装 Docker

在 powershell 中输入 wsl,进入 WSL 中,执行

首先安装依赖:

sudo apt-get update
sudo apt-get install ca-certificates curl gnupg

信任 Docker 的 GPG 公钥并添加仓库:

sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirror.nju.edu.cn/docker-ce/linux/ubuntu \"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

最后安装 Docker

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

3.2. 配置普通用户直接使用 Docker 命令

sudo gpasswd -a $USER docker
newgrp docker

3.3 安装 NVIDIA 支持

通过运行以下命令为 NVIDIA 容器工具包设置稳定存储库:

distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-docker-keyring.gpg
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-docker-keyring.gpg] https://#g' | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

安装 NVIDIA 运行时包和依赖项

sudo apt-get update
sudo apt-get install -y nvidia-docker2

3.4 Docker 换源

修改配置文件

sudo nano /etc/docker/daemon.json

正常走到这一步应该是这样的
在这里插入图片描述
添加一行

,"registry-mirrors": ["https://docker.nju.edu.cn/"]

在这里插入图片描述

按下 ctrl+o 再按下 回车 保存文件

再按下 ctrl+x 退出编辑器

检查一下结果,cat /etc/docker/daemon.json
在这里插入图片描述
重启 Docker

sudo systemctl restart docker

4. 拉取 & 运行 Docker 镜像

这个全栈开发镜像是我自己构建的
Dockfile 在 GitHub 仓库这里 https://github.com/james-curtis/code-os-debian
包含了

  • zsh
  • ohmyzsh
  • powerlevel10k
  • 中文语言包,gui 下微软雅黑字体支持
  • nodejs、nvm
  • openssh
  • c++
  • wslg 透传到 Windows 母机支持
  • Python、conda、pdm
    temurin 8、11、17 jdk,jenv
    docker cli
    TensorFlow
    pytorch
    cuda 11.8、cudatoolkit

4.1. 拉取镜像

由于镜像较大,建议单独拉取

  • GPU 支持镜像(9.94 GB):jamescurtisfoxmail/code-os:latest-gpu
  • 仅 CPU 支持镜像(2.77 GB):jamescurtisfoxmail/code-os:latest

这里以 GPU 支持镜像为例

docker pull jamescurtisfoxmail/code-os:latest-gpu

4.2. 下载 compose 配置

下载 Docker compose 配置

git clone https://github.com/james-curtis/code-os-debian.git

4.3. 启动 Docker compose

启动 docker compose

cd code-os-debian/docker/wsl/
bash run-gpu.sh

可以看到已经启动成功了
在这里插入图片描述

5. 检验成果

先进入 Docker 容器

source .gpu-envrc
docker compose exec os zsh

在这里插入图片描述

如果字体乱码,应该是没有配置 powerlevel10k 的 MesloLGS NF 字体支持。

我使用的终端是 tabby 全平台支持

在这里插入图片描述
在项目中有这几个字体,复制到 c:\windows\fonts 中即可
在这里插入图片描述

5.1. 检测 wslg 支持

xeyes 会显示一个跟随鼠标的小眼睛

xclock 是显示一个时钟
在这里插入图片描述

5.2. 检测 NVIDIA 支持

nvidia-smi

在这里插入图片描述
我这里显示出了母机的 3060,说明 Docker 已经检测到这张显卡

5.3. 检测 TensorFlow支持

5.3.1 TensorFlow CPU

python3 -c "import tensorflow as tf; print(tf.reduce_sum(tf.random.normal([1000, 1000])))"

在这里插入图片描述

打印出了张量

5.3.2 TensorFlow GPU

python3 -c "import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))"

在这里插入图片描述

可以看到 TensorFlow 也检测到了显卡

5.3.3 安装 kaggle cli

pip install kaggle

登录 kaggle 下载登录凭据,下载到 ~/.kaggle/kaggle.json

官方教程 https://github.com/Kaggle/kaggle-api#api-credentials

设置权限

chmod 600 ~/.kaggle/kaggle.json

在这里插入图片描述

5.3.4 检测 TensorFlow GPU 负载支持

这里我们使用 kaggle cli 下载比赛中别人提交的代码进行测试,https://www.kaggle.com/code/hassanamin/tensorflow-mnist-gpu-tutorial

在这里插入图片描述
复制下载命令

在这里插入图片描述

启动 openssh-server

sudo service ssh start

在这里插入图片描述

打开 vscode 进行远程连接
需要先下载远程开发插件 ms-vscode-remote.vscode-remote-extensionpack
在这里插入图片描述
点击左下角的蓝标,会弹出命令列表,选择 Connect to host

在这里插入图片描述
直接连接 localhost 即可

为什么可以直接通过 localhost 连接有两个原因

  1. 微软支持宿主机直接访问 WSL 的监听端口
  2. docker compose 中设置的 network 类型是 host,也就是和 WSL 公用一个网络

在这里插入图片描述

点击右侧的 Connect

在这里插入图片描述
会提示选择平台和输入密码

完成之后即可进行远程开发

进入刚刚 kaggle 的项目

这里由于的刚刚我下载的目录是 /tmp/kaggle/tf 所以这里我需要打开这个目录

在这里插入图片描述
安装插件
需要安装的插件有

  • donjayamanne.python-extension-pack
  • donjayamanne.python-extension-pack

安装完成之后需要加载窗口

选择运行环境
选择 conda Python3.9 作为运行环境
在这里插入图片描述
逐个单元格运行试试效果

可以看到检测到 GPU 了
在这里插入图片描述
可以看到成功调用宿主机显卡
在这里插入图片描述
不过似乎没有使得显卡满载

5.4. 检测 pytorch cuda 支持

在 WSL 中执行

python3 -c "import torch;print(torch.cuda.is_available());"

在这里插入图片描述

这里我还没有换 vscode 的终端字体,所以乱码了,忽略即可

5.4.1 检测 pytorch GPU 负载支持

对于 pytorch,这里使用 https://www.kaggle.com/code/lyhue1991/pytorch-gpu-examples,作为测试 demo

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
可以看到成功调度 GPU

6. 检查 nodejs

node -v
nvm list

在这里插入图片描述

7. 检查 java

java -version
javac -version
jenv versions

在这里插入图片描述

8. 检查 c++

g++ -v
gcc -v

在这里插入图片描述

9. 容器卷

在 Dockerfile 中有写到

# =========== 配置 容器卷 =============
VOLUME [ "/mnt/workspace", "/mnt/data" ]

这两个目录都是持久化的,也就是 docker 容器销毁之后,只有这两个目录下的文件不会清理(重启不影响)

其中 /mnt/workspace 是映射到 WSL 中的,IO 性能比较差

/mnt/data 是没有映射的容器卷,IO 性能较好,建议项目都放到该目录下

至于 /home/linux 用户目录下的文件可以自己创建并映射容器卷

6. 参考文档

  • https://learn.microsoft.com/zh-cn/windows/wsl/install
  • https://docs.docker.com/engine/install/ubuntu/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1620473.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

UML四大关系

文章目录 引言UML的定义和作用UML四大关系的重要性和应用场景关联关系继承关系聚合关系组合关系 UML四大关系的进一步讨论UML四大关系的实际应用软件开发中的应用其他领域的应用 总结 引言 在软件开发中&#xff0c;统一建模语言&#xff08;Unified Modeling Language&#x…

python+协同过滤算法实现简单的图书推荐系统

背景介绍 当我们做一些推荐系统网站时&#xff0c;通常需要合适的推荐算法&#xff0c;下面给大家介绍推荐系统中经典的推荐算法——协同过滤算法。在本文中通过Python语言&#xff0c;以一个图书推荐系统为案例&#xff0c;最终实现一个基于用户对图书的评分而对指定的用户个…

如何使用腾讯云服务器搭建网站?新手建站教程

使用腾讯云服务器搭建网站全流程&#xff0c;包括轻量应用服务器和云服务器CVM建站教程&#xff0c;轻量可以使用应用镜像一键建站&#xff0c;云服务器CVM可以通过安装宝塔面板的方式来搭建网站&#xff0c;腾讯云服务器网分享使用腾讯云服务器建站教程&#xff0c;新手站长搭…

代码随想录算法训练营第四十八天|LeetCode 583,72,编辑距离总结篇

目录 LeetCode 583.两个字符串的删除操作 动态规划五步曲&#xff1a; 1.确定dp[i][j]的含义 2.找出递推公式 3.初始化dp数组 4.确定遍历方向 5.打印dp数组 LeetCode 72.编辑距离 动态规划五步曲&#xff1a; 1.确定dp[i][j]的含义 2.找出递推公式 3.初始化dp数组 4.确定遍历方…

JAVA rs232

JAVA rs232 全套资源提供 全套项目资源环境都在我发布的资源里环境 MAVEN 依赖代码贴出 全套项目资源环境都在我发布的资源里 环境 Configure Virtual Serial Port Driver 模拟串口 友善串口工具调试 MAVEN 依赖 <dependency><groupId>org.bidib.jbidib.org.qba…

java输出hello world_java输出Hello World

一、输出“Hello World!” 1、新建一个java项目,点击File->New->Java Project,创建java项目的界面之后,输入项目名称wly,点击finish。 2、创建好java项目之后,鼠标右键项目,选择New->Class,创建一个类,mypackage为包名,Name类名Hello,首字母大写,点击fini…

二,java输出hello

1&#xff0c;创建文件Hello.java 2, 文件里输入 public class Hello{public static void main(String[] args){System.out.print("hello world!");} } 3&#xff0c; javac Hello.java 会生成一个class文件 4&#xff0c; 然后java Hello 注意&#xff1a; 1…

Go语言入门记录:从基础到变量、函数、控制语句、包引用、interface、panic、go协程、Channel、sync下的waitGroup和Once等

程序入口文件的包名必须是main&#xff0c;但主程序文件所在文件夹名称不必须是main&#xff0c;即我们下图hello_world.go在main中&#xff0c;所以感觉package main写顺理成章&#xff0c;但是如果我们把main目录名称改成随便的名字如filename也是可以运行的&#xff0c;所以…

C语言练习5(巩固提升)

C语言练习5 选择题 选择题 1&#xff0c;下面代码的结果是&#xff1a;( ) #include <stdio.h> #include <string.h> int main() {char arr[] { b, i, t };printf("%d\n", strlen(arr));return 0; }A.3 B.4 C.随机值 D.5 &#x1f4af;答案解析&#…

阿里云servless实现身份证智能识别Demo

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 servless实现身份证智能识别。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、如何快速实现阿里云Servless实现身份识别&#xff1f; 1…

观察级水下机器人使用系列之六超短基线(下)

本文主要讲述超短基线的安装校准和应用。 1、安装校准概述 水下声学导航系统标定算法的准确性很大程度上取决于所采集的数据质量、超短基线基阵的几何结构、高效的数值计算算法等方面。Mc Ewen 等在 2005 年发现了对于分立式的超短基线系统&#xff0c;水声传感器与姿态传感器…

附加题——有趣的搜索《我最怕的就是计算机系的学生被别人说成是个带着厚眼镜的,只能够在电脑前编编程序》...

链接&#xff1a;链接 学校/专业&#xff1a; 无 作者&#xff1a;钻石之黎明 时间&#xff1a;2008-10-04 19:22:40 链接&#xff1a;链接 学校/专业&#xff1a; 无 转载者&#xff1a;foresee 时间&#xff1a;2008-12-10 11:43:17 链接&#xff1a;链接 学校/专业&#xff…

外包,我也挺知足

今天给大家介绍一位录友&#xff0c;这位录友很特别&#xff0c;看完他的故事&#xff0c;你会感觉自己的起步已经很高了。 他15年上大学用不起智能机。读计算机专业&#xff0c;却买不起电脑。家里去年才通网。找工作的时候不知道要多少工资&#xff0c;让HR看着给就行。入职…

C#---第十九课:不同类型方法的执行顺序(new / virtual / common / override)

本文介绍不同类型的方法&#xff0c;在代码中的执行顺序问题&#xff1a; 构造方法普通方法&#xff08;暂用common代替&#xff09;、虚方法&#xff08;Virtual修饰&#xff09;、New方法&#xff08;new修饰&#xff09;三个优先级相同overide方法&#xff08;会替换virtual…

[Android]JNI的基础知识

目录 1.什么是JNI 2.配置JNI开发环境NDK 3.创建Native C类型的项目 4. 了解CMakeLists.txt 文件 5.了解native-lib.cpp 文件 6.在 Android 的 MainActivity 中调用 native-lib.cpp 中实现的本地方法 1.什么是JNI JNI&#xff08;Java Native Interface&#xff09;是一…

vue项目打包后出现页面布局异常、图片显示不出来等问题

通常我们写完vue项目后&#xff0c;会执行 npm run serve 对项目进行打包。执行完后&#xff0c;就在项目的目录中生成dist文件夹。一开始&#xff0c;我以为双击dist文件夹里index.html会把打包后的项目运行起来&#xff0c;结果在浏览器看到的页面布局异常以及许多图片没有加…

word无法显示图像计算机可能没有足够的,Word图片显示不出来怎么办 Word图片显空白的解决办法-电脑教程...

最近百事网小编钢琴下的旋律发来了一些Word投稿文档&#xff0c;不过奇怪的是Word里边的很多图片都显示不出来&#xff0c;原先以为可能是图片过多&#xff0c;可能一下子没载入完&#xff0c;不过等待很长一段时间后&#xff0c;很多Word里边的图片依旧显示不出现&#xff0c;…

java 选择图片 显示不出来的_java图片显示不出来怎么办

java图片显示不出来怎么办&#xff1f; 解决javaweb项目使用Tomcat服务在网页中的某些页面中的图片无法显示问题。 最近写了一个web项目&#xff0c;但在浏览器中测试&#xff0c;发现某些页面中的图片无法显示。 推荐教程&#xff1a;《java学习》 原因是在加载页面时一些img标…

html显示网上图片不显示不出来,网页图片显示不出来,教您网页不显示图片怎么办...

在使用电脑浏览网页的时候是不是有碰到过网页不显示图片的时候&#xff1f;可能因为是网速慢&#xff0c;所以造成加载图片失败;当然也有其他的原因&#xff0c;像有些地方设置错误的话也会导致网页图片显示不出来的。下面&#xff0c;小编跟大伙一同探讨一下网页不显示图片的解…