问题场景:
使用llamafactory进行微调大模型,显卡配置为两张23GB的4090显卡,当开启deepspeed进行lora微调的时报错:
DeepSpeed Op Builder: Installed CUDA version 11.8 does not match the version torch was compiled with 12.1, unable to compile cuda/cpp extensions without a matching cuda version.
问题报错原因:
安装的 CUDA 版本(11.8)与 PyTorch 所编译的 CUDA 版本(12.1)不匹配,导致无法正常编译 DeepSpeed 所需要的 CUDA/CPP 扩展
解决方案:
解决方案 1: 确保 CUDA 版本匹配
检查 PyTorch 的 CUDA 版本:
python -c "import torch; print(torch.version.cuda)"
这将告诉你当前安装的 PyTorch 是用哪个 CUDA 版本编译的。
安装对应的 CUDA 工具包:
根据 PyTorch 对应的 CUDA 版本,安装正确的 CUDA toolkit:
在 Linux 上,你可以使用 NVIDIA 的官方安装工具或 Conda 下载所需版本的 CUDA。
例如:
conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia
这将安装兼容的 PyTorch 和 CUDA 12.1 环境。
验证:
再次运行上面的检查命令,确保你的系统带匹配的 CUDA 版本。
解决方案 2: 重新安装 PyTorch
如果你无法更改系统里的 CUDA 版本,可以尝试安装一个与你现有 CUDA 版本(11.8)兼容的 PyTorch 版本。
先卸载当前的 PyTorch 版本:
pip uninstall torch torch vision torchaudio
根据你的 CUDA 版本安装对应的 PyTorch。例如,如果你使用的是 CUDA 11.8:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
或通过 Conda 安装:
conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia
确保 PyTorch 和 CUDA 版本匹配。
解决方案 3: 使用 CPU 加速而非 CUDA
如果你可以接受使用 CPU 而非 CUDA 来运行 DeepSpeed,可以安装 CPU-only 版本的 PyTorch:
卸载 GPU 版本的 PyTorch:
pip uninstall torch torch torchvision torchaudio
安装 CPU-only 版本的 PyTorch:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
配置 DeepSpeed 使用 CPU。
确保 DeepSpeed 使用 CPU,而不是 GPU。在你的 DeepSpeed 配置中,将设备改为 cpu。
解决方案 4: 手动设置环境变量
如果你已安装正确 CUDA 版本,但 DeepSpeed 仍提示错误,可以尝试设置 TORCH_CUDA_ARCH_LIST 环境变量。
查找你的 GPU 支持的 CUDA 架构:
比如,如果你使用 NVIDIA A100,可能需要设置为 8.0。
在运行程序之前设置环境变量:
export TORCH_CUDA_ARCH_LIST="8.0"
然后重新运行。
解决方案 5: 使用 Docker 环境
如果你无法调整本地的 CUDA 和 PyTorch 安装,可以使用 Docker 容器,选择正确的 CUDA 和 PyTorch 版本来避免不兼容问题。
下载合适的 NVIDIA 容器镜像:
docker pull nvcr.io/nvidia/pytorch:23.05-py3
运行 Docker 容器,确保 TensorFlow、DeepSpeed 和 PyTorch 的 CUDA 版本一致。
注意事项
使用 nvidia-smi 查看当前的驱动和 CUDA 版本,确保其与 PyTorch 和 CUDA 工具包匹配。
如果你经常需要切换 CUDA 和 PyTorch 版本,可以考虑使用 Conda 环境隔离不同版本的库。
------实际上我使用了第二种方案就解决了------