|

Jetson Thor上部署LLM 2026-04

Jetson Thor是否适合做“家用”本地LLM部署,我们把它和Nvidia AGX Sparks做一下比较。
GPU算力上:同样128G的通用内存,显存带宽一致,cuda数量少了不少,性能释放也低了不少。
其它方面:CPU性能弱了非常多。接口上缺少了一组专用光口,失去了原生的并联在增加算力的能力。其余的接口作为“桌面mini主机”来说,usb/type-c/以太口都比AGX差,但是基本够用。但是它有GPIO,有一个可以外接设备的m2接口,即使并没有用于机器人,也有不少额外的可玩空间
价格上它要比Nvidia AGX Sparks便宜不少,如果在乎性价比,它是一个不错的选择。

第零步:安装硬件

官方开发者套件带了SSD,安装上;带了输出为type-c的电源,接在远离HDMI接口的那个type-c口(两个口都可以供电,但是后面刷系统我们需要靠近HMDI的那个type-c接口)。
它的工业设计棱角异常尖锐,“家用”场景下可以拿角磨机倒个角或者贴个防撞保护角。

第一步:刷系统

使用Nvidia SDK Manager刷机安装系统 https://developer.nvidia.com/sdk-manager
需要另外一台电脑安装Nvidia SDK Manager,用USB连接Thor上面另外一个type-c接口,按软件指示逐步操作。
Windows和Ubuntu皆可,windows不支持一些稍早版本,需要手动额外安装一些工具。
需要一个相对容易访问nvidia开发者站点的网络。
另外,整个安装过程可以理解成刷入系统和安装Jetpack在内的各种SDK两个阶段,如果遇到问题,一般也出在后一个阶段,这时候直接放弃Nvidia SDK Manager,直接在刷完系统但是还没有安装好SDK的thor上的ubuntu系统里手动安装所需的各种SDK也可以。
我安装的系统版本是Jetpack7.1 L4T 38.4.0

安装一些常备工具

jtop

wget https://raw.githubusercontent.com/rbonghi/jetson_stats/master/scripts/install_jtop_torun_without_sudo.sh
chmod +x install_jtop_torun_without_sudo.sh
sudo -v
./install_jtop_torun_without_sudo.sh

sudo systemctl restart jetson_stats.service

pip里的版本不支持最新架构,你可能看不见GPU信息,直接执行作者的安装脚本——它会拉起最新的git仓库进行安装。

安装完成后执行jtop检查一下信息是否已经全部展示

docker/nvidia container toolkit

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

sudo usermod -aG docker $USER
# 刷新当前终端权限,或者退出重新登录
newgrp docker

sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit

sudo nvidia-ctk runtime configure --runtime=docker

最好手动检查编辑一些 Docker 的配置文件:

sudo nano /etc/docker/daemon.bash

确保文件内容包含以下结构:

{
    "runtimes": {
        "nvidia": {
            "path": "nvidia-container-runtime",
            "runtimeArgs": []
        }
    },
    "default-runtime": "nvidia" 
}

重启 Docker 服务生效

sudo systemctl restart docker

配置完成后可以跑一下查询镜像,检查是否就绪(注意只适用于jetson的arm架构)

docker run --rm jitteam/devicequery

ssh

官方镜像删减了ssh server,所有你在ubuntu设置里不管怎么打开ssh选项,功能都不会生效。

sudo apt update
sudo apt install openssh-server -y
sudo systemctl unmask ssh
sudo systemctl enable --now ssh
sudo systemctl status ssh

第二步:启动LLM

后续会再更新一下模型选择,框架选择,性能调优相关的过程。这里先简单列出vllm + Qwen/Qwen3.5-122B-A10B-GPTQ-Int4的部署方案。

准备模型权重

如果条件允许,最好给thor一根网线,jetson系统默认的wifi模块选择一直是“够用就好”,网速会存在一些限制。(对于机器人开发来说,它自带的有线网卡硬件也同样不太够用,但是下载模型权重这个场景足够了)
我这儿的网络环境并没有好到将权重管理直接叫交给huggingface,所以需要先手动下载好模型权重文件。
安装huggingface_hub

pip3 install -U "huggingface_hub[cli]" --break-system-packages

如果可以配置好你的hf_token。
我这儿用了镜像站,并更改了hf cache的位置

