☰
实时流式输出与批量推理双提速:InternVL3-14B-Pretrained TextIteratorStreamer与batch_chat完整示例
2026/10/18 1:22:21 网站建设 项目流程

【免费下载链接】InternVL3-14B-Pretrained

项目地址:https://ai.gitcode.com/OpenGVLab/InternVL3-14B-Pretrained
点击查看免费下载

InternVL3-14B-Pretrained 是 OpenGVLab 发布的 InternVL3 系列 14B 多模态大模型的预训练版本(基于 InternViT-300M 视觉编码器 + Qwen2.5-14B 语言模型),支持图文对话、视频理解等任务。本文带你掌握它的两大推理提速技巧:用 TextIteratorStreamer 实现字级实时流式输出,以及用 batch_chat 批量处理多张图片,配套完整示例代码,新手也能照着跑通。

💡 提示:本仓库是预训练版(Pretrained),未经 SFT/MPO 后训练,指令跟随能力弱于正式版。如果你的任务是日常问答或指令执行,建议优先选用后训练版本;本文的代码接口在两个版本中完全通用。

两种输出模式,解决两类等待

多模态模型生成内容时,默认是"憋大招"——等全部 token 生成完才一次性返回。这在两个场景下很吃亏:

场景痛点解决方案
交互式对话(聊天界面、Web 前端)用户盯着屏幕干等,几十秒没反馈TextIteratorStreamer 流式输出,逐字返回
批量任务(图文数据集标注、批量描述)逐张调用chat,串行等待浪费 GPUbatch_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 可以看到:

  1. 为每个问题独立套对话模板,把<image>占位符替换成num_image_token × num_patches个视觉 token;
  2. tokenizer.padding_side = 'left'——左填充是批量生成的关键,保证所有样本的起始位置对齐;
  3. 一次generate得到整个 batch 的输出,再用batch_decode解码并按sep截断。

load_image等预处理函数(含dynamic_preprocess动态切 tile 逻辑)的完整定义在 README.md 的Inference with Transformers代码块中,整段复制即可使用。

两者怎么选:速查对照

对比项TextIteratorStreamerbatch_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.pybatch_chat批量推理实现(左填充 + 一次 generate)
modeling_internvl_chat.pychat单轮/多轮对话实现
modeling_internvl_chat.py视觉特征注入与generate核心逻辑
config.json模型架构配置(ViT、LLM、template 等)

一句话总结:交互式应用上流式,离线任务上批量——TextIteratorStreamer 让用户体验从"干等"变成"边生成边阅读",batch_chat 让吞吐从串行变成并行,两者配合即可覆盖 InternVL3-14B-Pretrained 的绝大多数推理场景。

【免费下载链接】InternVL3-14B-Pretrained

项目地址:https://ai.gitcode.com/OpenGVLab/InternVL3-14B-Pretrained
点击查看免费下载
上一篇:3分钟掌握ArchWSL包依赖分析:从数据到可视化的完整流程
下一篇:capacitor-updater实战案例:3步实现生产环境热更新部署

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

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

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

立即咨询