2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OpenVINO GenAIでLlama 3.1を動かす!CPU vs GPUのパフォーマンス評価

2
Last updated at Posted at 2026-02-16

1. はじめに

AIモデルをローカル環境で動かそうとした際、「推論速度が遅い」「メモリが足りない」といった壁にぶつかることは少なくありません。特に最新のLLM(大規模言語モデル)を一般的なPCで動かすのは、非常に負荷の高い作業です。

そこで注目したいのが、Intelが提供している OpenVINO™ ツールキット です。

OpenVINOの特徴

OpenVINOは、Intel製のCPUやGPU、NPUといったハードウェアの性能を最大限に引き出し、AI推論を高速化・最適化するためのオープンソースツールキットです。

  • マルチデバイス対応: 1つのモデルを書き換えることなく、CPU、内蔵GPU、ディスクリートGPU、NPUで動作させることが可能。
  • モデルの最適化: 量子化(INT8やINT4など)により、モデルサイズを削減しつつ高速な推論を実現。
  • GenAI API: 最近ではLLM専用のライブラリ(OpenVINO GenAI)が登場し、わずか数行のPythonコードでLlama 3.1などの最新モデルを扱えるようになりました。

今回は、このOpenVINO GenAIを使い、**「CPUとGPUでどれくらい性能差が出るのか」「リソースの使い方はどう変わるのか」**を実測データをもとに解説します。

2. 検証環境・事前準備

  • CPU: Intel Core Ultra 7 258V (Lunar Lake)
  • GPU: Intel Arc Graphics 140V (内蔵GPU / 64 EU)
  • 物理メモリ: 32GB
  • OS: Ubuntu 22.04
  • 言語 Python 3.12.3
  • モデル: Llama-3.1-8b-instruct-int4-ov (INT4量子化版)
  • ライブラリ: 以下記載
# 推論エンジン
openvino-genai
openvino

# モデル変換・最適化(INT4量子化にnncfが必須)
optimum-intel[openvino,nncf]

# ベースライブラリ(変換時に必要)
torch
transformers
huggingface_hub

# トークナイザー・フォーマット関連
sentencepiece
protobuf

# メモリ計測用(任意)
psutil

OpenVINO形式に変換

今回の肝です。Hugging FaceにあるMeta公式のLlama 3.1を、Intel GPUでで動かすために INT4量子化 を施しつつOpenVINO形式へ変換します。Hugging Faceには変換済みのモデルもあります。

optimum-cli export openvino \
  --model meta-llama/Llama-3.1-8B-Instruct \
  --task text-generation-with-past \
  --weight-format int4 \
  ./models/llama-3.1-8b-int4-ov
  • このコマンドがやっていること

Export: PyTorch形式をIntel環境で効率よく計算できるIR形式(.xml/.bin)へ変換。

INT4量子化: 30GB以上ある元の重みを4bit(約1/8)に圧縮。これにより、数GBのVRAM/RAMでも動作可能になります。


3. 検証コード

変換したモデルを使い、CPUとGPUそれぞれの「応答ラグ(TTFT)」と「生成速度(TPS)」を計測します。

import time
import psutil
import openvino_genai as ov_genai
from huggingface_hub import snapshot_download

# --- 設定 ---
llm_model_id = "OpenVINO/llama-3.1-8b-instruct-int4-ov"
llm_path = "./models/llama-3.1-8b-int4-ov"

devices = ["CPU", "GPU"]
prompt = "OpenVINOについて日本語で100字以内で教えて。"
config = ov_genai.GenerationConfig()
config.max_new_tokens = 256

# --- 計測用の状態管理クラス ---
class BenchmarkTest:
    def __init__(self):
        self.first_token_time = None
        self.start_time = None
        self.token_count = 0

    def __call__(self, token_str):
        # 最初のトークンが生成された時間を記録
        if self.first_token_time is None:
            self.first_token_time = time.perf_counter()
        
        self.token_count += 1
        print(token_str, end="", flush=True)
        return False

def print_mem_usage(label):
    process = psutil.Process()
    mem_info = process.memory_info()
    print(f"[{label}] Memory Usage: {mem_info.rss / 1024 / 1024:.2f} MB")

def run_benchmark(device_name):
    print(f"\n{'='*10} Testing Device: {device_name} {'='*10}")
    
    # 1. モデルロード
    print_mem_usage("Before Load")
    pipe = ov_genai.LLMPipeline(llm_path, device_name)
    print_mem_usage("After Load")

    # 2. Warm-up (出力は表示しない)
    print("\nWarming up...")
    pipe.generate("Hello", config)

    # 3. 本番計測
    print(f"\nInference running on {device_name}...\n")
    print("-" * 20 + " [Output] " + "-" * 20)
    
    # testerの初期化
    b_tester = BenchmarkTest()
    
    start_time = time.perf_counter()
    # testerを渡して実行
    result = pipe.generate(prompt, config, b_tester)
    end_time = time.perf_counter()
    
    print("\n" + "-" * 50)

    # --- 性能計算 ---
    total_duration = end_time - start_time
    # TTFT (Time To First Token)
    ttft = b_tester.first_token_time - start_time if b_tester.first_token_time else 0
    # TPS (Tokens Per Second) ※生成フェーズのみの速度
    gen_duration = end_time - b_tester.first_token_time if b_tester.first_token_time else total_duration
    tps = b_tester.token_count / gen_duration if gen_duration > 0 else 0

    print(f"\n[Metrics for {device_name}]:")
    print(f"  - Total Execution Time: {total_duration:.2f} sec")
    print(f"  - Time to First Token (TTFT): {ttft:.4f} sec  <-- 応答の速さ")
    print(f"  - Throughput (TPS): {tps:.2f} tokens/s  <-- 生成速度")
    print(f"  - Generated Tokens: {b_tester.token_count} tokens")

    print("-" * 45)

