モダンな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製品に統合されており、高効率なコンテナ化された推論ソリューションを提供します。

Sources