模型概述
模型特點
模型能力
使用案例
🚀 InternVL3-8B
InternVL3-8B 是一款先進的多模態大語言模型,具備卓越的多模態感知和推理能力,能處理圖像、視頻等多模態數據,在工具使用、GUI 代理、工業圖像分析等領域表現出色。
Unsloth Dynamic 2.0 實現了卓越的準確性,性能優於其他領先的量化方法。
[🐱 GitHub] [📄 InternVL 1.0] [📄 InternVL 1.5] [📄 InternVL 2.5] [📄 InternVL2.5-MPO] [📄 InternVL3]
[📝 Blog] [💬 Chat Demo] [🤗 HF Demo] [🚀 Quick Start] [📚 Documents]

✨ 主要特性
- 卓越性能:相比 InternVL 2.5,InternVL3 展現出更出色的多模態感知和推理能力,將多模態能力拓展到工具使用、GUI 代理、工業圖像分析、3D 視覺感知等領域。
- 多語言支持:支持多種語言,具有更廣泛的應用場景。
- 高效訓練:採用原生多模態預訓練方法,將語言和視覺學習整合到一個預訓練階段,提高了模型處理視覺 - 語言任務的能力。
📦 安裝指南
文檔未提供具體安裝步驟,故跳過此章節。
💻 使用示例
基礎用法
import torch
from transformers import AutoTokenizer, AutoModel
path = "OpenGVLab/InternVL3-8B"
model = AutoModel.from_pretrained(
path,
torch_dtype=torch.bfloat16,
low_cpu_mem_usage=True,
use_flash_attn=True,
trust_remote_code=True).eval().cuda()
高級用法
BNB 8 - bit 量化
import torch
from transformers import AutoTokenizer, AutoModel
path = "OpenGVLab/InternVL3-8B"
model = AutoModel.from_pretrained(
path,
torch_dtype=torch.bfloat16,
load_in_8bit=True,
low_cpu_mem_usage=True,
use_flash_attn=True,
trust_remote_code=True).eval()
多 GPU 推理
import math
import torch
from transformers import AutoTokenizer, AutoModel
def split_model(model_name):
device_map = {}
world_size = torch.cuda.device_count()
config = AutoConfig.from_pretrained(model_path, trust_remote_code=True)
num_layers = config.llm_config.num_hidden_layers
# Since the first GPU will be used for ViT, treat it as half a GPU.
num_layers_per_gpu = math.ceil(num_layers / (world_size - 0.5))
num_layers_per_gpu = [num_layers_per_gpu] * world_size
num_layers_per_gpu[0] = math.ceil(num_layers_per_gpu[0] * 0.5)
layer_cnt = 0
for i, num_layer in enumerate(num_layers_per_gpu):
for j in range(num_layer):
device_map[f'language_model.model.layers.{layer_cnt}'] = i
layer_cnt += 1
device_map['vision_model'] = 0
device_map['mlp1'] = 0
device_map['language_model.model.tok_embeddings'] = 0
device_map['language_model.model.embed_tokens'] = 0
device_map['language_model.output'] = 0
device_map['language_model.model.norm'] = 0
device_map['language_model.model.rotary_emb'] = 0
device_map['language_model.lm_head'] = 0
device_map[f'language_model.model.layers.{num_layers - 1}'] = 0
return device_map
path = "OpenGVLab/InternVL3-8B"
device_map = split_model('InternVL3-8B')
model = AutoModel.from_pretrained(
path,
torch_dtype=torch.bfloat16,
low_cpu_mem_usage=True,
use_flash_attn=True,
trust_remote_code=True,
device_map=device_map).eval()
推理示例
import math
import numpy as np
import torch
import torchvision.transforms as T
from decord import VideoReader, cpu
from PIL import Image
from torchvision.transforms.functional import InterpolationMode
from transformers import AutoModel, AutoTokenizer
IMAGENET_MEAN = (0.485, 0.456, 0.406)
IMAGENET_STD = (0.229, 0.224, 0.225)
def build_transform(input_size):
MEAN, STD = IMAGENET_MEAN, IMAGENET_STD
transform = T.Compose([
T.Lambda(lambda img: img.convert('RGB') if img.mode != 'RGB' else img),
T.Resize((input_size, input_size), interpolation=InterpolationMode.BICUBIC),
T.ToTensor(),
T.Normalize(mean=MEAN, std=STD)
])
return transform
def find_closest_aspect_ratio(aspect_ratio, target_ratios, width, height, image_size):
best_ratio_diff = float('inf')
best_ratio = (1, 1)
area = width * height
for ratio in target_ratios:
target_aspect_ratio = ratio[0] / ratio[1]
ratio_diff = abs(aspect_ratio - target_aspect_ratio)
if ratio_diff < best_ratio_diff:
best_ratio_diff = ratio_diff
best_ratio = ratio
elif ratio_diff == best_ratio_diff:
if area > 0.5 * image_size * image_size * ratio[0] * ratio[1]:
best_ratio = ratio
return best_ratio
def dynamic_preprocess(image, min_num=1, max_num=12, image_size=448, use_thumbnail=False):
orig_width, orig_height = image.size
aspect_ratio = orig_width / orig_height
# calculate the existing image aspect ratio
target_ratios = set(
(i, j) for n in range(min_num, max_num + 1) for i in range(1, n + 1) for j in range(1, n + 1) if
i * j <= max_num and i * j >= min_num)
target_ratios = sorted(target_ratios, key=lambda x: x[0] * x[1])
# find the closest aspect ratio to the target
target_aspect_ratio = find_closest_aspect_ratio(
aspect_ratio, target_ratios, orig_width, orig_height, image_size)
# calculate the target width and height
target_width = image_size * target_aspect_ratio[0]
target_height = image_size * target_aspect_ratio[1]
blocks = target_aspect_ratio[0] * target_aspect_ratio[1]
# resize the image
resized_img = image.resize((target_width, target_height))
processed_images = []
for i in range(blocks):
box = (
(i % (target_width // image_size)) * image_size,
(i // (target_width // image_size)) * image_size,
((i % (target_width // image_size)) + 1) * image_size,
((i // (target_width // image_size)) + 1) * image_size
)
# split the image
split_img = resized_img.crop(box)
processed_images.append(split_img)
assert len(processed_images) == blocks
if use_thumbnail and len(processed_images) != 1:
thumbnail_img = image.resize((image_size, image_size))
processed_images.append(thumbnail_img)
return processed_images
def load_image(image_file, input_size=448, max_num=12):
image = Image.open(image_file).convert('RGB')
📚 詳細文檔
模型概述
我們推出了 InternVL3,這是一系列先進的多模態大語言模型(MLLM),展現出卓越的整體性能。與 InternVL 2.5 相比,InternVL3 具有更出色的多模態感知和推理能力,並將多模態能力進一步擴展到工具使用、GUI 代理、工業圖像分析、3D 視覺感知等領域。此外,我們還將 InternVL3 與 Qwen2.5 聊天模型進行了比較,Qwen2.5 對應的預訓練基礎模型被用作 InternVL3 語言組件的初始化。得益於原生多模態預訓練,InternVL3 系列在整體文本性能上甚至優於 Qwen2.5 系列。
InternVL3 家族
模型名稱 | 視覺部分 | 語言部分 | HF 鏈接 |
---|---|---|---|
InternVL3 - 1B | [InternViT - 300M - 448px - V2_5](https://huggingface.co/OpenGVLab/InternViT - 300M - 448px - V2_5) | [Qwen2.5 - 0.5B](https://huggingface.co/Qwen/Qwen2.5 - 0.5B) | [🤗 link](https://huggingface.co/OpenGVLab/InternVL3 - 1B) |
InternVL3 - 2B | [InternViT - 300M - 448px - V2_5](https://huggingface.co/OpenGVLab/InternViT - 300M - 448px - V2_5) | [Qwen2.5 - 1.5B](https://huggingface.co/Qwen/Qwen2.5 - 1.5B) | [🤗 link](https://huggingface.co/OpenGVLab/InternVL3 - 2B) |
InternVL3 - 8B | [InternViT - 300M - 448px - V2_5](https://huggingface.co/OpenGVLab/InternViT - 300M - 448px - V2_5) | [Qwen2.5 - 7B](https://huggingface.co/Qwen/Qwen2.5 - 7B) | [🤗 link](https://huggingface.co/OpenGVLab/InternVL3 - 8B) |
InternVL3 - 9B | [InternViT - 300M - 448px - V2_5](https://huggingface.co/OpenGVLab/InternViT - 300M - 448px - V2_5) | [internlm3 - 8b - instruct](https://huggingface.co/internlm/internlm3 - 8b - instruct) | [🤗 link](https://huggingface.co/OpenGVLab/InternVL3 - 9B) |
InternVL3 - 14B | [InternViT - 300M - 448px - V2_5](https://huggingface.co/OpenGVLab/InternViT - 300M - 448px - V2_5) | [Qwen2.5 - 14B](https://huggingface.co/Qwen/Qwen2.5 - 14B) | [🤗 link](https://huggingface.co/OpenGVLab/InternVL3 - 14B) |
InternVL3 - 38B | [InternViT - 6B - 448px - V2_5](https://huggingface.co/OpenGVLab/InternViT - 6B - 448px - V2_5) | [Qwen2.5 - 32B](https://huggingface.co/Qwen/Qwen2.5 - 32B) | [🤗 link](https://huggingface.co/OpenGVLab/InternVL3 - 38B) |
InternVL3 - 78B | [InternViT - 6B - 448px - V2_5](https://huggingface.co/OpenGVLab/InternViT - 6B - 448px - V2_5) | [Qwen2.5 - 72B](https://huggingface.co/Qwen/Qwen2.5 - 72B) | [🤗 link](https://huggingface.co/OpenGVLab/InternVL3 - 78B) |
模型架構
如下圖所示,[InternVL3](https://internvl.github.io/blog/2025 - 04 - 11 - InternVL - 3/) 保留了與 [InternVL 2.5](https://internvl.github.io/blog/2024 - 12 - 05 - InternVL - 2.5/) 及其前身 InternVL 1.5 和 2.0 相同的模型架構,遵循 “ViT - MLP - LLM” 範式。在這個新版本中,我們使用隨機初始化的 MLP 投影器,將新的增量預訓練的 InternViT 與各種預訓練的大語言模型(LLM)集成,包括 InternLM 3 和 Qwen 2.5。
與之前的版本一樣,我們應用了像素重排操作,將視覺標記的數量減少到原來的四分之一。此外,我們採用了與 InternVL 1.5 類似的動態分辨率策略,將圖像分割成 448×448 像素的圖塊。從 InternVL 2.0 開始,主要的區別在於我們額外引入了對多圖像和視頻數據的支持。
值得注意的是,在 InternVL3 中,我們集成了 可變視覺位置編碼(V2PE),它為視覺標記使用更小、更靈活的位置增量。得益於 V2PE,InternVL3 與其前身相比,表現出更好的長上下文理解能力。
訓練策略
原生多模態預訓練
我們提出了一種 原生多模態預訓練 方法,將語言和視覺學習整合到一個預訓練階段。與先訓練一個僅處理語言的模型,然後再將其調整以處理其他模態的標準範式不同,我們的方法將多模態數據(如圖文、視頻 - 文本或圖文交錯序列)與大規模文本語料庫交織在一起。這種統一的訓練方案使模型能夠同時學習語言和多模態表示,最終提高其處理視覺 - 語言任務的能力,而無需單獨的對齊或橋接模塊。更多細節請參閱 我們的論文。
監督微調
在這個階段,InternVL2.5 中提出的隨機 JPEG 壓縮、平方損失重新加權和多模態數據打包技術也被應用於 InternVL3 系列。與 InternVL2.5 相比,InternVL3 在監督微調階段的主要進步在於使用了更高質量和更多樣化的訓練數據。具體來說,我們進一步擴展了工具使用、3D 場景理解、GUI 操作、長上下文任務、視頻理解、科學圖表、創意寫作和多模態推理的訓練樣本。
混合偏好優化
在預訓練和監督微調期間,模型根據之前的真實標記來預測下一個標記。然而,在推理期間,模型根據自己的先前輸出預測每個標記。真實標記和模型預測標記之間的這種差異引入了分佈偏移,這可能會損害模型的思維鏈(CoT)推理能力。為了緩解這個問題,我們採用了 MPO,它引入了來自正樣本和負樣本的額外監督,以使模型響應分佈與真實分佈對齊,從而提高推理性能。具體來說,MPO 的訓練目標是偏好損失 \(\mathcal{L}{\text{p}}\)、質量損失 \(\mathcal{L}{\text{q}}\) 和生成損失 \(\mathcal{L}_{\text{g}}\) 的組合,可以表述如下:
$$ \mathcal{L}=w_{p}\cdot\mathcal{L}{\text{p}} + w{q}\cdot\mathcal{L}{\text{q}} + w{g}\cdot\mathcal{L}_{\text{g}}, $$
其中 \(w_{*}\) 表示每個損失組件的權重。有關 MPO 的更多詳細信息,請參閱 我們的論文。
測試時縮放
測試時縮放已被證明是提高大語言模型(LLM)和多模態大語言模型(MLLM)推理能力的有效方法。在這項工作中,我們使用 “Best - of - N” 評估策略,並採用 [VisualPRM - 8B](https://huggingface.co/OpenGVLab/VisualPRM - 8B) 作為評估模型,為推理和數學評估選擇最佳響應。
評估指標
多模態能力評估
包括多模態推理和數學、OCR、圖表和文檔理解、多圖像和現實世界理解、綜合多模態和幻覺評估、視覺定位、多模態多語言理解、視頻理解、GUI 定位和空間推理等方面的評估。
語言能力評估
我們將 InternVL3 與 Qwen2.5 聊天模型進行了比較,Qwen2.5 對應的預訓練基礎模型被用作 InternVL3 語言組件的初始化。得益於原生多模態預訓練,InternVL3 系列在整體文本性能上甚至優於 Qwen2.5 系列。請注意,Qwen2.5 系列的評估分數可能與官方報告的分數不同,因為我們在所有數據集上都採用了表中提供的提示版本進行 OpenCompass 評估。
消融實驗
原生多模態預訓練
我們在 InternVL2 - 8B 模型上進行了實驗,同時保持其架構、初始化參數和訓練數據完全不變。傳統上,InternVL2 - 8B 採用的訓練流程是先進行 MLP 預熱階段以進行特徵對齊,然後進行指令調優階段。在我們的實驗中,我們用原生多模態預訓練過程取代了傳統的 MLP 預熱階段。這種修改隔離了原生多模態預訓練對模型整體多模態能力的貢獻。
下圖的評估結果表明,採用原生多模態預訓練的模型在大多數基準測試中的性能與經過完整多階段訓練的 InternVL2 - 8B 基線相當。此外,在更高質量的數據上進行指令調優後,該模型在評估的多模態任務中表現出進一步的性能提升。這些發現強調了原生多模態預訓練在賦予多模態大語言模型強大多模態能力方面的效率。
混合偏好優化
如下表所示,與未使用 MPO 進行微調的模型相比,使用 MPO 進行微調的模型在七個多模態推理基準測試中表現出更出色的推理性能。具體來說,InternVL3 - 78B 和 InternVL3 - 38B 分別比其對應模型高出 4.1 和 4.5 分。值得注意的是,用於 MPO 的訓練數據是用於監督微調(SFT)的數據的子集,這表明性能提升主要源於訓練算法而非訓練數據。
可變視覺位置編碼
如下表所示,引入 V2PE 導致大多數評估指標的性能顯著提升。此外,我們通過改變位置增量 \( \delta \) 進行的消融實驗表明,即使對於主要涉及傳統上下文的任務,相對較小的 \( \delta \) 值也能實現最佳性能。這些發現為未來改進多模態大語言模型中視覺標記的位置編碼策略提供了重要見解。
🔧 技術細節
模型架構
- ViT - MLP - LLM 範式:遵循該範式,將視覺、特徵投影和語言處理模塊結合。
- 像素重排操作:減少視覺標記數量,提高處理效率。
- 動態分辨率策略:將圖像分割成固定大小的圖塊,適應不同圖像尺寸。
- 可變視覺位置編碼(V2PE):使用更小、更靈活的位置增量,提升長上下文理解能力。
訓練方法
- 原生多模態預訓練:整合語言和視覺學習,提高多模態處理能力。
- 監督微調:使用高質量和多樣化的訓練數據,提升模型性能。
- 混合偏好優化(MPO):引入額外監督,減少分佈偏移,提高推理性能。
- 測試時縮放:採用 “Best - of - N” 策略和評估模型,提升推理能力。
📄 許可證
本項目採用 [Apache - 2.0](https://huggingface.co/Qwen/Qwen2.5 - 72B - Instruct/blob/main/LICENSE) 許可證。
屬性 | 詳情 |
---|---|
模型類型 | 多模態大語言模型(MLLM) |
訓練數據 | 包括圖文、視頻 - 文本等多模態數據以及大規模文本語料庫 |
⚠️ 重要提示
請使用 transformers>=4.37.2 以確保模型正常工作。
💡 使用建議
在進行多 GPU 推理時,確保大語言模型(LLM)的第一層和最後一層在同一設備上,以避免因張量不在同一設備而導致的錯誤。










