OpenVINO を使用して Intel CPU で SmolVLM を 3 ステップで実行する

TL;DR

Hugging Face は、SmolVLM ビジョン‑ラングエッジモデルを任意の Intel CPU 上で 3 つのシンプルな手順(OpenVINO IR への変換、オプションの INT8 量子化、推論)でデプロイできることを示し、元の PyTorch バージョンと比較して 最初のトークンまでの時間(TTFT)を最大 12 倍短縮デコードスループットを最大 65 倍向上させます。


1. Optimum‑Intel でモデルをデプロイする

要点: optimum-intel[openvino]transformers をインストールすると、OpenVINO のエクスポートとランタイム実行を自動的に処理する統一 CLI と Python API が提供されます。

pip install optimum-intel[openvino] transformers==4.52.*

optimum パッケージは低レベルの OpenVINO 詳細を抽象化し、モデルの変換と量子化に集中できるようにします。


2. ステップバイステップガイド

2.1 OpenVINO IR への変換

要点: モデルは Intel ハードウェア上で量子化または実行できるようになる前に、OpenVINO の中間表現(IR)に変換する必要があります。

  • CLI 変換
    optimum-cli export openvino -m HuggingFaceTB/SmolVLM2-256M-Video-Instruct smolvlm_ov/
    
  • Python on‑the‑fly 変換
    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 量子化オプション

要点: ポストトレーニング量子化はモデルサイズとレイテンシを削減します。Weight‑Only Quantization(WOQ)はリスクが低い最初のステップであり、Static Quantization はビジョンエンコーダをさらに高速化しますが、若干の精度トレードオフが伴います。

オプション 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")

CLI で実行する場合:

optimum-cli export openvino -m HuggingFaceTB/SmolVLM2-256M-Video-Instruct \
    --weight-format int8 smolvlm_int8/

オプション 2 – 静的量子化 (Mixed)

  • 代表的なデータセット(例: contextual データセットから 50 サンプル)でキャリブレーションを行った後、重みとアクティベーションの両方を量子化します。
  • ビジョンエンコーダに静的 INT8 を適用し、言語モデルの重みは WOQ 精度のままにします。
  • マルチイメージや短文回答シナリオで最大のレイテンシ削減を実現します。
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 推論の実行

要点: 変換(およびオプションの量子化)後は、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、Mixed‑Quantized の各バージョンを第 4 世代 Intel Xeon(Sapphire Rapids)システム上で試すことができます。


3. パフォーマンス評価

要点: 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 (秒) TPOT (秒) エンドツーエンドレイテンシ (秒) スループット (tokens/秒)
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

ベンチマークは、Intel Core Ultra 7 265K(20 スレッド、64 GB DDR5)上で単一画像入力を使用し、Ubuntu 24.10 と OpenVINO 2025.2.0 で実行しました。

プラットフォーム構成(抜粋): 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