PCIe bandwidth

概要

PCIe bandwidth(PCIeバンド幅)は、CPUGPU間のデータ転送速度を決定する重要な指標です。ローカルLLM運用において、モデル読み込み時間、CPU-GPU間データ転送、マルチGPU通信の性能に直接影響します。

適切なPCIe世代とレーン数の選択により、ハードウェアの潜在能力を最大限に引き出すことができます。

PCIe世代別仕様

PCIe帯域幅(レーンあたり)

  • PCIe 3.0: 1GB/s per lane
  • PCIe 4.0: 2GB/s per lane
  • PCIe 5.0: 4GB/s per lane
  • PCIe 6.0: 8GB/s per lane(2025年以降)

x16スロット総帯域幅

  • PCIe 3.0 x16: 16GB/s(双方向32GB/s)
  • PCIe 4.0 x16: 32GB/s(双方向64GB/s)
  • PCIe 5.0 x16: 64GB/s(双方向128GB/s)

ローカルLLMでの影響

モデル読み込み時間

# Llama 2 70B(140GB FP16)の読み込み時間例
PCIe 3.0 x16 (16GB/s): 140GB ÷ 16GB/s = 8.75秒
PCIe 4.0 x16 (32GB/s): 140GB ÷ 32GB/s = 4.38秒
PCIe 5.0 x16 (64GB/s): 140GB ÷ 64GB/s = 2.19秒

# 実際は効率性を考慮(約70-80%)
PCIe 3.0実測: 約12-15秒
PCIe 4.0実測: 約6-8秒
PCIe 5.0実測: 約3-4秒

CPU-GPU間データ転送

  • モデル分割時: CPU-GPU間でのレイヤー転送
  • メモリオフロード: VRAM不足時のRAM退避
  • 動的ロード: 必要な部分のみ読み込み
  • 複数モデル切替: モデル間の高速切り替え

GPU別推奨PCIe構成

単一GPU構成

  • RTX 4090/4080: PCIe 4.0 x16推奨
  • RTX 3090/3080: PCIe 3.0 x16でも十分
  • RX 7900 XTX: PCIe 4.0 x16推奨
  • エントリーGPU: PCIe 3.0 x8でも実用的

マルチGPU構成

  • 2GPU: 各PCIe 4.0 x16(CPUレーン数要確認)
  • 4GPU: 各PCIe 4.0 x8以上
  • NVLink/SLI: GPU間直接接続併用
  • AMD Infinity Cache: GPU間高速通信

プラットフォーム別対応

Intel プラットフォーム

  • Z790/B760: PCIe 5.0 x16 + PCIe 4.0 x4
  • Z690/B660: PCIe 5.0 x16 + PCIe 3.0 x4
  • X299: PCIe 3.0 x16×4(HEDT)
  • W790: PCIe 5.0多レーン(ワークステーション)

AMD プラットフォーム

  • X670E/B650E: PCIe 5.0 x16 + PCIe 4.0 x16
  • X570/B550: PCIe 4.0 x16 + PCIe 4.0 x16
  • TRX40: PCIe 4.0 x16×4(Threadripper)
  • WRX80: PCIe 4.0多レーン(Pro)

パフォーマンス測定

帯域幅テストツール

# NVIDIA GPU帯域幅測定
nvidia-smi dmon -i 0 -s pcie -c 10

# PyTorchでのPCIe帯域幅測定
import torch
import time

def measure_pcie_bandwidth():
    device = torch.device('cuda')
    size = 1024 * 1024 * 1024  # 1GB
    
    # CPU → GPU転送測定
    cpu_tensor = torch.randn(size // 4, dtype=torch.float32)
    start = time.time()
    gpu_tensor = cpu_tensor.to(device)
    torch.cuda.synchronize()
    upload_time = time.time() - start
    
    # GPU → CPU転送測定
    start = time.time()
    cpu_result = gpu_tensor.to('cpu')
    download_time = time.time() - start
    
    print(f"Upload bandwidth: {size / upload_time / 1e9:.2f} GB/s")
    print(f"Download bandwidth: {size / download_time / 1e9:.2f} GB/s")

measure_pcie_bandwidth()

ボトルネック診断

  • GPU-Z: リアルタイムPCIe使用率
  • HWiNFO64: 詳細なPCIe統計
  • perfmon: Windowsシステム監視
  • iotop: LinuxのI/O監視

最適化のポイント

システム設計

  • CPUレーン数確認: 総PCIeレーン数の把握
  • スロット配置: 最適なGPU配置
  • M.2 SSD共有: PCIeレーンの競合回避
  • 将来拡張性: アップグレード計画

データ転送最適化

  • ピン留めメモリ: より高速な転送
  • 非同期転送: 計算と転送の並列化
  • バッチ転送: 小さなデータの統合
  • データ圧縮: 転送量の削減

実用的な制約と対処

一般的な制約

  • PCIe 3.0 x8: 大多数のGPUで性能影響は軽微
  • PCIe 2.0: 古いシステム、明確な性能低下
  • レーン共有: M.2 SSD使用時の帯域分割
  • 電力制限: スロット電力供給能力

対処法

  • モデル事前読み込み: 起動時間の短縮
  • ローカルキャッシュ: 頻繁に使用するモデル
  • 量子化モデル: データサイズ削減
  • SSD高速化: NVMe SSDでI/O改善

将来の展望

技術動向

  • PCIe 6.0: 2025年以降、128GB/s x16
  • CXL(Compute Express Link): メモリ・ストレージ統合
  • NVLink 5.0: GPU間通信のさらなる高速化
  • 光接続: 長距離高速データ転送

推奨戦略

  • 現在: PCIe 4.0対応システム推奨
  • 新規構築: PCIe 5.0対応マザーボード
  • 既存システム: PCIe 3.0 x16でも実用的
  • 将来性: アップグレード可能な設計

関連用語