官方要 16GB,实测 4-bit 压到 2.9GB:把 LocateAnything-3B 搬上 8GB Jetson
本文介绍
jetson-examples中的locateanything示例------NVIDIA 的 LocateAnything-3B 开放词汇目标检测模型,官方要 Jetson Thor + 16GB 内存才能跑。笔者额外用 4-bit 量化在 8GB 的 Orin NX Super 上压到 2.9GB 显存跑通。文章覆盖项目背景、产品设备、不足与未来展望。
一、项目背景
传统目标检测模型只能识别预训练类别(COCO 那 80 类、Open Images 那几百类),换个目标就得重训。开放词汇目标检测(Open-Vocabulary Detection / Grounding) 解决的就是这个问题:你用自然语言描述要找什么------"a person"、"cat"、"red car"、"戴安全帽的工人"------模型就把画面里所有符合的实例都框出来。这对零售盘点、安防线索检索、工业缺陷定位、机器人抓取这类"类别事先定不死"的场景价值很大。
LocateAnything-3B 是 NVIDIA 发布的一个 3B 参数视觉语言模型(VLM),架构上是 MoonViT 视觉编码器 + Qwen 语言模型 + MTP(Multi-Token Prediction)解码 。模型权重托管在 HuggingFace:nvidia/LocateAnything-3B。它的特点是输出不是一段文字描述,而是结构化的边界框 ------直接吐出 <box>x1 y1 x2 y2</box> 这种坐标 token,适合做检测而非对话。
但官方模型有一个很现实的工程限制:它自带的解码循环硬性要求 batch == 1 ,一次只能处理一对(图片, 查询)。这个锁只卡在手写的 MTP 解码循环里,底下的 Qwen 和视觉编码器本身是批处理安全的。本示例打包的 locateanything_batch 引擎(来自 github.com/liuwang97/LocateAnything-3B-batch)就是这个 MTP 循环的忠实批量化移植 :在贪心解码下与逐条 batch=1 跑数值等价 ,而且是社区各种移植里唯一保留模型原生 MTP 路径的版本------llama.cpp、vLLM 那些社区移植直接丢了 MTP、退回普通自回归。
为什么要费劲把它搬到 Jetson 上?端侧实时推理意味着:数据不出设备(隐私)、不依赖云端(离线/弱网可用)、延迟低(本地环路)。对于一台能塞进背包的边缘设备来说,跑一个 3B 的开放词汇检测器,是很有吸引力的事。
二、使用的产品设备
硬件:reComputer Thor J6015
本示例支持 Jetson Thor 以及Orin nano 8G (4-bit 量化) 。在Jetpack 7.2 上做的适配。参考设备是 Seeed 的 reComputer Thor J6015。
软件层面要求 JetPack 7,对应的 L4T 版本白名单是:
| JetPack | L4T 版本 |
|---|---|
| 7.0 | 38.1.0 |
| 7.1 | 38.2.0 |
| 7.0.1 (Thor) | 38.4.0 |
| 7.2 | 39.2.0 |
资源门槛:16 GB 内存 (模型权重 bf16 约 7.3 GB + torch + 激活值)、20 GB 可用磁盘(Docker 镜像约 6 GB + 模型卷 7.3 GB + 构建缓存约 3 GB)、Docker + NVIDIA Container Runtime。可以用这条命令确认设备 L4T 版本:
bash
cat /etc/nv_tegra_release # 应显示 R38.x 或 R39.x
引擎:locateanything_batch
示例的核心是 locateanything_batch 这个批量化引擎,整个引擎就一个模块(src/locateanything_batch/engine.py),对外暴露 load()、generate_batch()、generate_batch_grouped()、load_pil() 几个接口。推理管线可以概括成四步:
- 视觉编码 ------图片过 MoonViT 的
extract_feature+mlp1投影;装了 flash-attn 时把一个微批的图片打包成一次 varlen 调用(块对角,与逐图等价,快 2.6--3 倍)。 - 共享前缀预填充 ------"logit-free":只跑基础 Qwen(不走
lm_head),避免[B,S,V]的 fp32 logit 显存爆炸,返回 KV cache。 - MTP 解码 ------每步前推
[已接受 token + 6 宽投机窗口],接受 k∈{1,3,4,6} 个 token,然后截断窗口 KV(窗口是双向注意力,会污染),保留已接受块的干净因果 KV。 - 框解码 ------不做近似,用模型原生的 top-k 验证框解码,贪心输出与官方
batch=1路径逐位等价。
Web UI:FastAPI + WebSocket
示例还带一个单文件 Web UI(locate_web_ui.py),FastAPI + WebSocket,前端 HTML/CSS/JS 全部内嵌在 Python 字符串里。它支持三路输入:
- 图片上传(jpg/png/bmp/webp/tiff)------一次性检测,框逐步流式画出;
- 视频上传------每 N 帧(默认 5)检测一次,跳过的帧复用上一次的框,并按 FPS 自适应调 skip;
- 摄像头 ------探测
/dev/video0..9,下拉选源后实时检测。
输出是 WebSocket 推送的 base64 JPEG 帧,框直接画在图上,标签形如 <prompt> <序号>。状态栏实时显示 FPS / 推理耗时(ms) / 框数 / 帧进度 ,并按帧率给一个 Real-time+ / Real-time / Near real-time / Slow 的质量标签。界面是暗色主题(背景 #0f0f0f、主色绿 #00c853)。
三、极简上手
两条命令就能跑起来(前提是设备已满足上面的硬件/软件门槛):
bash
git clone https://github.com/Seeed-Projects/jetson-examples.git
pip3 install -e .
reComputer run locateanything
首次运行会自动构建 Docker 镜像(下载约 5 GB 的 PyTorch + CUDA wheel,约 30 分钟,构建可断点续传),并把 7.3 GB 模型拉进 Docker 卷(约 15 分钟,后续复用缓存)。完成后浏览器打开:
http://<jetson-ip>:7860
想换端口或调参,用环境变量:
bash
PORT=8080 reComputer run locateanything
LA3B_VIDEO_DIM=384 LA3B_DETECT_SKIP=3 reComputer run locateanything
几个可调旋钮:LA3B_MODEL(模型 ID,默认 nvidia/LocateAnything-3B)、LA3B_VIDEO_DIM(推理前长边缩放上限,默认 512)、LA3B_VIDEO_TOK(max_new_tokens,默认 16)、LA3B_DETECT_SKIP(视频模式每 N 帧检测一次,默认 5)。
四、不足
把官方能力搬上边缘设备,这个示例已经可用,但短板也很明显:
- flash-attn 安装麻烦 。PyPI 对新栈(sm_120 / cu128 / torch 2.11)没有预编译 wheel,得自己找匹配的预编译包
--no-build-isolation装,或从源码编译。不装也能跑,端到端慢约 30%,结果不变。 - decord 没有 aarch64 / py3.12 wheel 。示例里
processing_locateanything.py顶层 import 了 decord,但推理根本用不到(只有训练时读 LMDB 视频才用)。Dockerfile 里塞了个 dummydecord模块顶替 import。 - 贪心解码才严格等价 。批量化引擎的"逐位等价"以
repetition_penalty=1.0为闸门;rp=1.15时少数正确性检查会从"token 级一致"退化为"框 Δ ≤ 8/1000"(bf16 批量 GEMM 非结合律导致,文档说"预期内、良性")。 - 视频模式 NMS 可能压制重叠框 。视频模式做 IoU 0.3 的 NMS,密集遮挡场景可能丢框;图片模式为保密集场景故意不做 NMS,但图片模式是一次性 的------一次
start检测完就闲置,不会对静态图连续重检。 - 权重非商用 。
locateanything_batch包装层是 MIT,但 NVIDIA 的模型权重是独立的非商用 / 仅研究用许可。 locateanything-batch尚未发到 PyPI。目前只能从源码装。- 模型体积口径不一 。
README.md/config.yaml写 7.3 GB,engine_README.md写约 7.8 GB------文中照实并列,发布前建议确认以哪个为准。
五、笔者的 4-bit 探索:把门槛压到 8GB
官方示例要 Thor + 16GB,门槛偏高。笔者在 8GB 的 Orin NX Super(L4T R39.2、CUDA 13.2、SM 8.7,与 Thor 的 sm_120 是不同芯片)上,用 bitsandbytes NF4 4-bit 量化做了一轮验证:4-bit 加载仅占 2.9 GB VRAM,推理约 29s,测试图上检出 小猫框 ------证明 LocateAnything-3B 完全可以塞进 8GB 这一档出货量最大的 Orin 设备。

⚠️ 以下为笔者个人探索,非官方特性 ,相关改造不在本
locateanythingexample 仓库内,尚未沉淀回官方示例,仅作方向参考。
应用场景上,开放词汇检测在零售盘点("货架上的可乐")、安防线索("戴红帽的人")、工业缺陷("表面划痕")、机器人抓取("桌上的红色零件")这类"类别事先定不死"的边缘场景里,和 Jetson 这种低功耗设备是天然搭配。
小结
locateanything 示例把 NVIDIA LocateAnything-3B 这个 3B 开放词汇检测器,连同批量化引擎和一个三路输入的实时 Web UI,打包成了 Jetson Thor 上两条命令就能跑起来的开箱体验。官方门槛是 Thor + 16GB,而笔者用 4-bit 量化在 8GB Orin NX Super 上压到 2.9GB 显存跑通------证明这条路能下沉到主流 8GB 设备,剩下的主要是把一串工程坑沉淀回官方示例。对做边缘 AI 部署的同学来说,这是一个值得上手摸一摸、也值得跟进演进的示例。
仓库与体验
- 示例仓库 :Seeed-Projects/jetson-examples(本示例位于
reComputer/scripts/locateanything) - 模型权重 :nvidia/LocateAnything-3B
- 批量化引擎 :liuwang97/LocateAnything-3B-batch
浏览器打开http://<jetson-ip>:7860,上传图片或视频,输入一句自然语言,就能看到实时框出的目标。欢迎体验,遇到问题欢迎在仓库 issue 交流。
