我要提问
ARTICLE DETAIL

资讯详情

前沿编程新知与开发实战干货的深度解读。

Ubuntu 22.04 下 Isaac Gym Preview 3 环境配置与避坑指南

Ubuntu 22.04 下 Isaac Gym Preview 3 环境配置与避坑指南 1. 为什么 Isaac Gym Preview 3 值得折腾以及它到底难在哪如果你正在做机器人强化学习、灵巧手控制、四足机器人运动策略训练或者单纯想跑一跑 NVIDIA 官方那些让人眼馋的 demo那 Isaac Gym Preview 3 大概率已经出现在你的待办清单里了。它最吸引人的地方在于物理仿真和策略训练全部跑在 GPU 上不用像传统方案那样在 CPU 物理引擎和 GPU 神经网络之间来回搬数据。这个特性带来的直接好处就是训练速度的量级提升——同样的任务以前要跑一整天的现在可能一两个小时就出结果。但问题也恰恰出在这里。Isaac Gym 不是一个pip install就能搞定的普通 Python 包它是一整套深度绑定特定 CUDA 版本、特定 Python 版本、特定显卡驱动的软硬件组合。你在 Ubuntu 22.04 上装它本质上是在做一次精密的版本对齐手术任何一个环节的版本错位都会导致编译失败、运行时报错、或者更隐蔽的段错误崩溃。我前前后后在几台不同配置的机器上装过 Isaac Gym Preview 3踩过的坑包括但不限于Python 3.10 下setup.py直接报语法错误、CUDA 12.x 环境下找不到libcudart.so.11.0、显卡驱动太新反而导致nvidia-smi和 CUDA runtime 版本不匹配、conda 环境里混入了系统 Python 的包导致torch和isaacgym打架。这些问题在官方文档里基本找不到答案只能靠社区帖子和反复试错。这篇文章就是把这些经验整理出来给你一条经过验证的、可复现的配置路径。我会从系统准备开始一步步走到跑通官方示例中间每个关键决策都会解释为什么这么做每个常见错误都会给出排查思路。适合的人群包括做机器人学习的硕博研究生、具身智能方向的算法工程师、以及任何需要在 Ubuntu 上搭建 GPU 加速仿真环境的开发者。即使你之前没怎么碰过 Linux 环境配置跟着走也能搞定。2. 环境配置的整体思路与版本选型逻辑2.1 为什么版本对齐是 Isaac Gym 的生命线Isaac Gym Preview 3 发布于 2022 年底它的编译和运行依赖三个核心组件Python、CUDA Toolkit、NVIDIA 显卡驱动。这三个东西的版本必须满足一个隐含的约束关系而这个关系官方并没有用一张清晰的表格列出来。先说 Python。Isaac Gym Preview 3 的setup.py里用了distutils的一些旧接口在 Python 3.10 及以上版本中distutils被标记为废弃部分接口行为发生了变化。实测下来Python 3.8 是最稳妥的选择Python 3.9 也可以但 3.10 和 3.11 会出现各种奇怪的编译错误。这不是说 3.10 完全不能用而是你需要额外打补丁对于第一次配置的人来说没必要给自己增加难度。再说 CUDA。Isaac Gym Preview 3 官方编译时使用的是CUDA 11.x系列具体来说是 11.3 到 11.7 之间。如果你系统里装的是 CUDA 12.x编译时会出现undefined reference to cudaLaunchKernel之类的链接错误因为 CUDA 12 改变了部分 API 的签名。更麻烦的是即使你编译通过了运行时也可能因为libcudart.so的版本不匹配而崩溃。最后是显卡驱动。这里有一个常见的误区很多人觉得驱动越新越好。但在 Isaac Gym 的场景下驱动版本需要和 CUDA Toolkit 版本匹配。比如 CUDA 11.7 要求驱动版本不低于 515但如果你装了 545 的驱动它虽然向下兼容 CUDA 11.7但某些情况下会出现nvidia-smi显示的 CUDA Version 和实际 runtime 版本不一致的问题导致 Isaac Gym 初始化时找不到正确的设备。2.2 推荐的环境组合方案基于多次实测我总结出两套比较稳的组合组件方案 A保守稳定型方案 B较新但可用型Ubuntu22.04 LTS22.04 LTSPython3.8conda 创建3.9conda 创建CUDA Toolkit11.711.8显卡驱动515 或 525525 或 535PyTorch1.13.1 cu1172.0.1 cu118Isaac GymPreview 3Preview 3方案 A 是我最推荐的因为 PyTorch 1.13.1 和 CUDA 11.7 的组合经过了大量社区验证Isaac Gym 的官方示例在这个环境下基本不会出问题。方案 B 稍微新一点PyTorch 2.0.1 在 CUDA 11.8 下也能正常工作但偶尔会遇到一些算子不兼容的警告。注意不要用系统自带的 Python。Ubuntu 22.04 默认的 Python 3.10 会让你在编译 Isaac Gym 时多花至少两个小时排查问题。用 conda 创建一个独立的 Python 3.8 环境这是最省事的做法。2.3 为什么用 conda 而不是 venvPython 虚拟环境有两种主流选择venv和conda。在 Isaac Gym 的场景下我强烈建议用 conda原因有三个。第一conda 可以管理非 Python 的依赖。Isaac Gym 编译时需要调用 CUDA 的nvcc运行时需要加载libcudart.so。conda 可以通过cudatoolkit包在环境内部提供一套 CUDA runtime这样即使系统 CUDA 版本有偏差环境内部也能保持一致。第二conda 的环境隔离更彻底。venv只隔离 Python 包但LD_LIBRARY_PATH之类的环境变量还是共享的。conda 激活环境时会自动设置相关的库路径减少了很多手动配置的工作。第三conda 安装 PyTorch 更方便。PyTorch 官方为 conda 提供了预编译的 CUDA 版本一条命令就能装好不用自己处理libtorch的链接问题。3. 从裸机到可运行环境的完整实操3.1 系统准备与显卡驱动安装假设你已经装好了 Ubuntu 22.04并且能正常进入桌面。第一步是确认显卡型号和当前驱动状态lspci | grep -i nvidia nvidia-smi如果nvidia-smi能正常输出说明驱动已经装好了。如果提示command not found说明驱动还没装。Ubuntu 22.04 提供了一个比较方便的驱动安装方式sudo ubuntu-drivers devices sudo ubuntu-drivers autoinstall这个命令会自动检测你的显卡型号并安装推荐的驱动版本。但要注意autoinstall可能会给你装一个比较新的驱动比如 545 或 550。如果你打算用 CUDA 11.7建议手动指定驱动版本sudo apt install nvidia-driver-525安装完成后重启再次运行nvidia-smi你应该能看到类似这样的输出----------------------------------------------------------------------------- | NVIDIA-SMI 525.147.05 Driver Version: 525.147.05 CUDA Version: 12.0 | |--------------------------------------------------------------------------- | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | || | 0 NVIDIA GeForce ... Off | 00000000:01:00.0 On | N/A | | 30% 45C P8 25W / 250W | 500MiB / 24576MiB | 0% Default | ---------------------------------------------------------------------------这里有一个关键点nvidia-smi右上角显示的CUDA Version: 12.0是驱动支持的最高 CUDA 版本不是你系统里安装的 CUDA Toolkit 版本。很多人看到这个就以为自己装的是 CUDA 12其实不是。驱动版本 525 支持最高 CUDA 12.0但它同时兼容 CUDA 11.x 的 runtime。提示如果你之前装过其他版本的驱动先用sudo apt purge nvidia-*清理干净再装新驱动。残留的驱动文件会导致nvidia-smi输出异常。3.2 CUDA Toolkit 11.7 的安装与验证驱动装好后接下来装 CUDA Toolkit。这里我选择 11.7 版本因为它和 PyTorch 1.13.1 的配合最稳定。去 NVIDIA 的 CUDA Toolkit 归档页面找到 11.7 的安装命令。对于 Ubuntu 22.04命令大概是这样的wget https://developer.download.nvidia.com/compute/cuda/11.7.0/local_installers/cuda_11.7.0_515.43.04_linux.run sudo sh cuda_11.7.0_515.43.04_linux.run运行安装程序时注意几个选项在组件选择界面取消勾选 Driver因为我们已经单独装了驱动。如果这里再装一次驱动可能会覆盖掉之前的版本导致版本混乱。确保勾选 CUDA Toolkit 11.7 和相关的库文件。安装路径保持默认的/usr/local/cuda-11.7。安装完成后配置环境变量。编辑~/.bashrc在末尾添加export PATH/usr/local/cuda-11.7/bin:$PATH export LD_LIBRARY_PATH/usr/local/cuda-11.7/lib64:$LD_LIBRARY_PATH export CUDA_HOME/usr/local/cuda-11.7然后source ~/.bashrc验证安装nvcc --version你应该看到Cuda compilation tools, release 11.7, V11.7.64这样的输出。如果nvcc找不到检查 PATH 是否配置正确。3.3 conda 环境创建与 PyTorch 安装接下来创建 conda 环境。如果你还没装 conda先去 Miniconda 官网下载安装脚本wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh安装完成后创建一个 Python 3.8 的环境conda create -n isaacgym python3.8 conda activate isaacgym然后安装 PyTorch。这里要用 PyTorch 官方提供的 conda 安装命令指定 CUDA 11.7conda install pytorch1.13.1 torchvision0.14.1 torchaudio0.13.1 pytorch-cuda11.7 -c pytorch -c nvidia安装完成后验证 PyTorch 是否能正确识别 GPUpython -c import torch; print(torch.__version__); print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0))如果输出True和你的显卡型号说明 PyTorch 环境没问题。如果torch.cuda.is_available()返回False检查 CUDA 版本是否匹配或者LD_LIBRARY_PATH是否包含了正确的 CUDA 库路径。注意conda 安装的 PyTorch 会自带一套 CUDA runtime这套 runtime 和系统安装的 CUDA Toolkit 是独立的。Isaac Gym 编译时需要系统 CUDA Toolkit 的nvcc运行时则可能加载 conda 环境里的 CUDA 库。两者版本要一致否则会出现符号冲突。3.4 Isaac Gym Preview 3 的下载与编译Isaac Gym Preview 3 需要从 NVIDIA 开发者网站下载。你需要注册一个 NVIDIA 开发者账号然后找到 Isaac Gym Preview 3 的下载页面下载IsaacGym_Preview_3_Package.tar.gz。下载完成后解压到合适的位置tar -xzvf IsaacGym_Preview_3_Package.tar.gz cd isaacgym目录结构大概是这样的isaacgym/ ├── python/ │ ├── setup.py │ ├── isaacgym/ │ └── examples/ ├── docs/ └── LICENSE进入python目录执行编译安装cd python pip install -e .这个pip install -e .会触发setup.py的编译过程它会调用nvcc编译 CUDA 扩展。编译时间大概在 5 到 15 分钟取决于你的 CPU 性能。编译过程中如果出现错误大概率是以下几种错误一nvcc: command not found说明 CUDA Toolkit 的 PATH 没配置好。检查echo $PATH是否包含/usr/local/cuda-11.7/bin。错误二fatal error: cuda_runtime_api.h: No such file or directory说明编译器找不到 CUDA 头文件。检查CUDA_HOME环境变量是否设置正确以及/usr/local/cuda-11.7/include是否存在。错误三undefined reference to cudaLaunchKernel这是 CUDA 版本不匹配的典型症状。如果你系统里装了 CUDA 12而 Isaac Gym 期望的是 CUDA 11就会出现这个错误。解决办法是确保nvcc指向的是 CUDA 11.7 的版本。编译成功后你会看到类似Successfully installed isaacgym-1.0.preview3的输出。3.5 运行官方示例验证环境编译安装完成后先跑一个最简单的示例来验证环境cd examples python joint_monkey.py这个示例会打开一个窗口显示一个机械臂在随机运动。如果窗口正常弹出并且机械臂在动说明 Isaac Gym 已经可以正常工作了。如果报错ImportError: libpython3.8.so.1.0: cannot open shared object file说明 conda 环境的 Python 库路径没被正确加载。解决办法是在~/.bashrc里添加export LD_LIBRARY_PATH$CONDA_PREFIX/lib:$LD_LIBRARY_PATH然后重新激活环境。如果报错ImportError: libcudart.so.11.0: cannot open shared object file说明运行时找不到 CUDA runtime 库。检查LD_LIBRARY_PATH是否包含了/usr/local/cuda-11.7/lib64和$CONDA_PREFIX/lib。4. 常见错误与排查技巧实录4.1 编译阶段的高频错误速查错误信息根本原因解决方法nvcc: command not foundCUDA Toolkit 未安装或 PATH 未配置检查/usr/local/cuda-11.7/bin是否在 PATH 中cuda_runtime_api.h: No such fileCUDA 头文件路径未设置设置CUDA_HOME并确保 include 目录存在undefined reference to cudaLaunchKernelCUDA 版本不匹配确保 nvcc 指向 CUDA 11.xPython.h: No such filePython 开发头文件缺失sudo apt install python3.8-deverror: command gcc failedGCC 版本过高安装 gcc-9 并设置为默认distutils.errors.DistutilsErrorPython 版本过高使用 Python 3.8 或 3.9这里重点说一下 GCC 版本的问题。Ubuntu 22.04 默认的 GCC 是 11.x而 CUDA 11.7 的nvcc对 GCC 11 的支持不完整编译时可能会报一些奇怪的错误。解决办法是安装 GCC 9sudo apt install gcc-9 g-9 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 9 sudo update-alternatives --install /usr/bin/g g /usr/bin/g-9 9然后重新运行pip install -e .。4.2 运行时错误的排查思路编译通过只是第一步运行时的问题往往更隐蔽。以下是我遇到过的几个典型场景。场景一ImportError: libpython3.8.so.1.0这个错误说明 Python 解释器在加载 Isaac Gym 的 C 扩展时找不到 Python 的动态库。conda 环境的 Python 库在$CONDA_PREFIX/lib下但系统默认的库搜索路径可能不包含这个目录。解决方法是在激活 conda 环境后手动设置LD_LIBRARY_PATHexport LD_LIBRARY_PATH$CONDA_PREFIX/lib:$LD_LIBRARY_PATH场景二RuntimeError: CUDA error: no kernel image is available for execution on the device这个错误通常出现在显卡算力较高比如 RTX 40 系列而 CUDA 版本较旧的情况下。CUDA 11.7 对 Ada Lovelace 架构RTX 40 系列的支持需要驱动版本不低于 525并且需要在编译时指定正确的算力架构。解决办法是在setup.py中找到nvcc的编译参数添加-gencode archcompute_89,codesm_89。场景三程序运行几秒后直接段错误崩溃这种问题最难排查因为没有任何错误信息。常见原因有三个一是显卡驱动和 CUDA runtime 版本不匹配二是显存不足三是多线程冲突。排查方法是先用CUDA_LAUNCH_BLOCKING1环境变量运行看看是否能定位到具体的 CUDA 调用CUDA_LAUNCH_BLOCKING1 python joint_monkey.py如果加上这个变量后能正常运行只是速度变慢说明是异步 CUDA 调用的问题通常是版本不匹配导致的。4.3 显卡驱动与 CUDA 版本的兼容性陷阱很多人会忽略一个事实显卡驱动版本决定了系统能支持的最高 CUDA 版本但 CUDA Toolkit 的版本可以低于这个上限。比如驱动 525 支持最高 CUDA 12.0但你完全可以安装 CUDA 11.7 并使用它。真正的问题出在反向情况驱动版本太低不支持你安装的 CUDA Toolkit。比如驱动 470 最高只支持 CUDA 11.4如果你装了 CUDA 11.7运行时就会报CUDA driver version is insufficient for CUDA runtime version。排查方法很简单nvidia-smi # 看右上角的 CUDA Version nvcc --version # 看 CUDA Toolkit 版本确保nvidia-smi显示的 CUDA Version 大于等于nvcc显示的版本。如果小于要么升级驱动要么降级 CUDA Toolkit。提示如果你用的是云服务器或者实验室共享的机器可能没有权限升级驱动。这种情况下只能选择驱动支持的 CUDA 版本然后找对应版本的 PyTorch 和 Isaac Gym 编译方案。4.4 conda 环境与系统库的冲突处理conda 环境虽然隔离性好但有时候会过度隔离导致一些系统库找不到。比如 Isaac Gym 运行时需要加载libGL.so但 conda 环境里可能没有这个库或者版本不对。解决办法是安装一些系统级的依赖sudo apt install libgl1-mesa-glx libglib2.0-0 libsm6 libxext6 libxrender-dev如果 conda 环境里的库和系统库冲突可以通过conda install安装对应的包或者用LD_PRELOAD强制加载系统库。另一个常见问题是 conda 环境里的libstdc.so版本过旧导致 Isaac Gym 的 C 扩展加载失败。检查方法strings $CONDA_PREFIX/lib/libstdc.so.6 | grep GLIBCXX如果输出的版本低于GLIBCXX_3.4.29说明需要更新。可以从系统拷贝一份较新的cp /usr/lib/x86_64-linux-gnu/libstdc.so.6 $CONDA_PREFIX/lib/5. 性能调优与多环境管理经验5.1 让 Isaac Gym 跑得更快的几个实用设置环境跑通之后下一步就是让它跑得更快。Isaac Gym 的性能瓶颈通常不在 GPU 计算而在 CPU 和 GPU 之间的数据同步。以下几个设置可以明显提升训练速度。第一关闭垂直同步。在运行示例时Isaac Gym 默认会以显示器的刷新率来渲染这会限制仿真步进的速度。可以在代码中设置headlessTrue来关闭渲染窗口或者设置graphics_device_id-1来禁用图形输出。第二调整num_envs参数。Isaac Gym 的核心优势是可以在 GPU 上并行仿真成千上万个环境。但num_envs不是越大越好它受限于显存大小。一般来说对于 24GB 显存的显卡num_envs4096是一个比较安全的起点。你可以逐步增加直到显存占用达到 80% 左右。第三使用torch.backends.cudnn.benchmark True。这个设置会让 cuDNN 在第一次运行时自动寻找最优的卷积算法后续运行会快很多。对于固定的网络结构这个优化非常有效。第四避免在训练循环中频繁调用.cpu()或.numpy()。这些操作会强制同步 GPU 和 CPU破坏流水线。尽量在 GPU 上完成所有计算只在需要记录日志时才把数据搬到 CPU。5.2 多版本 CUDA 共存的管理策略如果你同时在做多个项目可能需要不同版本的 CUDA。比如 Isaac Gym 需要 CUDA 11.7而另一个项目需要 CUDA 12.1。这种情况下可以用update-alternatives来管理多个 CUDA 版本sudo update-alternatives --install /usr/local/cuda cuda /usr/local/cuda-11.7 117 sudo update-alternatives --install /usr/local/cuda cuda /usr/local/cuda-12.1 121然后通过sudo update-alternatives --config cuda来切换默认版本。但要注意conda 环境里的 PyTorch 会自带 CUDA runtime所以即使系统 CUDA 切换了conda 环境里的 PyTorch 仍然使用它自己的 CUDA 版本。这种隔离性有时候是好事有时候也会造成困惑。我的建议是每个项目用一个独立的 conda 环境环境内部固定 CUDA 版本系统层面的 CUDA 只用来提供nvcc编译器。这样最不容易出问题。5.3 环境备份与迁移的实操方法配置好的环境是宝贵的重装一次至少要花半天时间。conda 提供了环境导出功能conda env export isaacgym_env.yml但这个命令会导出所有依赖的精确版本包括一些平台相关的包。如果要在另一台机器上恢复可能会因为平台差异而失败。更稳妥的做法是手动记录关键版本pip freeze | grep -E torch|isaacgym|numpy然后在新机器上按照本文的步骤重新配置。虽然麻烦一点但能保证环境的干净和可控。如果实在不想重装可以直接打包整个 conda 环境目录conda pack -n isaacgym -o isaacgym.tar.gz然后在目标机器上解压到 conda 的envs目录下。但这种方法要求两台机器的系统库版本基本一致否则还是会出现库冲突。注意Isaac Gym 的编译产物和 CUDA 版本、显卡架构强相关。如果你把环境从一台机器迁移到另一台显卡型号不同的机器上可能需要重新编译 Isaac Gym 的 C 扩展。6. 一些让我少走弯路的个人体会配置 Isaac Gym 这件事说到底是一个版本管理问题而不是技术难题。我见过太多人卡在编译错误上反复重装系统、重装驱动最后发现只是 Python 版本高了 0.2 个小数点。所以我的第一条建议是先确定版本组合再动手安装。不要一边装一边试那样只会浪费更多时间。第二条建议是善用conda list和pip list做版本审计。每次环境出问题先看看当前环境里各个包的版本和已知可用的组合对比一下。大部分问题都能通过版本对比找到线索。第三条建议是保留一个能跑通的最小环境。当你花了很多时间终于配好一个环境后不要急着在里面装各种乱七八糟的包。先复制一份作为备份然后在副本里折腾。这样即使折腾坏了也能快速恢复。最后分享一个排查 CUDA 相关错误的通用思路从下往上查。先确认驱动版本再确认 CUDA Toolkit 版本再确认 PyTorch 的 CUDA 版本最后确认 Isaac Gym 编译时用的 CUDA 版本。这四个版本必须形成一条一致的链条任何一个环节断裂都会导致运行时崩溃。把这条链理顺了Isaac Gym 的环境配置就成功了一大半。
返回列表