1.11 Map4D
约 721 字大约 2 分钟
2025-05-13
1.11.1 tiny-cuda-nn
tiny-cuda-nn 的编译问题见 1.2.7 ld: cannot find -lcuda
1.11.2 CUDA 版本不匹配
在使用 pip install -e . / python setup.py develop 安装 map4d 或其他依赖 PyTorch C++/CUDA 扩展的包时,遇到了以下的错误:
RuntimeError:
The detected CUDA version (11.8) mismatches the version that was used to compile
PyTorch (12.4). Please make sure to use the same CUDA versions.排查:
nvcc --version
python -c "import torch; print(f'PyTorch version: {torch.__version__}'); print(f'PyTorch CUDA version: {torch.version.cuda}')"
# 同时检查 conda 环境中 PyTorch 的构建信息
mamba list | grep pytorchnvcc 版本与 torch.version.cuda 以及 mamba list 中 pytorch-cuda 包指示的版本都是 cuda11.8,没问题啊!
问题发现:
当使用 pip install -e . 配合 pyproject.toml 文件时,pip 会创建一个隔离的构建环境,并根据 pyproject.toml 中的 build-system.requires 安装构建依赖。如果这里声明的 torch 版本比较宽松(如 torch>=2.0),pip 可能会从 PyPI 拉取一个与你当前 Conda 环境中 PyTorch CUDA 版本不匹配的 torch(例如,拉取了一个为 CUDA 12.x 编译的 PyTorch)
解决方案:
在 map4d 项目的 pyproject.toml 文件中,明确指定 build-system.requires 下的 torch 版本,使其与你 Conda 环境中的 torch 版本和 CUDA 版本严格一致。比如 Conda 环境是 PyTorch 2.0.1 for CUDA 11.8:
# pyproject.toml
[build-system]
requires = [
# ...
"torch==2.0.1", # 确保与环境一致
]
build-backend = "setuptools.build_meta"
# ...修改之后,再执行 python setup.py develop 就没问题了!🫡
1.11.3 Unknown CUDA arch (X.Y) or GPU not supported
依然是在使用 pip install -e . / python setup.py develop 安装 map4d 时,在编译 CUDA 扩展时,遇到如下错误:
File ".../torch/utils/cpp_extension.py", line ..., in _get_cuda_arch_flags
raise ValueError(f"Unknown CUDA arch ({arch}) or GPU not supported")
ValueError: Unknown CUDA arch (10.0) or GPU not supported这个错误意味着 PyTorch 的构建系统在尝试为特定的 CUDA GPU 计算架构 (Compute Capability, 如 7.5, 8.6) 生成编译器标志 (如
-gencode arch=compute_86,code=sm_86) 时,遇到了一个无法识别的架构代号,比如 "10.0"。这些架构代号通常通过环境变量TORCH_CUDA_ARCH_LIST指定,或者由 PyTorch 自动检测。错误中出现的 "10.0", "10.1", "12.0" 等都不是有效的 CUDA 计算架构版本号,它们可能被错误地从 CUDA Toolkit 版本号 (如 CUDA Toolkit 10.0, 12.0) 混淆而来
检查 TORCH_CUDA_ARCH_LIST 环境变量: 这是最常见的肇事者
echo $TORCH_CUDA_ARCH_LIST
5.0;5.2;6.0;6.1;7.0;7.5;8.0;8.6;8.9;9.0;10.0;10.1;10.3;12.0;12.1+PTX果然输出一大堆,解决方法很简单:清空该环境变量,最简单的方法是清空此环境变量。PyTorch 会自动检测当前机器上 GPU 的架构并为其编译
unset TORCH_CUDA_ARCH_LIST但是注意:这样在之后的运行中发现,会导致 tinycudann 只能在卡 0 运行(因为这台服务器的卡 0 不太一样,是 4090,其他的卡是 3090),所以推荐找到自己卡的 Compute Capability:
export TORCH_CUDA_ARCH_LIST="8.6;8.9+PTX"