5 minute read

本文将介绍如何在 Jetson Thor 平台上编译、部署和测试 llama.cpp 项目中的 GGUF 格式的大模型。

源码编译

克隆 llama.cpp

git clone https://github.com/ggml-org/llama.cpp.git
cd llama.cpp

CUDA GPU Compute Capability(计算能力)

计算能力(CC)定义了每种 NVIDIA GPU 架构的硬件特性支持的指令。在下表中查找您的GPU的计算能力。

编译

cmake -B build -DGGML_CUDA=ON -DCMAKE_CUDA_ARCHITECTURES="110"
cmake --build build --config Release -j $(nproc)

模型部署

运行 llama-server

Qwen3-8B-GGUF

./build/bin/llama-server \
    --model /models/Qwen/Qwen3-8B-GGUF/Qwen3-8B-Q5_K_M.gguf \
    --alias qwen3 \
    --host 0.0.0.0 \
    --port 8000 \
    --reasoning-budget 0 \
    --gpu-layers -1 \
    --ctx-size 0 \
    --parallel $(nproc) \
    --threads $(nproc) \
    --flash-attn on \
    --no-kv-offload \
    --no-op-offload \
    --no-mmap \
    --mlock

Qwen3-Coder-30B-A3B-Instruct-GGUF

./build/bin/llama-server \
    --model /models/unsloth/Qwen3-Coder-30B-A3B-Instruct-GGUF/Qwen3-Coder-30B-A3B-Instruct-Q5_K_M.gguf \
    --alias qwen3 \
    --host 0.0.0.0 \
    --port 8000 \
    --jinja \
    --reasoning-format none \
    --gpu-layers -1 \
    --ctx-size 0 \
    --parallel $(nproc) \
    --threads $(nproc) \
    --flash-attn on \
    --no-kv-offload \
    --no-op-offload \
    --no-mmap \
    --mlock

gpt-oss-120b-GGUF

./build/bin/llama-server \
    --model /models/ggml-org/gpt-oss-120b-GGUF/gpt-oss-120b-mxfp4-00001-of-00003.gguf \
    --alias qwen3 \
    --host 0.0.0.0 \
    --port 8000 \
    --jinja \
    --gpu-layers -1 \
    --ctx-size 0 \
    --parallel $(nproc) \
    --threads $(nproc) \
    --flash-attn on \
    --no-kv-offload \
    --no-op-offload \
    --no-mmap \
    --mlock

llama-server 命令行参数解释

