llama.cpp 多 GPU 分布式计算优化实战
大模型推理时,单卡显存不足往往是首要瓶颈。当模型参数量超过单卡容量,或者需要追求更高吞吐量时,多 GPU 分布式部署成为必选项。本文基于 llama.cpp 项目,从设备调度、编译配置到参数调优,系统梳理多卡环境下的性能优化路径。
多 GPU 架构解析:从设备发现到任务调度
llama.cpp 依赖 GGML 后端实现跨设备计算。启动阶段,系统会自动扫描可用计算资源,并按优先级排序:RPC 服务器优先(用于远程调用),其次是独立 GPU,最后是集成显卡。这种机制确保了本地算力优先被利用。
核心逻辑位于 src/llama.cpp 的设备管理模块,大致流程如下:
// src/llama.cpp:190-248 设备分类与优先级排序
std::vector<ggml_backend_dev_t> gpus;
std::vector<ggml_backend_dev_t> igpus;
std::vector<ggml_backend_dev_t> rpc_servers;
// 优先添加 RPC 服务器,减少网络传输延迟
model->devices.insert(model->devices.begin(), rpc_servers.begin(), rpc_servers.end());
// 其次添加独立 GPU
model->devices.insert(model->devices.end(), gpus.begin(), gpus.end());
// 最后添加集成 GPU(仅当无其他设备时)
if (model->devices.empty()) {
model->devices.insert(model->devices.end(), igpus.begin(), igpus.end());
}
设备选择遵循'能力优先'原则。每个设备会输出其类型、ID 及剩余显存,典型日志如下:
llama_model_load_from_file: using device 0 (GPU) (NVIDIA GeForce RTX 4090) (PCIe 4.0) - 23028 MiB free
llama_model_load_from_file: using device 1 (GPU) (NVIDIA GeForce RTX 3060) (PCIe 3.0) - 11019 MiB free

