AI SeedbankHelp preserve open and free AI for humanity's future

← All models

OpenGVLab_InternVL2-2B

OpenGVLab · View on Hugging Face ↗

Get this model

Download TorrentMagnet Link

Seeders: 2 · Leechers: 0

Observed 2026-09-05T20:48:33Z across trackers.

Model card

The complete upstream card, rendered from this payload's README.md — the same hash-verified bytes the torrent distributes. Images and off-site links are removed; the original card on Hugging Face carries them.


license: mit pipeline_tag: image-text-to-text library_name: transformers base_model:

  • OpenGVLab/InternViT-300M-448px
  • internlm/internlm2-chat-1_8b new_version: OpenGVLab/InternVL2_5-2B base_model_relation: merge language:
  • multilingual tags:
  • internvl
  • custom_code

InternVL2-2B

[📂 GitHub] [📜 InternVL 1.0] [📜 InternVL 1.5] [📜 Mini-InternVL] [📜 InternVL 2.5]

[🆕 Blog] [🗨️ Chat Demo] [🤗 HF Demo] [🚀 Quick Start] [📖 Documents]

Introduction

We are excited to announce the release of InternVL 2.0, the latest addition to the InternVL series of multimodal large language models. InternVL 2.0 features a variety of instruction-tuned models, ranging from 1 billion to 108 billion parameters. This repository contains the instruction-tuned InternVL2-2B model.

Compared to the state-of-the-art open-source multimodal large language models, InternVL 2.0 surpasses most open-source models. It demonstrates competitive performance on par with proprietary commercial models across various capabilities, including document and chart comprehension, infographics QA, scene text understanding and OCR tasks, scientific and mathematical problem solving, as well as cultural understanding and integrated multimodal capabilities.

InternVL 2.0 is trained with an 8k context window and utilizes training data consisting of long texts, multiple images, and videos, significantly improving its ability to handle these types of inputs compared to InternVL 1.5. For more details, please refer to our blog and GitHub.

Model Name Vision Part Language Part HF Link MS Link
InternVL2-1B InternViT-300M-448px Qwen2-0.5B-Instruct 🤗 link 🤖 link
InternVL2-2B InternViT-300M-448px internlm2-chat-1_8b 🤗 link 🤖 link
InternVL2-4B InternViT-300M-448px Phi-3-mini-128k-instruct 🤗 link 🤖 link
InternVL2-8B InternViT-300M-448px internlm2_5-7b-chat 🤗 link 🤖 link
InternVL2-26B InternViT-6B-448px-V1-5 internlm2-chat-20b 🤗 link 🤖 link
InternVL2-40B InternViT-6B-448px-V1-5 Nous-Hermes-2-Yi-34B 🤗 link 🤖 link
InternVL2-Llama3-76B InternViT-6B-448px-V1-5 Hermes-2-Theta-Llama-3-70B 🤗 link 🤖 link

Model Details

InternVL 2.0 is a multimodal large language model series, featuring models of various sizes. For each size, we release instruction-tuned models optimized for multimodal tasks. InternVL2-2B consists of InternViT-300M-448px, an MLP projector, and internlm2-chat-1_8b.

Performance

Image Benchmarks

Benchmark PaliGemma-3B Mini-InternVL-2B-1-5 InternVL2-2B
Model Size 2.9B 2.2B 2.2B
DocVQAtest - 85.0 86.9
ChartQAtest - 74.8 76.2
InfoVQAtest - 55.4 58.9
TextVQAval 68.1 70.5 73.4
OCRBench 614 654 784
MMEsum 1686.1 1901.5 1876.8
RealWorldQA 55.2 57.9 57.3
AI2Dtest 68.3 69.8 74.1
MMMUval 34.9 37.4 36.3
MMBench-ENtest 71.0 70.9 73.2
MMBench-CNtest 63.6 66.2 70.9
CCBenchdev 29.6 63.5 74.7
MMVetGPT-4-0613 - 39.3 44.6
MMVetGPT-4-Turbo 33.1 35.5 39.5
SEED-Image 69.6 69.8 71.6
HallBenchavg 32.2 37.5 37.9
MathVistatestmini 28.7 41.1 46.3
OpenCompassavg 46.6 49.8 54.0
  • For more details and evaluation reproduction, please refer to our Evaluation Guide.

  • We simultaneously use InternVL and VLMEvalKit repositories for model evaluation. Specifically, the results reported for DocVQA, ChartQA, InfoVQA, TextVQA, MME, AI2D, MMBench, CCBench, MMVet (GPT-4-0613), and SEED-Image were tested using the InternVL repository. MMMU, OCRBench, RealWorldQA, HallBench, MMVet (GPT-4-Turbo), and MathVista were evaluated using the VLMEvalKit.

