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) |
| GPU | NVIDIA AGX Thor, 126GB 显存 |
| CUDA | 13.0 |
| Python | 3.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 sglang2.2 安装 SGLang
pip install sglang三、配置 CUDA 工具链
Jetson AGX Thor 默认只安装了 CUDA 运行时库,缺少开发工具包(头文件和 nvcc)。
3.1 安装
sudo apt update
sudo apt install cuda-toolkit3.2 查找头文件路径
安装完成后,查找 CUDA 头文件位置:
find /usr -name "cuda_runtime_api.h" 2>/dev/nullJetson 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 --version4.2 安装 OpenSSL 开发包
sudo apt install libssl-dev pkg-config4.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-25075.2 模型格式说明
| 路径 | 格式 | 可用框架 |
|---|---|---|
| /workspace/models/Qwen2-VL-7B-Instruct | Hugging Face | SGLang、vLLM |
| /workspace/models/Qwen3-30B-A3B-Instruct-2507 | Hugging Face | SGLang、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.806.3 核心参数说明
| 参数 | 作用 | 适配意义 |
|---|---|---|
--model-path | Hugging Face 格式模型路径 | 支持本地路径与 HuggingFace Hub ID |
--host 0.0.0.0 | 监听所有网络接口 | 允许局域网内其他设备访问推理服务 |
--log-level info | 日志级别 | debug / info / warning,调试时建议用 debug |
--cuda-graph-backend-decode disabled | 关闭 decode 阶段 CUDA Graph | Thor 平台 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 sglang8.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.log8.3 检查服务状态
# 端口监听检查
ss -tlnp | grep 30000
# GPU 内存使用
nvidia-smi
# 进程状态
ps aux | grep sglang写在最后
走完整套 SGLang 部署流程,有几点感受想和读者分享:
SGLang 的上手体验整体顺畅。
pip install一行命令、Python 模块直接启动、OpenAI 兼容 API 开箱即用。Jetson AGX Thor 的兼容性坑点主要集中在 CUDA Graph。 桌面 GPU 上默认启用的 CUDA Graph 在 AGX Thor 上会导致死锁,关闭后功能正常,但会牺牲部分性能。这是边缘平台部署时最需要留意的点,值得官方后续适配。
outlines_core 的 Rust 编译链是一个隐形成本。 在 Jetson 这类 ARM 平台上,很多 Python 包的预编译 wheel 不可用,必须从源码编译——这意味着 Rust、OpenSSL 等额外依赖需要提前准备好。对于不熟悉系统运维的开发者,这可能是第一个卡点。
SGLang 的差异化在调度层,不在算子层。 模型权重本身不动,优化全部发生在运行时调度策略上:RadixAttention 复用共享前缀的 KV Cache、连续批处理动态插入新请求、Prefill-Decode 分离让计算密集和访存密集阶段各自独立扩缩容——这些设计的核心命题是「同时来了 1000 个请求,怎么安排它们最高效」。SGLang 自己不做编译级的硬件优化,而是站在 FlashInfer、FlashAttention 等底层算子库的肩膀上。它的护城河不是 kernel 写得有多极致,而是调度策略有多聪明。这也是为什么 SGLang 更适合高并发、多租户的在线服务场景——竞争越激烈,它的调度优势越明显。
放在 AGX Thor 这张卡上,SGLang 不是为它而生的,但跑通本身就很有意思。 作为一个单用户边缘设备,Thor 的典型负载是单条请求的低延迟推理(具身智能、机器人控制),而不是成百上千的并发请求——这恰好是 SGLang 的调度能力最无用武之地的场景。但反过来看,能够在一张边缘卡上完整跑通一个面向数据中心的推理框架,本身就是 Jetson 平台能力的证明。如果未来边缘端出现了多模型、多请求并发的复杂场景(比如一台机器人同时跑导航、操作、对话多个模型),SGLang 的调度优势就会浮现。
希望这篇指南对你有帮助。愿你在自己的 Jetson 上顺利跑通推理服务,愿每一次 curl 都返回你想要的结果。祝部署愉快。