模型路径与别名设置

  • .llama-server
    • 这是 llama.cpp 项目中用于启动 REST API 服务的可执行文件 [i]。
  • --model /models/ggml-org/gpt-oss-120b-GGUF/gpt-oss-120b-mxfp4-00001-of-00003.gguf
    • 使用此选项(-m, --model FNAME)指定要加载的模型文件的路径。
  • --alias qwen3
    • 使用此选项(-a, --alias STRING为模型名称设置别名,该别名将用于 REST API。

服务配置

  • --host 0.0.0.0
    • 指定服务器要监听的 IP 地址。默认是 127.0.0.1
  • --port 8000
    • 指定服务器要监听的端口。默认是 8080
  • --jinja
    • 启用此标志,在聊天中将使用 Jinja 模板。默认情况下,此功能是禁用的。
  • --reasoning-format none
    • 此选项(-rf, --reasoning-format FORMAT)用于控制是否允许以及如何从模型的响应中提取“思维标签”
    • 当将此参数设置为 none 时,模型生成的思维内容(thoughts)将保持未解析状态,并保留在 message.content 字段中。 默认值是 none
  • --reasoning-budget 0
    • 当设置为 0 时,思维内容(thoughts)将被禁用。默认值是 -1

资源与并发控制

  • --gpu-layers -1
    • 此选项(-ngl, --gpu-layers, --n-gpu-layers N)设置存储在 VRAM 中的最大层数
    • 设置为 -1 通常意味着尝试将所有可能的层加载到 VRAM 中。
  • --ctx-size 0
    • 此选项(-c, --ctx-size N)设置提示上下文的大小。
    • 当设置为 0 时,上下文大小将从模型中加载。默认值是 4096。
  • --parallel $(nproc)
    • 此选项(-np, --parallel N)设置并行解码的序列数量
    • $(nproc) 是一个 shell 命令,表示将并行序列数设置为系统可用的处理器核心数。默认值是 1。
  • --threads $(nproc)
    • 此选项(-t, --threads N)设置在生成过程中使用的线程数量
    • $(nproc) 意味着将线程数设置为系统可用的处理器核心数。

性能优化与内存管理

  • --flash-attn on
    • 此选项(-fa, --flash-attn [on|off|auto]设置 Flash Attention 的使用
    • 在此配置中,它被显式设置为“开启”(on)。
  • --no-kv-offload
    • 此选项(-nkvo, --no-kv-offload)用于禁用 KV (Key/Value) 卸载
  • --no-op-offload
    • 此选项用于禁用将主机张量操作卸载到设备(默认值为 false)。
  • --no-mmap
    • 此选项用于不进行内存映射模型。这会导致加载速度变慢,但如果未使用 mlock,则可能减少换页。
  • --mlock
    • 此选项用于强制系统将模型保留在 RAM 中,而不是进行交换或压缩。

编写脚本 llama-server.sh

vim /models/llama.cpp/llama-server.sh
#!/bin/bash

# 默认配置
DEFAULT_MODEL="/models/unsloth/Qwen3-Coder-30B-A3B-Instruct-GGUF/Qwen3-Coder-30B-A3B-Instruct-Q5_K_M.gguf"
DEFAULT_HOST="0.0.0.0"
DEFAULT_PORT="8000"
DEFAULT_PARALLEL=$(nproc)
DEFAULT_THREADS=$(nproc)

# 函数:列出所有 gguf 模型
list_gguf_models() {
    echo "找到的 GGUF 模型文件:"
    echo "================================================"
    find /models/ -name "*.gguf" -not -path "/models/llama.cpp/*" 2>/dev/null | sort
    echo "================================================"
    echo "总计: $(find /models/ -name "*.gguf" -not -path "/models/llama.cpp/*" 2>/dev/null | wc -l) 个模型文件"
}

# 函数:显示帮助信息
show_help() {
    echo "使用方法: $0 [选项]"
    echo "选项:"
    echo "  -l, --list                列出所有 GGUF 模型(排除 /models/llama.cpp 目录)"
    echo "  -m, --model MODEL_PATH    指定模型路径"
    echo "  -H, --host HOST           指定主机地址 (默认: $DEFAULT_HOST)"
    echo "  -p, --port PORT           指定端口 (默认: $DEFAULT_PORT)"
    echo "  -P, --parallel PARALLEL   并行数 (默认: $(nproc))"
    echo "  -t, --threads THREADS     线程数 (默认: $(nproc))"
    echo "  -h, --help                显示帮助信息"
}

# 解析命令行参数
SHOW_LIST=false
MODEL_PATH=""
HOST=""
PORT=""
PARALLEL=""
THREADS=""

while [[ $# -gt 0 ]]; do
    case $1 in
        -l|--list)
            SHOW_LIST=true
            shift
            ;;
        -m|--model)
            MODEL_PATH="$2"
            shift 2
            ;;
        -H|--host)
            HOST="$2"
            shift 2
            ;;
        -p|--port)
            PORT="$2"
            shift 2
            ;;
        -P|--parallel)
            PARALLEL="$2"
            shift 2
            ;;
        -t|--threads)
            THREADS="$2"
            shift 2
            ;;
        -h|--help)
            show_help
            exit 0
            ;;
        *)
            echo "未知参数: $1"
            show_help
            exit 1
            ;;
    esac
done

# 如果指定了 --list,只列出模型并退出
if [ "$SHOW_LIST" = true ]; then
    list_gguf_models
    exit 0
fi

# 设置默认值
MODEL_PATH="${MODEL_PATH:-$DEFAULT_MODEL}"
HOST="${HOST:-$DEFAULT_HOST}"
PORT="${PORT:-$DEFAULT_PORT}"
PARALLEL="${PARALLEL:-$DEFAULT_PARALLEL}"
THREADS="${THREADS:-$DEFAULT_THREADS}"

# 检查模型文件是否存在
if [ ! -f "$MODEL_PATH" ]; then
    echo "错误: 模型文件不存在 - $MODEL_PATH"
    echo "使用 -l 参数查看可用模型:"
    echo "  $0 -l"
    exit 1
fi

echo "启动 llama-server..."
echo "模型路径: $MODEL_PATH"
echo "主机地址: $HOST"
echo "端口: $PORT"
echo "并行数: $PARALLEL"
echo "线程数: $THREADS"

# 运行 llama-server 命令
./build/bin/llama-server \
    --model "$MODEL_PATH" \
    --alias qwen3 \
    --host "$HOST" \
    --port "$PORT" \
    --jinja \
    --reasoning-budget 0 \
    --reasoning-format none \
    --gpu-layers -1 \
    --ctx-size 0 \
    --parallel "$PARALLEL" \
    --threads "$THREADS" \
    --flash-attn on \
    --no-kv-offload \
    --no-op-offload \
    --no-mmap \
    --mlock
  • 帮助
./llama-server.sh -h
使用方法: ./llama-server.sh [选项]
选项:
  -l, --list                列出所有 GGUF 模型(排除 /models/llama.cpp 目录)
  -m, --model MODEL_PATH    指定模型路径
  -H, --host HOST           指定主机地址 (默认: 0.0.0.0)
  -p, --port PORT           指定端口 (默认: 8000)
  -P, --parallel PARALLEL   并行数 (默认: 14)
  -t, --threads THREADS     线程数 (默认: 14)
  -h, --help                显示帮助信息
  • 列出 GGUF 模型
./llama-server.sh -l
找到的 GGUF 模型文件:
================================================
/models/ggml-org/gpt-oss-120b-GGUF/gpt-oss-120b-mxfp4-00001-of-00003.gguf
/models/ggml-org/gpt-oss-120b-GGUF/gpt-oss-120b-mxfp4-00002-of-00003.gguf
/models/ggml-org/gpt-oss-120b-GGUF/gpt-oss-120b-mxfp4-00003-of-00003.gguf
/models/Qwen/Qwen3-30B-A3B-GGUF/Qwen3-30B-A3B-Q5_K_M.gguf
/models/Qwen/Qwen3-8B-GGUF/Qwen3-8B-Q4_K_M.gguf
/models/Qwen/Qwen3-8B-GGUF/Qwen3-8B-Q5_0.gguf
/models/Qwen/Qwen3-8B-GGUF/Qwen3-8B-Q5_K_M.gguf
/models/Qwen/Qwen3-8B-GGUF/Qwen3-8B-Q6_K.gguf
/models/Qwen/Qwen3-8B-GGUF/Qwen3-8B-Q8_0.gguf
/models/Qwen/Qwen3-Embedding-4B-GGUF/Qwen3-Embedding-4B-f16.gguf
/models/Qwen/Qwen3-Embedding-4B-GGUF/Qwen3-Embedding-4B-Q4_K_M.gguf
/models/Qwen/Qwen3-Embedding-4B-GGUF/Qwen3-Embedding-4B-Q5_0.gguf
/models/Qwen/Qwen3-Embedding-4B-GGUF/Qwen3-Embedding-4B-Q5_K_M.gguf
/models/Qwen/Qwen3-Embedding-4B-GGUF/Qwen3-Embedding-4B-Q6_K.gguf
/models/Qwen/Qwen3-Embedding-4B-GGUF/Qwen3-Embedding-4B-Q8_0.gguf
/models/unsloth/Qwen3-Coder-30B-A3B-Instruct-GGUF/Qwen3-Coder-30B-A3B-Instruct-Q4_K_M.gguf
/models/unsloth/Qwen3-Coder-30B-A3B-Instruct-GGUF/Qwen3-Coder-30B-A3B-Instruct-Q5_K_M.gguf
/models/unsloth/Qwen3-Coder-30B-A3B-Instruct-GGUF/Qwen3-Coder-30B-A3B-Instruct-Q6_K.gguf
/models/yairpatch/Qwen3-VL-30B-A3B-Instruct-GGUF/Qwen3-VL-30B-A3B-Instruct-Q5_K_M.gguf
================================================
总计: 19 个模型文件

性能测试

模型性能分析

模型规格对比

PP512 性能对比

TG128 性能对比

模型大小 vs PP512 性能分析

模型大小 vs TG128 性能分析

gpt-oss-120b-GGUF

  • MXFP4
./build/bin/llama-bench -m /models/ggml-org/gpt-oss-120b-GGUF/gpt-oss-120b-mxfp4-00001-of-00003.gguf
model size params backend ngl test t/s
gpt-oss 120B MXFP4 MoE 59.02 GiB 116.83 B CUDA 99 pp512 533.06 ± 7.20
gpt-oss 120B MXFP4 MoE 59.02 GiB 116.83 B CUDA 99 tg128 39.95 ± 0.03

Qwen3-Coder-30B-A3B-Instruct-GGUF

  • Q4_K_M
./build/bin/llama-bench -m /models/unsloth/Qwen3-Coder-30B-A3B-Instruct-GGUF/Qwen3-Coder-30B-A3B-Instruct-Q4_K_M.gguf
model size params backend ngl test t/s
qwen3moe 30B.A3B Q4_K - Medium 17.28 GiB 30.53 B CUDA 99 pp512 959.77 ± 7.22
qwen3moe 30B.A3B Q4_K - Medium 17.28 GiB 30.53 B CUDA 99 tg128 52.95 ± 0.08
  • Q5_K_M
./build/bin/llama-bench -m /models/unsloth/Qwen3-Coder-30B-A3B-Instruct-GGUF/Qwen3-Coder-30B-A3B-Instruct-Q5_K_M.gguf
model size params backend ngl test t/s
qwen3moe 30B.A3B Q5_K - Medium 20.23 GiB 30.53 B CUDA 99 pp512 946.36 ± 4.90
qwen3moe 30B.A3B Q5_K - Medium 20.23 GiB 30.53 B CUDA 99 tg128 54.55 ± 0.08
  • Q6_K
./build/bin/llama-bench -m /models/unsloth/Qwen3-Coder-30B-A3B-Instruct-GGUF/Qwen3-Coder-30B-A3B-Instruct-Q6_K.gguf
model size params backend ngl test t/s
qwen3moe 30B.A3B Q6_K 23.36 GiB 30.53 B CUDA 99 pp512 863.80 ± 5.21
qwen3moe 30B.A3B Q6_K 23.36 GiB 30.53 B CUDA 99 tg128 47.76 ± 0.05

Qwen3-8B-GGUF

  • Q4_K_M
./build/bin/llama-bench -m /models/Qwen/Qwen3-8B-GGUF/Qwen3-8B-Q4_K_M.gguf
model size params backend ngl test t/s
qwen3 8B Q4_K - Medium 4.68 GiB 8.19 B CUDA 99 pp512 1256.90 ± 0.40
qwen3 8B Q4_K - Medium 4.68 GiB 8.19 B CUDA 99 tg128 40.07 ± 0.02
  • Q5_0
./build/bin/llama-bench -m /models/Qwen/Qwen3-8B-GGUF/Qwen3-8B-Q5_0.gguf
model size params backend ngl test t/s
qwen3 8B Q5_0 5.32 GiB 8.19 B CUDA 99 pp512 1353.25 ± 0.66
qwen3 8B Q5_0 5.32 GiB 8.19 B CUDA 99 tg128 39.22 ± 0.02
  • Q5_K_M
./build/bin/llama-bench -m /models/Qwen/Qwen3-8B-GGUF/Qwen3-8B-Q5_K_M.gguf
model size params backend ngl test t/s
qwen3 8B Q5_K - Medium 5.44 GiB 8.19 B CUDA 99 pp512 1239.98 ± 0.97
qwen3 8B Q5_K - Medium 5.44 GiB 8.19 B CUDA 99 tg128 36.13 ± 0.02
  • Q6_K
./build/bin/llama-bench -m /models/Qwen/Qwen3-8B-GGUF/Qwen3-8B-Q6_K.gguf
model size params backend ngl test t/s
qwen3 8B Q6_K 6.26 GiB 8.19 B CUDA 99 pp512 1121.56 ± 0.30
qwen3 8B Q6_K 6.26 GiB 8.19 B CUDA 99 tg128 31.35 ± 0.97
  • Q8_0
./build/bin/llama-bench -m /models/Qwen/Qwen3-8B-GGUF/Qwen3-8B-Q8_0.gguf
model size params backend ngl test t/s
qwen3 8B Q8_0 8.11 GiB 8.19 B CUDA 99 pp512 1413.13 ± 0.80
qwen3 8B Q8_0 8.11 GiB 8.19 B CUDA 99 tg128 28.29 ± 0.25

参考资料

Updated: