本教程详细记录了在 NVIDIA RTX 5090Blackwell 架构,sm_120 显卡、Ubuntu 22.04 系统、CUDA 13.0 驱动环境下,通过从源码编译 PyTorch 2.3.1 使其支持 sm_120 计算能力,从而在 Python 3.8 环境中成功运行 Isaac Gym 的全过程。教程步骤清晰、可复现,针对关键难点提供详细解决方案,适用于所有 50 系 NVIDIA 显卡。

📌 核心矛盾与解决思路

本教程的核心难点在于软硬件环境的版本兼容性冲突,具体矛盾及解决方案如下:

  1. Isaac Gym 官方限制:Isaac Gym 已停止维护,仅支持 Python 3.8 版本,无法适配更高版本 Python。

  2. RTX 5090 硬件要求:RTX 5090 采用 Blackwell 架构(计算能力 sm_120),官方预编译 PyTorch 包要求 Python ≥ 3.9,无法直接在 Python 3.8 环境中使用。

  3. 解决方案:通过修改 PyTorch 2.3.1 源码,使其能够为 sm_120 架构生成 PTX 代码,同时在 Python 3.8 环境中编译安装 PyTorch,打破版本限制,实现 Isaac Gym 正常运行。

🔧 前置条件

在开始操作前,请确保你的环境满足以下要求,避免后续编译安装失败:

  1. 显卡:NVIDIA RTX 5090(或其他 50 系显卡,如 RTX 5070 Ti)

  2. 驱动版本:≥ 555.x(本文使用版本:580.126.09)

  3. CUDA Toolkit:≥ 12.8(本文使用 Conda 环境中的 CUDA 12.8,系统驱动自带 CUDA 13.0 用于硬件支持)

  4. 操作系统:Ubuntu 22.04(Ubuntu 20.04 亦可,需注意系统依赖包名差异)

  5. 基础工具:已安装 git、conda(或 miniconda)、gcc、g++ 等基础编译工具

📥 第一步:克隆 PyTorch 源码并应用 sm_120 补丁

首先克隆 PyTorch 源码并切换到 2.3.1 版本,同步子模块(子模块缺失会导致编译失败):

git clone https://github.com/pytorch/pytorch
cd pytorch
git checkout v2.3.1
git submodule update --init --recursive

🔧 修改源码以支持 sm_120 架构

由于 PyTorch 2.3.1 源码默认不支持 sm_120(Blackwell 架构),需修改两处关键文件,确保编译时生成对应架构的代码。

1. 修改架构识别文件

编辑 cmake/Modules_CUDA_fix/upstream/FindCUDA/select_compute_arch.cmake 文件,定位到约第 227 行,修改未知架构的默认处理逻辑:

原内容:

      elseif(${arch_name} STREQUAL "Hopper")
        set(arch_bin 9.0)
        set(arch_ptx 9.0)
      else()
        message(SEND_ERROR "Unknown CUDA Architecture Name ${arch_name} in CUDA_SELECT_NVCC_ARCH_FLAGS")
      endif()

修改为:

      elseif(${arch_name} STREQUAL "Hopper")
        set(arch_bin 9.0)
        set(arch_ptx 9.0)
      else()
        set(arch_bin 12.0)
        set(arch_ptx 12.0)
      endif()

说明:此修改确保当 CMake 无法识别架构时,默认使用 sm_120(12.0)的二进制和 PTX 代码,适配 RTX 5090。

2. 修改 Dockerfile(影响默认架构列表)

编辑根目录下的 Dockerfile,定位到约第 60 行,在 TORCH_CUDA_ARCH_LIST 末尾添加 12.0,确保编译时包含 sm_120 架构:

TORCH_CUDA_ARCH_LIST="3.5 5.2 6.0 6.1 7.0+PTX 8.0 12.0" TORCH_NVCC_FLAGS="-Xfatbin -compress-all" \

🐍 第二步:创建 Python 3.8 Conda 环境并安装基础依赖