export HF_ENDPOINT=https://hf-mirror.com

sudo mkdir -p /home/nvidia/models #我这儿的用户名是nvidia吗,替换成你的用户名或者其它你想存的位置
sudo chown -R nvidia:nvidia /home/nvidia/models
export HF_HOME=/home/nvidia/models 

下载和等待

mkdir /home/nvidia/models/Qwen-122B
hf download Qwen/Qwen3.5-122B-A10B-GPTQ-Int4 --local-dir /home/nvidia/models/Qwen-122B

这里–local-dir是必须的,如果以缓存形式传递进docker后文件符号链接会发送混乱,并不能正常加载

拉取镜像

docker pull ghcr.io/nvidia-ai-iot/vllm:latest-jetson-thor

最好也在 https://github.com/orgs/nvidia-ai-iot/packages/container/package/vllm 上检查一下latest-jetson-thor别名的tag是否对于你的jetpack和cuda版本,一般来说docker内外的jetpack和cuda版本应该是和宿主机上隔离的,宿主机上只要保证显卡驱动版本足够高就可以了,但如果两边一致,减少冲突的风险总是好的。

启动镜像

docker run --rm -it --runtime nvidia --gpus all \
  --shm-size=8g \
  -p 8000:8000 \
  -v /home/nvidia/models/Qwen-122B:/model_workspace/Qwen-122B \
  ghcr.io/nvidia-ai-iot/vllm:latest-jetson-thor \
  python3 -m vllm.entrypoints.openai.api_server \
  --model /model_workspace/Qwen-122B \
  --served-model-name Qwen/Qwen3.5-122B-A10B-GPTQ-Int4 \
  --reasoning-parser qwen3 \
  --default-chat-template-kwargs '{"enable_thinking": false}' \
  --enable-auto-tool-choice \
  --tool-call-parser qwen3_coder \
  --quantization gptq_marlin \
  --max-model-len 65536
  --gpu-memory-utilization 0.9 \
  --host 0.0.0.0 \
  --port 8000

需要理解的参数
docker:
–shm-size=8g KV cache会用到共享内存
-v /home/nvidia/models/Qwen-122B:/model_workspace/Qwen-122B 指定的权重文件夹
vllm:
–model /model_workspace/Qwen-122B 指定模型权重位置,不需要再去拉起权重
–quantization gptq_marlin 和GPTQ-Int4对于的量化
–served-model-name Qwen/Qwen3.5-122B-A10B-GPTQ-Int4 显示的模型名称,可以替换成方便使用的别名
–reasoning-parser qwen3 事先约定的思考文本(token)输出格式
–default-chat-template-kwargs ‘{“enable_thinking”: false}’ Qwen3.5-122B-A10B-GPTQ-Int4默认会以思考模式输出,我后面准备把它给openclaw做低实时性任务的模型,关闭思考模型适当加速任务,另外个人习惯上希望它默认不开启思考模式,提出要求后再开始深度思考。(后面又试了一下,这个参数没有生效,还是需要在客户端上请求的时候增加额外的参数。之前看起来生效了,其实是思考的内容被收到了–reasoning-parser qwen3当中,不参与文本content输出了,ttft会因而显著增加)
–enable-auto-tool-choice 支持skill调用
–tool-call-parser qwen3_coder skill调用的文本(token)格式
–max-model-len 65536 64k上下文长度,充分利用Thor的大显存
–gpu-memory-utilization 0.9 vllm需要使用的显存上限,对于Qwen3.5-122B-A10B-GPTQ-Int4来说需要设到0.9,初始化阶段会用上,初始化后日常推理阶段显存占用会下来一些。

等待一段时间直到日志提示端口已经可用。

快速测试

在thor上新开一个terminal

curl http://127.0.0.0:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "Qwen/Qwen3.5-122B-A10B-GPTQ-Int4",
    "messages": [
      {"role": "system", "content": "你是一个物理学专家。"},
      {"role": "user", "content": "请用通俗的语言,并结合生活中的例子,详细解释一下什么是量子纠缠。"}
    ],
    "max_tokens": 1024,
    "temperature": 0.7,
    "stream": true
  }'

你应当看到流式反馈的回答内容。至此,部署完成。

Next

我会在未来的文章中更新:

  • 部署并配置LobeHub
  • 性能优化尝试当中遇到的问题和现象

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注