跳至内容

Jetson AGX Thor 大模型部署实战二:以 SGLang 部署 Qwen2-VL 与 Qwen3-30B 为例

本文记录在 NVIDIA Jetson AGX Thor(JetPack R38)上使用 SGLang 搭建大模型推理服务的全过程,涵盖环境安装、依赖编译、模型配置、服务启动及接口测试各环节。


〇、SGLang 简介

SGLang 是面向大语言模型与多模态模型的高性能推理框架,由斯坦福大学等机构联合开发。其核心特色在于高效的推理调度与结构化输出能力:

特性说明
RadixAttention基于前缀缓存的注意力机制,对共享前缀的多轮对话和批量请求场景大幅降低计算量
结构化输出原生支持 JSON Schema、正则表达式等约束生成,无需额外后处理
OpenAI 兼容 API内置 /v1/chat/completions 接口,无缝对接现有 OpenAI 生态工具链
连续批处理动态插入新请求,最大化 GPU 利用率
多模态支持原生支持视觉语言模型,单接口覆盖纯文本与图文混合推理

整体流程为:安装依赖 → 配置 CUDA 工具链 → 处理编译问题 → 准备模型 → 启动推理服务 → 测试与运维。以下章节将在 Jetson AGX Thor 上逐步走通全流程。


一、前置说明

适配环境

项目
设备NVIDIA Jetson AGX Thor
系统Ubuntu (JetPack R38, REVISION 4.0)
GPUNVIDIA AGX Thor, 126GB 显存
CUDA13.0
Python3.13 (Conda 环境 sglang)
存储NVMe SSD 937GB

工作目录约定

统一使用 /workspace 作为模型与产物的存放目录:

类型路径
HuggingFace 模型/workspace/models/Qwen2-VL-7B-Instruct/
HuggingFace 模型/workspace/models/Qwen3-30B-A3B-Instruct-2507/

二、环境安装

2.1 创建 Conda 环境

conda create -n sglang python=3.13 -y
conda activate sglang

2.2 安装 SGLang

pip install sglang

三、配置 CUDA 工具链

Jetson AGX Thor 默认只安装了 CUDA 运行时库,缺少开发工具包(头文件和 nvcc)。

3.1 安装

sudo apt update
sudo apt install cuda-toolkit

3.2 查找头文件路径

安装完成后,查找 CUDA 头文件位置:

find /usr -name "cuda_runtime_api.h" 2>/dev/null

Jetson AGX Thor 上的路径为:

/usr/local/cuda-13.0/targets/sbsa-linux/include/cuda_runtime_api.h

注意:Jetson 上路径是 sbsa-linux,不是传统桌面的 aarch64-linux

3.3 配置环境变量

export CUDA_HOME=/usr/local/cuda-13.0
export C_INCLUDE_PATH=$CUDA_HOME/targets/sbsa-linux/include:$C_INCLUDE_PATH
export CPLUS_INCLUDE_PATH=$CUDA_HOME/targets/sbsa-linux/include:$CPLUS_INCLUDE_PATH
export PATH=$CUDA_HOME/bin:$PATH

永久生效,写入 ~/.bashrc

echo 'export CUDA_HOME=/usr/local/cuda-13.0' >> ~/.bashrc
echo 'export PATH=$CUDA_HOME/bin:$PATH' >> ~/.bashrc
echo 'export C_INCLUDE_PATH=$CUDA_HOME/targets/sbsa-linux/include:$C_INCLUDE_PATH' >> ~/.bashrc
echo 'export CPLUS_INCLUDE_PATH=$CUDA_HOME/targets/sbsa-linux/include:$CPLUS_INCLUDE_PATH' >> ~/.bashrc
source ~/.bashrc

四、依赖编译

outlines_core 是 Rust 编写的包,从源码编译需要以下依赖:

4.1 安装 Rust

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# 选择默认安装(选项 1)
source $HOME/.cargo/env
rustc --version

4.2 安装 OpenSSL 开发包

sudo apt install libssl-dev pkg-config

4.3 Python 3.14 兼容性问题

如果使用 Python 3.14,PyO3(版本 0.22.6)不支持,需要设置兼容标志:

export PYO3_USE_ABI3_FORWARD_COMPATIBILITY=1
pip install outlines_core

五、模型准备

5.1 可用模型

ls /workspace/models/
Qwen2-VL-7B-Instruct
Qwen3-30B-A3B-Instruct-2507

5.2 模型格式说明

路径格式可用框架
/workspace/models/Qwen2-VL-7B-InstructHugging FaceSGLang、vLLM
/workspace/models/Qwen3-30B-A3B-Instruct-2507Hugging FaceSGLang、vLLM

六、启动推理服务

6.1 小模型验证(Qwen2-VL-7B)

python3 -m sglang.launch_server \
  --model-path /workspace/models/Qwen2-VL-7B-Instruct \
  --host 0.0.0.0 \
  --log-level info

启动成功标志:

[INFO] Uvicorn running on http://0.0.0.0:30000 (Press CTRL+C to quit)
[INFO] The server is fired up and ready to roll!

6.2 大模型启动(Qwen3-30B)

由于 NVIDIA Jetson AGX Thor 平台的 CUDA Graph 兼容性问题,需要关闭 CUDA Graph:

python3 -m sglang.launch_server \
  --model-path /workspace/models/Qwen3-30B-A3B-Instruct-2507 \
  --host 0.0.0.0 \
  --log-level info \
  --cuda-graph-backend-decode disabled \
  --cuda-graph-backend-prefill disabled \
  --mem-fraction-static 0.80

6.3 核心参数说明

参数作用适配意义
--model-pathHugging Face 格式模型路径支持本地路径与 HuggingFace Hub ID
--host 0.0.0.0监听所有网络接口允许局域网内其他设备访问推理服务
--log-level info日志级别debug / info / warning,调试时建议用 debug
--cuda-graph-backend-decode disabled关闭 decode 阶段 CUDA GraphThor 平台 CUDA Graph 存在死锁问题,必须关闭
--cuda-graph-backend-prefill disabled关闭 prefill 阶段 CUDA Graph同上
--mem-fraction-static 0.80分配 80% 显存给 KV Cache在并发量低的边缘场景下可适当提高以支持更长上下文

七、接口测试

7.1 纯文本请求

curl http://localhost:30000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "Qwen2-VL-7B-Instruct",
    "messages": [{"role": "user", "content": "你好,做个自我介绍"}],
    "max_tokens": 100
  }'

7.2 多模态图片请求(Qwen2-VL)

由于 base64 编码后图片过大,超出命令行参数长度限制,需要通过文件发送:

# 将图片转为 base64 并构建请求 JSON
IMG_BASE64=$(base64 -w 0 /path/to/your/image.png)

cat > /tmp/vl_request.json << ENDJSON
{
  "model": "Qwen2-VL-7B-Instruct",
  "messages": [{
    "role": "user",
    "content": [
      {"type": "image_url", "image_url": {"url": "data:image/png;base64,${IMG_BASE64}"}},
      {"type": "text", "text": "描述一下这张图片"}
    ]
  }],
  "max_tokens": 200
}
ENDJSON

# 发送请求
curl http://localhost:30000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d @/tmp/vl_request.json

八、服务管理

8.1 停止服务

# 方式一:在启动终端按 Ctrl+C

# 方式二:强制杀进程
pkill -f sglang

# 确认清理干净
ps aux | grep sglang

8.2 后台运行

nohup python3 -m sglang.launch_server \
  --model-path /workspace/models/Qwen3-30B-A3B-Instruct-2507 \
  --host 0.0.0.0 \
  --log-level info \
  --cuda-graph-backend-decode disabled \
  --cuda-graph-backend-prefill disabled \
  > /tmp/sglang.log 2>&1 &

# 查看日志
tail -f /tmp/sglang.log

8.3 检查服务状态

# 端口监听检查
ss -tlnp | grep 30000

# GPU 内存使用
nvidia-smi

# 进程状态
ps aux | grep sglang

写在最后

走完整套 SGLang 部署流程,有几点感受想和读者分享:

  1. SGLang 的上手体验整体顺畅。 pip install 一行命令、Python 模块直接启动、OpenAI 兼容 API 开箱即用。

  2. Jetson AGX Thor 的兼容性坑点主要集中在 CUDA Graph。 桌面 GPU 上默认启用的 CUDA Graph 在 AGX Thor 上会导致死锁,关闭后功能正常,但会牺牲部分性能。这是边缘平台部署时最需要留意的点,值得官方后续适配。

  3. outlines_core 的 Rust 编译链是一个隐形成本。 在 Jetson 这类 ARM 平台上,很多 Python 包的预编译 wheel 不可用,必须从源码编译——这意味着 Rust、OpenSSL 等额外依赖需要提前准备好。对于不熟悉系统运维的开发者,这可能是第一个卡点。

  4. SGLang 的差异化在调度层,不在算子层。 模型权重本身不动,优化全部发生在运行时调度策略上:RadixAttention 复用共享前缀的 KV Cache、连续批处理动态插入新请求、Prefill-Decode 分离让计算密集和访存密集阶段各自独立扩缩容——这些设计的核心命题是「同时来了 1000 个请求,怎么安排它们最高效」。SGLang 自己不做编译级的硬件优化,而是站在 FlashInfer、FlashAttention 等底层算子库的肩膀上。它的护城河不是 kernel 写得有多极致,而是调度策略有多聪明。这也是为什么 SGLang 更适合高并发、多租户的在线服务场景——竞争越激烈,它的调度优势越明显。

  5. 放在 AGX Thor 这张卡上,SGLang 不是为它而生的,但跑通本身就很有意思。 作为一个单用户边缘设备,Thor 的典型负载是单条请求的低延迟推理(具身智能、机器人控制),而不是成百上千的并发请求——这恰好是 SGLang 的调度能力最无用武之地的场景。但反过来看,能够在一张边缘卡上完整跑通一个面向数据中心的推理框架,本身就是 Jetson 平台能力的证明。如果未来边缘端出现了多模型、多请求并发的复杂场景(比如一台机器人同时跑导航、操作、对话多个模型),SGLang 的调度优势就会浮现。

  6. 希望这篇指南对你有帮助。愿你在自己的 Jetson 上顺利跑通推理服务,愿每一次 curl 都返回你想要的结果。祝部署愉快。

最后更新于