# 実行
for dev in devices:
    try:
        run_benchmark(dev)
    except Exception as e:
        print(f"Device {dev} is not available or error occurred: {e}")
  • CPU使用時
    cpu_usage.png

  • GPU使用時
    gpu_usage.png

ちゃんとGPUを使えています。

コードの説明

  • LLMPipeline(llm_path, device_name) : ここがOpenVINOの核心です。device_name に "CPU" や "GPU" を渡すだけで、使用するハードウェアを瞬時に切り替えられます。

  • BenchmarkTest : LLMは1文字ずつ出力されます。最初の文字が届いた時間を記録することで、**TTFT(Time To First Token)**という「AIが考え始めてから答え始めるまでのラグ」を測っています。

  • Warm-up : GPUは最初の1回目だけ「最適化(コンパイル)」に時間がかかるため、計測前に短い文章を1度だけ生成させています。


4. 比較結果:実測データ

実行時の出力

$ python llm_test.py

========== Testing Device: CPU ==========
[Before Load] Memory Usage: 68.62 MB
[After Load] Memory Usage: 1169.29 MB

Warming up...

Inference running on CPU...

-------------------- [Output] --------------------
OpenVINO(オープンビノ)とは、Intelが提供するオープンソースの深層学習推論エンジンです。主に、CPU、GPU、FPGA、ASICなど、さまざまなハードウェア上で、AI推論を高速かつ効率的に実行することを目的としています。OpenVINOは、モデルをさまざまなハードウェア上で実行できるように、モデルをオプティマイズし、コンパイルし、デプロイするためのツールキットを提供します。
--------------------------------------------------

[Metrics for CPU]:
  - Total Execution Time: 20.07 sec
  - Time to First Token (TTFT): 1.3145 sec  <-- 応答の速さ
  - Throughput (TPS): 6.61 tokens/s  <-- 生成速度
  - Generated Tokens: 124 tokens
---------------------------------------------

========== Testing Device: GPU ==========
[Before Load] Memory Usage: 123.94 MB
[After Load] Memory Usage: 470.01 MB

Warming up...

Inference running on GPU...

-------------------- [Output] --------------------
OpenVINO(オープンビノ)とは、Intelが提供するオープンソースの深層学習推論エンジンです。主に、CPU、GPU、FPGA、ASICなど、さまざまなハードウェア上で、AI推論を高速かつ効率的に実行することを目的としています。OpenVINOは、モデルをさまざまなハードウェア上で実行できるように、モデルをオプティマイズし、コンパイルし、デプロイするためのツールキットを提供します。
--------------------------------------------------

[Metrics for GPU]:
  - Total Execution Time: 8.34 sec
  - Time to First Token (TTFT): 0.2567 sec  <-- 応答の速さ
  - Throughput (TPS): 15.33 tokens/s  <-- 生成速度
  - Generated Tokens: 124 tokens
---------------------------------------------

計測の結果、CPUとGPUで明確な差が現れました。

指標 CPU実行 GPU実行 比較
推論時間 (Total Time) 20.07 sec 8.34 sec GPUが約2.4倍高速
ロード後のRAM使用量 1169.29 MB 470.01 MB GPUの方がRAM消費が少ない

5. 考察

① 推論速度:GPUの圧倒的な並列処理能力

GPU実行では、CPUに対して約2.4倍の高速化を達成しました。LLMの推論(Transformerブロックの行列演算)は高度に並列化可能なタスクであるため、内蔵GPUであってもその恩恵は絶大です。

② RAM使用量の「逆転現象」の理由

注目すべきは、GPU実行時の方がメインメモリ(RAM)の消費が大幅に低い(約700MB減)という点です。これは、OpenVINOが推論に必要なモデルデータをRAMから**GPU専用メモリ(VRAM)**へ転送して処理しているためだと思われます。

  • CPU実行: RAM上にすべての重みデータを展開して演算。
  • GPU実行: 重みデータをVRAMへオフロード。結果としてシステム全体のRAM負荷が軽減される。

6. まとめ

OpenVINO GenAIを活用することで、コードを一行書き換えるだけで劇的なパフォーマンス向上とリソースの効率化が可能になります。

「ローカルLLMは重い」と思われがちですが、Intel CPU搭載PCをお持ちなら、内蔵GPUを眠らせておく手はありません。ぜひ OpenVINO で高速なAI体験を試してみてください。

参考

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?