WSL2 + ROCm + PyTorch 深度学习环境配置全记录

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

  1. 安装 Remote - WSL 扩展

  2. WSL 终端中执行:

    bash 复制代码
    cd ~/projects/my-app
    code .  # 唤起 Trae 的 WSL 模式
  3. 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_MIRRORMMU_NOTIFIER 等)必须同时开启,否则 olddefconfig 会自动关闭 HSA_AMD
  • DRM_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 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 部署新内核

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

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

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

相关推荐
孟俊宇-MJY1 小时前
10 分钟零门槛本地部署 AI 编码助手!Ollama+Qwen2-7B+Continue 全程无外网、代码不泄露,企业内网合规首选【全平台完整版】
人工智能
霸道流氓气质1 小时前
Spring AI ChatMemory 对话记忆配置指南:概念、实战与常见问题
java·人工智能·spring
十六年开源服务商1 小时前
外贸WordPress用户调查与满意度调查实战指南2026
大数据·数据库·人工智能
happyprince1 小时前
07-FlagEmbedding 研究项目分析
人工智能
鹿角片ljp1 小时前
将流量研判能力封装成 MCP与Skill:AI工具化实践
人工智能
吾辈亦有感1 小时前
【动手学大语言模型】神经网络启蒙:PyTorch 入门实战
人工智能·pytorch·大语言模型
小王毕业啦1 小时前
1949-2023年 各地级市、县新注册农民专业合作社数量数据(xlsx+dta+代码)
大数据·人工智能·数据挖掘·数据分析·社科数据·实证分析·经管数据
夜影风1 小时前
AI Agent初探:让LLM自己决定该调用什么工具
人工智能·langchain·ai agent