深色模式
L8 Jetson 端侧推理
目标
- 熟悉 NVIDIA Jetson 设备的软件栈、功耗模式和监控工具;
- 在 Jetson 上部署小模型,测量生成速度和功耗;
- 把同一个模型在服务器 GPU 和 Jetson 上的表现做对比。
端侧设备的算力、内存和功耗都受限,这正是边缘智能研究要面对的条件。
背景
| 设备 | 软件栈 |
|---|---|
| Jetson Orin 系列(Orin Nano、Orin NX、AGX Orin) | JetPack 6.x(Jetson Linux r36,Ubuntu 22.04,CUDA 12) |
| Jetson Thor | JetPack 7.x(Jetson Linux r38 起,CUDA 13) |
JetPack 7 的较新版本也开始支持 Orin,但很多现成的容器镜像是为 JetPack 6 构建的,在新版本上可能无法使用 GPU。先确认设备上的 JetPack 版本,再选对应的镜像或安装方式。
Jetson 上的 CPU 和 GPU 共享同一块内存,没有独立显存。模型能不能放下,要看总内存减去系统占用后还剩多少。
第 1 步:认识你的设备
bash
cat /etc/nv_tegra_release # Jetson Linux 版本
sudo pip3 install jetson-stats # 安装 jtop,装完重新登录。JetPack 7(Ubuntu 24.04)上要加 --break-system-packages
jtop # 图形化查看 CPU、GPU、内存、功耗、温度
sudo tegrastats # 命令行持续输出资源和功耗,Ctrl+C 退出功耗模式:Jetson 有多种功耗模式,性能和功耗差别很大,测试前必须固定并记录:
bash
sudo nvpmodel -q # 查看当前模式
sudo nvpmodel -m 0 # 切换到模式 0(通常是最高性能,不同型号的编号含义不同)
sudo jetson_clocks # 把频率锁定到当前模式的最高值,测性能时使用第 2 步:部署模型
方式一:Ollama 原生安装(最简单)
Ollama 的官方安装脚本支持 Jetson:
bash
curl -fsSL https://ollama.com/install.sh | sh
ollama run qwen3:0.6b --verbose # --verbose 会在每次回答后打印速度统计方式二:容器
Jetson 不能直接使用 x86 服务器上的镜像,要用为 Jetson 构建的版本。按 Jetson AI Lab 的 Ollama 教程选择与 JetPack 版本对应的镜像,例如 JetPack 6 可以用 jetson-containers 项目的 dustynv/ollama 镜像:
bash
docker run --runtime nvidia -it --rm --network=host \
-v ~/ollama:/ollama -e OLLAMA_MODELS=/ollama \
dustynv/ollama:r36.2.0--runtime nvidia 让容器使用 Jetson 的 GPU;--network=host 直接使用宿主机网络,不需要端口映射。镜像标签要和设备的 Jetson Linux 版本(r36.x)匹配,Thor 等新设备请使用 NVIDIA 在 GHCR 上发布的镜像(见上面的教程)。
方式三:从源码编译 llama.cpp
镜像不兼容时,直接在设备上编译最可靠:
bash
git clone https://github.com/ggml-org/llama.cpp
cd llama.cpp
cmake -B build -DGGML_CUDA=ON
cmake --build build --config Release -j$(nproc)编译完成后用 build/bin/llama-bench 测试 GGUF 格式模型的速度。
第 3 步:测速度和功耗
- 固定功耗模式并运行
jetson_clocks。 - 另开一个终端运行
sudo tegrastats --interval 500 --logfile power.log,记录功耗。 - 用
ollama run qwen3:0.6b --verbose提几个问题,记录输出中的prompt eval rate(预填充速度)和eval rate(生成速度,tokens/s)。 - 停止记录,从日志里算出推理期间的平均功耗(Orin Nano、Orin NX 上
VDD_IN一项是整板输入功耗,单位 mW;其他型号的电源轨名称不同,以设备实际输出为准)。
练习:
- 测 0.6B、1.7B、4B 三个规模的模型,画出“模型大小—生成速度—功耗”的关系。
- 在不同功耗模式下重复,算出每个 token 消耗的能量(焦耳/token)。
- 同样的模型在服务器 GPU 上用 L1 的方法测一遍,对比两者的差距。哪些请求适合留在端侧,哪些应该交给云端?这就是方向一的核心问题。
常见问题
- 内存不够:Jetson 内存是 CPU 和 GPU 共用的,关掉桌面环境(
sudo systemctl set-default multi-user.target后重启)能多出不少可用内存;选更小的模型或更低精度的量化版本。 - 容器里看不到 GPU:检查是否加了
--runtime nvidia,镜像版本是否和 JetPack 匹配。 - 速度忽快忽慢:没有运行
jetson_clocks,或者设备过热降频(jtop里看温度)。