Video Benchmarks

Benchmark VideoChat2-Phi3 VideoChat2-HD-Mistral Mini-InternVL-2B-1-5 InternVL2-2B
Model Size 4B 7B 2.2B 2.2B
MVBench 55.1 60.4 37.0 60.2
MMBench-Video8f - - 0.99 0.97
MMBench-Video16f - - 1.04 1.03
Video-MME
w/o subs
- 42.3 42.9 45.0
Video-MME
w subs
- 54.6 44.7 47.3
  • We evaluate our models on MVBench and Video-MME by extracting 16 frames from each video, and each frame was resized to a 448x448 image.

Grounding Benchmarks

Model avg. RefCOCO
(val)
RefCOCO
(testA)
RefCOCO
(testB)
RefCOCO+
(val)
RefCOCO+
(testA)
RefCOCO+
(testB)
RefCOCO‑g
(val)
RefCOCO‑g
(test)
UNINEXT-H
(Specialist SOTA)
88.9 92.6 94.3 91.5 85.2 89.6 79.8 88.7 89.4
Mini-InternVL-
Chat-2B-V1-5
75.8 80.7 86.7 72.9 72.5 82.3 60.8 75.6 74.9
Mini-InternVL-
Chat-4B-V1-5
84.4 88.0 91.4 83.5 81.5 87.4 73.8 84.7 84.6
InternVL‑Chat‑V1‑5 88.8 91.4 93.7 87.1 87.0 92.3 80.9 88.5 89.3
InternVL2‑1B 79.9 83.6 88.7 79.8 76.0 83.6 67.7 80.2 79.9
InternVL2‑2B 77.7 82.3 88.2 75.9 73.5 82.8 63.3 77.6 78.3
InternVL2‑4B 84.4 88.5 91.2 83.9 81.2 87.2 73.8 84.6 84.6
InternVL2‑8B 82.9 87.1 91.1 80.7 79.8 87.9 71.4 82.7 82.7
InternVL2‑26B 88.5 91.2 93.3 87.4 86.8 91.0 81.2 88.5 88.6
InternVL2‑40B 90.3 93.0 94.7 89.2 88.5 92.8 83.6 90.3 90.6
InternVL2-
Llama3‑76B
90.0 92.2 94.8 88.4 88.8 93.1 82.8 89.5 90.3
  • We use the following prompt to evaluate InternVL's grounding ability: Please provide the bounding box coordinates of the region this sentence describes: <ref>{}</ref>

Limitations: Although we have made efforts to ensure the safety of the model during the training process and to encourage the model to generate text that complies with ethical and legal requirements, the model may still produce unexpected outputs due to its size and probabilistic generation paradigm. For example, the generated responses may contain biases, discrimination, or other harmful content. Please do not propagate such content. We are not responsible for any consequences resulting from the dissemination of harmful information.

Quick Start

We provide an example code to run InternVL2-2B using transformers.

Please use transformers>=4.37.2 to ensure the model works normally.

Model Loading

16-bit (bf16 / fp16)

import torch
from transformers import AutoTokenizer, AutoModel
path = "OpenGVLab/InternVL2-2B"
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 Quantization

import torch
from transformers import AutoTokenizer, AutoModel
path = "OpenGVLab/InternVL2-2B"
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()

BNB 4-bit Quantization

import torch
from transformers import AutoTokenizer, AutoModel
path = "OpenGVLab/InternVL2-2B"
model = AutoModel.from_pretrained(
    path,
    torch_dtype=torch.bfloat16,
    load_in_4bit=True,
    low_cpu_mem_usage=True,
    use_flash_attn=True,
    trust_remote_code=True).eval()

Multiple GPUs

The reason for writing the code this way is to avoid errors that occur during multi-GPU inference due to tensors not being on the same device. By ensuring that the first and last layers of the large language model (LLM) are on the same device, we prevent such errors.

import math
import torch
from transformers import AutoTokenizer, AutoModel

def split_model(model_name):
    device_map = {}
    world_size = torch.cuda.device_count()
    num_layers = {
        'InternVL2-1B': 24, 'InternVL2-2B': 24, 'InternVL2-4B': 32, 'InternVL2-8B': 32,
        'InternVL2-26B': 48, 'InternVL2-40B': 60, 'InternVL2-Llama3-76B': 80}[model_name]
    # 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/InternVL2-2B"
