多图对比与视频理解教程:InternVL3_5-241B-A28B-Flash多轮对话代码全解

【免费下载链接】InternVL3_5-241B-A28B-Flash

项目地址:https://ai.gitcode.com/OpenGVLab/InternVL3_5-241B-A28B-Flash
点击查看免费下载

想一次看懂多张图片的差异,或让模型"看完"整段视频再追问细节?InternVL3_5-241B-A28B-Flash 是一个开源多模态大模型(MoE 总参数 241B、激活 28B),原生支持多图对比、视频理解与多轮对话。本篇教程带你从模型加载讲到model.chat的每个关键参数,零基础上手多模态对话开发。

🤖 InternVL3_5-241B-A28B-Flash 是什么?

InternVL3.5 是 OpenGVLab 开源的多模态模型家族,本仓库中的241B-A28B-Flash是其中最大、且带"Flash 效率增强"的旗舰版本,核心亮点:

特性说明
MoE 架构总参数约 241B,每 token 激活约 28B,推理更省算力
Cascade RL 训练离线 + 在线两阶段强化学习,推理/数学能力显著提升
ViR 视觉分辨率路由器按图像块语义自动选择 256 或 64 个视觉 token,视觉 token 数最多降低 50%
DvD 解耦部署视觉编码器与语言模型分卡部署,吞吐更高

架构采用经典的ViT–MLP–LLM范式,语言模型基于 Qwen3 系列初始化。模型配置(如flash_mode: true、动态切片min/max_dynamic_patch: 1/12)可在 config.json 中直接查看,对话逻辑实现在 modeling_internvl_chat.py 中。

💡 官方资料与完整示例都写在仓库根目录的 README.md 里,本文所有代码均基于其中的 Quick Start 示例。

⚡ 环境准备与模型加载

硬件与依赖要求(来自 README):

  • transformers>=4.52.1(务必升级,旧版本无法加载本模型)
  • 241B 版本需要8 张 A100 GPU;30B 及以下可单卡部署

加载模型只需几行代码:

import torch from transformers import AutoTokenizer, AutoModel path = "OpenGVLab/InternVL3_5-241B-A28B-Flash" model = AutoModel.from_pretrained( path, torch_dtype=torch.bfloat16, low_cpu_mem_usage=True, use_flash_attn=True, trust_remote_code=True, device_map="auto").eval() tokenizer = AutoTokenizer.from_pretrained(path, trust_remote_code=True, use_fast=False)

三个关键点:

  • device_map="auto":把 241B 大参数自动切分到多张 GPU
  • trust_remote_code=True:本模型使用仓库内自定义建模代码(如 modeling_intern_vit.py)
  • use_fast=False:分词器必须用慢速版,否则特殊 token 处理可能出错

🗣️ 核心接口:model.chat 多轮对话机制

所有图片/视频对话都通过model.chat完成(源码见 modeling_internvl_chat.py)。先理解它最重要的几个参数:

参数作用多轮对话中的作用
pixel_values图像/视频帧的像素张量视觉输入,纯文本对话时传None
question本轮提问,可含<image>占位符每轮一条
history历史对话列表传入上一轮返回的 history,模型即可"记住"上文
return_history置为True时同时返回 history多轮必备
num_patches_list每张图被切成多少个 patch多图/多帧场景的关键参数

多轮对话的基本模式就是"接龙":

generation_config = dict(max_new_tokens=1024, do_sample=True) # 第一轮:开启历史 response, history = model.chat( tokenizer, None, 'Hello, who are you?', generation_config, history=None, return_history=True) # 第二轮:把上轮 history 传进去,即可继续追问 response, history = model.chat( tokenizer, None, 'Can you tell me a story?', generation_config, history=history, return_history=True)

原理很简单:chat内部会把history里的每轮问答按 conversation.py 定义的对话模板拼进提示词,再执行生成(见 modeling_internvl_chat.py)。你只需要负责把history一路传下去。

🖼️ 多图对比:两种传图方式全解

多图是 InternVL 系列最强的场景之一,README 官方示例给出了两种写法,区别在于"模型是否区分第几张图"。

方式一:拼接图像(共用一个<image>)

把所有图的 patch 张量首尾拼接,问题里只写一个<image>:

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() pixel_values = torch.cat((pixel_values1, pixel_values2), dim=0) question = '<image>\nDescribe the two images in detail.' response, history = model.chat( tokenizer, pixel_values, question, generation_config, history=None, return_history=True)

适合"请对比这两张图"这类整体描述任务。第二轮追问时无需再传图片,只需继续传history:

