跳到主要内容

视觉语言模型

Florence-2 私有化部署:1.55GB 权重扛下检测、OCR 与密集描述

0.77B 参数、fp16 权重只有 1.55GB 的视觉基础模型,靠一个任务 token 在检测、分割、OCR、图像描述之间切换。RTX 3090 24GB $0.193/卡·时起,按秒计费,跑完就停。

Florence 这个名字有两层含义。2021 年微软那篇《Florence: A New Foundation Model for Computer Vision》说的是一个闭源视觉基础模型,普通人只能在 Azure 的图像分析服务里间接用到它;而你今天真能下载、能商用、能改的,是它的开源续作 Florence-2(技术报告 arXiv 2311.06242),MIT 许可,权重就挂在 Hugging Face 上。所以搜「Florence 本地部署」,实际要部署的几乎都是 Florence-2。

它最反直觉的地方是小得离谱。Florence-2-large 只有 0.77B 参数,仓库里的 model.safetensors 是 1.55GB;base 版 0.23B,463MB。就这个体量,在 FLD-5B(1.26 亿张图、54 亿条标注)上训出来,一个模型同时干十几件事:图像描述、详细描述、目标检测、密集区域描述、短语定位、开放词表检测、指代表达分割、OCR、带框 OCR。切换方式不是写 prompt,而是把 <OD>、<OCR_WITH_REGION>、<CAPTION_TO_PHRASE_GROUNDING> 这样的任务 token 直接当输入喂进去。

架构是 DaViT 视觉塔加一个 BART 风格的 encoder-decoder 文本塔,这一点直接决定了部署路数:它不是 decoder-only,vLLM 那套原生推理优化用不上(vLLM 的支持列表里把 Florence2ForConditionalGeneration 放进了 bart-plugin),但也正因为小,单卡把显存全部拿去堆 batch 就能硬吞。真正花钱的地方从来不是显存,而是打标的规模和微调的卡时。

01 —

版本与显存对照

认准 florence-community 组织,它是 Florence-2 的 transformers 官方转换版本

版本参数量显存上下文说明
florence-community/Florence-2-large0.77Bfp16 权重 1.55GB / bitsandbytes 4-bit 不到 1GB文本塔 4096默认首选。零样本的检测、密集区域描述和 OCR 质量都比 base 明显好一档,下载量也是四个 checkpoint 里最高的。
florence-community/Florence-2-base0.23Bfp16 权重 463MB文本塔 4096要吞百万级图库、或者想往边缘设备和 CPU 上塞时用它;社区已经有人做了 ONNX、CoreML、ExecuTorch 移植。
florence-community/Florence-2-large-ft0.77Bfp16 权重 1.55GB文本塔 4096在一批下游任务上继续微调过的版本,标准 benchmark 上分数更好看,但零样本泛化不如未微调的 large,自己两版都跑一遍再定。
florence-community/Florence-2-base-ft0.23Bfp16 权重 463MB文本塔 4096小模型的微调版,适合任务边界很窄、只要一两个 task token 的固定流水线。
Florence-VL 3B / 8B(jiuhai/florence-vl-*)HF 上标注 5B / 9Bbf16 约 10GB / 约 18GB(按标注参数量估算)跟随底座 LLMFlorence-2 的后续演进:把它当视觉编码器接进 LLM,走对话式 VQA。想要能聊天的多模态模型时看这条线,想要框和坐标还是回 Florence-2。

02 —

选哪张卡