device_map = split_model('InternVL2-2B')
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()

Inference with Transformers

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')
    transform = build_transform(input_size=input_size)
    images = dynamic_preprocess(image, image_size=input_size, use_thumbnail=True, max_num=max_num)
    pixel_values = [transform(image) for image in images]
    pixel_values = torch.stack(pixel_values)
    return pixel_values

# If you want to load a model using multiple GPUs, please refer to the `Multiple GPUs` section.
path = 'OpenGVLab/InternVL2-2B'
model = AutoModel.from_pretrained(
    path,
    torch_dtype=torch.bfloat16,
    low_cpu_mem_usage=True,
    use_flash_attn=True,
    trust_remote_code=True).eval().cuda()
tokenizer = AutoTokenizer.from_pretrained(path, trust_remote_code=True, use_fast=False)

# set the max number of tiles in `max_num`
pixel_values = load_image('./examples/image1.jpg', max_num=12).to(torch.bfloat16).cuda()
generation_config = dict(max_new_tokens=1024, do_sample=True)

# pure-text conversation (纯文本对话)
question = 'Hello, who are you?'
response, history = model.chat(tokenizer, None, question, generation_config, history=None, return_history=True)
print(f'User: {question}\nAssistant: {response}')

question = 'Can you tell me a story?'
response, history = model.chat(tokenizer, None, question, generation_config, history=history, return_history=True)
print(f'User: {question}\nAssistant: {response}')

# single-image single-round conversation (单图单轮对话)
question = '<image>\nPlease describe the image shortly.'
response = model.chat(tokenizer, pixel_values, question, generation_config)
print(f'User: {question}\nAssistant: {response}')

# single-image multi-round conversation (单图多轮对话)
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}')

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}')

# multi-image multi-round conversation, combined images (多图多轮对话,拼接图像)
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}')

# multi-image multi-round conversation, separate images (多图多轮对话,独立图像)
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)
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}')

# batch inference, single image per sample (单图批处理)
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()
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}')

# video multi-round conversation (视频多轮对话)
def get_index(bound, fps, max_frame, first_idx=0, num_segments=32):
    if bound:
        start, end = bound[0], bound[1]
    else:
        start, end = -100000, 100000
    start_idx = max(first_idx, round(start * fps))
    end_idx = min(round(end * fps), max_frame)
    seg_size = float(end_idx - start_idx) / num_segments
    frame_indices = np.array([
        int(start_idx + (seg_size / 2) + np.round(seg_size * idx))
        for idx in range(num_segments)
    ])
    return frame_indices

def load_video(video_path, bound=None, input_size=448, max_num=1, num_segments=32):
    vr = VideoReader(video_path, ctx=cpu(0), num_threads=1)
    max_frame = len(vr) - 1
    fps = float(vr.get_avg_fps())

    pixel_values_list, num_patches_list = [], []
    transform = build_transform(input_size=input_size)
    frame_indices = get_index(bound, fps, max_frame, first_idx=0, num_segments=num_segments)
    for frame_index in frame_indices:
        img = Image.fromarray(vr[frame_index].asnumpy()).convert('RGB')
        img = dynamic_preprocess(img, image_size=input_size, use_thumbnail=True, max_num=max_num)
        pixel_values = [transform(tile) for tile in img]
        pixel_values = torch.stack(pixel_values)
        num_patches_list.append(pixel_values.shape[0])
        pixel_values_list.append(pixel_values)
    pixel_values = torch.cat(pixel_values_list)
    return pixel_values, num_patches_list

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()
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...\nFrame8: <image>\n{question}
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 = '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)
print(f'User: {question}\nAssistant: {response}')

Streaming Output

Besides this method, you can also use the following code to get streamed output.

from transformers import TextIteratorStreamer
from threading import Thread

# Initialize the streamer
streamer = TextIteratorStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True, timeout=10)
# Define the generation configuration
generation_config = dict(max_new_tokens=1024, do_sample=False, streamer=streamer)
# Start the model chat in a separate thread
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()

# Initialize an empty string to store the generated text
generated_text = ''
# Loop through the streamer to get the new text as it is generated
for new_text in streamer:
    if new_text == model.conv_template.sep:
        break
    generated_text += new_text
    print(new_text, end='', flush=True)  # Print each new chunk of generated text on the same line

Finetune

