在 WSL2 中使用 NVIDIA Docker 进行全栈开发和深度学习 TensorFlow pytorch GPU 加速
在 WSL2 中使用 NVIDIA Docker 进行全栈开发和深度学习 TensorFlow pytorch GPU 加速
0. 背景
0.1 起源
- 生产环境都是在 k8d pod 中运行,直接在容器中开发不好嘛?
- 每次换电脑,都要配配配,呸呸呸
- 新电脑只安装日常用的软件不好嘛,环境变量配配配,各种日常软件和开发软件到处拉💩
- 虚拟机呗,怎么调用 GPU 是个问题,hyper-v 好像是可以魔改配置实现,又得改改改。改好了本地能跑了,生产给你报错报错错错错
- 到处拉💩,文件弄乱了怎么办,容器直接销毁重建就完事,分分钟解决。电脑重装再配环境也遭不住
0.2. 容器化开发之后
- 宿主机电脑随便换,随便重装。重装之后我只要
上网+wsl --install+get docker+docker compose up -d就完事了 - 换 macOS?没事,
docker compsoe up -d - 换 Windows?没事,
docker compose up -d - 没电脑?没事,搞台远程机子
ssh+docker compose up -d - 电脑炸了?没事,所有 git 修改都在远端有一份。开发环境换台机子
docker compose up -d继续
0.3 不足
- 如果是做 k8s 开发的,估计不行,起本地集群建议用 vagrant。本质上一个容器根本无法解决这个问题
- 如果没有机器不支持
systemd没法搞,比如公司只给提供开发容器环境(只能操作给你的容器),这个情况下目前正在解决,使用 ansible 重写 Dockerfile 里面的脚本,摆脱容器限制。主要区别就是环境安装过程在本地还是在远端
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
参考:docker 官网 和 南京大学镜像 -> https://mirror.nju.edu.cn/mirrorz-help/docker-ce/?mirror=NJU
在 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 支持
参考:微软 WSL 官方文档:https://learn.microsoft.com/zh-cn/windows/wsl/tutorials/gpu-compute
通过运行以下命令为 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
输入密码 linux
默认用户和密码都是
linux
root用户名也是linux

打开 vscode 进行远程连接
需要先下载远程开发插件 ms-vscode-remote.vscode-remote-extensionpack

点击左下角的蓝标,会弹出命令列表,选择 Connect to host

