WSL2 + ROCm + PyTorch 深度学习环境配置全记录
从零开始,在 Windows 11 的 WSL2 中搭建 AMD GPU (RX 6600 XT) 的 PyTorch 训练环境,包含内核编译、中文字体配置等完整踩坑记录。
结论:不成功,WSL并不能很好支持A卡!
一、环境背景
| 项目 | 配置 |
|---|---|
| Windows 版本 | Windows 11 25H2 |
| WSL 版本 | 2.7.3.0 (内核 6.6.114.1) |
| Linux 发行版 | Ubuntu 26 |
| GPU | AMD Radeon RX 6600 XT (gfx1032) |
| Python | 3.11 |
| 编辑器 | Trae (VS Code 分支) |
| 数据库 | MySQL,安装在 Windows 侧 |
二、基础开发环境配置
2.1 文件存放原则
代码必须放在 WSL 文件系统内 ,不要放在 /mnt/c/ 下:
bash
# 正确 ✅
~/projects/my-app
# 错误 ❌(跨文件系统 IO 性能差 3-5 倍)
/mnt/c/Users/你的用户名/projects/my-app
2.2 Trae 连接 WSL
-
安装 Remote - WSL 扩展
-
WSL 终端中执行:
bashcd ~/projects/my-app code . # 唤起 Trae 的 WSL 模式 -
Trae 左下角显示
WSL: Ubuntu-26即成功
2.3 从 WSL 访问 Windows 数据库
bash
# 获取 Windows 主机 IP
DB_HOST=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}')
# 测试连接
mysql -h $DB_HOST -u root -p
Windows 端需确保 MySQL 绑定 0.0.0.0 且防火墙放行对应端口。
2.4 Python 虚拟环境
bash
sudo apt install -y python3.11 python3.11-venv python3.11-dev
cd ~/projects/my-app
python3.11 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
注意: Windows 下创建的虚拟环境不能直接在 Linux 上用,必须重建。
三、中文字体与 Locale 配置
3.1 系统 Locale 设置
Locale 是比字体更底层的问题。如果系统语言环境不支持中文,字体再全也会乱码。
bash
# 安装中文语言包
sudo apt install -y locales language-pack-zh-hans
# 生成并设置中文 locale
sudo locale-gen zh_CN.UTF-8
sudo update-locale LANG=zh_CN.UTF-8 LC_ALL=zh_CN.UTF-8
# 当前终端立即生效
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
3.2 安装中文字体
bash
# 开源中文字体
sudo apt install -y fonts-wqy-zenhei fonts-wqy-microhei fonts-noto-cjk
# 链接 Windows 字体(最还原)
sudo mkdir -p /usr/share/fonts/windows
sudo cp /mnt/c/Windows/Fonts/msyh*.ttc /usr/share/fonts/windows/
sudo cp /mnt/c/Windows/Fonts/simhei.ttf /usr/share/fonts/windows/
sudo cp /mnt/c/Windows/Fonts/simsun.ttc /usr/share/fonts/windows/
sudo fc-cache -fv
3.3 设置字体回退链
bash
sudo tee /etc/fonts/conf.d/99-chinese-default.conf << 'EOF'
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<alias>
<family>sans-serif</family>
<prefer>
<family>WenQuanYi Micro Hei</family>
<family>Noto Sans CJK SC</family>
</prefer>
</alias>
</fontconfig>
EOF
sudo fc-cache -fv
四、WSL2 内核编译(启用 ROCm 支持)
这是整个配置中最关键也最复杂的部分。RX 6600 XT 不在 ROCm 官方支持列表中,且 WSL2 默认内核未启用 HSA_AMD。
4.1 检查当前内核配置
bash
zcat /proc/config.gz | grep -E "DRM_AMDGPU|HSA_AMD"
典型输出:
CONFIG_DRM_AMDGPU=m
# CONFIG_HSA_AMD is not set # ← 这就是问题所在
4.2 获取内核源码
bash
# 查看可用 tag
git ls-remote --tags https://github.com/microsoft/WSL2-Linux-Kernel.git \
| grep 'linux-msft-wsl-6.6'
# 克隆与当前内核版本匹配的源码
git clone --depth=1 --branch linux-msft-wsl-6.6.114.1 \
https://github.com/microsoft/WSL2-Linux-Kernel.git
cd WSL2-Linux-Kernel
4.3 配置内核
bash
# 使用当前运行内核的配置作为基础
cp /proc/config.gz ~/config.gz
gunzip -f ~/config.gz
cp ~/config .config
# 开启 AMD GPU 和 HSA 支持
# 注意:这些配置项之间有依赖关系,必须同时开启
scripts/config --enable CONFIG_DRM_AMDGPU
scripts/config --enable CONFIG_DRM_AMDGPU_USERPTR
scripts/config --enable CONFIG_HMM_MIRROR
scripts/config --enable CONFIG_MMU_NOTIFIER
scripts/config --enable CONFIG_HSA_AMD
scripts/config --enable CONFIG_HSA_AMD_SVM
# 关闭 BTF 调试信息(避免 GCC 版本不兼容导致编译失败)
scripts/config --disable CONFIG_DEBUG_INFO_BTF
scripts/config --disable CONFIG_DEBUG_INFO_BTF_MODULES
# 更新依赖配置
make olddefconfig
# 最终确认(每一项都必须是 =y 或 =m)
grep -E "CONFIG_DRM_AMDGPU=|CONFIG_HSA_AMD=" .config
期望输出:
CONFIG_DRM_AMDGPU=y
CONFIG_HSA_AMD=y
踩坑记录:
HSA_AMD不支持=m(模块模式),只能=y(内建)- 依赖项(
HMM_MIRROR、MMU_NOTIFIER等)必须同时开启,否则olddefconfig会自动关闭HSA_AMDDRM_AMDGPU建议设为=y,避免模块安装路径问题
4.4 编译内核
bash
# 安装编译依赖
sudo apt install -y build-essential flex bison libssl-dev \
libelf-dev bc dwarves libncurses-dev cpio
# 清理编译残留
make clean
# 编译(约 15-40 分钟)
make -j$(nproc) WERROR=0
常见编译错误:
'cpio' could not be found→sudo apt install -y cpiolibbpf.c: error→scripts/config --disable CONFIG_DEBUG_INFO_BTFnet/netfilter/xt_RATEEST.o→ 旧编译缓存残留,执行make mrproper后重来/tmp空间不足 →export TMPDIR=~/tmp
4.5 部署新内核
bash
# 安装内核模块
sudo make modules_install
# 复制内核到 Windows 侧
sudo cp arch/x86/boot/bzImage /mnt/c/Users/Administrator/vmlinux-wsl
配置 WSL 使用新内核:
bash
cat > /mnt/c/Users/Administrator/.wslconfig << 'EOF'
[wsl2]
kernel=C:\\Users\\Administrator\\vmlinux-wsl
EOF
PowerShell 中重启 WSL:
powershell
wsl --shutdown
4.6 验证
bash
ls -la /dev/kfd
# crw-rw---- 1 root render 234, 0 ... /dev/kfd ← 成功!
bash
# 获取 GPU 访问权限
sudo usermod -aG render,video $USER
sudo chmod 666 /dev/kfd
五、安装 ROCm 和 PyTorch
5.1 安装 ROCm Runtime
bash
# 添加 ROCm 仓库
sudo mkdir --parents --mode=0755 /etc/apt/keyrings
wget -q -O - https://repo.radeon.com/rocm/rocm.gpg.key | \
sudo gpg --dearmor -o /etc/apt/keyrings/rocm.gpg
echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/rocm.gpg] \
https://repo.radeon.com/rocm/apt/6.3.4 noble main" | \
sudo tee /etc/apt/sources.list.d/rocm.list
sudo apt update
sudo apt install -y rocm-hip-runtime rocm-dev
# 验证
rocm-smi
5.2 安装 PyTorch ROCm 版
bash
# 设置环境变量(RX 6600 XT 架构声明)
export HSA_OVERRIDE_GFX_VERSION=10.3.0
# 安装 PyTorch ROCm 版(约 5GB,注意 /tmp 空间)
cd ~/projects/my-app
source venv/bin/activate
# 如果 /tmp 空间不足(tmpfs 默认只有内存一半),指定临时目录
mkdir -p ~/tmp
TMPDIR=~/tmp pip install torch torchvision torchaudio \
--index-url https://download.pytorch.org/whl/rocm6.3
# 补装依赖
pip install typing_extensions filelock "fsspec>=0.8.5" jinja2 \
"networkx>=2.5.1" "sympy>=1.13.3" setuptools
踩坑记录:
- Python 3.14 太新,PyTorch 可能没有对应 wheel,建议用 Python 3.11/3.12
/tmp是 tmpfs(内存文件系统),默认只有约 4.8GB,装不下 5GB 的 torch 包- 下载超时可以用
wget -c断点续传,然后pip install xxx.whl --no-deps本地安装
5.3 最终验证
python
import torch
import os
os.environ['HSA_OVERRIDE_GFX_VERSION'] = '10.3.0'
print(f'PyTorch: {torch.__version__}')
print(f'HIP: {torch.version.hip}')
print(f'GPU available: {torch.cuda.is_available()}')
if torch.cuda.is_available():
print(f'GPU: {torch.cuda.get_device_name(0)}')
mem = torch.cuda.get_device_properties(0).total_mem / 1024**3
print(f'显存: {mem:.1f} GB')
x = torch.randn(1000, 1000, device='cuda')
y = torch.matmul(x, x.T)
print(f'GPU 计算: 通过 ✓')
print(f'显存占用: {torch.cuda.memory_allocated()/1024**2:.1f} MB')
期望输出:
PyTorch: 2.9.1+rocm6.3
HIP: 6.3.4
GPU available: True
GPU: AMD Radeon RX 6600 XT
显存: 8.0 GB
GPU 计算: 通过 ✓
显存占用: 4.0 MB
六、8GB 显存优化建议
RX 6600 XT 只有 8GB 显存,训练时需要控制显存占用:
python
from torch.cuda.amp import autocast, GradScaler
scaler = GradScaler()
for batch in dataloader:
with autocast(): # 混合精度训练,显存减半
output = model(batch)
loss = loss_fn(output, target)
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()
optimizer.zero_grad()
# 训练中定期清理显存
torch.cuda.empty_cache()
七、设备自适应模块
封装一个通用的设备检测模块,适配 ROCm/CUDA/CPU:
python
# device_utils.py
import torch
import os
os.environ.setdefault("HSA_OVERRIDE_GFX_VERSION", "10.3.0")
def get_device():
if torch.cuda.is_available():
device = torch.device("cuda:0")
name = torch.cuda.get_device_name(0)
mem = torch.cuda.get_device_properties(0).total_mem / 1024**3
hip = getattr(torch.version, 'hip', None)
backend = f"ROCm/HIP {hip}" if hip else f"CUDA {torch.version.cuda}"
print(f"[Device] GPU: {name} ({mem:.1f} GB) [{backend}]")
return device
else:
print("[Device] GPU 不可用,使用 CPU")
return torch.device("cpu")
def clear_cache():
if torch.cuda.is_available():
torch.cuda.empty_cache()
项目代码无需修改,torch.device('cuda') 在 ROCm 和 CUDA 上通用。
八、备选方案:Docker(推荐生产环境)
如果内核编译太折腾,Docker 方案更干净:
bash
# 安装 Docker
sudo apt install -y docker.io
sudo usermod -aG docker $USER
# 运行 ROCm PyTorch 容器
docker run -it --rm \
--device=/dev/kfd \
--device=/dev/dxg \
--group-add video \
--shm-size=8g \
-v ~/projects/my-app:/workspace/project \
-w /workspace/project \
-e HSA_OVERRIDE_GFX_VERSION=10.3.0 \
rocm/pytorch:latest \
bash
九、快速回顾:完整的 .wslconfig
ini
[wsl2]
kernel=C:\\Users\\Administrator\\vmlinux-wsl
guiApplications=true
memory=8GB
processors=4
swap=2GB
localhostForwarding=true
[automount]
enabled = true
options = "metadata,umask=22,fmask=11"
十、总结
整个配置过程的核心难点在于 RX 6600 XT (gfx1032) 不在 ROCm 官方支持列表,需要:
- 自编译 WSL2 内核,启用
CONFIG_HSA_AMD=y - 设置
HSA_OVERRIDE_GFX_VERSION=10.3.0强制声明架构 /dev/kfd权限配置
如果你的 GPU 是 RX 7900 系列(gfx1100),则无需编译内核,最新 WSL 内核已原生支持。