question = 'What are the similarities and differences between these two images.' response, history = model.chat( tokenizer, pixel_values, question, generation_config, history=history, return_history=True)

方式二:独立图像(Image-1: <image>+num_patches_list)

如果你希望模型明确知道"哪张是图 1、哪张是图 2",用编号占位符:

num_patches_list = [pixel_values1.size(0), pixel_values2.size(0)] question = 'Image-1: <image>\nImage-2: <image>\nDescribe the two images in detail.' response, history = model.chat( tokenizer, pixel_values, question, generation_config, num_patches_list=num_patches_list, history=None, return_history=True)

⚠️ 两个易踩的坑:

  1. num_patches_list必须与拼接顺序一致,且各元素之和必须等于pixel_values.shape[0],源码中有断言检查(modeling_internvl_chat.py);
  2. 后续每一轮都要继续传num_patches_list,否则模型会按错误的图片数量展开<IMG_CONTEXT>token。

💡load_image里的max_num=12控制动态高分辨率切片数(上限 12 块),图片细节多时可保留该值;纯视频帧建议设小(如max_num=1)以节省显存。

🎬 视频理解:抽帧 + 多轮追问

InternVL 用"抽帧当多图"的方式做视频理解。核心是两个工具函数(完整代码见 README.md Quick Start 部分):

  • get_index:按视频 fps 均匀抽取num_segments帧(默认 32 帧)
  • load_video:逐帧做动态切片预处理,返回pixel_values和每帧的num_patches_list

完整流程:

# 1. 抽 8 帧,每帧只切 1 块(视频帧不宜过大) video_path = './examples/red-panda.mp4' pixel_values, num_patches_list = load_video(video_path, num_segments=8, max_num=1) pixel_values = pixel_values.to(torch.bfloat16).cuda() # 2. 给每一帧编号,拼成"帧列表 + 问题" video_prefix = ''.join([f'Frame{i+1}: <image>\n' for i in range(len(num_patches_list))]) question = video_prefix + 'What is the red panda doing?' # 形如: Frame1: <image>\nFrame2: <image>\n...\nWhat is the red panda doing? # 3. 第一轮提问 response, history = model.chat( tokenizer, pixel_values, question, generation_config, num_patches_list=num_patches_list, history=None, return_history=True) # 4. 第二轮追问:同样要带 num_patches_list question = 'Describe this video in detail.' response, history = model.chat( tokenizer, pixel_values, question, generation_config, num_patches_list=num_patches_list, history=history, return_history=True)

调参经验:

参数建议说明
num_segments短视频 8,长视频 32帧数越多越贵,注意上下文窗口
max_num视频用 1视频帧通常不需要高分辨率切片
bound可选时间区间load_video(path, bound=(10, 20))只分析 10s–20s

🧠 进阶技巧:Thinking 模式与批量推理

开启 Thinking 模式:设置官方系统提示词,让模型先"思考"再回答,复杂多图/视频推理任务效果更佳。官方推荐配合do_sample=True和temperature=0.6,避免重复输出:

model.system_message = R1_SYSTEM_PROMPT # 见 README 中的完整提示词 generation_config = dict(max_new_tokens=1024, do_sample=True, temperature=0.6)

批量处理多张图:如果任务是"每张图各自回答一个问题"(不是多轮),改用model.batch_chat(源码见 modeling_internvl_chat.py):

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)

注意batch_chat不支持多轮(传history会直接抛NotImplementedError),多轮场景请坚持用model.chat。

🚀 生产部署建议

开发验证用transformers即可;上线服务推荐:

  • LMDeploy / vLLM:241B-A28B 版本记得设tp=8(张量并行 8 卡);多图会大幅增加输入 token,建议把session_len提到 32768 或更高
  • LMDeploy 多图对话同样用Image-1: <image>\nImage-2: <image>编号写法,多轮通过pipe.chat(..., session=sess)维持会话

📝 小结

场景关键做法
单图多轮history接龙,第二轮起pixel_values可传None
多图整体对比张量拼接 + 单个<image>
多图编号对比Image-N: <image>+num_patches_list(每轮都要传)
视频理解load_video抽帧 → 帧编号前缀 → 同多图机制
深度推理Thinking 模式 +do_sample=True, temperature=0.6

掌握chat/batch_chat两个接口和num_patches_list这一个关键参数,基本就解锁了 InternVL3_5-241B-A28B-Flash 的全部多模态玩法。更多示例与模型家族全表,欢迎直接翻阅 README.md。

