Jetson Orin NX 16G部署llama.cpp框架(5090微调模型)
Jetson Orin NX 16G 上稳定跑 llama.cpp,本地 API 服务优先,后面还能和 5090 微调机联动
我默认你走 JetPack 6.x 原生部署,不先上 Docker。llama.cpp 本身就是 C/C++ 项目,提供 llama 库、C 风格接口,以及 llama-server 这种轻量 OpenAI 兼容 HTTP 服务;Jetson Orin NX 的 CUDA 计算能力是 8.7,而 JetPack 6.2.1 是当前 JetPack 6 的最新 production release,基于 Ubuntu 22.04 / CUDA 12.6。Jetson Orin NX 16GB 这块板子是 16GB LPDDR5、102 GB/s 理论带宽。([GitHub][1])
1. 我建议的目标形态
这台机器最适合的形态是:
- 主模式:
llama-server提供本地 OpenAI 兼容接口 - 模型形态:GGUF 量化模型
- 服务目标:单模型、低并发、低延迟优先
- 更新方式:5090 上训练 LoRA,Jetson 侧加载 GGUF 基座 + GGUF adapter
llama-server 官方支持 OpenAI 兼容的 chat completions / responses / embeddings 路由,也支持并行 slot、连续批处理、函数调用、speculative decoding;另外它支持运行时加载 LoRA:--lora FNAME。([GitHub][2])
2. 机型建议
在 Orin NX 16G 上,我建议你这样选模型:
- 首选:1B–4B Instruct 模型,GGUF,
Q4_K_M起步 - 质量优先:同模型换
Q5_K_M - 可试但保守:7B Instruct,GGUF,
Q4_K_M,上下文压到 2K–4K,parallel=1 - 不建议作为主服务:8B 以上长期常驻、长上下文、多并发
这不是因为 llama.cpp 不支持大模型,而是因为 Orin NX 是 16GB 共享内存,还要给系统、页缓存、服务本身留空间;llama.cpp 虽然支持 CUDA unified memory 回退,但那是“顶住不崩”的兜底,不是“高性能舒适区”。GGML_CUDA_ENABLE_UNIFIED_MEMORY=1 在 Linux 下会让 CUDA 在显存吃紧时回退到系统内存。([GitHub][3])
3. 系统基线
先把系统环境定住。
如果你还没升级,我建议直接用 JetPack 6.2.1。它是当前 JetPack 6 的最新 production release,带 Ubuntu 22.04、CUDA 12.6。另外 JetPack 6.2/6.2.1 对 Orin NX 引入了更高功耗档位:40W 和 MAXN SUPER,但前提是你的模块、散热和载板支持。([NVIDIA Developer][4])
我建议的运行前准备:
sudo apt update
sudo apt install -y git cmake ninja-build build-essential curl jq rsync
mkdir -p ~/src ~/models ~/adapters ~/logs
再确认设备状态:
uname -a
nvcc --version
nvidia-smi || true
cat /etc/nv_tegra_release || true
如果你的载板和散热允许,再切到更高性能功耗档位。不同载板的 nvpmodel 配置编号不完全一样,所以这里不写死 mode 编号。
4. 编译 llama.cpp
llama.cpp 的 CUDA 构建推荐按设备的 compute capability 设置 CMAKE_CUDA_ARCHITECTURES;Jetson Orin NX 是 8.7,所以这里用 87。官方 build 文档也明确给了 -DGGML_CUDA=ON 和 -DCMAKE_CUDA_ARCHITECTURES=... 的方式。([GitHub][3])
cd ~/src
git clone https://github.com/ggml-org/llama.cpp.git
cd llama.cpp
cmake -S . -B build -G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DGGML_CUDA=ON \
-DCMAKE_CUDA_ARCHITECTURES=87 \
-DBUILD_SHARED_LIBS=ON
cmake --build build -j"$(nproc)"
编译完先做最基本检查:
./build/bin/llama-cli --version
./build/bin/llama-server --help | head
./build/bin/llama-bench --help | head
llama.cpp 官方仓库里,llama-bench 就是拿来做推理性能测试的;llama-server 是轻量 OpenAI 兼容服务。([GitHub][5])
5. 推荐的目录结构
我建议固定成这样,后面最好维护:
~/models/
base/
model.gguf
draft/
model-draft.gguf
~/adapters/
task-a.gguf
task-b.gguf
~/logs/
llama-server.log
~/src/llama.cpp/
build/bin/...
原因很简单:
基座、adapter、日志分开,后面你从 5090 推送新 adapter 时不会乱。
6. 第一条能跑起来的服务命令
先从最稳的单模型服务开始:
export GGML_CUDA_ENABLE_UNIFIED_MEMORY=1
~/src/llama.cpp/build/bin/llama-server \
-m ~/models/base/model.gguf \
--host 0.0.0.0 \
--port 8080 \
-c 4096 \
-np 1 \
-fa auto \
-ctk q8_0 \
-ctv q8_0 \
--no-mlock
为什么这样配:
-c 4096:先把上下文定在 4K,避免一上来把共享内存吃爆。llama-server支持--ctx-size。([GitHub][2])-np 1:Jetson 上先走单 slot,优先延迟和稳定性。llama-server支持--parallel。([GitHub][2])-ctk q8_0 -ctv q8_0:把 KV cache 改成量化,明显有助于省内存。官方允许的 K/V cache 类型就包括q8_0、q4_0、q5_0等。([GitHub][2])GGML_CUDA_ENABLE_UNIFIED_MEMORY=1:作为 16GB 共享内存设备的兜底。([GitHub][3])- 不建议在这台机器上用
--mlock常驻锁内存;官方文档说明--mlock会强制把模型留在 RAM,而--mmap默认是开的。对 16GB Jetson 来说,保留mmap默认行为通常更稳。([GitHub][2])
如果模型偏大、仍然紧张,可以把上下文先降到 2048:
-c 2048 -np 1
如果模型偏小、运行很稳,再试:
-c 4096 -np 2
7. 启动后验证
先看服务有没有起来:
curl http://127.0.0.1:8080/props | jq .
再测 OpenAI 兼容接口:
curl http://127.0.0.1:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "default",
"messages": [
{"role": "user", "content": "你好,做个自我介绍"}
],
"temperature": 0.2,
"max_tokens": 128
}'
llama-server 官方就是按 OpenAI 兼容 API 来提供 /v1/chat/completions 的。([GitHub][2])
8. 开机自启的 systemd 服务
/etc/systemd/system/llama-server.service:
[Unit]
Description=llama.cpp server on Jetson Orin NX
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=%i
Environment=GGML_CUDA_ENABLE_UNIFIED_MEMORY=1
ExecStart=/home/%i/src/llama.cpp/build/bin/llama-server \
-m /home/%i/models/base/model.gguf \
--host 0.0.0.0 \
--port 8080 \
-c 4096 \
-np 1 \
-fa auto \
-ctk q8_0 \
-ctv q8_0
Restart=always
RestartSec=3
WorkingDirectory=/home/%i
StandardOutput=append:/home/%i/logs/llama-server.log
StandardError=append:/home/%i/logs/llama-server.log
[Install]
WantedBy=multi-user.target
启用:
sudo systemctl daemon-reload
sudo systemctl enable llama-server@$USER
sudo systemctl start llama-server@$USER
sudo systemctl status llama-server@$USER
9. 和 5090 微调机的联动方式
你的最佳闭环不是在 Jetson 上正式训练,而是:
- 5090 上训练 PEFT/LoRA
- 把 LoRA 转成 GGUF adapter
- 只把 adapter 下发到 Jetson
- Jetson 运行时加
--lora
llama.cpp 仓库自带 convert_lora_to_gguf.py,脚本说明里明确写的是:把 Hugging Face PEFT LoRA adapter 转成 GGUF 文件;脚本支持 --base 或 --base-model-id,输出格式支持 f16 / bf16 / q8_0 / auto。([GitHub][6])
在 5090 上:
cd ~/src/llama.cpp
python convert_lora_to_gguf.py /path/to/peft_adapter \
--base /path/to/base_model_config_dir \
--outfile /tmp/task-a-lora.gguf \
--outtype f16
把 adapter 发到 Jetson:
rsync -avP /tmp/task-a-lora.gguf jetson:/home/ubuntu/adapters/
Jetson 侧启动:
export GGML_CUDA_ENABLE_UNIFIED_MEMORY=1
~/src/llama.cpp/build/bin/llama-server \
-m ~/models/base/model.gguf \
--lora ~/adapters/task-a-lora.gguf \
--host 0.0.0.0 \
--port 8080 \
-c 4096 \
-np 1 \
-ctk q8_0 \
-ctv q8_0
llama-server 官方参数里有 --lora FNAME,所以这条链路是原生支持的。([GitHub][2])
10. 你后面可以再开的两个增强项
A. speculative decoding
如果 1B–4B 主模型已经稳定,你可以再加一个更小的 draft 模型试提速:
~/src/llama.cpp/build/bin/llama-server \
-m ~/models/base/model.gguf \
-md ~/models/draft/model-draft.gguf \
-c 4096 \
-np 1
llama-server 官方支持 -md / --model-draft 做 speculative decoding。只是这会多占一份模型内存,所以我建议你等主链稳定后再开。([GitHub][2])
B. 多模型 preset
如果你要在同一台 Jetson 上切换多个模型,llama-server 支持 .ini 形式的 model preset 和按请求路由到指定模型。([GitHub][2])
11. 运行中最重要的调参顺序
如果你遇到 OOM 或卡顿,按这个顺序调:
- 先降
-c:4096 → 2048 - 再把
-np固定为 1 - 确认开了
GGML_CUDA_ENABLE_UNIFIED_MEMORY=1 - 把 KV cache 设成
q8_0 - 模型从
Q5_K_M换成Q4_K_M - 7B 换回 3B/4B
最不建议先动的是:上来就开大上下文、并发、多模型常驻。
12. 如果你想直接嵌到自己的 C++ 工程
也可以不走 HTTP,直接嵌 libllama。llama.cpp 官方 build 文档明确写了主产物是 llama library,C 风格接口在 include/llama.h。这条路适合你把它嵌进现有的 C++ 服务、机器人控制程序或本地应用。([GitHub][1])
最终建议
Orin NX 16G,我建议先按这个配置落地:
- JetPack 6.2.1
- 原生编译 llama.cpp + CUDA + sm_87
- 1B–4B Instruct GGUF
llama-server单模型单 slotGGML_CUDA_ENABLE_UNIFIED_MEMORY=1- KV cache 用
q8_0 - 正式微调放 5090,Jetson 只加载 GGUF adapter
这套最稳,也最符合前面那套“边缘部署 + 轻量更新”的目标。
参考链接
[1]: https://github.com/ggml-org/llama.cpp/blob/master/docs/build.md?utm_source=chatgpt.com “llama.cpp/docs/build.md at master · ggml-org …”
[2]: https://github.com/ggml-org/llama.cpp/blob/master/tools/server/README.md “llama.cpp/tools/server/README.md at master · ggml-org/llama.cpp · GitHub”
[3]: https://github.com/ggml-org/llama.cpp/blob/master/docs/build.md “llama.cpp/docs/build.md at master · ggml-org/llama.cpp · GitHub”
[4]: https://developer.nvidia.com/embedded/jetpack-sdk-621 “JetPack SDK | NVIDIA Developer”
[5]: https://github.com/ggml-org/llama.cpp “GitHub - ggml-org/llama.cpp: LLM inference in C/C++ · GitHub”
[6]: https://github.com/ggml-org/llama.cpp/blob/master/convert_lora_to_gguf.py “llama.cpp/convert_lora_to_gguf.py at master · ggml-org/llama.cpp · GitHub”
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)