直接连接 localhost 即可
为什么可以直接通过
localhost连接有两个原因
- 微软支持宿主机直接访问 WSL 的监听端口
- 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/
相关文章:
在 WSL2 中使用 NVIDIA Docker 进行全栈开发和深度学习 TensorFlow pytorch GPU 加速
在 WSL2 中使用 NVIDIA Docker 进行全栈开发和深度学习 TensorFlow pytorch GPU 加速 0. 背景 0.1 起源 生产环境都是在 k8d pod 中运行,直接在容器中开发不好嘛?每次换电脑,都要配配配,呸呸呸新电脑只安装日常用的软件不好嘛&…...
模拟实现应用层协议
模拟实现应用层协议 文章目录 模拟实现应用层协议应用层再谈协议 序列化和反序列化 网络版计算器自定义协议利用Json进行序列化和反序列化json库的安装条件编译 应用层 应用层(Application layer)是OSI模型的第七层。应用层直接和应用程序接口并提供常见…...
SAP-MM-冲销凭证布局变更
业务场景: 仓管员在冲销物料凭证时MBST,显示行很少,只有7行,提出需求调整布局为多行,但是MBST没有调整布局功能, 解决:点击“定制本地布局-选项-字体设置”调整字体大小 跟据需求调整字体&…...
事务方法中保证数据只插入一次方案探究
需求场景 在项目的接口请求中,我们有一个接口A需要事务支持,在接口A中调用了方法B,方法B也需要事务支持,两者都带有Transactional注解。在B方法中是这个一个逻辑,查询本地数据库是否包含属性值为一个特定值的字段&…...
高通开发系列 - 5G网络之QTI守护进程服务介绍
By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 返回:专栏总目录 目录 代码位置和依赖关系功能介绍代码逻辑讲解外设节点关注的目录socket服务端初始化DPM客户端监听守护关键的数据结构体…...
Ansible学习笔记3
ansible模块: ansible是基于模块来工作的,本身没有批量部署的能力,真正具有批量部署的是ansible所运行的模块,ansible只是提供一个框架。 ansible支持的模块非常多,我们并不需要把每个模块记住,而只需要熟…...
DP读书:鲲鹏处理器 架构与编程(十)鲲鹏软件生态与云服务
十秒带你了解鲲鹏软件生态与云服务 鲲鹏软件生态与云服务ARM授权机制在传统的PC领域,半导体厂商的业务类型主要分为两种:在移动领域, ARM服务器生态鲲鹏服务器软件生态1. 鲲鹏计算产业2. 鲲鹏软件生态兼容性3. openEluer操作系统4. 鲲鹏软件栈…...
CSS_IOS适配状态栏和IOS底部安全区域
状态栏 var(--status-bar-height)计算属性 height: calc(var(--status-bar-height) 343px);底部安全区 先constant再env constant(safe-area-inset-bottom) env(safe-area-inset-bottom)计算属性 height: calc(132px constant(safe-area-inset-bottom)); height: calc(1…...
中央仓库更新失败,IDEA报错repository is non-nexus repo, or does not indexed
某个仓库未被识别为 Nexus 仓库,或者没有被正确地索引。导致引入依赖一直爆红,找不到。只有本地仓库的依赖没报错,因为下载过了,添加新的依赖就需要到远程仓库找就爆红。 解决 去阿里云Maven官网看了一下,发现阿里云…...
设计模式--代理模式
笔记来源:尚硅谷Java设计模式(图解框架源码剖析) 代理模式 1、代理模式的基本介绍 1)代理模式:为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象2)这样做的好处是…...
链路聚合原理
文章目录 一、定义二、功能三、负载分担四、分类五、常用命令 首先可以看下思维导图,以便更好的理解接下来的内容。 一、定义 在网络中,端口聚合是一种将连接到同一台交换机的多个物理端口捆绑在一起,形成一个逻辑端口的技术。通过端口聚合&…...
el-table表尾添加合计行,自动合计,且特殊列自定义计算展示
效果如图 1.element-ui的table表格有合计功能,但是功能却不完善,会有不显示和计算出现错误的问题,项目中有遇到,所以记录下 show-summary:自动合计 getSummaries():对合计行进行特…...
uview ui 1.x ActonSheet项太多,设置滚动(亲测有效)
问题:ActionSheet滚动不了。 使用uview ui :u-action-sheet, 但是item太多,超出屏幕了, 查了一下文档,并没有设置滚动的地方。 官方文档:ActionSheet 操作菜单 | uView - 多平台快速开发的UI框架 - uni-a…...
STM32 Cubemx 同名外设中断及回调
文章目录 前言示例工程个人理解 前言 最近在学习STM32,采用HAL库开发方式。记录一下同名外设中断及回调。 这里提及的同名外设指USART1/2之类的相同外设,但不是同一个instance。 示例工程 以使用cubemx配置两个同名外设EXTI0/EXT4为例。 在NVIC配置…...
储能辅助电力系统调峰的容量需求研究(matlab代码)
目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序参考文献《储能辅助电力系统调峰的容量需求研究》,是一个很常规很经典的matlab优化代码,主要是对火电、风电和储能等电力设备主体进行优化调度,在调峰能力达不到时采…...
非计算机科班如何丝滑转码?(本人就是有点不丝滑)
我觉得无非三个办法可以选择(当然可能有其他方法) 自学 报班 有师傅带 但是在学习之前,你一定要明确你学习编程的目的是什么! 游戏开发?后台研发?爬虫工程师?前端程序员?数据分析师? 或者 仅仅是想做一…...
tensorrtx部署yolov5 6.0
文章目录 一. yolov5 v6.0训练模型二.训练好的yolov5模型转tensorrt引擎 一. yolov5 v6.0训练模型 官网下载yolov5 v6.0代码 下载官方预训练好的模型 安装yolov5所需要的库文件,requirements.txt在下载好的yolov5源代码中有 pip install -r C:\Users\10001540…...
用html5写一个音乐播放器
在HTML5中创建一个简单的音乐播放器时,你可以使用<audio>元素来实现。以下是一个基本的示例: html <!DOCTYPE html> <html> <head> <title>音乐播放器</title> </head> <body> <h1>音乐…...
postgresql类型转换函数
postgresql类型转换函数 简介CAST 函数to_date 函数to_timestamp 函数to_char 函数to_number 函数隐式类型转换 简介 类型转换函数用于将数据从一种类型转换为另一种类型。 CAST 函数 CAST ( expr AS data_type )函数用于将 expr 转换为 data_type 数据类型;Post…...
Go 自学:Array阵列
以下代码展示了用两种方法建立array。 package mainimport "fmt"func main() {var fruitList [4]stringfruitList[0] "Apple"fruitList[1] "Tomato"fruitList[3] "Peach"fmt.Println("Fruit list is: ", fruitList)fmt.…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...
【深度学习新浪潮】什么是credit assignment problem?
Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...
Mac flutter环境搭建
一、下载flutter sdk 制作 Android 应用 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 1、查看mac电脑处理器选择sdk 2、解压 unzip ~/Downloads/flutter_macos_arm64_3.32.2-stable.zip \ -d ~/development/ 3、添加环境变量 命令行打开配置环境变量文件 ope…...


