モダンなCPUにおけるBERTライクなモデルの推論のスケーリング - パート2
TL;DR
Hugging Faceは、ソフトウェアコンポーネント(具体的にはメモリ割り当て器、並列化ライブラリ、およびベイズ最適化の使用)を最適化することで、Intel Ice Lake Xeon CPU上でのBERTライクなモデルの推論パフォーマンスを大幅に向上させることができることを示しました。これらの最適化は、AVX-512やVNNIのようなハードウェア機能と組み合わさることで、CPUベースのインフラストラクチャ上でのNLPワークロードのより効率的なスケーリングを可能にします。
AI効率化のためのIntelソフトウェアの活用
Intelハードウェア上でのAIワークロードのパフォーマンスを最大化するために、開発者はIntel oneAPIの傘下にあるソフトウェア最適化スタックを活用できます。これらのツールは、PyTorchやTensorFlowのような高レベルフレームワークと、基礎となるCPUアーキテクチャとの間のギャップを埋めるように設計されています。
主要なソフトウェアコンポーネント
- Intel oneMKL (Math Kernel Library): 高効率な線形代数ルーチンを提供します。
- Intel OpenMP and oneTBB (Threading Building Blocks): 計算の高レベルな並列化のためのフレームワークです。
- Intel oneDNN: 深層ニューラルネットワークのプリミティブ(例:ReLU、全結合層)のライブラリであり、PyTorchおよびTensorFlow(バージョン2.5.0以降)にネイティブに統合されています。
- Intel PyTorch Extension (IPEX): メインのPyTorchライブラリにアップストリームされる前の最適化のための実験場として機能する、特化されたフレームワークです。
CPU推論のためのパフォーマンスチューニングのノブ
推論パフォーマンスは、主に3つの要因によって駆動されます:メモリ内のデータ表現、数学的演算子の実装、および並列化の効率性です。
メモリ割り当てと管理
メモリ割り当て(OSから動的メモリを要求するプロセス)は、速度と断片化に影響を与える可能性があります。glibcのようなデフォルトの割り当て器は汎用目的ですが、特化された割り当て器を使用することで、マルチスレッドの深層学習ワークロードにおける同期オーバーヘッドを削減できます:
- tcmalloc (Google): 各スレッドにローカルメモリセグメントを維持することで、グローバルなクリティカルパスを削減し、多くの場合、さまざまなワークロードにおいて最高のパフォーマンスを提供します。
- jemalloc (Facebook): 特定の低並列度状況において、最も高速になる場合があります。
- mimalloc (Microsoft): メモリ管理を改善するためのもう一つの選択肢です。
計算の並列化
複数のCPUコアを効率的に利用するには、単にコア数を増やすだけでは不十分です。CPUキャッシュの無効化や同時データアクセスなどの要因が、スケーリングを妨げる可能性があります。Hugging Faceは、スレッドのディスパッチとリソースバインディングを最適化するために、Intelハードウェアに対してOpenMP仕様のIntel実装("IOMP")を使用することを推奨しています。
最適化された数学的演算子
モダンなCPUは、1クロックサイクルあたりに複数のアイテムを操作するためにSIMD (Single Instruction Multiple Data) 命令を使用します。Intel CPUはSSE2、AVX、AVX2、およびAVX-512をサポートしています。Intel MKLやoneDNNのようなライブラリは、これらの演算子を効率的に実装しており、Linear + ReLUやConvolutionのような一般的なパターンに対してパフォーマンスの高速化を可能にします。
Intel Ice Lake Xeon CPUでのベンチマーク
ベンチマークは、Ubuntu 20.04.2 LTS上でIntel Ice Lake Xeon Platinum 8380 CPUを使用して、PyTorch 1.9.0およびTensorFlow 2.5.0を、さまざまなバッチサイズ(1から128)およびシーケンス長(8から512)にわたってテストしました。
Eagerモード vs. Graphモード
- Eager Mode (PyTorch, TensorFlow): 計算グラフは実行中に発見されます。これは柔軟性を提供しますが、実行時のオーバーヘッドを導入し、演算子フュージョン(例:Convolution + ReLU)をより困難にします。
- Graph Mode (TorchScript, TensorFlow Graph, Intel TensorFlow): グラフは事前に知られているため、枝刈り、演算子フュージョン、および事前計画されたメモリ割り当てが可能です。
スケーリングに関する主要な知見
- コア・スケーリング: コア数を増やすことは一般的にレイテンシを減少させますが、単調増加ではありません。ワークロードのサイズと割り当てられたリソースの間のトレードオフが存在します。
- インター・ソケット・オーバーヘッド: 複数のCPU(複数のソケット)を備えたシステムで全コアを使用する場合、インター・ソケット通信による大きなレイテンシ・オーバーヘッドがしばしば導入されます。
- 割り当て器のインパクト: メモリを動的に管理する必要があるEagerモードでは、割り当て器の選択(例:tcmalloc)が、リソースを事前に予約できるGraphモードよりも、パフォーマンスに顕著な影響を与えます。
Intel SigOptによる自動パフォーマンスチューニング
最適な設定の探索空間が膨大であるため(コア数、メモリ割り当て器、並列化ライブラリ、Transparent Huge Pages、およびKMP block timeの組み合わせ)、総当たり的なチューニングは非効率的です。Hugging Faceは、ほぼ最適な構成をより速く見つけるために、ベイズ最適化を使用するIntel SigOptを活用しました。
SigOptの結果
- 効率性: SigOptは、総当たり法の結果に非常に近いパフォーマンスを提供しました。最大の差は8.6%でした。
- パラメータの重要性: コア数は一貫して最も重要なパラメータです。しかし、大きなシーケンス長(例:512)の場合、並列化ライブラリの選択(OpenMP vs. Intel OpenMP)が、メモリ割り当て器と比較してより重要になります。
- リソース最適化: SigOptは、より少ないコア数(例:16コア)を使用することが、時として最高のレイテンシを実現できることを特定しました。これにより、複数のモデルインスタンスを並列に実行することで、全体ののスループットを向上させることができます。
結論
Intel Ice Lake Xeon CPU上でBERTライクなモデルをプロダクション環境で最適化するには、レイヤー化されたアプローチが必要です:低レベルのハードウェア機能から始まり、フレームワーク特化の最適化(oneDNNなど)に移動し、最後にメモリ割り当て器やOpenMP実装などのシステムレベルのノブをチューニングすることです。これらの取り組みは、Hugging Face OptimumライブラリおよびInfinity製品に統合されており、高効率なコンテナ化された推論ソリューションを提供します。