☰
InternLM2分词器解析:Mono-InternVL-2B如何统一处理图像与文本Token
2026/10/19 12:01:41 网站建设 项目流程

【免费下载链接】Mono-InternVL-2B

项目地址:https://ai.gitcode.com/OpenGVLab/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:

TokenID作用
<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.modelSentencePiece 词表(基础 92538 个 piece)
added_tokens.json9 个图像/定位类追加 Token 及其 ID
special_tokens_map.json全部 15 个特殊 Token 映射
tokenizer_config.json对话模板、BOS/EOS/pad 配置
tokenization_internlm2.py分词器 Python 实现(编码/解码核心)
tokenization_internlm2_fast.pyFast 版分词器
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

项目地址:https://ai.gitcode.com/OpenGVLab/Mono-InternVL-2B
点击查看免费下载
上一篇:rrvideo 使用指南:将 rrweb 会话录制转换为 WebM 视频
下一篇:Motion Canvas 内嵌播放器:@motion-canvas/player 版本演进与实现原理

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询