【免费下载链接】Mono-InternVL-2B
Mono-InternVL-2B 是 OpenGVLab 出品的单体式多模态大模型(1.8B 激活参数),它基于 InternLM2 分词器(InternLM2Tokenizer),用一套统一的词表同时处理文本 Token 与视觉 Token。本文带你快速看懂这套 InternLM2 分词器如何把一张图片变成<IMG_CONTEXT>序列,并与文本在同一条序列中完成推理。
🧩 一、先搞懂:什么是 InternLM2 分词器
InternLM2 分词器本质上是一个基于 SentencePiece 的字节级 BPE(Byte-Pair-Encoding)分词器:
- 核心实现:tokenization_internlm2.py 中的
InternLM2Tokenizer类,通过sp_model.encode()完成文本编码; - 快速版本:tokenization_internlm2_fast.py 提供
PreTrainedTokenizerFast兼容实现,推理更快; - 词表文件:tokenizer.model(SentencePiece 模型),基础词表大小约92538,加上 15 个额外特殊 Token 后总词表为92553(见 config.json 中
vocab_size字段)。
它的输出统一是input_ids + attention_mask两组模型输入,这正是多模态模型能够把图像和文本拼在一条序列里的基础。
图:Mono-InternVL 的 Token 化流程 —— 文本走 Text Tokenizer,图像走 Patch Embedding,最终 text tokens 与 visual tokens 在同一个多模态大模型中融合。
🔑 二、特殊 Token 一览:图像与文本的"统一词表"
Mono-InternVL-2B 在基础词表之上追加了一组专为多模态设计的特殊 Token,完整清单见 added_tokens.json 与 special_tokens_map.json:
| Token | ID | 作用 |
|---|---|---|
<img> | 92544 | 标记图像段开始 |
</img> | 92545 | 标记图像段结束 |
<IMG_CONTEXT> | 92546 | 占位符:每个位置对应一个视觉 Token 嵌入 |
<quad>/</quad> | 92547 / 92548 | 四点框定(如任意形状目标定位) |
<ref>/</ref> | 92549 / 92550 | 指代表达(Grounding) |
<box>/</box> | 92551 / 92552 | 边界框输出(目标检测) |
<s>/</s> | 1 / 2 | 序列开始 / 结束,</s>同时兼任 padding |
这些 Token 让模型可以在同一条序列里完成三件事:读图(<IMG_CONTEXT>占位)、对话(文本 Token)、输出坐标(<box>等)。这是 Mono-InternVL-2B 被称为"单体式多模态"的关键之一——图像不再是外挂的编码块,而是像文字一样参与统一的语言建模。
图:(a)(b) 模块式 vs 单体式 MLLM 架构对比,(c) Mono-InternVL-2B 在各多模态基准上的表现。
🖼️ 三、一张图片如何变成 256 个 Token
以 examples/image1.jpg 这张小熊猫照片为例,它进入模型前的 Token 化过程如下:
第 1 步:计算每张图需要多少个视觉 Token
在 modeling_internvl_chat.py 中:
num_image_token = (image_size // patch_size)² × downsample_ratio²结合 config.json 中force_image_size: 448、patch_size: 14、downsample_ratio: 0.5,每个 image patch 对应(448/14)² × 0.5² = 256 个<IMG_CONTEXT>。
第 2 步:把占位符填进对话文本
在 modeling_internvl_chat.py 中,模板里的<image>会被替换为:
<img> + <IMG_CONTEXT> × 256 × num_patches + </img>其中num_patches由动态分辨率机制决定(min_dynamic_patch: 1到max_dynamic_patch: 24):图像先缩略为 1 个 patch 的全局视图,细节复杂时再追加局部 patch,实现"按需"增加视觉 Token。
第 3 步:视觉嵌入替换占位符
前向传播时,ViT 输出的视觉特征会原位替换这些<IMG_CONTEXT>位置的嵌入向量,之后整条序列(文本 Token + 视觉 Token)一起送入 LLM,由 modeling_internlm2_ve.py 中带视觉专家(V-Expert)的 MoE 结构完成解码。
💬 四、对话模板:chat template 是怎么组织 Token 的
tokenizer_config.json 里定义了chat_template:
{{ bos_token }}{% for message in messages %}{{'<' + message['role'] + '>' + '\n' + message['content'] + '<|role_end|>' + '\n'}}{% endfor %}{% if add_generation_prompt %}{{ '<role>assistant' + '\n' }}{% endif %}它采用 InternLM2 风格的角色标签格式,一轮对话会被组织成:
<s><role>user 这里是被 <img>...<IMG_CONTEXT>×256...</img> 替换后的图文内容<|role_end|> <role>assistant几个实用参数:
model_max_length: 8192:默认最大序列长度,图像占位会占用其中一部分预算;bos_token: <s>、pad_token: </s>:批量推理时左侧 padding;tokenizer_class: InternLM2Tokenizer:AutoTokenizer.from_pretrained()会据此自动加载仓库内自定义分词器代码(auto_map机制)。
📁 五、关键文件速查
| 文件 | 说明 |
|---|---|
| tokenizer.model | SentencePiece 词表(基础 92538 个 piece) |
| added_tokens.json | 9 个图像/定位类追加 Token 及其 ID |
| special_tokens_map.json | 全部 15 个特殊 Token 映射 |
| tokenizer_config.json | 对话模板、BOS/EOS/pad 配置 |
| tokenization_internlm2.py | 分词器 Python 实现(编码/解码核心) |
| tokenization_internlm2_fast.py | Fast 版分词器 |
| conversation.py | 对话模板(internlm2-chat 等) |
| modeling_internvl_chat.py | 图文 Token 拼接与占位符替换逻辑 |
✅ 六、小结
- 一套词表两种模态:InternLM2 分词器用 BPE 编码文本,再用
<img>/<IMG_CONTEXT>/</img>三个 Token 为图像"开座",每 256 个占位对应一个 448×448 的图像 patch; - 动态分辨率:视觉 Token 数量随图像复杂度弹性变化(1~24 个 patch),在精度与显存之间取得平衡;
- 定位能力同源:
<box>、<quad>等特殊 Token 让目标检测输出与文本生成走同一个解码器,这正是 Mono-InternVL-2B 统一处理图像与文本 Token 的精髓所在。
理解了这套 Token 化机制,你就掌握了读懂 Mono-InternVL-2B 输入输出的第一把钥匙 🚀
【免费下载链接】Mono-InternVL-2B
相关推荐
多模态革命:Transformers如何统一处理文本、图像与音频
多模态革命:Transformers如何统一处理文本、图像与音频 你是否还在为跨模态数据处理而烦恼?从文本分类到图像识别,再到音频分析,每个任务都需要不同的工具
人工智能大模型深度学习NLP预训练微调模型推理服务一文读懂Mono-InternVL-2B-S1-1:1.8B单体多模态大模型终极入门指南
一文读懂Mono InternVL 2B S1 1:1.8B单体多模态大模型终极入门指南 Mono InternVL 2B S1 1 是由上海人工智能实验室 O
如何微调Mono-InternVL-2B-S1-1:LoRA低秩适配视觉专家的完整实战教程
如何微调Mono InternVL 2B S1 1:LoRA低秩适配视觉专家的完整实战教程 Mono InternVL 2B S1 1 是 OpenGVLab
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考