ホーム » 「TensorFlow Performance」タグがついた投稿

タグアーカイブ: TensorFlow Performance

TensorFlow : Performance : XLA JIT コンピレーションを使用する

TensorFlow : Performance : XLA JIT コンピレーションを使用する(翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 03/22/2017

* 本ページは、TensorFlow の本家サイトの Performance – Using JIT Compilation を翻訳した上で
適宜、補足説明したものです:
https://www.tensorflow.org/performance/xla/jit
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

【注意】XLA を含めるためには TensorFlow をソースからコンパイルしなければなりません。

 

何故 just-in-time (JIT) コンピレーションを使用するのか?

TensorFlow/XLA JIT コンパイラは XLA を通して TensorFlow グラフのパーツをコンパイルして実行します。標準の TensorFlow 実装を超えるこれのメリットは XLA が複数の演算を少数のコンパイル済みのカーネルに融合できることです(カーネル・フュージョン)。演算の融合は、TensorFlow executor が行なっているような、演算を一つずつ (one-at-a-time) 実行することに比べてメモリ帯域幅の要求を減少させてパフォーマンスを改善することができます。

 

XLA を通して TensorFlow グラフを実行する

XLA を通して TensorFlow 計算を実行するには2つの方法があります、CPU または GPU デバイス上に置かれた JIT-コンパイリング演算子によるか、XLA_CPU または XLA_GPU TensorFlow デバイス上に演算子を置くことによるかです。演算を TensorFlow XLA デバイス上に直接置くことは演算にそのデバイス上で実行されることをことを強制し主としてテストのために使用されます。

【注意】 XLA CPU バックエンドは(多くの場合)高速な単一スレッドのコードを生成しますが、TensorFlow CPU バックエンドと同様にまだ並列化はしていません。XLA GPU バックエンドは標準 TensorFlow 実装と競争力があり、ときにより速く、ときにより遅いです。

JIT コンピレーションを有効にする

JIT コンピレーションは session レベルでもあるいは手動で選択した演算子のためにでも有効にすることができます。これらのアプローチの両者ともゼロコピーです — データはデータが渡されるときに同じデバイス上に置かれた、コンパイル済みの XLA カーネルと TensorFlow 演算子の間でコピーされる必要はありません。

Session

session レベルで JIT コンピレーションが有効にされると全ての可能な演算子は貪欲に XLA 計算にコンパイルされる結果になるでしょう。各 XLA 計算は基礎となるデバイスのために一つあるいはそれ以上のカーネルにコンパイルされます。

2、3の制約のもとで、グラフに2つの隣接する演算がありそれらが両者とも XLA 実装を持つのであれば、それらは単一の XLA 計算にコンパイルされます。

JIT コンピレーションは、global_jit_level config に tf.OptimizerOptions.ON_1 をセットして session 初期化の間に config を渡すことによって session レベルで有効になります。

# Config to turn on JIT compilation
config = tf.ConfigProto()
config.graph_options.optimizer_options.global_jit_level = tf.OptimizerOptions.ON_1

sess = tf.Session(config=config)

【注意】JIT を session レベルで有効にすることは演算が CPU のためにコンパイルされる結果にはなりません。CPU 演算のための JIT コンピレーションは後述されるような手動の方法を通して行なわれなければなりません。この決定は単一スレッドである CPU バックエンドによってなされました。

マニュアル (手動)

JIT コンピレーションはまた一つあるいはそれ以上の演算のために手動で有効にすることもできます。これは、_XlaCompile=true 属性でコンパイルするように演算にタグ付けすることでなされます。これを行なうもっとも単純な方法は、tensorflow/contrib/compiler/jit.py で定義された tf.contrib.compiler.jit.experimental_jit_scope() スコープを通すことです。使用例は :

jit_scope = tf.contrib.compiler.jit.experimental_jit_scope

x = tf.placeholder(np.float32)
with jit_scope():
  y = tf.add(x, x)  # The "add" will be compiled with XLA.

_XlaCompile 属性は現在はベストエフォート・ベースでサポートされています。演算がコンパイルできないときは、TensorFlow は通常の実装に静的にフォールバックします。

演算を XLA デバイス上に置く

XLA を通して計算を実行する他の方法は特定の XLA デバイス上に演算を置くことです。この方法は通常はテストのためにだけ使用されます。有効なターゲットは XLA_CPU または XLA_GPU です。

with tf.device("/job:localhost/replica:0/task:0/device:XLA_GPU:0"):
  output = tf.add(input1, input2)

標準の CPU と GPU デバイス上の JIT コンピレーションと異なり、これらのデバイスは(データが)デバイスへ/から転送される時にデータのコピーを作成します。余分なコピーは、同じグラフ内で XLA と TensorFlow 演算をミックスすることをコスト高にします。

 

チュートリアル

このチュートリアルは、JIT を有効にした MNIST softmax の単純なバージョンのトレーニングをカバーします。現在は session レベルの JIT は、これはチュートリアルのために使用しますが、GPU のみをサポートします。

チュートリアルを始める前に、LD_LIBRARY 環境変数あるいは ldconfig が $CUDA_ROOT/extras/CUPTI/lib64 を含むことを確認してください、これは CUDA Profiling Tools Interface ( CUPTI ) のためのライブラリを含みます。

TensorFlow は GPU から tracing 情報を引っ張るために CUPTI を使用します。

Step #1: サンプル・スクリプトを準備する

mnist_softmax_xla.py をダウンロードするか、TensorFlow ソース・トリーの外側のフォルダに移します。

Step #2: XLA なしで実行する

XLA なしでモデルをトレーニングするために python スクリプトを実行します。

python mnist_softmax_xla.py --xla=''

Chrome Trace Event Profiler (browse to chrome://tracing) を使用して、スクリプトが終了したときに作成される timeline ファイルを開きます: timeline.ctf.json。

表示されたタイムラインは複数のグリーン・ボックスを持つ下の図と類似したものになるでしょう、(CPU の場合には) たぶん複数の CPU に渡って。

 
訳注: 以下は CPU 環境で確認したものです :

Step #3 XLA で実行する

XLA グラフを出力する環境変数を通して XLA のデバッグ機能を有効にして XLA でモデルをトレーニングするための python スクリプトを実行します。

TF_XLA_FLAGS=--xla_generate_hlo_graph=.* python mnist_softmax_xla.py

作成された timeline ファイル (timeline.ctf.json) を開きます。表示されたタイムラインは _XlaLaunch とラベル付けされた一つの長いバーを持つ下の図と類似したものになるでしょう。

 
_XlaLaunch で何が起きているかを理解するためには、以下に類似したステートメントのコンソール出力を見てみましょう :

computation cluster_0[_XlaCompiledKernel=true,_XlaNumConstantArgs=1].v82 [CPU:
pipeline start, before inline]: /tmp/hlo_graph_0.dot

コンソール・ステートメントは hlo_graph_xx.dot ファイルの位置を指し示し、これは XLA で作成されたグラフについての情報を含みます。Ops を融合するために XLA が取るプロセスは hlo_graph_0.dot から開始して続く各図を見ることで可視化されます。

.dot ファイルを png に展開するためには、 GraphViz をインストールして実行します :

dot -Tpng hlo_graph_80.dot -o hlo_graph_80.png

結果は次のようなものです :

 

以上

TensorFlow : Performance : XLA 概要

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 コンピレーションをサポートします。

 

以上

AI導入支援 #2 ウェビナー

スモールスタートを可能としたAI導入支援   Vol.2
[無料 WEB セミナー] [詳細]
「画像認識 AI PoC スターターパック」の紹介
既に AI 技術を実ビジネスで活用し、成果を上げている日本企業も多く存在しており、競争優位なビジネスを展開しております。
しかしながら AI を導入したくとも PoC (概念実証) だけでも高額な費用がかかり取組めていない企業も少なくないようです。A I導入時には欠かせない PoC を手軽にしかも短期間で認知度を確認可能とするサービの紹介と共に、AI 技術の特性と具体的な導入プロセスに加え運用時のポイントについても解説いたします。
日時:2021年10月13日(水)
会場:WEBセミナー
共催:クラスキャット、日本FLOW(株)
後援:働き方改革推進コンソーシアム
参加費: 無料 (事前登録制)
人工知能開発支援
◆ クラスキャットは 人工知能研究開発支援 サービスを提供しています :
  • テクニカルコンサルティングサービス
  • 実証実験 (プロトタイプ構築)
  • アプリケーションへの実装
  • 人工知能研修サービス
◆ お問合せ先 ◆
(株)クラスキャット
セールス・インフォメーション
E-Mail:sales-info@classcat.com