Jetson Orin NX 上部署 Ollama + Llama 3.2
一、环境准备与系统要求
1.1 硬件要求
| 组件 | 要求 | 推荐配置 |
|---|---|---|
| 设备型号 |
介绍在 NVIDIA Jetson Orin NX(JetPack 5)上部署 Ollama 并运行 Llama 3.2 模型的完整流程。内容包括环境检查、Ollama 专用版安装、GPU 验证、模型拉取与推理、HTTP API 调用示例以及性能优化和 systemd 服务配置。通过合理选择量化模型和优化功耗模式,可实现边缘端的高效本地大模型推理。
| 组件 | 要求 | 推荐配置 |
|---|---|---|
| 设备型号 |
| Jetson Orin NX |
| Orin NX 16GB |
| 内存 | ≥8GB | 16GB |
| 存储 | ≥32GB | NVMe SSD 256GB+ |
| 系统 | JetPack 5.x | JetPack 5.1.2+ |
| 网络 | 可访问 GitHub | 配置代理(可选) |
| 模型名称 | 量化版本 | 模型大小 | 推荐内存 |
|---|---|---|---|
| Llama 3.2 1B | Q4_0 | ~1GB | 4GB+ |
| Llama 3.2 3B | Q4_0 | ~2GB | 8GB+ |
| Llama 3.2 3B | Q8_0 | ~3.5GB | 12GB+ |
📌 建议: 初学者建议从
1b-instruct-q4_0开始,验证流程后再尝试更大的模型。
在开始安装前,让我们先检查系统环境是否满足要求。
# 查看 L4T 版本
cat /etc/nv_tegra_release
# 查看系统信息
uname -a
lsb_release -a
# 查看 JetPack 版本(如果已安装 SDK Manager)
apt list --installed | grep nvidia-jetpack
预期输出示例:
# R35 (release), REVISION: 3.1, GCID: 32827747, BOARD: t186ref, EABI: aarch64 Ubuntu 20.04.6 LTS
Jetson 设备使用 tegrastats 代替 nvidia-smi:
# 实时监控 GPU 状态
sudo tegrastats
# 查看 GPU 信息
sudo jetson_clocks --show
关键指标说明:
GR3D_FREQ:GPU 频率和使用率RAM:内存使用情况SWAP:交换分区使用情况EMC_FREQ:内存频率# 查看磁盘空间
df -h
# 查看块设备
lsblk
# 如果有 NVMe,建议使用 ls /dev/nvme*
💾 最佳实践: 强烈建议将模型文件存储在 NVMe SSD 上,避免使用 eMMC 或 SD 卡,以获得更好的 I/O 性能。
为了保持系统整洁,我们采用用户目录安装方式:
# 创建安装目录结构
mkdir -p ~/apps/ollama/{bin,lib,tmp}
# 创建模型存储目录(建议使用 NVMe)
sudo mkdir -p /data/ollama/models
sudo chown $USER:$USER /data/ollama/models
# 或使用用户目录(空间充足时)
mkdir -p ~/.ollama/models
# 设置代理(如需要)
export HTTP_PROXY=http://127.0.0.1:你的端口
export HTTPS_PROXY=http://127.0.0.1:你的端口
# 获取最新版本号
TAG=$(curl -fsSL https://api.github.com/repos/ollama/ollama/releases/latest | grep -m1 '"tag_name"' | cut -d'"' -f4)
echo "Latest version: $TAG"
# 下载 JetPack 5 专用版本
curl -fL "https://github.com/ollama/ollama/releases/download/${TAG}/ollama-linux-arm64-jetpack5.tgz" \
-o ~/apps/ollama/tmp/ollama-jetpack5.tgz
# 解压文件
cd ~/apps/ollama/tmp
tar -xzf ollama-jetpack5.tgz
# 安装二进制文件
mv bin/ollama ~/apps/ollama/bin/
chmod +x ~/apps/ollama/bin/ollama
# 安装运行库(重要!)
cp -r lib/* ~/apps/ollama/lib/
# 验证安装
~/apps/ollama/bin/ollama --version
成功输出示例:
ollama version 0.4.8
# 当前会话生效
export PATH="$HOME/apps/ollama/bin:$PATH"
export OLLAMA_MODELS="/data/ollama/models"
export OLLAMA_HOST="127.0.0.1:11434"
# 可选:限制并发和上下文长度(边缘设备推荐)
export OLLAMA_NUM_PARALLEL=1
export OLLAMA_CONTEXT_LENGTH=2048
# 添加到 .bashrc
cat >> ~/.bashrc <<'EOF'
# Ollama Configuration
export PATH="$HOME/apps/ollama/bin:$PATH"
export OLLAMA_MODELS="/data/ollama/models"
export OLLAMA_HOST="127.0.0.1:11434"
export OLLAMA_NUM_PARALLEL=1
export OLLAMA_CONTEXT_LENGTH=2048
EOF
# 立即生效
source ~/.bashrc
# 启动 Ollama 服务
ollama serve
成功启动的关键标志:
time=2024-12-15T10:00:00.000+08:00 level=INFO source=gpu.go:199 msg="detected GPU" library=cuda compute=8.7 driver=11.4 name="NVIDIA Orin" total="15.7 GiB" available="14.2 GiB"
❌ 如果看到
library=cpu说明 GPU 未启用,请检查:是否安装了lib目录,是否使用了正确的jetpack5版本,CUDA 环境是否正常。
新开一个终端,运行:
# 实时监控 GPU 使用情况
sudo tegrastats
# 查看显存使用
free -h
对于 Jetson Orin NX,推荐按以下顺序尝试:
llama3.2:1b-instruct-q4_0 (~1GB,速度最快)llama3.2:3b-instruct-q4_0 (~2GB,效果更好)llama3.2:3b-instruct-q8_0 (~3.5GB,精度更高)# 保持 ollama serve 运行,新开终端
# 拉取 1B 模型(推荐首选)
ollama pull llama3.2:1b-instruct-q4_0
# 查看下载进度和信息
ollama list
下载进度示例:
pulling manifest
pulling 1890919b6184... 100% ████████████████ 976 MB
pulling a70ff7e570d5... 100% ████████████████ 342 B
pulling 5ad0a1049874... 100% ████████████████ 110 B
verifying sha256 digest
writing manifest
success
# 交互式对话
ollama run llama3.2:1b-instruct-q4_0
# 示例对话
>>> 介绍一下 NVIDIA Jetson 平台
# 简单性能测试
time ollama run llama3.2:1b-instruct-q4_0 "写一个 Python 快速排序函数"
# 批量测试
echo "What is AI?" | ollama run llama3.2:1b-instruct-q4_0
Ollama 提供 RESTful API,方便集成到各种应用中。
/api/generate# 非流式响应
curl -X POST http://127.0.0.1:11434/api/generate \
-H 'Content-Type: application/json' \
-d '{ "model": "llama3.2:1b-instruct-q4_0", "prompt": "解释什么是边缘计算", "stream": false, "options": { "temperature": 0.7, "top_p": 0.9, "max_tokens": 200 } }' | jq
/api/chat# 多轮对话示例
curl -X POST http://127.0.0.1:11434/api/chat \
-H 'Content-Type: application/json' \
-d '{ "model": "llama3.2:1b-instruct-q4_0", "messages": [ {"role": "system", "content": "你是一个专业的机器人导航助手"}, {"role": "user", "content": "如何实现语义地标导航?"} ], "stream": false, "options": { "temperature": 0.5 } }' | jq
# Python 示例:流式响应
import requests
import json
url = 'http://127.0.0.1:11434/api/generate'
data = {
'model': 'llama3.2:1b-instruct-q4_0',
'prompt': '写一首关于机器人的诗',
'stream': True
}
response = requests.post(url, json=data, stream=True)
for line in response.iter_lines():
if line:
chunk = json.loads(line)
print(chunk['response'], end='', flush=True)
# 查看当前功耗模式
sudo nvpmodel -q
# 切换到最高性能模式(MODE_15W_6CORE)
sudo nvpmodel -m 0
# 锁定最高频率
sudo jetson_clocks
# 查看当前频率设置
sudo jetson_clocks --show
# 限制上下文长度(减少内存占用)
export OLLAMA_CONTEXT_LENGTH=1024
# 限制并发请求
export OLLAMA_NUM_PARALLEL=1
# 设置模型保持时间
export OLLAMA_KEEP_ALIVE=5m
# 清理未使用的模型
ollama rm model_name
# 查看模型占用空间
du -sh $OLLAMA_MODELS/*
# 定期清理缓存
rm -rf $OLLAMA_MODELS/.cache/*
#!/bin/bash
# monitor_ollama.sh
echo "Monitoring Ollama Performance..."
echo "================================"
while true; do
clear
echo "$(date '+%Y-%m-%d %H:%M:%S')"
echo "--------------------------------"
# GPU 状态
echo "GPU Status:"
sudo tegrastats | head -n1
# 内存使用
echo -e "\nMemory Usage:"
free -h | grep -E "^Mem|^Swap"
# Ollama 进程
echo -e "\nOllama Process:"
ps aux | grep -E "ollama|PID" | grep -v grep
# 模型列表
echo -e "\nLoaded Models:"
ollama list 2>/dev/null || echo "Service not running"
sleep 5
done
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 只显示 CPU 推理 | 未安装 lib 目录 | 重新解压并复制 lib 文件夹 |
| 内存不足错误 | 模型过大/上下文过长 | 减小 CONTEXT_LENGTH 或使用更小模型 |
| 推理速度慢 | 功耗模式限制 | 执行 sudo jetson_clocks |
| 模型下载失败 | 网络问题 | 配置代理或使用镜像源 |
| 端口被占用 | 11434 已被使用 | 修改 OLLAMA_HOST 端口 |
# 检查 CUDA 是否可用
python3 -c "import torch; print(torch.cuda.is_available())"
# 查看 Ollama 日志
journalctl -u ollama --no-pager -n 50
# 测试 API 连接
curl http://127.0.0.1:11434/api/tags
# 强制使用 GPU
export CUDA_VISIBLE_DEVICES=0
# 1. 检查温度节流
cat /sys/class/thermal/thermal_zone*/temp
# 2. 查看内存碎片
cat /proc/buddyinfo
# 3. 检查 I/O 性能
iostat -x 1
# 4. 分析系统瓶颈
htop iotop
# 创建用户级服务
mkdir -p ~/.config/systemd/user
cat > ~/.config/systemd/user/ollama.service <<'EOF'
[Unit]
Description=Ollama AI Model Server
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
Restart=always
RestartSec=3
TimeoutStartSec=300
# 环境变量
Environment="PATH=%h/apps/ollama/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Environment="OLLAMA_MODELS=/data/ollama/models"
Environment="OLLAMA_HOST=127.0.0.1:11434"
Environment="OLLAMA_KEEP_ALIVE=5m"
Environment="OLLAMA_NUM_PARALLEL=1"
Environment="OLLAMA_CONTEXT_LENGTH=2048"
# 启动命令
ExecStart=%h/apps/ollama/bin/ollama serve
# 资源限制
LimitNOFILE=65536
LimitMEMLOCK=infinity
[Install]
WantedBy=default.target
EOF
# 重载服务配置
systemctl --user daemon-reload
# 启用开机自启
systemctl --user enable ollama
# 启动服务
systemctl --user start ollama
# 查看状态
systemctl --user status ollama
# 查看日志
journalctl --user -u ollama -f
# 启用 linger(需要 sudo 权限)
sudo loginctl enable-linger $USER
# 验证
loginctl show-user $USER | grep Linger
#!/usr/bin/env python3
""" 机器人语义地标导航示例 集成 Ollama 进行自然语言理解 """
import json
import requests
from typing import Dict, List
class SemanticNavigator:
def __init__(self, ollama_url="http://127.0.0.1:11434"):
self.ollama_url = ollama_url
self.model = "llama3.2:1b-instruct-q4_0"
def parse_navigation_intent(self, user_input: str) -> Dict:
"""解析用户导航意图"""
prompt = f"""你是一个机器人导航助手。分析以下指令并返回 JSON 格式:{{"action": "navigate/stop/pause", "landmark": "具体地标名称", "confidence": 0.0-1.0}} 用户指令:{user_input} 只返回 JSON,不要其他解释。"""
response = requests.post(f"{self.ollama_url}/api/generate", json={"model": self.model, "prompt": prompt, "stream": False, "options": {"temperature": 0.3}})
try:
result = response.json()['response']
return json.loads(result)
except:
return {"action": "unknown", "landmark": None, "confidence": 0.0}
def get_path_description(self, start: str, end: str) -> str:
"""生成路径描述"""
prompt = f"用一句话描述从{start}到{end}的路径。"
response = requests.post(f"{self.ollama_url}/api/generate", json={"model": self.model, "prompt": prompt, "stream": False, "options": {"temperature": 0.5, "max_tokens": 50}})
return response.json()['response']
# 使用示例
if __name__ == "__main__":
nav = SemanticNavigator()
# 测试意图解析
test_commands = ["带我去充电桩", "停止移动", "去会议室开会"]
for cmd in test_commands:
result = nav.parse_navigation_intent(cmd)
print(f"指令:{cmd}")
print(f"解析:{json.dumps(result, ensure_ascii=False)}")
print("-" * 40)
系统架构设计
感知层 (Camera/Lidar)
↓
场景理解 (CV/SLAM)
↓
语义提取 (JSON)
↓
LLM 推理 (Ollama)
↓
决策规划 (Structured Output)
↓
执行控制 (ROS Actions)
通过本教程,我们成功在 Jetson Orin NX 上部署了 Ollama + Llama 3.2 的 GPU 加速推理环境。关键要点包括:
相关资源:

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online