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. 리소스


면책 조항: 성능은 구성 및 워크로드에 따라 달라진다. 결과는 위에 명시된 하드웨어 및 소프트웨어 버전을 기준으로 하며, 향후 업데이트 전체를 대표하지 않을 수 있다.

Sources