Many repositories now support fine-tuning of the InternVL series models, including InternVL, SWIFT, XTurner, and others. Please refer to their documentation for more details on fine-tuning.

Deployment

LMDeploy

LMDeploy is a toolkit for compressing, deploying, and serving LLMs & VLMs.

pip install lmdeploy>=0.5.3

LMDeploy abstracts the complex inference process of multi-modal Vision-Language Models (VLM) into an easy-to-use pipeline, similar to the Large Language Model (LLM) inference pipeline.

A 'Hello, world' Example

from lmdeploy import pipeline, TurbomindEngineConfig
from lmdeploy.vl import load_image

model = 'OpenGVLab/InternVL2-2B'
image = load_image('https://raw.githubusercontent.com/open-mmlab/mmdeploy/main/tests/data/tiger.jpeg')
pipe = pipeline(model, backend_config=TurbomindEngineConfig(session_len=8192))
response = pipe(('describe this image', image))
print(response.text)

If ImportError occurs while executing this case, please install the required dependency packages as prompted.

Multi-images Inference

When dealing with multiple images, you can put them all in one list. Keep in mind that multiple images will lead to a higher number of input tokens, and as a result, the size of the context window typically needs to be increased.

Warning: Due to the scarcity of multi-image conversation data, the performance on multi-image tasks may be unstable, and it may require multiple attempts to achieve satisfactory results.

from lmdeploy import pipeline, TurbomindEngineConfig
from lmdeploy.vl import load_image
from lmdeploy.vl.constants import IMAGE_TOKEN

model = 'OpenGVLab/InternVL2-2B'
pipe = pipeline(model, backend_config=TurbomindEngineConfig(session_len=8192))

image_urls=[
    'https://raw.githubusercontent.com/open-mmlab/mmdeploy/main/demo/resources/human-pose.jpg',
    'https://raw.githubusercontent.com/open-mmlab/mmdeploy/main/demo/resources/det.jpg'
]

images = [load_image(img_url) for img_url in image_urls]
# Numbering images improves multi-image conversations
response = pipe((f'Image-1: {IMAGE_TOKEN}\nImage-2: {IMAGE_TOKEN}\ndescribe these two images', images))
print(response.text)

Batch Prompts Inference

Conducting inference with batch prompts is quite straightforward; just place them within a list structure:

from lmdeploy import pipeline, TurbomindEngineConfig
from lmdeploy.vl import load_image

model = 'OpenGVLab/InternVL2-2B'
pipe = pipeline(model, backend_config=TurbomindEngineConfig(session_len=8192))

image_urls=[
    "https://raw.githubusercontent.com/open-mmlab/mmdeploy/main/demo/resources/human-pose.jpg",
    "https://raw.githubusercontent.com/open-mmlab/mmdeploy/main/demo/resources/det.jpg"
]
prompts = [('describe this image', load_image(img_url)) for img_url in image_urls]
response = pipe(prompts)
print(response)

Multi-turn Conversation

There are two ways to do the multi-turn conversations with the pipeline. One is to construct messages according to the format of OpenAI and use above introduced method, the other is to use the pipeline.chat interface.

from lmdeploy import pipeline, TurbomindEngineConfig, GenerationConfig
from lmdeploy.vl import load_image

model = 'OpenGVLab/InternVL2-2B'
pipe = pipeline(model, backend_config=TurbomindEngineConfig(session_len=8192))

image = load_image('https://raw.githubusercontent.com/open-mmlab/mmdeploy/main/demo/resources/human-pose.jpg')
gen_config = GenerationConfig(top_k=40, top_p=0.8, temperature=0.8)
sess = pipe.chat(('describe this image', image), gen_config=gen_config)
print(sess.response.text)
sess = pipe.chat('What is the woman doing?', session=sess, gen_config=gen_config)
print(sess.response.text)

Service

LMDeploy's api_server enables models to be easily packed into services with a single command. The provided RESTful APIs are compatible with OpenAI's interfaces. Below are an example of service startup:

lmdeploy serve api_server OpenGVLab/InternVL2-2B --server-port 23333

To use the OpenAI-style interface, you need to install OpenAI:

pip install openai

Then, use the code below to make the API call:

from openai import OpenAI

