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/ 下:

# 正确 ✅
~/projects/my-app

# 错误 ❌(跨文件系统 IO 性能差 3-5 倍)
/mnt/c/Users/你的用户名/projects/my-app

2.2 Trae 连接 WSL

  1. 安装 Remote - WSL 扩展
  2. WSL 终端中执行:
    cd ~/projects/my-app
    code .  # 唤起 Trae 的 WSL 模式
    
  3. Trae 左下角显示 WSL: Ubuntu-26 即成功

2.3 从 WSL 访问 Windows 数据库

# 获取 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 虚拟环境

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 是比字体更底层的问题。如果系统语言环境不支持中文,字体再全也会乱码。

# 安装中文语言包
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 安装中文字体

# 开源中文字体
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 设置字体回退链

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 检查当前内核配置

zcat /proc/config.gz | grep -E "DRM_AMDGPU|HSA_AMD"

典型输出:

CONFIG_DRM_AMDGPU=m
# CONFIG_HSA_AMD is not set    # ← 这就是问题所在

4.2 获取内核源码

# 查看可用 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 配置内核

# 使用当前运行内核的配置作为基础
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_MIRRORMMU_NOTIFIER 等)必须同时开启,否则 olddefconfig 会自动关闭 HSA_AMD
  • DRM_AMDGPU 建议设为 =y,避免模块安装路径问题

4.4 编译内核

# 安装编译依赖
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 foundsudo apt install -y cpio
  • libbpf.c: errorscripts/config --disable CONFIG_DEBUG_INFO_BTF
  • net/netfilter/xt_RATEEST.o → 旧编译缓存残留,执行 make mrproper 后重来
  • /tmp 空间不足 → export TMPDIR=~/tmp

4.5 部署新内核

# 安装内核模块
sudo make modules_install

# 复制内核到 Windows 侧
sudo cp arch/x86/boot/bzImage /mnt/c/Users/Administrator/vmlinux-wsl

配置 WSL 使用新内核:

cat > /mnt/c/Users/Administrator/.wslconfig << 'EOF'
[wsl2]
kernel=C:\\Users\\Administrator\\vmlinux-wsl
EOF

PowerShell 中重启 WSL:

wsl --shutdown

4.6 验证

ls -la /dev/kfd
# crw-rw---- 1 root render 234, 0 ... /dev/kfd    ← 成功!
# 获取 GPU 访问权限
sudo usermod -aG render,video $USER
sudo chmod 666 /dev/kfd

五、安装 ROCm 和 PyTorch

5.1 安装 ROCm Runtime

# 添加 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 版

# 设置环境变量(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 最终验证

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 显存,训练时需要控制显存占用:

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:

# 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 方案更干净:

# 安装 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

[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 官方支持列表,需要:

  1. 自编译 WSL2 内核,启用 CONFIG_HSA_AMD=y
  2. 设置 HSA_OVERRIDE_GFX_VERSION=10.3.0 强制声明架构
  3. /dev/kfd 权限配置

如果你的 GPU 是 RX 7900 系列(gfx1100),则无需编译内核,最新 WSL 内核已原生支持。

Logo

免费领 50 小时云算力,进群参与显卡、AI PC 幸运抽奖

更多推荐