Motivation:远程桌面开发 AI 模型容易占用 GPU 资源(串流编码)降低计算效率,以及受限于网络环境问题容易卡顿/掉帧,改用 SSH 远程连接方法可以规避该问题。
Env:WSL2 Ubuntu 24.04、Python 3.12、CUDA 13.0、PyTorch 2.9 (CUDA13 Version)
Win11商店里安装后运行
apt update && apt upgrade -y 更新。Befor you start:更常用的开发环境搭建是在系统下使用 Docker,在容器中配置 cuda、pytorch 等开发环境,几乎不会跟宿主机的环境发生冲突,同时更容易迁移和分发。
0. Docker 环境
‣
‣
首先安装 NVIDIA Container Toolkit,
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/stable/deb/nvidia-container-toolkit.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。当前最新版是1.17.8,官方文档提供的操作如下:export NVIDIA_CONTAINER_TOOLKIT_VERSION=1.17.8-1 sudo apt-get install -y \ nvidia-container-toolkit=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \ nvidia-container-toolkit-base=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \ libnvidia-container-tools=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \ libnvidia-container1=${NVIDIA_CONTAINER_TOOLKIT_VERSION}
此时 NVIDIA Container Toolkit 就安装完了,接着是 Docker,参考文档的
apt 安装:# Add Docker's official GPG key: sudo apt-get update sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc # Add the repository to Apt sources: echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update
包更新完后运行
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin,sudo systemctl status docker 显示运行即可。此时宿主机的环境应该同时具有 NVIDIA Container Toolkit 和 Docker,然后才能进行下一步:
sudo nvidia-ctk runtime configure --runtime=docker sudo systemctl restart docker
NV 官网文档介绍 nvidia-ctk 修改
/etc/docker/daemon.json 添加 NVIDIA 作为默认 runtime 后 Docker 就可以支持容器访问宿主机 GPU。接着使用
sudo docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi 创建一个临时容器检验安装是否成功。0.1 创建容器
https://hub.docker.com/r/nvidia/cuda/tags NVIDIA 在 Docker 的镜像。
如果是专注AI开发,还有一个库可以选择,参考0.2节。
这里使用 Dockerfile 构建自定义镜像和 compose 方法来创建容器(当然可以安装管理面板进行操作),在
docker-compose.yml 中保存以下内容,可按需设置。默认使用 NV 官方提供的镜像 nvidia/cuda:13.0.1-cudnn-devel-ubuntu24.04,包含了最新 cuda 和 cudnn,开箱即用。需要注意的是
runtime 版本的容器里 nvcc -V 是会显示 nvcc: command not found 的,因为只有运行环境,如果需要编译版本应该选择开发用的 devel。# Dockerfile for python 3.13 # 选择镜像 FROM nvidia/cuda:13.0.1-cudnn-devel-ubuntu24.04 # 更新系统并安装依赖 RUN apt-get update && apt-get install -y \ software-properties-common \ wget \ && apt-get clean && rm -rf /var/lib/apt/lists/* # 添加 deadsnakes PPA 并安装 Python 3.13 RUN add-apt-repository ppa:deadsnakes/ppa -y && \ apt-get update && \ apt-get install -y python3.13 python3.13-venv python3.13-dev && \ apt-get clean && rm -rf /var/lib/apt/lists/* # 设置 Python 3.13 为默认(可选,如果需要系统默认) RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.13 1 && \ update-alternatives --set python3 /usr/bin/python3.13 # 安装 pip(Python 3.13 自带,但确保最新) RUN wget https://bootstrap.pypa.io/get-pip.py && \ python3 get-pip.py && \ rm get-pip.py # 安装 PyTorch RUN pip install torch torchvision --index-url https://download.pytorch.org/whl/cu130 # 默认命令:进入 bash shell CMD ["/bin/bash"]
# Dockerfile for python 3.12 处理 PEP 668 # 选择镜像 FROM nvidia/cuda:13.0.1-cudnn-devel-ubuntu24.04 # 更新系统并安装依赖 RUN apt-get update && apt-get install -y \ software-properties-common \ wget \ && apt-get clean && rm -rf /var/lib/apt/lists/* # 添加 deadsnakes PPA 并安装 Python 3.12 RUN add-apt-repository ppa:deadsnakes/ppa -y && \ apt-get update && \ apt-get install -y python3.12 python3.12-venv python3.12-dev python3-pip && \ apt-get clean && rm -rf /var/lib/apt/lists/* # 创建 Python 3.12 虚拟环境 RUN python3.12 -m venv /opt/venv ENV PATH="/opt/venv/bin:$PATH" # 升级虚拟环境中的 pip RUN pip install --upgrade pip # 安装 PyTorch RUN pip install torch torchvision --index-url https://download.pytorch.org/whl/cu130 # 默认命令:进入 bash CMD ["/bin/bash"]
# docker-compose.yml services: cuda-container: build: . # 从 Dockerfile 构建 # 训练中dataloader的num_workers需要较多的共享内存,docker默认只有64M shm_size: '8gb' # 根据自己硬件情况调整 container_name: my-persistent-cuda # 自定义容器名,便于管理 restart: unless-stopped # 确保持久性:除非手动停止,否则自动重启 deploy: resources: reservations: devices: - driver: nvidia count: all # 启用所有 GPU;或指定 'capabilities: [gpu]' capabilities: [gpu] volumes: - /root/python-project/:/workspace/project # 挂载项目目录 command: /bin/bash # 默认进入 bash shell,便于交互配置 stdin_open: true # 启用 stdin 以支持交互 tty: true # 启用 tty 以支持交互 shell # ports: # 可选:暴露端口,例如 Jupyter。Vscode会自动处理 # - "18888:18888"
然后运行
docker compose up -d --build,使用 docker ps 查看是否运行,此时会显示 CONTAINER ID 这个名称。docker exec -it "CONTAINER ID" bash 进入容器,从 stdin 中使用 exit 退出容器不会导致容器停止。如果使用 attach 的话就会停止,因此推荐使用 exec。docker stop "CONTAINER ID" # 停止容器 docker rm "CONTAINER ID" # 删除容器
接下来就不需要第一步和第二步,cuda、py3.12、pytorch基本环境就配好了,不需要 docker 里套一层 conda 环境。
如果复制了一个容器,可以把
container_name 注释掉,用 docker compose -p project-1 up -d 这种形式创建,只需要更改 project-1 的名称。如果发现缓存还是不够用,但又不想删掉,可以先记下当前容器的 ID 然后执行以下操作
# root 环境下暂停 docker systemctl stop docker.socket systemctl stop docker cd /var/lib/docker/containers ls # 找到容器 ID 的文件 cd 123456* # 假如是123456开头的文件 nano hostconfig.json # 找到 ShmSize 并修改,值的单位是字节。1024*1024*1024为1G。 # 保存后再启动 docker systemctl start docker.socket systemctl start docker docker start 123456 # 启动容器
0.2 容器打包与安装
本地用
commit 将容器打包成镜像,其中镜像名可以简单的设为"cuda",或者类似版本号"cuda:latest" 形式。docker commit [容器ID或NAME] [镜像名]
然后对该容器所创建的镜像进行保存,其中镜像路径可以直接用
cuda.tar ,保存至当前路径下,等效于./cuda.tar。docker save -o [镜像路径] [镜像名]
在WSL2环境下需要对文件赋予权限,才能到Windows的文件管理器中copy出来。
到另外一个环境加载该镜像
docker load -i [镜像路径]
完成后
docker images 列出该镜像即完成。0.3 NVIDIA PyTorch 容器
‣
‣
容器包含了Ubuntu、CUDA、PyTorch 和 TensorRT。可以在本地用消费级显卡进行开发,然后迁移到高性能集群进行计算。
services: cuda-container: image: nvcr.io/nvidia/pytorch:25.09-py3 container_name: my-persistent-cuda restart: unless-stopped deploy: resources: reservations: devices: - driver: nvidia count: all # 启用所有 GPU capabilities: [gpu] volumes: - /root/python-project/:/workspace/project command: /bin/bash stdin_open: true tty: true
docker compose up -d 构建容器。1. 安装 CUDA Toolkit 13 & cuDNN
参考 NVDIA 官方说明,使用 WSL2 无需在 Linux 环境下安装驱动,避免和 Win 的驱动发生冲突(已经存在)。
‣
1.1 CUDA Toolkit
根据指示安装 CUDA Toolkit
‣
当前最新的安装版本是 13.0.2。
wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin sudo mv cuda-wsl-ubuntu.pin /etc/apt/preferences.d/cuda-repository-pin-600 wget https://developer.download.nvidia.com/compute/cuda/13.0.2/local_installers/cuda-repo-wsl-ubuntu-13-0-local_13.0.2-1_amd64.deb sudo dpkg -i cuda-repo-wsl-ubuntu-13-0-local_13.0.2-1_amd64.deb sudo cp /var/cuda-repo-wsl-ubuntu-13-0-local/cuda-*-keyring.gpg /usr/share/keyrings/ sudo apt-get update sudo apt-get -y install cuda-toolkit-13-0
安装完成后,
nano ~/.bashrc 添加环境变量,放置在文件最底下即可export PATH=/usr/local/cuda/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
更新环境变量
source ~/.bashrc ,此时 nvcc -V 应该可以正常回显Copyright (c) 2005-2025 NVIDIA Corporation Built on Wed_Aug_20_01:58:59_PM_PDT_2025 Cuda compilation tools, release 13.0, V13.0.88 Build cuda_13.0.r13.0/compiler.36424714_0
接着
ln -s /usr/lib/wsl/lib/nvidia-smi /usr/bin/nvidia-smi 可以链接 nvidia-smi 工具。1.2 cuDNN
这里直接安装 Ubuntu 24.04 对应的本地版本
‣
wget https://developer.download.nvidia.com/compute/cudnn/9.14.0/local_installers/cudnn-local-repo-ubuntu2404-9.14.0_1.0-1_amd64.deb sudo dpkg -i cudnn-local-repo-ubuntu2404-9.14.0_1.0-1_amd64.deb sudo cp /var/cudnn-local-repo-ubuntu2404-9.14.0/cudnn-*-keyring.gpg /usr/share/keyrings/ sudo apt-get update sudo apt-get -y install cudnn
文章推荐最后使用
sudo apt-get -y install cudnn9-cuda-13 安装,但实际上会根据 CUDA 版本自行安装最新版本。2. Anaconda & PyTorch
2.1 Anaconda
这里选择全量版本,空间有的是就不用 miniconda 了。
‣
wget https://repo.anaconda.com/archive/Anaconda3-2025.06-0-Linux-x86_64.sh 下载后 bash Anaconda3-2025.06-0-Linux-x86_64.sh 执行安装。如果
conda init 无法执行,运行 source ~/anaconda3/bin/activate 后再尝试。重新打开一个终端后应该会显示
(base) 环境。接着创建 Python 3.12 环境
conda create --name cu13py312 python=3.12 ,然后 conda activate cu13py312 进入新创建的环境。如果此时发现 nvcc -V 无法正常工作,那么按 1.1 的方法重新配置下环境。在这个新的环境里是不需要再安装 CUDA 和 cuDNN 的。
2.2 PyTorch
‣
Stable 2.9.0 已支持 CUDA 13 环境。
pip3 install torch torchvision --index-url https://download.pytorch.org/whl/cu130
安装完后执行代码检查环境配置是否正确
import torch print(torch.__version__) # 2.10.0.dev20251012+cu130 print(torch.cuda.is_available()) # True print(torch.cuda.device_count()) # 1 print(torch.version.cuda) # 13.0 print(torch.backends.cudnn.is_available()) # True print(torch.backends.cudnn.version()) # 91300
3. WSL2 保活
已知最新版该方法失效,直接点开个终端缩小吧。
Win 的 WSL 默认逻辑是不使用/关闭终端后就会关闭虚拟机,为了能在后台运行,最简单的方法是创建会话保持虚拟机活跃。
这里使用 tmux 创建会话,
apt install tmux 安装后运行 tmux new -s my_session 创建名为 my_session 的会话,可自定义。进入后可通过Ctrl + b, + d 退出,同时保持会话让 WSL2 在关闭终端后仍能在后台运行。恢复会话使用
tmux attach -t my_session 。命令 | 描述 | 示例 |
tmux new -s <name> | 创建并进入命名会话 | tmux new -s work |
tmux | 创建并进入无名会话 | tmux |
tmux ls | 列出所有活跃会话 | tmux ls |
tmux attach -t <name> | 连接到指定会话 | tmux attach -t work |
tmux kill-session -t <name> | 结束指定会话 | tmux kill-session -t work |
Ctrl + b, d | 从会话中分离(在 tmux 内) | - |
Ctrl + b, s | 切换会话(在 tmux 内) | - |
该操作可以在 win 锁屏情况下继续使用 WSL2。
3.1 修改 WSL2 配置
‣
全局配置文件路径
%UserProfile%\.wslconfig,可配置内存和 CPU 核心数量等。也可以用官方的工具“Windows Subsystem for Linux Settings”去配置。
4. VSCODE 远程管理
‣
为了便于操作,避免修改 WSL2 和宿主机的网络环境以及添加端口转发或开防火墙,直接使用组网工具 tailscale (类似的有 ZeroTier)进行操作,使用分配的内网 IP 用 SSH 进行连接。
4.1 Git & Github
首先安装 Git 工具
apt install git,设置git config --global user.name "Your Name" git config --global user.email "your_email@example.com"
接着在 WSL2 里生成密钥
ssh-keygen -t ed25519,将 cat /root/.ssh/id_ed25519.pub 公钥添加到 Github 的账户里,便于管理自己的私有仓库。接着在仓库里选择 ssh 方式 git clone 到本地,
git clone git@github.com:***.git 然后会遇到一个保存 ssh 指纹的提示,输入 yes,之后再到 vscode 里管理 git 才不会卡在 “or” 具有指纹 这个问题里。4.2 Remote
通过 Vscode 的插件
Remote - SSH 连接到 WSL2 服务器后(由于组内网,密码登录即可),在远端服务器安装常用的工具 Python 来管理/选择 anaconda 创建的环境,以及 GitLens 查看记录等等。5. 监控 GPU 状态的工具
5.1 nvtop
apt install nvtop这个工具简单清楚,可以展示哪个用户在执行什么任务,消耗了多少系统资源。
5.2 nvitop
pip install nvitop相比较 nvtop 可以额外展示 CPU、RAM 的图形资源使用信息。可以监控更多的性能指标。
5.3 gpustat
极致简洁,一般使用 nvitop 和 nvtop 多一点。
5.4 Other Tool: zellig
Ubuntu 用编译好的二进制文件安装方便一点
wget https://github.com/zellij-org/zellij/releases/download/v0.43.1/zellij-x86_64-unknown-linux-musl.tar.gz tar -xzf zellij* mv zellij /usr/local/bin
端口复用上比 tmux 好用,可以设置多个窗格。
