跳到主要内容Jetson Orin NX 部署 Ollama 及 Llama 3.2 模型 | 极客日志PythonAI算法
Jetson Orin NX 部署 Ollama 及 Llama 3.2 模型
介绍在 NVIDIA Jetson Orin NX(JetPack 5)上部署 Ollama 并运行 Llama 3.2 模型的完整流程。内容包括环境检查、Ollama 安装配置、GPU 加速验证、模型拉取与推理、HTTP API 调用示例以及性能优化方案。通过系统服务配置实现开机自启,并结合机器人导航场景展示实际应用,适合边缘计算设备上的本地大模型部署参考。
灭霸8 浏览 Jetson Orin NX 上部署 Ollama + Llama 3.2
前言
随着大语言模型(LLM)的快速发展,如何在边缘设备上高效部署和运行这些模型成为了热门话题。NVIDIA Jetson Orin NX 作为一款强大的边缘 AI 计算平台,凭借其 100 TOPS 的 AI 算力和 16GB 统一内存,为边缘端 LLM 推理提供了可能。
本文将详细介绍如何在 Jetson Orin NX(JetPack 5 / Ubuntu 20.04)上部署 Ollama,并通过 GPU 加速运行 Meta 最新的 Llama 3.2 模型。我们将从零开始,一步步搭建一个完整的本地大模型推理平台。
💡 重要提示: 虽然 Orin NX 具备一定的 AI 算力,但与桌面级 GPU(如 RTX 3090)相比,其算力和内存带宽仍有较大差距。因此,在边缘端部署时,我们需要合理选择模型规模、优化推理参数,并做好性能预期管理。
一、环境准备与系统要求
1.1 硬件要求
| 组件 | 要求 | 推荐配置 |
|---|
| 设备型号 | Jetson Orin NX | Orin NX 16GB |
| 内存 | ≥8GB | 16GB |
| 存储 | ≥32GB | NVMe SSD 256GB+ |
| 系统 | JetPack 5.x | JetPack 5.1.2+ |
| 网络 | 可访问 GitHub | 配置代理(可选) |
1.2 软件要求
- 操作系统: Ubuntu 20.04 LTS(L4T)
- JetPack 版本: 5.0 或更高
- CUDA: 11.4+(JetPack 自带)
- cuDNN: 8.6+(JetPack 自带)
1.3 模型存储空间估算
| 模型名称 | 量化版本 | 模型大小 | 推荐内存 |
|---|
| 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 开始,验证流程后再尝试更大的模型。
二、系统环境检查
2.1 检查 JetPack 版本
cat /etc/nv_tegra_release
uname -a
lsb_release -a
apt list --installed | grep nvidia-jetpack
2.2 验证 GPU 状态
Jetson 设备使用 tegrastats 代替 nvidia-smi:
sudo tegrastats
sudo jetson_clocks --show
GR3D_FREQ:GPU 频率和使用率
RAM:内存使用情况
SWAP:交换分区使用情况
EMC_FREQ:内存频率
2.3 存储空间规划
💾 最佳实践: 强烈建议将模型文件存储在 NVMe SSD 上,避免使用 eMMC 或 SD 卡,以获得更好的 I/O 性能。
三、安装 Ollama(JetPack 5 专用版)
3.1 安装目录规划
mkdir -p ~/apps/ollama/{bin,lib,tmp}
sudo mkdir -p /data/ollama/models
sudo chown $USER:$USER /data/ollama/models
mkdir -p ~/.ollama/models
3.2 下载 Ollama JetPack 5 版本
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"
curl -fL "https://github.com/ollama/ollama/releases/download/${TAG}/ollama-linux-arm64-jetpack5.tgz" -o ~/apps/ollama/tmp/ollama-jetpack5.tgz
3.3 安装 Ollama
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
四、配置运行环境
4.1 配置环境变量
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
4.2 永久保存配置
cat >> ~/.bashrc <<'EOF'
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 服务与 GPU 验证
5.1 启动服务
5.2 验证 GPU 支持
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 环境是否正常。
5.3 GPU 使用监控
六、部署 Llama 3.2 模型
6.1 模型选择策略
对于 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,精度更高)
6.2 拉取模型
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
6.3 运行模型
ollama run llama3.2:1b-instruct-q4_0
>>> 介绍一下 NVIDIA Jetson 平台
6.4 性能测试
time ollama run llama3.2:1b-instruct-q4_0 "写一个 Python 快速排序函数"
echo "What is AI?" | ollama run llama3.2:1b-instruct-q4_0
七、HTTP API 接口调用
Ollama 提供 RESTful API,方便集成到各种应用中。
7.1 生成接口 /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
7.2 对话接口 /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
7.3 流式响应
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)
八、性能优化与调优
8.1 Jetson 功耗模式优化
sudo nvpmodel -q
sudo nvpmodel -m 0
sudo jetson_clocks
sudo jetson_clocks --show
8.2 内存和上下文优化
export OLLAMA_CONTEXT_LENGTH=1024
export OLLAMA_NUM_PARALLEL=1
export OLLAMA_KEEP_ALIVE=5m
8.3 存储优化
ollama rm model_name
du -sh $OLLAMA_MODELS/*
rm -rf $OLLAMA_MODELS/.cache/*
8.4 性能监控脚本
#!/bin/bash
echo "Monitoring Ollama Performance..."
echo "================================"
while true; do
clear
echo "$(date '+%Y-%m-%d %H:%M:%S')"
echo "--------------------------------"
echo "GPU Status:"
sudo tegrastats | head -n1
echo -e "\nMemory Usage:"
free -h | grep -E "^Mem|^Swap"
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
九、常见问题与解决方案
9.1 问题诊断清单
| 问题 | 可能原因 | 解决方案 |
|---|
| 只显示 CPU 推理 | 未安装 lib 目录 | 重新解压并复制 lib 文件夹 |
| 内存不足错误 | 模型过大/上下文过长 | 减小 CONTEXT_LENGTH 或使用更小模型 |
| 推理速度慢 | 功耗模式限制 | 执行 sudo jetson_clocks |
| 模型下载失败 | 网络问题 | 配置代理或使用镜像源 |
| 端口被占用 | 11434 已被使用 | 修改 OLLAMA_HOST 端口 |
9.2 调试命令集
python3 -c "import torch; print(torch.cuda.is_available())"
journalctl -u ollama --no-pager -n 50
curl http://127.0.0.1:11434/api/tags
export CUDA_VISIBLE_DEVICES=0
9.3 性能问题排查
cat /sys/class/thermal/thermal_zone*/temp
cat /proc/buddyinfo
iostat -x 1
htop iotop
十、系统服务配置
10.1 创建 systemd 服务
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
10.2 启用服务
systemctl --user daemon-reload
systemctl --user enable ollama
systemctl --user start ollama
systemctl --user status ollama
journalctl --user -u ollama -f
10.3 设置用户会话持久化
sudo loginctl enable-linger $USER
loginctl show-user $USER | grep Linger
十一、实战应用场景
11.1 机器人语义导航集成
""" 机器人语义地标导航示例 集成 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)
11.2 边缘端优化建议
- 模型选择优先级
- 任务简单 → 1B 模型
- 需要推理 → 3B 模型
- 实时要求 → Q4 量化
- 精度要求 → Q8 量化
- 性能优化技巧
- 使用结构化提示词
- 限制输出长度
- 缓存常见查询
- 异步处理非关键任务
感知层 (Camera/Lidar)
↓
场景理解 (CV/SLAM)
↓
语义提取 (JSON)
↓
LLM 推理 (Ollama)
↓
决策规划 (Structured Output)
↓
执行控制 (ROS Actions)
总结
通过本教程,我们成功在 Jetson Orin NX 上部署了 Ollama + Llama 3.2 的 GPU 加速推理环境。关键要点包括:
📊 性能参考
- 1B 模型: 首 token 延迟 ~2-3 秒,生成速度 ~10-15 tokens/s
- 3B 模型: 首 token 延迟 ~5-8 秒,生成速度 ~5-8 tokens/s
- 功耗: 满载约 15W,待机约 5W
微信扫一扫,关注极客日志
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
相关免费在线工具
- 加密/解密文本
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
- RSA密钥对生成器
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
- Mermaid 预览与可视化编辑
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
- curl 转代码
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online