client = OpenAI(api_key='YOUR_API_KEY', base_url='http://0.0.0.0:23333/v1')
model_name = client.models.list().data[0].id
response = client.chat.completions.create(
    model=model_name,
    messages=[{
        'role':
        'user',
        'content': [{
            'type': 'text',
            'text': 'describe this image',
        }, {
            'type': 'image_url',
            'image_url': {
                'url':
                'https://modelscope.oss-cn-beijing.aliyuncs.com/resource/tiger.jpeg',
            },
        }],
    }],
    temperature=0.8,
    top_p=0.8)
print(response)

License

This project is released under the MIT License. This project uses the pre-trained internlm2-chat-1_8b as a component, which is licensed under the Apache License 2.0.

Citation

If you find this project useful in your research, please consider citing:

@article{chen2024expanding,
  title={Expanding Performance Boundaries of Open-Source Multimodal Models with Model, Data, and Test-Time Scaling},
  author={Chen, Zhe and Wang, Weiyun and Cao, Yue and Liu, Yangzhou and Gao, Zhangwei and Cui, Erfei and Zhu, Jinguo and Ye, Shenglong and Tian, Hao and Liu, Zhaoyang and others},
  journal={arXiv preprint arXiv:2412.05271},
  year={2024}
}
@article{gao2024mini,
  title={Mini-internvl: A flexible-transfer pocket multimodal model with 5\% parameters and 90\% performance},
  author={Gao, Zhangwei and Chen, Zhe and Cui, Erfei and Ren, Yiming and Wang, Weiyun and Zhu, Jinguo and Tian, Hao and Ye, Shenglong and He, Junjun and Zhu, Xizhou and others},
  journal={arXiv preprint arXiv:2410.16261},
  year={2024}
}
@article{chen2024far,
  title={How Far Are We to GPT-4V? Closing the Gap to Commercial Multimodal Models with Open-Source Suites},
  author={Chen, Zhe and Wang, Weiyun and Tian, Hao and Ye, Shenglong and Gao, Zhangwei and Cui, Erfei and Tong, Wenwen and Hu, Kongzhi and Luo, Jiapeng and Ma, Zheng and others},
  journal={arXiv preprint arXiv:2404.16821},
  year={2024}
}
@inproceedings{chen2024internvl,
  title={Internvl: Scaling up vision foundation models and aligning for generic visual-linguistic tasks},
  author={Chen, Zhe and Wu, Jiannan and Wang, Wenhai and Su, Weijie and Chen, Guo and Xing, Sen and Zhong, Muyan and Zhang, Qinglong and Zhu, Xizhou and Lu, Lewei and others},
  booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition},
  pages={24185--24198},
  year={2024}
}

Magnet link

Opens the swarm directly in your torrent client — no file download needed. Copy-paste works too:

magnet:?xt=urn:btih:ae25694585d058aabe0abf48c3ee00efbef75071&dn=OpenGVLab_InternVL2-2B

Open magnet in torrent client · infohash ae25694585d058aabe0abf48c3ee00efbef75071

Files & hashes

