适用场景是Windows 11 + NVIDIA RTX 50系显卡(Blackwell, sm_120)+ CUDA 12.8+。核心问题是Isaac Sim 5.1的Windows pip版自带旧版MSVC运行时,与PyTorch nightly cu128存在DLL冲突,导致c10.dll报WinError 1114错误。

前置条件

  • Windows 11(WDDM驱动)
  • NVIDIA RTX 5080/5090(或未来Blackwell架构显卡)
  • 最新NVIDIA驱动(>= 591.x,支持CUDA 12.8+)
  • Miniconda/Anaconda已安装

创建Conda环境

BASH
conda create -n isaaclab python=3.11 -y
conda activate isaaclab

安装PyTorch Nightly(CUDA 12.8)

RTX 50系需要sm_120支持,必须使用PyTorch nightly cu128(稳定版2.7.0不支持Blackwell):

BASH
pip install --pre torch==2.12.0.dev20260408+cu128 torchvision==0.27.0.dev20260408+cu128 --index-url https://download.pytorch.org/whl/nightly/cu128 --force-reinstall

如果上述特定版本不可用,去PyTorch nightly索引页找最新可用的torch + torchvision cu128版本。

验证安装:

BASH
python -c "import torch; print(torch.__version__); print(torch.cuda.is_available()); a=torch.randn(1000,1000).cuda(); print(a@a)"

安装Isaac Sim 5.1(pip)

BASH
pip install isaacsim[all,extscache]==5.1.0

安装过程约5-10分钟,会下载大量扩展包。

修复DLL冲突(关键步骤)

问题根因

Isaac Sim kit目录下自带了VS2019时代的MSVC运行时DLL(版本14.29.x):

位置 vcruntime140.dll 版本
isaacsim/kit/ 14.29.30139.0
isaacsim/kit/kernel/plugins/ 14.29.30139.0
C:\Windows\System32 14.51.36231.0

PyTorch nightly cu128(2.12.0+)使用新版MSVC编译,需要14.50+的运行时。当Isaac Sim kit进程启动时,Windows DLL搜索顺序会让kit优先加载自己目录下的旧版DLL,导致PyTorch的c10.dll初始化失败:

OSError: [WinError 1114] 动态链接库(DLL)初始化例程失败
Error loading "...\torch\lib\c10.dll"

解决方案

把kit自带的旧版MSVC DLL重命名,让kit回退到加载系统目录中的新版(14.51.x向后兼容旧代码)。

在conda环境的isaacsim/kit/目录下执行:

BASH
# 进入kit目录
cd %CONDA_PREFIX%\Lib\site-packages\isaacsim\kit

# 重命名旧版DLL(保留.old后缀以便回滚)
ren vcruntime140.dll vcruntime140.dll.old
ren msvcp140.dll msvcp140.dll.old
ren msvcp140_1.dll msvcp140_1.dll.old
ren msvcp140_2.dll msvcp140_2.dll.old
ren msvcp140_atomic_wait.dll msvcp140_atomic_wait.dll.old
ren msvcp140_codecvt_ids.dll msvcp140_codecvt_ids.dll.old
ren vcruntime140_1.dll vcruntime140_1.dll.old

# 进入kernel/plugins子目录,同样处理
cd kernel\plugins

ren vcruntime140.dll vcruntime140.dll.old
ren msvcp140.dll msvcp140.dll.old
ren msvcp140_1.dll msvcp140_1.dll.old
ren msvcp140_2.dll msvcp140_2.dll.old
ren msvcp140_atomic_wait.dll msvcp140_atomic_wait.dll.old
ren msvcp140_codecvt_ids.dll msvcp140_codecvt_ids.dll.old
ren vcruntime140_1.dll vcruntime140_1.dll.old

如果之后需要回滚,把.old改回.dll即可。

验证修复后kit能正常启动

PYTHON
import os
os.environ["OMNI_KIT_ACCEPT_EULA"] = "YES"
from isaacsim import SimulationApp
app = SimulationApp({"headless": True})
import torch
print("torch:", torch.__version__, torch.cuda.is_available())
app.close()

