☰
如何用InternVL3-2B-AWQ做图像问答:从单图描述到多轮对话的5个实用示例
2026/10/17 5:59:19 网站建设 项目流程

【免费下载链接】InternVL3-2B-AWQ

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

📷InternVL3-2B-AWQ是一款轻量级多模态大语言模型(MLLM)的 4-bit AWQ 量化版本,专为图像问答、单图描述、多图对比和多轮对话场景设计。它由视觉编码器 InternViT、MLP 投影器和语言模型 Qwen2.5-1.5B 组成(遵循 ViT-MLP-LLM 架构),AWQ 量化让它在显存占用大幅降低的同时保留接近全精度的图像理解能力。本文用 5 个实用示例,带你从"单图一句话描述"一步步走到"多图多轮对话",全程只需 transformers 和几行 Python 代码。

一、为什么选 InternVL3-2B-AWQ 做图像问答

特性说明
💾 AWQ 4-bit 量化bits=4, group_size=128,显存占用约为 16-bit 版本的 1/4
🖼️ 动态分辨率图像按 448×448 切片,最多支持 12 块 + 缩略图
🗣️ 多轮对话通过history参数维护上下文
🌐 多模态能力支持单图、多图、视频帧问答

在 config.json 中可以看到关键量化配置:

"quantization_config": { "bits": 4, "group_size": 128, "quant_method": "awq" }

对话模板由 conversation.py 提供(模板名为internvl2_5),而对话入口chat()方法定义在 modeling_internvl_chat.py 中。

二、快速加载模型:一段代码跑起来

使用transformers>=4.37.2,加载 AWQ 量化版本只需几行:

import torch from transformers import AutoTokenizer, AutoModel model = AutoModel.from_pretrained( "OpenGVLab/InternVL3-2B-AWQ", torch_dtype=torch.bfloat16, low_cpu_mem_usage=True, use_safetensors=True, trust_remote_code=True).eval().cuda() tokenizer = AutoTokenizer.from_pretrained( "OpenGVLab/InternVL3-2B-AWQ", trust_remote_code=True, use_fast=False)

💡 加载前请确认已安装autoawq与transformers,否则量化权重无法正确加载。

图像预处理逻辑(动态切片 + 448px 归一化)可在 README 的 Quick Start 一节找到,归一化均值/方差与 preprocessor_config.json 保持一致:

"image_mean": [0.485, 0.456, 0.406], "image_std": [0.229, 0.224, 0.225], "size": 448

下面所有示例都会复用load_image()(负责把图片切成 tile 并转成pixel_values)和统一的生成配置:

generation_config = dict(max_new_tokens=1024, do_sample=True)

三、5 个实用示例:从单图描述到多轮对话

示例 1:单图简要描述——最基础的图像问答

把图片转成pixel_values,再在问题里加上<image>占位符,模型就会自动"看图说话":

pixel_values = load_image('./examples/image1.jpg', max_num=12).to(torch.bfloat16).cuda() question = '<image>\nPlease describe the image shortly.' response = model.chat(tokenizer, pixel_values, question, generation_config) print(f'User: {question}\nAssistant: {response}')

📌要点:<image>占位符会被替换为视觉 token(<img><IMG_CONTEXT>...</IMG_CONTEXT></img>),替换逻辑见 modeling_internvl_chat.py。如果问题里没写<image>,chat()方法会自动在开头补上。

示例 2:单图多轮对话——围绕同一张图连续追问

多轮对话的关键是return_history=True:它会返回上文的(question, response)列表,下一轮直接传入即可。

# 第一轮:详细描述 question = '<image>\nPlease describe the image in detail.' response, history = model.chat( tokenizer, pixel_values, question, generation_config, history=None, return_history=True) print(f'User: {question}\nAssistant: {response}') # 第二轮:基于同一张图写一首诗(复用 history) question = 'Please write a poem according to the image.' response, history = model.chat( tokenizer, pixel_values, question, generation_config, history=history, return_history=True) print(f'User: {question}\nAssistant: {response}')

💬 第二轮提问里不需要再重复<image>——历史上下文里已经带着图片信息了。历史拼接逻辑在 modeling_internvl_chat.py 中实现。

示例 3:多图拼接对比——一次看懂两张图

把两张图的 tile 沿第 0 维拼接,用一个<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) print(f'User: {question}\nAssistant: {response}') # 追问两图的异同 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) print(f'User: {question}\nAssistant: {response}')

示例 4:独立多图对话——分别描述、再跨图比较

与示例 3 不同,这里用两个<image>占位符,并传入num_patches_list告诉模型每张图各占多少 tile:

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) print(f'User: {question}\nAssistant: {response}') question = 'What are the similarities and differences between these two images.' response, history = model.chat( tokenizer, pixel_values, question, generation_config, num_patches_list=num_patches_list, history=history, return_history=True) print(f'User: {question}\nAssistant: {response}')

🔍什么时候用哪种?想让模型把多图当"一张拼图"整体理解时用示例 3;想让模型分清"图 1 说了什么、图 2 说了什么"再做比较时用示例 4。

示例 5:批量图片问答——一次处理多张图

需要处理一批图片时,用batch_chat()一次性推理,比循环调用快得多。它要求传入num_patches_list和与之一一对应的questions列表:

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()不支持多轮对话(见 modeling_internvl_chat.py 中的NotImplementedError检查),需要多轮请回到chat()。

四、参数调优与进阶技巧

参数作用建议值
max_num单图最多切分 tile 数普通照片 4~6,细节图 12
max_new_tokens最大生成长度描述类 256~512,推理类 1024
do_sample是否采样创作类True,问答类False更稳定
num_patches_list每张图 tile 数列表独立多图时必填

📖 更多用法(视频多轮对话、流式输出TextIteratorStreamer、LMDeploy 部署)可参考 README.md 的Inference with Transformers与Streaming Output两节;多卡部署可用 README 中的split_model()方案把 ViT 和 LLM 分层放置。

五、常见问题速查

Q1:加载时提示 AWQ 相关 ImportError?先安装依赖:pip install autoawq transformers>=4.37.2,并确认 GPU 支持。

Q2:回答里图片信息丢失?检查问题中是否包含<image>(独立多图模式需要与num_patches_list对应数量的占位符),且pixel_values的总行数等于sum(num_patches_list)(断言见 modeling_internvl_chat.py)。

Q3:显存不够怎么办?AWQ 版本已量化到 4-bit,是 2B 系列中最省显存的形态;仍紧张时可降低max_num(减少 tile 数)或改用 8-bit 方案对比效果。

Q4:多轮对话第二轮后上下文越来越长?可手动裁剪history只保留最近几轮,或在一轮结束后把history置空重新开始。


掌握以上 5 个示例后,你已能覆盖绝大多数图像问答场景:单图描述、围绕单图的多轮追问、多图拼接对比、独立多图比较,以及批量图片处理。InternVL3-2B-AWQ 的小巧体积 + AWQ 量化,让它成为在消费级显卡上落地多模态应用的理想选择,动手试试吧!🚀

【免费下载链接】InternVL3-2B-AWQ

项目地址:https://ai.gitcode.com/OpenGVLab/InternVL3-2B-AWQ
点击查看免费下载
上一篇:Apache DataFusion查询优先级抢占机制:实现细节
下一篇:10分钟装好Buzz:本地离线语音转文字完整指南

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

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

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

立即咨询