官方要 16GB,实测 4-bit 压到 2.9GB:把 LocateAnything-3B 搬上 8GB Jetson

官方要 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() 几个接口。推理管线可以概括成四步:

  1. 视觉编码 ------图片过 MoonViT 的 extract_feature + mlp1 投影;装了 flash-attn 时把一个微批的图片打包成一次 varlen 调用(块对角,与逐图等价,快 2.6--3 倍)。
  2. 共享前缀预填充 ------"logit-free":只跑基础 Qwen(不走 lm_head),避免 [B,S,V] 的 fp32 logit 显存爆炸,返回 KV cache。
  3. MTP 解码 ------每步前推 [已接受 token + 6 宽投机窗口],接受 k∈{1,3,4,6} 个 token,然后截断窗口 KV(窗口是双向注意力,会污染),保留已接受块的干净因果 KV。
  4. 框解码 ------不做近似,用模型原生的 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_TOKmax_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 里塞了个 dummy decord 模块顶替 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 设备。

⚠️ 以下为笔者个人探索,非官方特性 ,相关改造不在本 locateanything example 仓库内,尚未沉淀回官方示例,仅作方向参考。

应用场景上,开放词汇检测在零售盘点("货架上的可乐")、安防线索("戴红帽的人")、工业缺陷("表面划痕")、机器人抓取("桌上的红色零件")这类"类别事先定不死"的边缘场景里,和 Jetson 这种低功耗设备是天然搭配。

小结

locateanything 示例把 NVIDIA LocateAnything-3B 这个 3B 开放词汇检测器,连同批量化引擎和一个三路输入的实时 Web UI,打包成了 Jetson Thor 上两条命令就能跑起来的开箱体验。官方门槛是 Thor + 16GB,而笔者用 4-bit 量化在 8GB Orin NX Super 上压到 2.9GB 显存跑通------证明这条路能下沉到主流 8GB 设备,剩下的主要是把一串工程坑沉淀回官方示例。对做边缘 AI 部署的同学来说,这是一个值得上手摸一摸、也值得跟进演进的示例。

仓库与体验

相关推荐
Kobebryant-Manba1 小时前
Bert预训练数据&代码
人工智能·深度学习·bert
Exclusive_Cat2 小时前
FastAPI热重载失效?降级uvicorn解决
python·fastapi
QN1幻化引擎2 小时前
# DalinX V8 灵鉴 V2:12维意识评测框架 —— 从 Tononi IIT 到 Friston FEP 的理论统一
数据库·人工智能·算法·机器学习·数据挖掘·agi
人生百态,人生如梦2 小时前
情感交互仿生人从技术到落地构想1——技术交流贴(2026.7)
人工智能·机器人·人机交互·交互
m0_617493942 小时前
Python OpenCV 孔洞检测与缺陷分析详解与实战
开发语言·python·opencv
GeekArch2 小时前
第5讲:嵌入式场景二范式决策树:什么情况快写、什么情况严写
人工智能·stm32·单片机·mcu·物联网·决策树·机器学习
YMWM_11 小时前
lerobot中use_relative_actions=True需要重新计算meta/stats.json等信息
人工智能·深度学习·lerobot
闻道且行之12 小时前
TurboOCR:基于PP-OCRv6的极速Windows离线OCR工具,深度解析3.4GB依赖背后的技术架构
c++·人工智能·python·qt·机器学习·ocr
橙臣程12 小时前
深度学习2——CNN与RNN概述
rnn·深度学习·cnn