OpenVINO를 사용해 Intel CPU에서 SmolVLM 실행 (3단계)
TL;DR
Hugging Face는 SmolVLM 비전‑언어 모델을 세 가지 간단한 단계—OpenVINO IR로 변환, 선택적인 INT8 양자화, 그리고 추론—를 통해 모든 Intel CPU에 배포할 수 있음을 보여주며, 원본 PyTorch 버전과 비교해 첫 토큰까지의 시간이 최대 12배 감소하고 디코딩 처리량이 65배 증가합니다.
1. Optimum‑Intel로 모델 배포하기
Takeaway: optimum-intel[openvino]와 transformers를 설치하면 OpenVINO 내보내기와 런타임 실행을 자동으로 처리하는 통합 CLI 및 Python API를 제공한다.
pip install optimum-intel[openvino] transformers==4.52.*
optimum 패키지는 저수준 OpenVINO 세부 사항을 추상화하여 모델 변환 및 양자화에 집중할 수 있게 해준다.
2. 단계별 가이드
2.1 OpenVINO IR로 변환
Takeaway: 모델은 양자화하거나 Intel 하드웨어에서 실행하기 전에 OpenVINO의 Intermediate Representation (IR)으로 변환되어야 한다.
- CLI 변환
optimum-cli export openvino -m HuggingFaceTB/SmolVLM2-256M-Video-Instruct smolvlm_ov/ - Python 실시간 변환
from optimum.intel import OVModelForVisualCausalLM model_id = "HuggingFaceTB/SmolVLM2-256M-Video-Instruct" model = OVModelForVisualCausalLM.from_pretrained(model_id) model.save_pretrained("smolvlm_ov")
두 방법 모두 동일한 OpenVINO IR 파일(.xml 및 .bin)을 생성한다.
2.2 양자화 옵션
Takeaway: 사후 훈련 양자화는 모델 크기와 지연 시간을 줄이며, 가중치 전용 양자화(WOQ)는 위험이 낮은 첫 단계이고, 정적 양자화는 비전 인코더를 추가로 가속하지만 약간의 정확도 손실을 초래한다.
옵션 1 – 가중치 전용 양자화 (WOQ)
- 가중치만 INT8로 양자화하고, 활성화는 FP32 그대로 유지한다.
- 정확도에 미치는 영향이 최소이며, 속도 향상이 약간 있다.
- OpenVINO 2024.3부터는 가중치가 INT8일 경우 런타임 활성화 양자화가 자동으로 적용되어 추가 속도 향상이 있다.
from optimum.intel import OVModelForVisualCausalLM, OVWeightQuantizationConfig
q_config = OVWeightQuantizationConfig(bits=8)
q_model = OVModelForVisualCausalLM.from_pretrained(model_id, quantization_config=q_config)
q_model.save_pretrained("smolvlm_int8")
Or via CLI:
optimum-cli export openvino -m HuggingFaceTB/SmolVLM2-256M-Video-Instruct \
--weight-format int8 smolvlm_int8/
옵션 2 – 정적 양자화 (혼합)
- 대표 데이터셋(예: contextual 데이터셋에서 50개 샘플)으로 캘리브레이션을 수행한 후 가중치와 활성화를 모두 양자화한다.
- 언어 모델 가중치는 WOQ 정밀도를 유지하면서 비전 인코더에 정적 INT8을 적용한다.
- 다중 이미지 또는 짧은 답변 시나리오에서 가장 큰 지연 감소를 제공한다.
from optimum.intel import (
OVModelForVisualCausalLM,
OVPipelineQuantizationConfig,
OVQuantizationConfig,
OVWeightQuantizationConfig,
)
q_config = OVPipelineQuantizationConfig(
quantization_configs={
"lm_model": OVWeightQuantizationConfig(bits=8),
"text_embeddings_model": OVWeightQuantizationConfig(bits=8),
"vision_embeddings_model": OVQuantizationConfig(bits=8),
},
dataset=dataset,
num_samples=num_samples,
)
q_model = OVModelForVisualCausalLM.from_pretrained(model_id, quantization_config=q_config)
q_model.save_pretrained("smolvlm_static_int8")
2.3 추론 실행
Takeaway: 변환(및 선택적 양자화) 후에는 generate 호출 하나로 추론이 가능하며, device="gpu"를 추가하면 사용 가능한 경우 Intel GPU 가속을 활성화한다.
generated_ids = q_model.generate(**inputs, max_new_tokens=100)
generated_texts = processor.batch_decode(generated_ids, skip_special_tokens=True)
print(generated_texts[0])
GPU 사용 시:
model = OVModelForVisualCausalLM.from_pretrained(model_id, device="gpu")
공개 Hugging Face Space를 통해 원본, WOQ, 혼합 양자화 모델을 4세대 Intel Xeon (Sapphire Rapids) 시스템에서 직접 실험해 볼 수 있다.
3. 성능 평가
Takeaway: OpenVINO 변환만으로도 첫 토큰까지의 시간(TTFT)을 5.15 s에서 0.42 s(≈12배 빠름)로 단축하고 디코딩 처리량을 0.72 tokens / s에서 47 tokens / s(≈65배)로 높인다. 8‑bit WOQ를 추가하면 TTFT가 0.247 s까지 감소하고 처리량이 63.9 tokens / s까지 상승한다.
| 구성 | TTFT (s) | TPOT (s) | End‑to‑End 지연 (s) | 처리량 (tokens/s) |
|---|---|---|---|---|
| PyTorch | 5.150 | 1.385 | 25.927 | 0.722 |
| OpenVINO | 0.420 | 0.021 | 0.738 | 47.237 |
| OpenVINO 8‑bit WOQ | 0.247 | 0.016 | 0.482 | 63.928 |
벤치마크는 Ubuntu 24.10과 OpenVINO 2025.2.0이 설치된 Intel Core Ultra 7 265K(20 스레드, 64 GB DDR5)에서 단일 이미지 입력을 사용해 수행하였다.
플랫폼 구성 (발췌): Intel Core Ultra 7 265K, 20 스레드, 64 GB DDR5 @ 6400 MHz, OpenVINO 2025.2.0, optimum‑intel 1.25.2, transformers 4.53.3.
4. 리소스
- 노트북: https://github.com/huggingface/optimum-intel/blob/main/notebooks/openvino/vision_language_quantization.ipynb
- 인터랙티브 Space: https://huggingface.co/spaces/echarlaix/vision-langage-openvino
- 웨비나 녹화: https://web.cvent.com/event/d550a2a7-04f2-4a28-b641-3af228e318ca/regProcessStep1?utm_campaign=speakers4&utm_medium=organic&utm_source=Community
- Optimum‑Intel OpenVINO 문서: https://huggingface.co/docs/optimum-intel/en/openvino/inference
면책 조항: 성능은 구성 및 워크로드에 따라 달라진다. 결과는 위에 명시된 하드웨어 및 소프트웨어 버전을 기준으로 하며, 향후 업데이트 전체를 대표하지 않을 수 있다.