应能正常启动并输出 torch: 2.12.0.dev20260408+cu128 True

验证系统MSVC版本

确保C:\Windows\System32\vcruntime140.dll版本 >= 14.40:

POWERSHELL
(Get-ItemProperty "C:\Windows\System32\vcruntime140.dll").VersionInfo.FileVersion

如果版本过旧,下载并安装最新Visual C++ Redistributable

安装IsaacLab扩展

BASH
# 克隆IsaacLab
git clone https://github.com/isaac-sim/IsaacLab.git
cd IsaacLab
git checkout v2.3.2  # 或最新稳定版

# 安装核心包
pip install -e source/isaaclab
pip install -e source/isaaclab_assets
pip install -e source/isaaclab_rl
pip install -e source/isaaclab_tasks

注意:IsaacLab安装时可能因flatdict build失败。若遇到,先执行pip install "setuptools<71"pip install flatdict==4.0.1,然后重试。

环境变量配置

添加到系统环境变量或每次激活conda时设置:

BASH
set OMNI_KIT_ACCEPT_EULA=YES

否则Isaac Sim每次启动都会交互式询问EULA。

验证安装

PYTHON
import torch
print("torch:", torch.__version__, "CUDA:", torch.cuda.is_available())

from isaacsim import SimulationApp
app = SimulationApp({"headless": True})

from isaaclab.app import AppLauncher
import isaaclab
print("IsaacLab version:", isaaclab.__version__)

app.close()

期望输出:

torch: 2.12.0.dev20260408+cu128 CUDA: True
Simulation App Startup Complete
IsaacLab version: 0.54.2
Simulation App Shutting Down

修复h5py DLL冲突(关键步骤)

问题根因

Isaac Sim kit的传感器模块(generic_model_output)自带了hdf5.dllhdf5_hl.dll,而h5py也依赖同名的HDF5 DLL。Windows不允许同一个进程加载两个同名DLL。kit启动时会先加载自己的hdf5.dll,当后续导入h5py时,h5py的C扩展会链接到kit的不兼容版本,导致崩溃:

ImportError: DLL load failed while importing _errors: 找不到指定的程序。
Windows fatal exception: code 0xc0000139

这会进一步阻断isaaclab_tasks的导入链(isaaclab_tasksrecorder_managerdatasetsh5py)。

解决方案

核心思路:将h5py的hdf5.dll重命名为唯一名称,并修改h5py所有.pyd文件的PE导入表,让它们引用新名称。这样kit和h5py各自使用独立的DLL,互不干扰。

项目已提供自动化脚本,保存为 fix_h5py_dll_conflict.py

PYTHON
#!/usr/bin/env python3
import os
import shutil
import sys

def get_h5py_dir():
    try:
        import h5py
        return os.path.dirname(h5py.__file__)
    except ImportError:
        for site_dir in sys.path:
            candidate = os.path.join(site_dir, "h5py")
            if os.path.isdir(candidate) and os.path.exists(os.path.join(candidate, "hdf5.dll")):
                return candidate
        return None

def patch_pe_imports(filepath, rename_map):
    try:
        import pefile
    except ImportError:
        print("ERROR: pefile is required. Install it with: pip install pefile")
        sys.exit(1)

    pe = pefile.PE(filepath)
    modified = False

    if not hasattr(pe, 'DIRECTORY_ENTRY_IMPORT'):
        return False

    for entry in pe.DIRECTORY_ENTRY_IMPORT:
        dll_name = entry.dll
        for old_name, new_name in rename_map.items():
            old_stripped = old_name.rstrip(b'\x00')
            if dll_name.lower() == old_stripped.lower():
                rva = entry.struct.Name
                file_offset = pe.get_offset_from_rva(rva)

                with open(filepath, 'r+b') as f:
                    f.seek(file_offset)
                    original = f.read(len(old_name))
                    if original.lower() == old_name.lower():
                        f.seek(file_offset)
                        f.write(new_name)
                        modified = True
                        new_stripped = new_name.rstrip(b'\x00').decode()
                        print(f"  Patched: {old_stripped.decode()} -> {new_stripped}")
                    else:
                        print(f"  WARNING: bytes at offset don't match for {old_stripped.decode()}")
                break

    return modified

