DGX Spark llama.cpp 部署 Gemma4 31B
前提
我这里只讨论llama.cpp方式,vllm 其他等已经有成功的案例
下面是我部署时的相关参数,大佬知道哪里有问题,希望指出来相互学习
编译最新版本的 llama.cpp
新出的模型,需要重新编译最新代码,才能支持
复制
git clone https://github.com/ggml-org/llama.cpp.git cd ~/llama.cpp # 彻底清理旧的、错误的编译缓存 rm -rf build # 重新配置:关键在于指定 CUDA 指令集 sm_121 (Blackwell) cmake -B build \ -DGGML_CUDA=ON \ -DGGML_CUDA_GRAPHS=ON \ -DGGML_CUDA_FA_ALL_QUANTS=ON \ -DCMAKE_CUDA_ARCHITECTURES=121 \ -DCMAKE_BUILD_TYPE=Release # 开始编译 (DGX Spark 有 20 个 CPU 核心,直接拉满) cmake --build build --config Release -j 20
gemma-4-31B-it-BF16 满血版本
复制
#!/bin/bash cd /home/romain export GGML_CUDA_ENABLE_UNIFIED_MEMORY=1 exec /home/romain/llama.cpp/build/bin/llama-server \ -m /home/romain/models/gemma4-31B/BF16/gemma-4-31B-it-BF16-00001-of-00002.gguf \ --mmproj /home/romain/models/gemma4-31B/mmproj-BF16.gguf \ -ngl 999 \ --no-mmap \ --jinja \ -fa on \ -c 16384 \ --temp 1.0 \ --top-p 0.95 \ --top-k 64 \ --min-p 0.0 \ --repeat-penalty 1.0 \ -t 8 \ -tb 8 \ -b 512 \ -ub 512 \ -np 1 \ --cont-batching \ -ctk q8_0 \ -ctv q8_0 \ --no-context-shift \ --alias gemma-4-31B \ --host 0.0.0.0 \ --port 8080
复制
sudo chmod +x /usr/local/bin/start-llama-server.sh # 清理残留进程(很重要!) sudo pkill -9 llama-server # 重新加载 systemd 配置 sudo systemctl daemon-reload # 重启服务 sudo systemctl restart llama-server.service # 实时查看日志 sudo journalctl -u llama-server -f -n 100 sudo systemctl status llama-server.service
好了结论 2.5token/s,巨牛逼我都傻眼了,其实理论值时4token/s,我这里指的是输出
gemma-4-31B-it-UD-Q4_K_XL 量化版本
复制
#!/bin/bash # 1. 确保进入工作目录 cd /home/romain/llama.cpp # 2. 环境变量(保留统一内存支持,这是 DGX Spark 的精髓) export GGML_CUDA_ENABLE_UNIFIED_MEMORY=1 # 3. 启动 Server #!/bin/bash export GGML_CUDA_ENABLE_UNIFIED_MEMORY=1 /home/romain/llama.cpp/build/bin/llama-server \ -m /home/romain/models/gemma4-31B/gemma-4-31B-it-UD-Q4_K_XL.gguf \ --mmproj /home/romain/models/gemma4-31B/mmproj-BF16.gguf \ -ngl 999 \ --jinja \ -fa on \ -c 16384 \ -b 2048 \ -ub 512 \ -t 20 \ --cache-type-k q8_0 \ --cache-type-v q8_0 \ --host 0.0.0.0 \ --port 8080 \ --alias gemma-4-31B \ --cont-batching \ --temp 0.7 \ --top-p 0.9 \ --repeat-penalty 1.05
重复上面的杀进程重新启动
好了结论
- prompt eval time: 111 token/s ✅ (prefill 很快,GPU 正常)
- eval time: 6.5 token/s ❌ (decode 慢,这是瓶颈)
整整提升2.5倍
我看到这个数据已经癫狂了,不行要死磕这个模型了
结论知识点
其实我知道原因,dgx spark 宽带限制了,几乎已经跑满了
GB10 的带宽 273 GB/s
万能计算公式
31B 参数 × 2 bytes (BF16) ÷ 273 GB/s = 每个 token 227 ms = 理论最大 4.4 token/s
接下来继续搞 26B 的