1.55GB 的权重意味着显存不是瓶颈,吞吐和卡时才是

  • 单卡推理、日常批量打标

    RTX 3090 24GB$0.193/卡·时

    Ampere 架构里最便宜的一张,fp16 张量核心齐全,装完 1.55GB 权重剩下的 20GB 全是 batch 余量。

  • 百万级图库一次性洗完的高吞吐流水线

    RTX 4090 24GB$0.540/卡·时

    同样 24GB,但单位时间处理的图明显更多,按秒计费的场景下省下的时间就是省下的钱。

  • 冻结视觉塔做领域微调(DocVQA、票据、界面截图)

    A100 PCIE 80GB$0.824/卡·时

    官方教程冻结视觉塔时在 40GB 上开到 batch 6,80GB 让你直接把 batch 翻上去而不必重调学习率。

  • 解冻视觉塔的全量微调,复现官方 8 卡配置

    H100 SXM 80GB ×8$3.582/卡·时

    官方那套 batch 64、7 个 epoch、70 分钟跑完的配置原样搬过来,单节点最多 14 卡,8 卡不用申请配额。

03 —

从开机到出第一个检测框

四步,全程不需要 trust_remote_code

  1. 01

    开一台 PyTorch 实例,装对依赖

    选 PyTorch 预置镜像开机,SSH、Jupyter 或 Web 终端进去都行。Florence-2 已经进了 transformers 主干,类名就是 Florence2ForConditionalGeneration 和 Florence2Processor,不再需要 trust_remote_code=True。

    pip install -U transformers accelerate timm einops pillow
  2. 02

    拉官方转换过的权重

    认准 florence-community 这个组织,base、base-ft、large、large-ft 四个 checkpoint 都在里面,config 是按 transformers 4.56.1 转换的。microsoft/ 下的原始仓库带的是 2024 年写的 modeling_florence2.py 自定义代码,和新版 transformers 反复打架,没必要再踩一遍。

    hf download florence-community/Florence-2-large --local-dir /workspace/florence2-large
  3. 03

    用任务 token 跑第一张图

    processor 会先把图缩到固定的 768×768,任务 token 决定模型干什么,生成默认 num_beams=3、max_new_tokens 一般给到 1024。返回的是一串带 <loc_0> 到 <loc_999> 量化坐标的字符串,必须过 post_process_generation 并传入原图 image_size 才能还原成像素级的框,直接当 JSON 解析一定出错。

    python -c "from transformers import pipeline; p = pipeline('image-text-to-text', model='florence-community/Florence-2-large', device=0); print(p('demo.jpg', text='<OD>'))"
  4. 04

    压显存,或者反过来上规模

    想再省,transformers 文档里直接给了 bitsandbytes 4-bit 的例子,BitsAndBytesConfig(load_in_4bit=True) 一行压到 1GB 以内;想上规模就反着来,把显存全部拿去堆 batch,同时先把图按长边补到 768 减少无谓缩放。跑完直接停机,算力立刻停止计费,只有存储会继续计到你销毁实例为止。

    pip install bitsandbytes

这套流程到底多少钱

先算最贵的一档:复现 Hugging Face 官方那份 DocVQA 微调,解冻视觉塔、batch 64、7 个 epoch,官方记录是 8 张 H100 跑 70 分钟。在 NexGPU 上就是 8 × $3.582 = $28.656/时,70 分钟即 28.656 × 70 ÷ 60 = $33.43,一次跑完。预算优先就换官方那条冻结视觉塔、batch 6 的路线:单张 A100 PCIE 80GB $0.824/卡·时,就算慢到 12 小时,也只有 0.824 × 12 = $9.89。推理侧更便宜得离谱:Florence-2-large fp16 权重才 1.55GB,RTX 3090 24GB $0.193/卡·时,挂满一整天做打标服务是 0.193 × 24 = $4.63;换成吞吐更高的 RTX 4090 24GB 也才 0.540 × 24 = $12.96。数据集加 checkpoint 按 20GB 存三天算:20 × $0.414 × 3 ÷ 30 = $0.83。全部按秒计量、按小时计价,没有起租量、没有开通费、没有配额申请;算力停机即停止计费,存储则一直计到你把它销毁。

04 —

常见问题

Florence-2 本地部署到底需要多大显存?

