
build server success but execute `ggml_cuda_init: failed to initialize CUDA: unknown error`
快速结论:此报错通常发生在编译 llama.cpp server 时启用了 CUDA(LLAMA_CUDA=1),但在执行时 CUDA 驱动或运行时环境未正确初始化。优先排查 nvidia_uvm 内核模块是否加载。
问题场景
用户在一台搭载 NVIDIA GeForce RTX 3090 的机器上使用 make server LLAMA_CUDA=1 CUDA_DOCKER_ARCH=all 成功编译了 llama.cpp server,但执行时出现该报错且模型未加载到 GPU。在另一台 1080 Ti 机器上用相同编译参数可正常运行。
报错原文
ggml_cuda_init: failed to initialize CUDA: unknown error
原因分析
可能原因:
nvidia_uvm内核模块未加载,导致 CUDA 无法与 GPU 通信。- CUDA 驱动版本(545.29.02)与编译时的 CUDA Toolkit 版本(CUDA 12.3)不匹配,或运行环境缺少必要的 CUDA 运行时库。
- GPU 被其他进程占用(如已运行的模型、训练任务),导致 CUDA 初始化失败。
- 权限不足,导致用户进程无法访问 GPU 设备文件。
环境排查
- 确认 NVIDIA 驱动版本:
nvidia-smi输出中的 Driver Version 和 CUDA Version。 - 检查
nvidia_uvm模块是否加载:lsmod | grep nvidia_uvm。 - 确认编译时使用的 CUDA Toolkit 路径是否正确:
make LLAMA_CUDA=1 CUDA_PATH=/path/to/cuda-12.3。 - 查看运行时 CUDA 可用设备:
python -c "import torch; print(torch.cuda.is_available())"或nvidia-smi topo -m。 - 检查是否有其他进程占用 GPU:
nvidia-smi查看 GPU 使用情况。
解决步骤
- 加载
nvidia_uvm模块:在终端执行sudo modprobe nvidia_uvm,然后再次运行 llama.cpp server。这是 Issue 评论中提到的可优先尝试的解决方案。 - 如果步骤 1 无效,重新编译并指定 CUDA 路径:确保编译时使用的 CUDA Toolkit 版本与运行时驱动兼容。例如,如果驱动支持 CUDA 12.3,则编译时使用
make LLAMA_CUDA=1 CUDA_PATH=/usr/local/cuda-12.3。 - 检查 CUDA 库权限:运行
ls -l /dev/nvidia*检查设备文件权限,确保用户有读写权限。必要时添加 udev 规则或使用 sudo 执行。 - 关闭其他 GPU 进程:使用
kill -9 [PID]终止占用 GPU 的进程,或重启系统后立即测试。 - 更新 NVIDIA 驱动:如果上述步骤均无效,考虑更新驱动到最新稳定版(如 550 系列),并重启系统。
验证方法
重新执行 llama.cpp server,观察启动日志中是否包含 ggml_cuda_init: calling cuInit 且无错误输出,同时 nvidia-smi 显示 GPU 内存被模型占用。