【免费下载链接】InternVL3_5-241B-A28B-Flash

项目地址:https://ai.gitcode.com/OpenGVLab/InternVL3_5-241B-A28B-Flash
点击查看免费下载
上一篇:LiteIDE中使用Docker Compose:多容器Go应用开发
下一篇:Apache DataFusion CI缓存配置:依赖与测试结果

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

相关新闻

OpenCore Legacy Patcher 给老 Mac 装新 macOS 的 3 步实操

OpenCore Legacy Patcher 给老 Mac 装新 macOS 的 3 步实操

OpenCore Legacy Patcher 给老 Mac 装新 macOS 的 3 步实操 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 苹果停更之后&#xff0c;老 Intel Mac 其实还能用…

2026/10/20 1:29:00 阅读更多 →
STM32寄存器操作实战:从GPIO到串口的底层开发核心逻辑

STM32寄存器操作实战:从GPIO到串口的底层开发核心逻辑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:27:59 阅读更多 →
可重构超低功耗语音AI芯片:架构解析、功耗优化与落地实操指南

可重构超低功耗语音AI芯片:架构解析、功耗优化与落地实操指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:27:59 阅读更多 →

最新新闻

大模型Skills应用实战:在Trae中把提示词变成可复用工作流

大模型Skills应用实战:在Trae中把提示词变成可复用工作流

这个系列写到第14篇&#xff0c;我聊点真正能提效的东西——大模型Skills应用。之前几篇要么在讲模型能力边界&#xff0c;要么在讲上下文工程&#xff0c;这次把视角落到一个具体场景&#xff1a;在Trae这款AI原生IDE里&#xff0c;怎么把Skill从"听说过"变成"…

2026/10/20 2:53:45 阅读更多 →
PC端缩放布局不崩:clamp()、视口字号、防撑破与Grid弹性收缩

PC端缩放布局不崩:clamp()、视口字号、防撑破与Grid弹性收缩

做 Web 开发的人&#xff0c;十有八九都被一个场景折腾过&#xff1a;你在 PC 上写了个布局&#xff0c;看着还挺满意。结果用户那边把浏览器窗口拉窄一点&#xff0c;或者按了Ctrl 滚轮缩放一下&#xff0c;整个页面瞬间就没法看了——侧边栏把内容挤成一团、文字溢出到屏幕外…

2026/10/20 2:53:45 阅读更多 →
OpenCode技能机制详解:从SKILL.md设计到团队共享实战

OpenCode技能机制详解:从SKILL.md设计到团队共享实战

1. 这份折腾的前提&#xff1a;OpenCode是什么&#xff0c;技能解决的是什么问题先说清楚我为什么会去研究这个&#xff0c;因为市面上叫"技能"或"Skills"的AI功能太多了。几个月前我还在终端里同时开着几个不同的AI编程工具&#xff0c;来回粘贴代码上下文…

2026/10/20 2:53:45 阅读更多 →
基于YOLOv5的动态增强遥感小目标检测方案

基于YOLOv5的动态增强遥感小目标检测方案

做遥感图像目标检测的时候&#xff0c;有一类问题特别让人头疼&#xff1a;高分辨率遥感图里目标很小、分布密集&#xff0c;通用检测模型跑起来一看&#xff0c;漏检的全是那些只有几十像素甚至十几个像素的小目标。我最初直接用现成的一套检测框架去处理&#xff0c;效果始终…

2026/10/20 2:53:45 阅读更多 →
BEV感知数据工程:数据集选择、标定时序与真值对齐

BEV感知数据工程:数据集选择、标定时序与真值对齐

做BEV感知这块时间久了&#xff0c;会有个特别深的感受&#xff1a;模型结构只是面子&#xff0c;数据工程才是里子。我接触过的几个环视检测项目里&#xff0c;模型选型、backbone替换、多尺度融合&#xff0c;加起来可能只花一周&#xff1b;真正耗进去一个多月的&#xff0c…

2026/10/20 2:53:45 阅读更多 →
Spring Boot公益服务平台开发实战:从数据库建模到答辩全流程指南

Spring Boot公益服务平台开发实战:从数据库建模到答辩全流程指南

最近帮几个学弟学妹把基于Spring Boot的公益服务平台从零到一完整搭了一遍&#xff0c;整个过程走了不少弯路&#xff0c;也沉淀了不少可以直接复用的经验。这类系统在课程设计和毕业设计里出现频率很高&#xff0c;一是业务场景贴近生活&#xff0c;二是功能边界清晰——用户注…

2026/10/20 2:52:44 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →