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_0q4_0q5_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 上正式训练,而是:

  1. 5090 上训练 PEFT/LoRA
  2. 把 LoRA 转成 GGUF adapter
  3. 只把 adapter 下发到 Jetson
  4. 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 或卡顿,按这个顺序调:

  1. 先降 -c:4096 → 2048
  2. 再把 -np 固定为 1
  3. 确认开了 GGML_CUDA_ENABLE_UNIFIED_MEMORY=1
  4. 把 KV cache 设成 q8_0
  5. 模型从 Q5_K_M 换成 Q4_K_M
  6. 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 单模型单 slot
  • GGML_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”

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