PathSizesha1sha256
README.md33.8 KB (34,633 B)d7d28cc8ea3092d1e5aedbdc41dee0b26aee53b91108ba8a8dc431691e537e8f7aaebbac18ceca54fc78279875b33c923db4bafc
added_tokens.json179 B (179 B)35f5893c8e29d6102945a953529819a2d56c62a9df59e170102f8d19d3e186cc91c81006c9822ea9fe8ce2b68e7be77195c01db3
config.json3.8 KB (3,928 B)44cdfe7c288d6189a50c9827d801c607553e44f4fbb50f9f529a3360b204370f7243ec1147862043bb0e2cf76d6ae3e8025d82f1
configuration_intern_vit.py5.4 KB (5,548 B)7e630c456eb9cf350e55bf850c3ff72f445a7e1722dd687a5f142985407675fc6b1dc688c2ded93e54192543ecf28ef495a6efa8
configuration_internlm2.py6.8 KB (7,005 B)282b13b1e2066ecc074ecae87b35a19d251f0ed79f9e14d64be7b81068e8421fd27e1c466b3fb6aeb67725ca328e56083c3f7a60
configuration_internvl_chat.py4.0 KB (4,088 B)50d3ee82772f8abb4fa1ae6a7c80899df7ddd94120bd8ddcf5c51f9fded0e3191db2bc00a7012fd3f7912dea4277fa24f17b6e32
conversation.py15.0 KB (15,309 B)5a771766f21ce3aeeb99b286fb8d188b0038a547b1b9f280e9cb9211e519e2b8071002b57cc742aadb2f49b05fa674ee3c7d83ee
eval_llm_benchmark.log163.6 KB (167,502 B)73610a397f065e1630f993be9fb2927d6c717043c008bff0c119e4d4f53903ba4e459e5d8061e2f78f95d6bc1dc66e05f9673b7b
examples/image1.jpg76.2 KB (78,073 B)fd9891ef7e00774157a9dcd726b2ea9fa0c5ecffc587294b3bf637dacbb3c96324c127187a2f242c94f639633a0d8a2775a9a399
examples/image2.jpg122.7 KB (125,656 B)26be44f4c42740479648e3f30a2b1abefcef37a808487494b8dc08d44bc36491adf3ab89ff30d13a3122da86f3cd67cad89eeee8
examples/red-panda.mp41.8 MB (1,867,237 B)b50fb1d02a500d5780bad3182748b27f0757d6d0d921c07bb97224d65a37801541d246067f0d506f08723ffa1ad85c217907ccb8
generation_config.json115 B (115 B)d45dc4fdf649b1096e6d30f54fa59c1366ddecfbeac5a6b0dff266d8ce2fcf6c05880d7ff71087ca273d1fafd6fd2f53b2565d2e
model.safetensors4.11 GB (4,411,571,040 B)24e5a25f019a949ffa9d97060f70e9f182566febc57c830f03c9141b77b70f84735a0473458a0ebf99250515b0962f20cd9fa3dc
modeling_intern_vit.py17.7 KB (18,106 B)233b0293451a13c7b5211d65633deb73a13b240c1978e330ea5533dda4d1379096aded271fc741347fc48cb4924846b56a2a6a4b
modeling_internlm2.py59.8 KB (61,208 B)7c8c24d873f6ecd152d00fd65371e23ead981e1dc014d933c6afdf7414791c1859c692ca4b49c925688bcc00fbd1658ef75fb0ba
modeling_internvl_chat.py15.6 KB (15,988 B)6dd05026716317d3483b2abd4a573e61cf1048c71915c32d984aed6750e911884ad59f92504f73b799c7443121c67b9cb21fe347
preprocessor_config.json287 B (287 B)dfd7e50d9d4e67cd679b16b337b419a0c6cfa8490658115064c561026539aeeead9ed3b1a8e0cc90967df8c142849199f955d2b4
special_tokens_map.json844 B (844 B)cbf34a50d27c43ed8d1e2823b800b4e6f66e637a8cb729e6fd4c29e8c5be65cb51128735cea0ab56606a186cf8cbb30123c72eae
tokenization_internlm2.py8.6 KB (8,791 B)1be581da37ef678de65f2737493fc0ed7160446ee548dc777a1def2f5339cfe12de8da2d12500d664e3dafa5c585c407e4b806fa
tokenization_internlm2_fast.py7.6 KB (7,788 B)aa0fccbd0f1d029d79e19821f2edcb01b594537cb6dc75cb1a276a897190a003b97a65b13b68b948d64646df67e7f18392dfbb34
tokenizer.model1.4 MB (1,477,754 B)4e98263819708caf5ae3501311d2022f7fd8e2e4f868398fc4e05ee1e8aeba95ddf18ddcc45b8bce55d5093bead5bbf80429b48b
tokenizer_config.json3.9 KB (4,005 B)1f32946df0f56d92ddbc1df79cabb4477b6224802a0e30fb556e25b8255729fcb67db4e0e1a265e3fb177d9b09316f7c665f31f7

Cite this release

Canonical URL
https://aiseedbank.org/models/OpenGVLab_InternVL2-2B/
Slug
OpenGVLab_InternVL2-2B
Infohash
ae25694585d058aabe0abf48c3ee00efbef75071
License
mit
Signing key fingerprint
85a3b32c3712427b

Every file carries a locally computed sha256 — verify a download against the signed sums: OpenGVLab_InternVL2-2B.SHA256SUMS (+ minisign signature).

Provenance

Upstream repositoryOpenGVLab/InternVL2-2B
Revision (pinned)e4f6747bd20f139e637642c6a058c6bd00b36919
Fetched at2026-08-23T07:23:10Z
License at fetchmit
Snapshot toolhuggingface · seedbank 0.1.0

Trackers

✓ verified · rehash-vs-hf-metadata at 2026-08-23T07:26:13Z

mit4.11 GB (4,415,475,084 bytes)transformerssafetensorsinternvl_chatfeature-extractioninternvlcustom_codeimage-text-to-textconversationalmultilingualpaper: 2312.14238paper: 2404.16821paper: 2410.16261paper: 2412.05271