def main():
    h5py_dir = get_h5py_dir()
    if h5py_dir is None:
        print("ERROR: Could not find h5py installation.")
        sys.exit(1)

    print(f"Found h5py at: {h5py_dir}")

    copies = [
        ("hdf5.dll", "h5pyh5.dll"),
        ("hdf5_hl.dll", "h5pyhl.dll"),
    ]

    rename_map = {
        b"hdf5.dll\x00": b"h5pyh5.dll\x00",
        b"hdf5_hl.dll\x00": b"h5pyhl.dll\x00\x00\x00",
    }

    for old_name, new_name in copies:
        old_path = os.path.join(h5py_dir, old_name)
        new_path = os.path.join(h5py_dir, new_name)
        if not os.path.exists(old_path):
            print(f"WARNING: {old_path} not found, skipping.")
            continue
        if os.path.exists(new_path):
            print(f"{new_name} already exists, skipping copy.")
        else:
            shutil.copy2(old_path, new_path)
            print(f"Created {new_name} from {old_name}")

    files_to_patch = []
    for f in os.listdir(h5py_dir):
        if f.endswith('.pyd') or (f.endswith('.dll') and f not in {'z.dll', 'hdf5.dll', 'hdf5_hl.dll'}):
            files_to_patch.append(os.path.join(h5py_dir, f))

    for filepath in files_to_patch:
        basename = os.path.basename(filepath)
        modified = patch_pe_imports(filepath, rename_map)
        if modified:
            print(f"Patched imports in: {basename}")

    print("\nDone! h5py DLL conflict should be resolved.")
    print("In your script, add the following before 'import h5py':")
    print(f"    import os")
    print(f"    os.add_dll_directory(r'{h5py_dir}')")

if __name__ == "__main__":
    main()

执行脚本(需先安装 pefile):

BASH
pip install pefile
python fix_h5py_dll_conflict.py

脚本会:

  1. 在h5py安装目录中创建h5pyh5.dll(原hdf5.dll的副本)和h5pyhl.dll(原hdf5_hl.dll的副本)
  2. 自动patch所有.pyd文件的导入表

在代码中使用h5py

由于h5py的DLL目录不在Windows默认搜索路径中,每次在kit进程内导入h5py前,需要显式添加DLL搜索路径:

PYTHON
import os
import h5py

# 必须在 import h5py 之前执行
os.add_dll_directory(os.path.dirname(h5py.__file__))

import h5py
import isaaclab_tasks  # 现在可以正常导入了

验证

PYTHON
import os
os.environ["OMNI_KIT_ACCEPT_EULA"] = "YES"

from isaacsim import SimulationApp
app = SimulationApp({"headless": True})

import h5py
print("h5py version:", h5py.__version__)  # 应输出 3.16.0

import isaaclab_tasks
print("isaaclab_tasks imported successfully!")

app.close()

已知问题与注意事项

  1. 依赖版本冲突警告isaacsim-core严格依赖torch==2.7.0numpy==1.26.0,但我们强制安装了torch 2.12.0numpy 1.26.4。这些警告不影响实际运行。

  2. Manager-Based vs Direct Workflow:IsaacLab内置的Go1任务只有Manager-Based版本。如果自定义逻辑复杂,建议参考AnymalCEnv使用Direct Workflow(DirectRLEnv)。

  3. Quadruped扩展已弃用omni.isaac.quadruped已弃用,新代码应使用isaacsim.robot.policy.examples

回滚方案

如果出现问题,恢复kit自带的MSVC DLL:

BASH
cd %CONDA_PREFIX%\Lib\site-packages\isaacsim\kit
for %f in (*.old) do @ren "%f" "%~nf"
cd kernel\plugins
for %f in (*.old) do @ren "%f" "%~nf"

恢复h5py原始DLL,重新安装即可:

BASH
pip uninstall h5py -y
pip install h5py==3.16.0 --no-deps