Qwen-VL / Qwen2-VL
1. 개요
| 항목 |
내용 |
| 개발사 |
Alibaba Cloud (Qwen Team) |
| 공개일 |
Qwen-VL: 2023.08, Qwen2-VL: 2024.08 |
| 모델 타입 |
Open Source (Apache 2.0 / Qwen License) |
| 접근 방식 |
Hugging Face, ModelScope, DashScope API |
Qwen-VL 시리즈는 Alibaba의 오픈소스 VLM으로, 특히 OCR, 다국어(중국어), 문서 이해에서 뛰어난 성능을 보인다. Qwen2-VL은 동적 해상도와 비디오 이해를 추가했다.
2. 모델 패밀리
2.1 Qwen-VL (v1)
| 모델 |
파라미터 |
Vision Encoder |
LLM |
| Qwen-VL |
9.6B |
ViT-bigG (OpenCLIP) |
Qwen-7B |
| Qwen-VL-Chat |
9.6B |
ViT-bigG (OpenCLIP) |
Qwen-7B |
2.2 Qwen2-VL
| 모델 |
파라미터 |
Vision Encoder |
LLM |
| Qwen2-VL-2B-Instruct |
2.2B |
ViT-600M |
Qwen2-1.5B |
| Qwen2-VL-7B-Instruct |
8.3B |
ViT-600M |
Qwen2-7B |
| Qwen2-VL-72B-Instruct |
73B |
ViT-600M |
Qwen2-72B |
3. 아키텍처
3.1 Qwen-VL 구조
[이미지 448x448]
|
v
[ViT-bigG (Frozen)]
|
v
[Cross-Attention Adapter]
|
v
[Qwen LLM] <-- [텍스트 토큰]
|
v
[출력 토큰]
3.2 Qwen2-VL 구조 (개선)
[이미지 (동적 해상도)]
|
v
[Naive Dynamic Resolution]
|
v
[ViT-600M] -- Window Attention + Full Attention
|
v
[2D RoPE (M-RoPE)]
|
v
[Compression (4 tokens per 2x2 patches)]
|
v
[Qwen2 LLM] <-- [텍스트 토큰]
|
v
[출력 토큰]
3.3 핵심 컴포넌트 (Qwen2-VL)
| 컴포넌트 |
사양 |
| Vision Encoder |
ViT-600M (자체 학습) |
| 해상도 처리 |
Naive Dynamic Resolution |
| 위치 인코딩 |
Multimodal RoPE (M-RoPE) |
| Attention |
Window + Full Attention 혼합 |
| 토큰 압축 |
2x2 → 1 토큰 |
| LLM |
Qwen2 (1.5B / 7B / 72B) |
3.4 M-RoPE (Multimodal RoPE)
3D 위치 정보를 1D로 분해:
- 시간 차원 (비디오 프레임)
- 높이 차원 (이미지)
- 너비 차원 (이미지)
4. 이미지/비디오 처리
4.1 해상도 지원 (Qwen2-VL)
| 항목 |
사양 |
| 최소 해상도 |
제한 없음 |
| 최대 해상도 |
제한 없음 (토큰 수로 제한) |
| 토큰 계산 |
(H/14) x (W/14) / 4 |
| 기본 설정 |
min_pixels=2562828, max_pixels=12802828 |
4.2 토큰 수 계산 예시
| 해상도 |
패치 수 |
압축 후 토큰 |
| 224x224 |
16x16 |
64 |
| 448x448 |
32x32 |
256 |
| 1344x1344 |
96x96 |
2,304 |
4.3 비디오 처리
| 항목 |
사양 |
| 지원 |
네이티브 비디오 이해 |
| 프레임 추출 |
기본 2 FPS |
| 최대 길이 |
토큰 제한 내 |
| 시간적 이해 |
M-RoPE로 프레임 순서 인코딩 |
4.4 멀티 이미지
| 항목 |
지원 |
| 최대 이미지 수 |
컨텍스트 제한 내 무제한 |
| 이미지 인터리빙 |
지원 |
| Few-shot 학습 |
지원 |
5. 벤치마크 성능
5.1 Qwen2-VL-72B-Instruct
| 벤치마크 |
점수 |
비고 |
| MMMU (val) |
64.5% |
오픈소스 최고 |
| MathVista |
70.5% |
수학 추론 |
| DocVQA |
96.5% |
문서 이해 SOTA |
| ChartQA |
88.3% |
차트 이해 |
| TextVQA |
84.3% |
텍스트 인식 |
| OCRBench |
866 |
OCR 최고 성능 |
| RealWorldQA |
68.9% |
실세계 이해 |
| AI2D |
85.2% |
다이어그램 |
5.2 Qwen2-VL-7B-Instruct
| 벤치마크 |
점수 |
비고 |
| MMMU |
54.1% |
- |
| DocVQA |
94.5% |
- |
| ChartQA |
83.0% |
- |
| TextVQA |
84.3% |
- |
| OCRBench |
845 |
- |
| RealWorldQA |
66.7% |
- |
5.3 Qwen2-VL-2B-Instruct
| 벤치마크 |
점수 |
| MMMU |
41.1% |
| DocVQA |
90.1% |
| OCRBench |
794 |
| RealWorldQA |
62.9% |
5.4 비디오 이해 벤치마크
| 벤치마크 |
Qwen2-VL-72B |
비고 |
| Video-MME |
71.2% |
비디오 이해 |
| MVBench |
73.6% |
- |
| EgoSchema |
66.7% |
자아 시점 |
6. 사용 방법
from transformers import Qwen2VLForConditionalGeneration, AutoProcessor
from PIL import Image
import torch
model_id = "Qwen/Qwen2-VL-7B-Instruct"
model = Qwen2VLForConditionalGeneration.from_pretrained(
model_id,
torch_dtype=torch.bfloat16,
device_map="auto"
)
processor = AutoProcessor.from_pretrained(model_id)
image = Image.open("image.jpg")
messages = [
{
"role": "user",
"content": [
{"type": "image", "image": image},
{"type": "text", "text": "이 이미지를 자세히 설명해주세요."}
]
}
]
text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = processor(text=[text], images=[image], return_tensors="pt").to(model.device)
outputs = model.generate(**inputs, max_new_tokens=512)
result = processor.batch_decode(outputs, skip_special_tokens=True)
print(result[0])
6.2 비디오 처리
from qwen_vl_utils import process_vision_info
messages = [
{
"role": "user",
"content": [
{"type": "video", "video": "video.mp4", "fps": 1.0},
{"type": "text", "text": "이 비디오를 요약해주세요."}
]
}
]
text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
image_inputs, video_inputs = process_vision_info(messages)
inputs = processor(
text=[text],
images=image_inputs,
videos=video_inputs,
return_tensors="pt"
).to(model.device)
outputs = model.generate(**inputs, max_new_tokens=512)
6.3 해상도 제어
# 최소/최대 픽셀 수 설정
min_pixels = 256 * 28 * 28 # 200,704
max_pixels = 1280 * 28 * 28 # 1,003,520
processor = AutoProcessor.from_pretrained(
model_id,
min_pixels=min_pixels,
max_pixels=max_pixels
)
6.4 vLLM 서빙
vllm serve Qwen/Qwen2-VL-7B-Instruct \
--limit-mm-per-prompt image=10,video=2 \
--max-model-len 32768
6.5 양자화 (AWQ)
model_id = "Qwen/Qwen2-VL-7B-Instruct-AWQ"
model = Qwen2VLForConditionalGeneration.from_pretrained(
model_id,
torch_dtype=torch.float16,
device_map="auto"
)
7. VRAM 요구량
7.1 Qwen2-VL
| 모델 |
BF16 |
INT8 |
INT4 |
| 2B |
6GB |
3GB |
2GB |
| 7B |
18GB |
10GB |
6GB |
| 72B |
150GB |
78GB |
42GB |
7.2 추론 속도 (A100 80GB)
| 모델 |
BF16 |
AWQ |
| 2B |
85 tok/s |
120 tok/s |
| 7B |
48 tok/s |
70 tok/s |
| 72B |
8 tok/s |
15 tok/s |
8. 장점
| 장점 |
설명 |
| OCR 최고 |
OCRBench 최고 성능 |
| 다국어 |
중국어, 한국어, 일본어 우수 |
| 동적 해상도 |
임의 크기 이미지 처리 |
| 비디오 지원 |
네이티브 비디오 이해 |
| 다양한 크기 |
2B ~ 72B 선택 가능 |
| 오픈소스 |
Apache 2.0 라이선스 |
9. 단점
| 단점 |
설명 |
| 72B 요구사양 |
고사양 GPU 필요 |
| 영어 대비 |
중국어 특화로 영어 약간 약함 |
| 복잡한 추론 |
GPT-4V 대비 약함 |
| HF 의존성 |
qwen-vl-utils 필요 |
10. 사용 사례
10.1 적합한 사용 사례
- 문서 OCR 및 정보 추출
- 중국어/한국어 텍스트 인식
- 영수증/인보이스 처리
- 비디오 분석
- 다국어 VQA
- 차트/표 데이터 추출
10.2 부적합한 사용 사례
- 초저사양 환경 (2B 제외)
- 영어 전용 서비스 (다른 모델 권장)
11. API (DashScope)
11.1 가격 (2024.12)
| 모델 |
가격 (1K 토큰) |
| Qwen-VL-Plus |
¥0.008 |
| Qwen-VL-Max |
¥0.02 |
11.2 DashScope 사용
from dashscope import MultiModalConversation
response = MultiModalConversation.call(
model='qwen-vl-max',
messages=[
{
'role': 'user',
'content': [
{'image': 'https://example.com/image.jpg'},
{'text': 'Describe this image.'}
]
}
]
)
12. 참고 자료