【免费下载链接】Mini-InternVL2-2B-DA-DriveLM
Mini-InternVL2-2B-DA-DriveLM 是 OpenGVLab 开源的自动驾驶领域多模态大模型(VLM),它是基于 Mini-InternVL2-2B 底座在 DriveLM 自动驾驶数据集上领域适配(Domain Adaptation)而成的"口袋级"视觉语言模型。全文将带你拆解它的架构"高效公式":轻量 InternViT 视觉编码器 + PixelShuffle 空间下采样 + InternLM2-1.8B 语言模型,三部分如何拼出约 2B 参数的高性价比方案,并覆盖动态分辨率切图、Token 压缩、对话模板等工程细节。
一句话看懂:2B 参数是怎么"配方"出来的
这个仓库是一个"开箱即用"的模型权重包(MIT 协议,可直接被 Hugging Facetransformers加载)。它的整体结构非常清晰,就像一道三步菜谱:
| 组成模块 | 作用 | 关键参数(来自 config.json) |
|---|---|---|
| InternViT 视觉编码器 | 把图片切成小块并提取视觉特征 | image_size=448、patch_size=14、hidden_size=1024、24 层 |
| PixelShuffle + MLP 连接器 | 压缩视觉 Token 数量、对齐语言模型维度 | downsample_ratio=0.5、ps_version=v2 |
| InternLM2 语言模型 | 理解图文混合输入并生成回答 | hidden_size=2048、24 层、vocab_size=92553 |
算一笔参数账:视觉塔约 0.4B 参数,InternLM2-1.8B 语言塔约 1.85B 参数,加上中间两层 MLP 连接器,总参数刚好落在2B 量级——这正是"2B 参数高效公式"的由来:用不到 5% 的参数量换取接近大型 VLM 的通用能力,再叠加领域微调,专攻自动驾驶场景理解(如驾驶问答、交通元素描述)。
视觉塔:InternViT 如何"切图看图"
视觉编码器源码在 modeling_intern_vit.py,配置默认值定义在 configuration_intern_vit.py。它的看图流程分三步:
- Patch 切分:把 448×448 的图像用卷积切成 14×14 的小块,得到 32×32=1024 个图像块向量(
PatchEmbed,见 modeling_intern_vit.py#L145-L168); - 24 层 Transformer 编码:
hidden_size=1024、16 个注意力头,支持 Flash Attention 加速(本仓库默认use_flash_attn=true); - 取最后一层输出:
select_layer=-1表示取编码器最后一层的输出作为视觉特征(配置项见 config.json#L108)。
这里的hidden_size=1024对比 InternVL2 原版动辄 8B 级别的视觉塔,是本模型"轻量化"的第一刀。
动态分辨率:一张图最多切 12 块
dynamic_image_size=true(见 config.json#L12)是 InternVL 系列的招牌特性:输入图片不再是固定尺寸,而是按原始宽高比动态切成多块 448×448 子图。
min_dynamic_patch=1:最简单的图只切 1 块;max_dynamic_patch=12:细节复杂的图最多切 12 块(max_num=12);use_thumbnail=true:切多块时额外附加一张缩略图,让模型既看清局部又知道全貌。
切分逻辑由推理代码中的dynamic_preprocess函数完成(见 README.md Quick Start 部分)。对自动驾驶场景来说这一点尤其实用:街景照片里远处的小路牌、近处的大车,靠"多块高分辨率子图 + 全图缩略图"的组合就不会漏掉。
💡 每张子图都产生 1024 个视觉 Token,因此
max_num越大看得越清,但显存和耗时也越高。日常使用推荐保持默认的 12。
核心技巧:PixelShuffle 把 Token 数量砍半
这是整个架构里最巧妙的"省 Token"设计,实现于 modeling_internvl_chat.py#L168-L202 的pixel_shuffle与extract_feature两个函数。
为什么要压缩?视觉塔输出的 Token 数量往往远多于文本 Token 数量,如果每张子图直接送 1024 个 Token 给语言模型,12 块图就要上万 Token,生成速度慢、显存占用高。
PixelShuffle 怎么做的?它的思路类似"马赛克合并":
- 把每个 patch 的特征图排成 32×32 的网格;
- 按
downsample_ratio=0.5将相邻 2×2 的 4 个 Token在空间上折叠、在通道上拼接,得到 16×16 网格——Token 数量从 1024 降到256,每个 Token 携带的信息量则翻 4 倍; - 送入
mlp1两层全连接(LayerNorm → Linear → GELU → Linear,见 modeling_internvl_chat.py#L78-L83),把维度从1024×4=4096投影到语言模型的 2048。
一句话总结:空间换信息密度,Token 数减半(实际为 1/4,256/1024),细节基本不丢。配置中ps_version=v2还会修正 v1 版中宽高未换回导致的图像转置小问题,值得点赞。
语言塔:InternLM2-1.8B 的对话能力
语言模型部分源码在 modeling_internlm2.py,由llm_config(见 config.json#L14-L102)驱动,底层是 internlm2-chat-1_8b。几个值得注意的参数:
- 24 层、hidden_size=2048、16 个注意力头,其中 KV 头只有 8 个(
num_key_value_heads=8)——这是GQA(分组查询注意力),推理时更省显存; - 动态 RoPE 扩展:
rope_scaling.type=dynamic、factor=2.0,max_position_embeddings=32768,支持约 3.2 万 Token 的长上下文,多图多轮对话也不会"失忆"; - SiLU 激活 + RMSNorm(
hidden_act=silu、rms_norm_eps=1e-05),是现代 LLM 的标配组合; - 词表 92553,并额外注册了 8 个视觉专用符号:
<img>、</img>、<IMG_CONTEXT>、<box>、</box>、<quad>、</quad>、<ref>、</ref>(见 added_tokens.json),其中<IMG_CONTEXT>就是视觉 Token 在文本序列里的"占位符"。
图文是怎么汇合的?在 modeling_internvl_chat.py#L119-L129 可以看到:先把所有文本 Token 变成 embedding,再把<IMG_CONTEXT>位置上的向量整体替换为视觉特征,最后交给language_model.generate统一生成。这就是典型的"Embedding 层注入"式 VLM 架构。
对话模板与推理入口:chat / batch_chat
模型本体由 configuration_internvl_chat.py 的InternVLChatConfig统一装配,template=internlm2-chat指定了对话格式(实现于 conversation.py 的get_conv_template)。
对使用者来说,真正需要关心的只有两个方法(定义于 modeling_internvl_chat.py#L204-L307):
| 方法 | 用途 |
|---|---|
model.chat(...) | 单轮/多轮对话,支持纯文本、单图、多图输入 |
model.batch_chat(...) | 批量推理,一次处理多张图,吞吐更高 |
多轮对话只需把上一轮返回的history传回下一次调用即可自动维护上下文;多图场景则用num_patches_list告诉模型每张图分别切了几块(详见 README.md 中的完整示例代码)。
如何快速上手部署这个 2B 模型
部署门槛是这个模型的一大卖点。以 README.md 的 Quick Start 为例,核心只需四步:
- 准备环境:
transformers>=4.37.2+ PyTorch +(可选)flash-attn; - 加载模型:用
AutoModel.from_pretrained(path, torch_dtype=torch.bfloat16, use_flash_attn=True, trust_remote_code=True)一行加载,bfloat16精度是官方推荐; - 切图加载:调用
load_image('path/to/image.jpg', max_num=12),动态切图逻辑自动完成; - 发起对话:
model.chat(tokenizer, pixel_values, '<image>\n请描述这张图片', generation_config)。
由于权重已合并进仓库的 model.safetensors,克隆后即可本地推理:
git clone https://gitcode.com/OpenGVLab/Mini-InternVL2-2B-DA-DriveLM显存参考:2B 参数、bf16 精度下权重约占 4GB 显存,叠加 KV Cache 后,单张 8GB 消费级显卡(如 RTX 3060/4070)即可流畅运行,这也是"口袋多模态模型"定位的实际含义。
文件清单:动手前建议收藏的 6 个文件
| 文件 | 说明 |
|---|---|
| config.json | 总配置:视觉塔、语言塔、动态切图与 PixelShuffle 参数都在这里 |
| modeling_internvl_chat.py | 模型主入口:chat、batch_chat、pixel_shuffle |
| modeling_intern_vit.py | InternViT 视觉编码器实现 |
| modeling_internlm2.py | InternLM2 语言模型实现 |
| conversation.py | internlm2-chat对话模板 |
| tokenization_internlm2.py + tokenizer.model | BPE 分词器,词表 92553 |
写在最后:这套架构值得借鉴的 3 个点
- 视觉 Token 是 VLM 的隐形成本:PixelShuffle 空间折叠 + MLP 投影的组合,让每块子图只占 256 个 Token,是"小模型看大图"的关键;
- 动态分辨率按需分配算力:1~12 块自适应切图 + 缩略图,简单图省资源、复杂图保细节;
- 组件皆可替换:配置中
llm_config/vision_config分离(见 configuration_internvl_chat.py#L49-L55),意味着你可以把语言塔换成 Llama 等其他开源 LLM,公式依然成立。
正是这三点,让 Mini-InternVL2-2B-DA-DriveLM 成为在边缘设备、端侧车机上部署多模态理解能力的现实选择——小身材,真本事。
【免费下载链接】Mini-InternVL2-2B-DA-DriveLM
相关推荐
Vuetify System Bar 组件实战指南:用 v-system-bar 构建 Android 风格状态栏与窗口栏
Vuetify System Bar 组件实战指南:用 v system bar 构建 Android 风格状态栏与窗口栏 导读 v system bar 是
Haraka data.noreceived 插件解析:基于 Received 头的中转痕迹反垃圾机制与弃用迁移指南
Haraka data.noreceived 插件解析:基于 Received 头的中转痕迹反垃圾机制与弃用迁移指南 本文围绕 Haraka 已弃用插件 dat
为什么Mini-InternVL2-2B-DA-DriveLM能理解道路场景?领域适配(DA)技术完整解析
为什么Mini InternVL2 2B DA DriveLM能理解道路场景?领域适配(DA)技术完整解析 Mini InternVL2 2B DA Drive
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考