Isaac Gym 仅支持 Python 3.8,因此需创建独立的 Conda 环境,避免与系统 Python 版本冲突,并安装必要的系统依赖:

1. 创建并激活 Conda 环境

conda create -n isaacgym python=3.8 -y
conda activate isaacgym

说明:环境名称可自定义,后续操作均需在该环境中执行。

2. 安装系统开发包(Ubuntu 22.04

sudo apt update
sudo apt install build-essential libssl-dev libffi-dev libbz2-dev libreadline-dev libsqlite3-dev liblzma-dev libcrypt-dev

说明:Ubuntu 20.04 系统需将 libcrypt-dev 替换为 libcrypt1-dev

⚙️ 第三步:配置编译环境(关键步骤)

此步骤是编译成功的核心,需解决 CUDA 版本兼容、环境变量配置、分布式组件冲突等问题,严格按照以下命令执行。

1. Conda 环境中安装 CUDA 12.8 工具包

系统默认的 CUDA 13.0 与 PyTorch 2.3.1 存在 API 兼容性问题(如缺失 nvToolsExt、cicc 工具),因此通过 Conda 安装完整的 CUDA 12.8 工具包:

conda install -c conda-forge cuda-toolkit=12.8.0 -y
conda install -c conda-forge cuda-nvtx-dev -y   # 提供 NVTX 头文件,解决编译时缺失问题
conda install -c conda-forge libxcrypt -y       # 提供 crypt.h 头文件,避免编译报错

2. 设置环境变量(每次编译前必须执行)

设置环境变量,确保编译时优先使用 Conda 环境中的 CUDA 工具和依赖,避免链接到系统 CUDA 13.0:

export CUDA_HOME="$CONDA_PREFIX"
export PATH="$CUDA_HOME/bin:$PATH"
export LD_LIBRARY_PATH="$CUDA_HOME/lib:$CUDA_HOME/lib64:$LD_LIBRARY_PATH"
export CMAKE_PREFIX_PATH="$CONDA_PREFIX:$CMAKE_PREFIX_PATH"
export CPLUS_INCLUDE_PATH="$CONDA_PREFIX/include:$CPLUS_INCLUDE_PATH"
export C_INCLUDE_PATH="$CONDA_PREFIX/include:$C_INCLUDE_PATH"

3. 禁用非必需的分布式组件(避免编译冲突)

单卡训练无需分布式组件,禁用后可避免与 CUDA 13.0 的兼容性冲突,同时加快编译速度:

export USE_CUDA=1                          # 启用 CUDA 支持
export TORCH_CUDA_ARCH_LIST="8.0;8.6;8.9;9.0;12.0"  # 指定支持的 CUDA 架构,包含 sm_120
export CMAKE_CUDA_ARCHITECTURES="80;86;89;90;120"  # CMake 识别的架构列表
export MAX_JOBS=4                           # 编译线程数,根据内存大小调整(建议 4-8)
export USE_NCCL=0                           # 禁用 NCCL 分布式
export USE_TENSORPIPE=0                     # 禁用 TensorPipe(与 CUDA 13 不兼容)
export USE_GLOO=0                           # 禁用 Gloo 分布式
export USE_DISTRIBUTED=0                    # 完全禁用分布式组件
export BUILD_TEST=0                         # 跳过测试,避免链接静态库问题

4. 修复 TensorPipe 强制编译 CUDA 支持的问题

TensorPipe 组件默认强制启用 CUDA 支持,与当前环境冲突,需修改其 CMake 配置禁用 CUDA:

sed -i 's/option(TP_ENABLE_CUDA "Enable CUDA support" ON)/option(TP_ENABLE_CUDA "Enable CUDA support" OFF)/' third_party/tensorpipe/CMakeLists.txt

🔨 第四步:开始编译

进入 PyTorch 源码目录,清理之前的编译缓存(若有),开始编译生成 wheel 包:

cd /home/yxx/pytorch  # 替换为你的 PyTorch 源码目录
rm -rf build          # 清理编译缓存,避免残留文件导致报错
python setup.py bdist_wheel

说明:

  1. 编译过程持续约 1~2 小时,具体时间取决于 CPU 性能和线程数。

  2. 编译期间会出现大量警告(如 -Wterminateptxas advisory等),均为正常现象,无需处理,只要未出现 FAILED 且编译未中断,即为正常。

📦 第五步:安装自定义 PyTorch

编译成功后,会在 dist/ 目录下生成自定义的 PyTorch wheel 包(约 523 MB)。需先安装配套依赖,再安装自定义 PyTorch,避免依赖被覆盖。

1. 安装配套依赖

pip install torchvision==0.18.1 torchaudio==2.3.1 numpy==1.23.5

说明:版本需严格对应 PyTorch 2.3.1,避免版本冲突。

2. 安装自定义 PyTorch

pip install /home/yxx/pytorch/dist/torch-2.3.0a0+git63d5e92-cp38-cp38-linux_x86_64.whl

注意:安装时若提示版本冲突,可忽略;务必保证最后安装的是自定义编译的 PyTorch 包,避免被 pip 自动替换为官方版本。

3. 验证 GPU 可用性

离开 PyTorch 源码目录,执行以下命令验证 PyTorch 是否成功识别 GPU:

cd ~
python -c "import torch; print(torch.cuda.is_available()); torch.randn(2,2,device='cuda')"

若输出 True 且无报错,说明 PyTorch 编译安装成功,且已支持 RTX 5090 GPU。

🏋️ 第六步:安装 Isaac Gym 及相关项目

PyTorch 安装成功后,依次安装 Isaac Gym、rsl_rl 及相关项目,确保各组件兼容。

1. 安装 Isaac Gym Preview 4(下载链接

将下载的 Isaac Gym 压缩包解压,进入 Python 目录安装:

tar -xzf IsaacGym_Preview_4_Package.tar.gz  # 替换为你的压缩包路径
cd isaacgym/python
pip install -e .

验证安装:

cd examples
python 1080_balls_of_solitude.py

若能正常显示模拟窗口,说明 Isaac Gym 安装成功。

2. 安装 rsl_rl(版本 v1.0.2

rsl_rl 是 Isaac Gym 常用的强化学习框架,需安装指定版本以保证兼容性:

cd ~
git clone https://github.com/leggedrobotics/rsl_rl
cd rsl_rl
git checkout v1.0.2
pip install -e .

3. 安装 unitree_rl_gym(或其他相关项目)

以 unitree_rl_gym 为例,安装时需先安装本地 rsl_rl 子模块,避免 pip 依赖解析失败:

cd ~/unitree_rl_gym  # 替换为你的项目目录
# 先安装本地 rsl_rl 子模块
cd rsl_rl && pip install -e . && cd ..
# 安装 unitree_rl_gym
pip install -e .

注意:项目安装过程中可能会自动降级 NumPy,导致后续出现 Numpy is not available 错误,需执行以下命令强制重装指定版本:

pip install numpy==1.23.5 --force-reinstall

🚀 第七步:启动训练测试

进入项目训练脚本目录,启动训练,验证整套环境是否正常工作:

cd ~/unitree_rl_gym/legged_gym/scripts
python train.py --task=g1

若成功输出训练日志,且通过 nvidia-smi 查看 GPU 利用率上升,说明整套环境配置完成,可正常进行强化学习训练。

🧪 常见问题与解决方法汇总

编译安装过程中可能遇到各类报错,以下是高频问题的原因及解决方案,按报错类型分类整理,便于快速排查:

问题描述

报错原因

解决方案

CUDA_ARCHITECTURES is empty

CMake 无法识别系统 CUDA 13.0 架构

设置环境变量 export CMAKE_CUDA_ARCHITECTURES="80;86;89;90;120"

Failed to find nvToolsExt

CUDA 12.8 中 NVTX 已改为纯头文件,未安装对应依赖

安装 conda install -c conda-forge cuda-nvtx-dev -y,并设置 export NVTOOLSEXT_PATH="$CONDA_PREFIX"

cicc: not found

系统 CUDA 13.0 安装不完整,缺少 cicc 工具

改用 Conda 环境中的 CUDA 12.8 工具包,确保 CUDA_HOME 指向 Conda 环境

error: 'struct cudaDeviceProp' has no member named 'computeMode'

TensorPipe 的 CUDA 代码与 CUDA 13 不兼容

禁用 TensorPipe CUDA 支持(执行第三步第 4 小节的 sed 命令)

fatal error: crypt.h: No such file or directory

Conda 环境缺少 crypt.h 头文件

安装 conda install -c conda-forge libxcrypt -y,并设置 export CPLUS_INCLUDE_PATH="$CONDA_PREFIX/include:$CPLUS_INCLUDE_PATH"

undefined symbol: cudaGetDeviceProperties_v2

运行时链接到系统 CUDA 13.0 库,与编译时的 CUDA 12.8 不兼容

重新编译 PyTorch,确保编译时 CUDA_HOME 指向 Conda 环境中的 CUDA 12.8

Numpy is not available

安装项目时自动降级了 NumPy,与 PyTorch 依赖冲突

强制重装 pip install numpy==1.23.5 --force-reinstall

gymtorch 编译失败

即时编译时找不到 crypt.h 头文件

设置 export CPLUS_INCLUDE_PATH="$CONDA_PREFIX/include:$CPLUS_INCLUDE_PATH",并清理缓存 rm -rf ~/.cache/torch_extensions

💾 备份与持久化建议

为避免后续环境损坏需重新编译,建议做好以下备份和持久化操作:

1. 备份自定义 PyTorch wheel

将编译生成的 wheel 包复制到安全位置(如移动硬盘、云存储),便于后续快速恢复环境:

2. 环境变量持久化

将第三步的环境变量配置添加到 Conda 激活脚本,避免每次激活环境都手动输入:

mkdir -p $CONDA_PREFIX/etc/conda/activate.d
cat > $CONDA_PREFIX/etc/conda/activate.d/env_vars.sh << 'EOF'
#!/bin/bash
export CUDA_HOME="$CONDA_PREFIX"
export LD_LIBRARY_PATH="$CONDA_PREFIX/lib:$CONDA_PREFIX/lib64:$LD_LIBRARY_PATH"
export CPLUS_INCLUDE_PATH="$CONDA_PREFIX/include:$CPLUS_INCLUDE_PATH"
export C_INCLUDE_PATH="$CONDA_PREFIX/include:$C_INCLUDE_PATH"
EOF

说明:后续激活环境时,会自动加载上述环境变量。

3. 防止 PyTorch 被意外覆盖

若后续执行 pip install 时意外替换了自定义 PyTorch,可执行以下命令强制重装:

pip install numpy==1.23.5
pip install --force-reinstall /path/to/torch-2.3.0a0+git63d5e92-cp38-cp38-linux_x86_64.whl

🎯 总结

本教程通过源码修改、环境配置、编译安装等步骤,成功解决了 RTX 5090(sm_120)与 Isaac Gym(Python 3.8)的版本兼容性问题,实现了整套强化学习环境的搭建。核心要点如下:

  1. 修改 PyTorch 源码,添加 sm_120 架构支持,适配 RTX 5090 显卡。

  2. 使用 Conda 安装 CUDA 12.8,避免与系统 CUDA 13.0 的兼容性冲突。

  3. 禁用非必需的分布式组件,确保编译顺利完成。

  4. 严格控制依赖版本,避免安装过程中出现版本冲突。

此方法同样适用于其他 50 系 NVIDIA 显卡。若在训练中遇到任何新问题,可参考常见问题汇总排查,或留言交流。

参考文章:https://blog.csdn.net/m0_56706433/article/details/148902144?fromshare=blogdetail&sharetype=blogdetail&sharerId=148902144&sharerefer=PC&sharesource=m0_52950826&sharefrom=from_link

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