large 版 fp16 权重 1.55GB,base 版 463MB,走 bitsandbytes 4-bit 之后 large 压到 1GB 以内。单流推理留 4GB 显存已经很宽裕,真正吃显存的是 batch 大小和 beam search。要注意的是别只看显存数字选卡:Pascal 架构的 Tesla P40 24GB 虽然只要 $0.214,但没有可用的 fp16 张量算力;Tesla V100 32GB $0.188 便宜且能跑 fp16,可它不支持 bf16。在 NexGPU 上这类活最稳的组合是 RTX 3090 24GB,$0.193/卡·时,按秒计费,跑完就停。

Florence-2 能用 vLLM 部署吗?

不能原生跑。Florence-2 的文本塔是 encoder-decoder 结构,vLLM 的模型支持表里 Florence2ForConditionalGeneration 挂在 bart-plugin 下,属于插件而非原生架构。生产上更实际的做法是 transformers 配大 batch,或者导出 ONNX 做流水线推理。NexGPU 的 2000+ 预置镜像里 PyTorch 和 vLLM 都现成,开一台把两条路都实测一遍,一小时的成本还不到一杯咖啡。

为什么 microsoft/Florence-2-large 在我机器上跑不起来?

两个经典坑。一是 flash_attn:那份自定义代码在 import 阶段就去找它,本地没编译成功就直接抛错,社区帖 #71 讨论的就是这个。二是版本漂移:modeling_florence2.py 是对着 2024 年的 transformers 4.4x 写的,帖子 #104 报「transformers >= 4.52.1 不工作」,#115 报「transformers >= 4.54.0 的 _supports_sdpa AttributeError」,到 transformers v5 还有人在提修复。换成 florence-community/Florence-2-large 加原生的 Florence2ForConditionalGeneration,这些问题一次性消失。NexGPU 的 PyTorch 镜像开机即用,也省了你自己跟 CUDA 编译较劲的那半天。

Florence-2 的 OCR 能替代专门的 OCR 引擎吗?

分场景。<OCR> 和 <OCR_WITH_REGION> 对招牌、票据、商品包装、界面截图这种「图里有字」的情况很好用,而且能顺手把框一起给你。但视觉塔固定吃 768×768,整版扫描件和小字长文档缩下去就糊了,这也是社区从很早就在做 OCR 方向微调的原因。要判断够不够用,最快的办法是在 NexGPU 租一张 RTX 4090 24GB($0.540/卡·时)拿你自己的真实图片跑一轮,比看任何榜单都准。

微调 Florence-2 需要几张什么卡?

Hugging Face 官方那份 DocVQA 教程给了两个现成参照:冻结视觉塔时,单张 A100 40GB 能开 batch 6,连 T4 上 batch 1 都能跑;解冻视觉塔做全量微调则用了 8 张 H100、batch 64、7 个 epoch、70 分钟,学习率 1e-6 配 AdamW 和线性调度器(他们特别提醒学习率一大就迅速过拟合)。对应到 NexGPU:前者用 A100 PCIE 80GB $0.824/卡·时,后者 8 × H100 SXM 80GB $3.582/卡·时,单节点最多支持 14 卡,不需要提配额申请。

Florence 是不是过时了?有没有更新的替代?

Florence-2 仍然是这条线上可下载的开源版本,四个 checkpoint 都还在更新,并且已经被官方转换进 transformers 主干,这本身就是还在被认真维护的信号。后续演进方向是 Florence-VL:把 Florence-2 当视觉编码器接进 LLM(Hugging Face 上的 jiuhai/florence-vl-3b 和 florence-vl-8b),换来对话式 VQA 能力。但如果你要的是「给我框、给我坐标、给我 OCR」,一个 MIT 许可、只有 0.77B 的模型目前仍然没有更省事的替代品。两条路 NexGPU 都能开:Florence-2 用 RTX 3090 24GB $0.193/卡·时,Florence-VL 8B 这种 bf16 十几 GB 的用 RTX 4090 24GB $0.540/卡·时 或 A10 24GB $0.414/卡·时。

开始使用 NexGPU

无论你是企业研发团队还是独立开发者,都可以在几分钟内跑起第一个任务。

注册即可浏览全网实时价格,无需绑定支付方式。