【免费下载链接】InternVL3-14B-Pretrained
InternVL3-14B-Pretrained 是 OpenGVLab 发布的 InternVL3 系列 14B 多模态大模型的预训练版本(基于 InternViT-300M 视觉编码器 + Qwen2.5-14B 语言模型),支持图文对话、视频理解等任务。本文带你掌握它的两大推理提速技巧:用 TextIteratorStreamer 实现字级实时流式输出,以及用 batch_chat 批量处理多张图片,配套完整示例代码,新手也能照着跑通。
💡 提示:本仓库是预训练版(Pretrained),未经 SFT/MPO 后训练,指令跟随能力弱于正式版。如果你的任务是日常问答或指令执行,建议优先选用后训练版本;本文的代码接口在两个版本中完全通用。
两种输出模式,解决两类等待
多模态模型生成内容时,默认是"憋大招"——等全部 token 生成完才一次性返回。这在两个场景下很吃亏:
| 场景 | 痛点 | 解决方案 |
|---|---|---|
| 交互式对话(聊天界面、Web 前端) | 用户盯着屏幕干等,几十秒没反馈 | TextIteratorStreamer 流式输出,逐字返回 |
| 批量任务(图文数据集标注、批量描述) | 逐张调用chat,串行等待浪费 GPU | batch_chat批量推理,一次 generate |
两者都基于同一个入口:模型的generate方法。视觉特征先由 ViT 抽取、再注入到文本嵌入中,随后交给语言模型解码——区别只在于解码结果的消费方式。
上图即为examples/image1.jpg,仓库自带的示例图片,也是下面两个示例的输入素材
流式输出完整示例:TextIteratorStreamer 三步接入
TextIteratorStreamer是 transformers 自带的输出流对象:模型每解码出一个新 token,就把它"推"进队列,主线程迭代队列即可实时拿到文本片段。
核心思路只有三步:建流 → 塞进 generation_config → 开线程跑 chat,主线程迭代。
from transformers import TextIteratorStreamer from threading import Thread # 1. 初始化流式器:跳过 prompt 与特殊 token,10 秒超时保护 streamer = TextIteratorStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True, timeout=10) # 2. 把 streamer 放进生成配置 generation_config = dict(max_new_tokens=1024, do_sample=False, streamer=streamer) # 3. 子线程执行 chat,主线程逐段消费流 thread = Thread(target=model.chat, kwargs=dict( tokenizer=tokenizer, pixel_values=pixel_values, question=question, history=None, return_history=False, generation_config=generation_config, )) thread.start() for new_text in streamer: if new_text == model.conv_template.sep: # 遇到对话分隔符即结束 break print(new_text, end='', flush=True) # 实时打印每个片段几个关键参数说明:
skip_prompt=True:不把输入提示回显出来,只输出模型新生成的部分;timeout=10:两次取词间隔超过 10 秒就结束迭代,防止主线程被挂起;do_sample=False:流式演示建议贪心解码,输出稳定、便于观察逐字效果;- 为什么必须开线程:
model.chat内部会阻塞直到生成完毕,若在主线程执行,for new_text in streamer永远轮不到运行。
完整可运行的加载与流式输出代码见 README.md 的Streaming Output小节,模型加载(bf16 加载、BNB 8-bit 量化、多卡切分)示例也在同一文件的Model Loading小节。
批量推理完整示例:batch_chat 一次喂多张图
如果你的任务是对 100 张图分别做描述,串行调用chat意味着 100 次等待;而batch_chat会把多条样本左侧对齐、填充拼接,一次generate全部完成。它的实现位于 modeling_internvl_chat.py。
多模态批量有个特殊点:动态分辨率。每张图会被切成 1~12 个 448×448 的 tile(见max_num参数),不同图片的 tile 数往往不同,因此需要num_patches_list告诉模型"每张图占几块":
# 加载两张示例图,各自动态切分为 tile pixel_values1 = load_image('./examples/image1.jpg', max_num=12).to(torch.bfloat16).cuda() pixel_values2 = load_image('./examples/image2.jpg', max_num=12).to(torch.bfloat16).cuda() # 记录每张图的 tile 数量,并把所有 tile 拼成一个大 batch num_patches_list = [pixel_values1.size(0), pixel_values2.size(0)] pixel_values = torch.cat((pixel_values1, pixel_values2), dim=0) questions = ['<image>\nDescribe the image in detail.'] * len(num_patches_list) responses = model.batch_chat(tokenizer, pixel_values, num_patches_list=num_patches_list, questions=questions, generation_config=generation_config) for question, response in zip(questions, responses): print(f'User: {question}\nAssistant: {response}')内部发生了什么?对照源码 batch_chat 可以看到:
- 为每个问题独立套对话模板,把
<image>占位符替换成num_image_token × num_patches个视觉 token; tokenizer.padding_side = 'left'——左填充是批量生成的关键,保证所有样本的起始位置对齐;- 一次
generate得到整个 batch 的输出,再用batch_decode解码并按sep截断。
load_image等预处理函数(含dynamic_preprocess动态切 tile 逻辑)的完整定义在 README.md 的Inference with Transformers代码块中,整段复制即可使用。
两者怎么选:速查对照
| 对比项 | TextIteratorStreamer | batch_chat |
|---|---|---|
| 适用场景 | 在线交互、低延迟体验 | 离线批处理、数据标注 |
| 吞吐表现 | 首 token 延迟极低,总时长不变 | 批量吞吐显著提升 |
| 多轮对话 | 支持(传history) | ❌ 仅单轮 |
| 代码侵入性 | 需开线程 | 一个方法调用 |
新手常见坑位
- batch_chat 不支持多轮:传入
history或return_history=True会直接抛NotImplementedError(见 modeling_internvl_chat.py)。多轮交互请改用chat; num_patches_list必须与问题数量、顺序一一对应,且所有 tile 数之和要等于pixel_values.shape[0],否则 assert 报错;- 别忘记版本要求:README 明确需要
transformers>=4.37.2,并传trust_remote_code=True; - 显存预算:README 注明 14B 模型在 8-bit 量化下需 2 张 80GB GPU,非量化至少 3 张 80GB GPU,批量推理前请先核对
batch size × 输出长度的显存占用。
相关资料索引
| 文件 | 内容 |
|---|---|
| README.md | 模型加载、单轮/多轮对话、流式输出、批量推理、视频理解全套示例 |
| modeling_internvl_chat.py | batch_chat批量推理实现(左填充 + 一次 generate) |
| modeling_internvl_chat.py | chat单轮/多轮对话实现 |
| modeling_internvl_chat.py | 视觉特征注入与generate核心逻辑 |
| config.json | 模型架构配置(ViT、LLM、template 等) |
一句话总结:交互式应用上流式,离线任务上批量——TextIteratorStreamer 让用户体验从"干等"变成"边生成边阅读",batch_chat 让吞吐从串行变成并行,两者配合即可覆盖 InternVL3-14B-Pretrained 的绝大多数推理场景。
【免费下载链接】InternVL3-14B-Pretrained
相关推荐
批量推理提速指南:InternVL3-38B-Instruct batch_chat 批处理实战
批量推理提速指南:InternVL3 38B Instruct batch_chat 批处理实战 InternVL3 38B Instruct 是 OpenGV
InternVL3-2B-AWQ进阶5技巧:流式输出、多图对比与批量推理完整清单
InternVL3 2B AWQ进阶5技巧:流式输出、多图对比与批量推理完整清单 InternVL3 2B AWQ 是 InternVL3 系列中参数量仅 2B
Serial Studio 的 C++20 惯用法:Concepts、RAII、移动语义与并发模式的源码级解析
Serial Studio 的 C++20 惯用法:Concepts、RAII、移动语义与并发模式的源码级解析 Serial Studio 是一个支持 UART
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考