TensorFlow : Performance : XLA 概要(翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 03/21/2017
* 本ページは、TensorFlow の本家サイトの Performance – XLA Overview を翻訳した上で
適宜、補足説明したものです:
https://www.tensorflow.org/performance/xla/
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
【注意】 XLA は実験的で alpha と考えられます。多くのユースケースではパフォーマンスにおける改善は見られないでしょう (速度あるいはメモリ使用量の減少)。XLA を早期にリリースしたのはオープンソース・コミュニティがハードウェア・アクセラレータとの統合のためのパスを作成できることに加えて、その開発に貢献できるようにするためです。
XLA (Accelerated Linear Algebra – 直訳すれば、加速された線形代数) は TensorFlow 計算を最適化する、線形代数のためのドメイン固有コンパイラ (domain-specific compiler) です。結果は速度、メモリ使用量、そしてサーバとモバイル・プラットフォーム上のポータビリティです。最初は、多くのユーザは XLA からの大きな恩恵を見ることはないでしょうが、just-in-time (JIT) コンピレーション あるいは ahead-of-time (AOT) コンピレーション を通じて XLA を使用することによる実験は歓迎するでしょう。新しいハードウェア・アクセラレータを対象とする開発者は XLA を試すことが特に奨励されるでしょう。
XLA フレームワークは実験的で活発に開発中です。特に、既存の演算のセマンティクスが変更されることはないものの、重要なユースケースをカバーするために更に演算が追加されることは期待されます。欠落している機能についてのコミュニティからのフィードバックや GitHub を通したコミュニティの貢献をチームは歓迎します。
何故 XLA を構築したのか?
XLA が TensorFlow と連携するために幾つかの目的を持ちました :
- 実行スピードを改善する。サブグラフをコンパイルして一時的な Ops の実行時間を減少させ、TensorFlow ランタイムからオーバーヘッドを取り除き、メモリオーバーヘッドを減じるためにパイプライン化された演算を融合し、そしてより積極的な定数伝播を可能にするために既知のテンソル shape に特化します。
- メモリ使用を改善する。メモリ使用を解析してスケジューリングし、原則的に多くの中間的なストレージ・バッファを取り除きます。
- カスタム Op への依存を減じる。手動で融合されたカスタム Op の性能に匹敵するように自動的に融合された低位の Op の性能を改善することによって多くのカスタム Op への要求を取り除きます。
- モバイル・フットプリントを減じる。サブグラフを ahead-of-time コンパイリングして他のアプリケーションに直接リンク可能なオブジェクト/ヘッダのファイル・ペアを発行する (emit) ことで TensorFlow ランタイムを取り除きます。結果はモバイル推論のためのフットプリントを桁違いに減少できます。
- ポータビリティを改善する。 新しいハードウェアのための新しいバックエンドを書くことを比較的容易にします、その場所では TensorFlow プログラムの大きな断片がそのハードウェアで変更されることなく実行されます。これは新しいハードウェアのために個々のモノリシック Ops を特化するアプローチとの対比であり、それはこれらの Ops を利用するために TensorFlow プログラムが書き直されることを必要とします。
XLA はどのように動作するか?
XLA への入力言語は “HLO IR”、あるいは単に HLO (High Level Optimizer – 高位オプティマイザ) と呼ばれます。HLO のセマンティクスは Operation Semantics ページで記述されます。それは HLO を コンパイラ IR として考えることは便利です。(訳注: IR は中間表現。)
XLA は HLO で定義されたグラフ (“計算”) を取りそれらを各種アーキテクチャのマシン命令にコンパイルします。ある新規の H/W アーキテクチャを対象とする ために代替のバックエンドにスロットすることが容易であるという意味で XLA はモジュールです。NVIDIA GPU バックエンドに加えて x64 と ARM64 のための CPU バックエンドは TensorFlow ソース・ツリーにあります。
次の図は XLA におけるコンピレーション・プロセスを示します :
XLA は幾つかの最適化と解析が付属しています、これは CSE のようなターゲット独立、ターゲット独立演算の融合、そして計算のためのランタイム・メモリを割り当てるためのバッファ解析です。
ターゲット独立なステップの後、XLA は HLO 計算をバックエンドに送ります。バックエンドは更なる HLO-レベルの解析と最適化を行なうことができ、この時はターゲット固有情報と要請が念頭に置かれます。
例えば、XLA GPU バックエンドは GPU プログラミングモデルのために具体的に有益な演算の融合を実行してそしてどのように計算をストリームに分割するかを決定します。このステージでは、バックエンドはまたある演算や最適化されたライブラリ・コールに関連したコンビネーションをパターンマッチします。
次のステップはターゲット固有のコード生成です。XLA に含まれる CPU と GPU バックエンドは低位な IR、最適化、そしてコード生成のために LLVM を使用します。これらのバックエンドは効率的な流儀で XLA HLO 計算を表すに必要な LLVM IR を発行し、そしてそれからこの LLVM IR からネーティブ・コードを発行するために LLVM を呼び出します。
GPU バックエンドは現在 NVIDIA GPU を LLVM NVPTX バックエンドを通してサポートします; CPU バックエンドは複数の CPU ISA をサポートします。
サポートされるプラットフォーム
XLA は現在 x86-64 と NVIDIA GPU 上の JIT コンピレーションをサポートします; そして x86-64 と ARM のための AOT コンピレーションをサポートします。
以上