# 推論最適化 ## 定義 推論最適化(inference optimization)とは、モデルのパラメータ数やサイズを変えずに、推論そのものを高速化する処理を指す。モデルを小さくするモデル圧縮とは区別される概念で、推論レイテンシーを削減する3方向(推論の高速化・モデルの縮小・ハードウェアの高速化)のうち前者にあたる。(Source: [[@2023__OReillyJapan__機械学習システムデザイン - Chapter 7 モデルのデプロイと予測サービス]] §7.3) TensorFlow・PyTorch等のフレームワークで構築したモデルを特定のハードウェアバックエンド(CPU/GPU/TPU等)で動作させるには、そのフレームワークがハードウェアベンダーにサポートされている必要があるが、対応には多大な時間とエンジニアの労力を要する。CPU の計算プリミティブはスカラ、GPU は一次元ベクトル、TPU は二次元ベクトル(テンソル)というように、ハードウェアバックエンドごとに計算プリミティブとメモリレイアウトが異なるためである。この課題に対し、フレームワークとハードウェアの間に「仲介者」としてIR(intermediate representation:中間表現)を置く設計が採られる。IRは高レベルIR(計算グラフ、ハードウェア非依存、XLA HLO・TensorFlow Lite・TensorRT等)→調整されたIR(手作業または機械学習ベースの調整を経る)→低レベルIR(言語非依存、LLVM・NVCC等が生成する機械語)という段階を経てネイティブコードに至り、この過程を低レベル化(lowering)と呼ぶ。一対一の変換ではないためトランスレート(トランスパイル)とは呼ばれない。(Source: [[@2023__OReillyJapan__機械学習システムデザイン - Chapter 7 モデルのデプロイと予測サービス]] §7.4.1) モデルの最適化には局所的最適化(モデルの演算や演算の集合を最適化する)と全体的最適化(計算グラフ全体を端から端まで最適化する)がある。局所的最適化の代表的な4技法は次のとおり。 - **ベクトル化(vectorization)**: ループを1つずつ実行せず、メモリ上で連続する複数要素を同時に処理してデータI/Oのレイテンシーを削減する。 - **並列化(parallelization)**: 入力配列(またはn次元配列)を独立したチャンクに分割し、それぞれを個別に演算する。 - **ループタイリング(loop tiling)**: ループ中のデータアクセス順序を変更しハードウェアのメモリレイアウトやキャッシュを活用できるようにする。ハードウェア依存の最適化であり、CPUに適切なアクセスパターンがGPUに適切とは限らない。 - **融合演算(operator fusion)**: 複数の演算を1つに融合し冗長なメモリアクセスを避ける。計算グラフの高レベル構造を活用する全体的最適化としては、畳み込みニューラルネットワークの計算グラフに対する垂直融合・水平融合がある。 局所最適化・全体最適化とも、従来はフレームワーク・ハードウェアベンダーが雇う最適化エンジニアが経験に基づくヒューリスティックを設計してきたが、これには非最適解であること・フレームワークやハードウェアが新しくなるたびにやり直しが必要という2つの欠点がある。これに対し、TVMの一部であるautoTVMは、計算グラフを部分グラフに分割し、それぞれの部分グラフの実行時間を予測するコストモデルを機械学習で訓練し、実行するハードウェアの種類に関係なく適応できる最適化探索を行う。ただし探索には何時間・何日もかかりうる一方、最適化結果はキャッシュして再利用できる。(Source: [[@2023__OReillyJapan__機械学習システムデザイン - Chapter 7 モデルのデプロイと予測サービス]] §7.4.1.1, §7.4.1.2) ## 横断的知見 - (現時点でソースは1件のみ。他ソースとの横断比較は今後の ingest で蓄積する。) ## 未解決の問い - autoTVMのコストモデル訓練にかかる「何時間・何日」という探索コストは、モデルアーキテクチャ(CNN/Transformer等)によってどこまで変わるか。書籍執筆時点(2022年)の記述であり、その後の高速化手法の進展は反映されていない。 - 局所的最適化4技法(ベクトル化・並列化・ループタイリング・融合演算)と、[[カーネルフュージョン]]概念が扱うGPU固有のカーネル融合(スレッドマッピング・レジスタ圧力)は、どこまで同一の技法群として統合的に理解できるか。本ページの融合演算はハードウェア非依存の一般的なコンパイラ最適化として説明されるのに対し、[[カーネルフュージョン]]はGPUカーネル起動境界の暗黙同期という具体的な制約に踏み込んでおり、抽象度の異なる記述を橋渡しする横断的知見はまだ書けない。 - [[torch.compile]]のTorchInductorが実装する自動融合(elementwise演算・GEMM前処理/後処理)は、本ページのautoTVM的な機械学習ベースの最適化探索とどう異なるか。両者とも「人手のヒューリスティックを機械/コンパイラで置き換える」という同じ動機を持つように見えるが、具体的な探索・生成メカニズムの異同はまだ突き合わせていない。 - IR段階(高レベルIR→調整されたIR→低レベルIR)の「調整されたIR」に機械学習ベースの調整が入るとされるが、これはautoTVMのコストモデル探索と同一のプロセスを指すのか、別の最適化ステップなのか、原文の記述だけでは判別できない。 ## 関連 - ソース: [[@2023__OReillyJapan__機械学習システムデザイン - Chapter 7 モデルのデプロイと予測サービス]] - 概念: [[モデル圧縮]] / [[カーネルフュージョン]] / [[torch.compile]] / [[量子化]] / [[Edge Computing]] / [[WebAssembly]] ## 出典 - [[@2023__OReillyJapan__機械学習システムデザイン - Chapter 7 モデルのデプロイと予測サービス]](§7.3, §7.4.1 エッジデバイス向けのモデルのコンパイルと最適化, §7.4.1.1 モデルの最適化, §7.4.1.2 機械学習を使用した機械学習モデルの最適化)