TensorFlow TFRT 新しい TensorFlow ランタイム (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 05/04/2020
* 本ページは、TFRT の以下のドキュメントを翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
TFRT : 新しい TensorFlow ランタイム
TFRT は新しい TensorFlow ランタイムです。それは多岐に渡るドメイン固有ハードウェアに渡り最高クラスのパフォーマンスを持つ、統一された、拡張可能なインフラストラクチャ層を提供することを目的としています。それはマルチスレッド・ホスト CPU の効率的な利用を提供し、完全に非同期なプログラミングモデルをサポートし、そして低位効率性に焦点を当てています。
TFRT は広範囲のユーザに恩恵を与えますが、もし貴方が以下であればそれは貴方に特に関心があるものとなるでしょう :
- 複雑な新しいモデルで実験して TensorFlow にカスタム演算を追加することに関心がある研究者
- モデルをプロダクションでサーブするとき改良されたパフォーマンスを求めるアプリケーション開発者
- エッジとデータセンターデバイスを含む、ハードウェアを TensorFlow にプラグすることに関心があるハードウェアメーカー
… あるいは貴方は単純にクールな ML インフラストラクチャと低位ランタイムテクノロジーに興味があるだけかもしれません!
TFRT の早期の進捗と成功についてより多く学習するには、ResNet 50 上の小さいバッチ GPU 推論のための性能ベンチマークを提供した Tensorflow Dev Summit 2020 プレゼンテーション と、TFRT の中核コンポーネント、低位抽象と一般的なデザイン原理の詳細な概要を提供した MLIR Open Design Deep Dive プレゼンテーション を調べてください。
Note: TRFT は早期ステージのプロジェクトであり一般的な利用のためにはまだ準備できていません。
Getting started
TLDR: このセクションは TFRT のための開発環境をどのようにセットアップするか、そして TFRT コンポーネントを構築してテストするための手順を説明します。TFRT は現在は Ubuntu-16.04 をサポートします。将来サポートされるプラットフォームは MacOS、Windows 等を含みます。TFRT をビルドしてテストするためには Bazel と clang が必要です。
TFRT ビルドとテストワークフローを説明するため、グラフ実行のために以下のバイナリを構築して実行します。
グラフ実行のための Dev Summit プレゼンテーションから引用すれば、TensorFlow ユーザは 高位 TensorFlow API を通して作成された TensorFlow グラフを渡し、それから TFRT はグラフを BEF – TFRT グラフ実行のためのバイナリ実行形式 (= Binary Executable Format) に最適化して低位化するために MLIR ベースのグラフコンパイラを呼び出します (MLIR は TFRT ホストプログラムを表すために使用するコンパイラ・インフラストラクチャです)。下の単純化された TensorFlow 訓練スタック図内の青い矢印がこのフローを示します。
次に紹介される 2 つのバイナリはグラフ実行ワークフローのバックエンドにフォーカスします。グラフコンパイラが TensorFlow グラフを最適化して MLIR で表される低位 TFRT ホストプログラムを生成した後、tfrt_translate はそのホストプログラムから BEF ファイルを生成して bef_executor は BEF ファイルを実行します。tfrt_translate を通した TFRT ホストプログラムから bef_executor への進行は下の拡張された TensorFlow 訓練スタック図で描かれます。TFRT ホストプログラムと BEF ファイルの間の青い矢印は tfrt_translate を表していることに注意してください。両者のプログラムは tools ディレクトリでビルドされます。
tfrt_translate
tfrt_translate プログラムは、アセンブラと逆アセンブラのように、MLIR と BEF の間でラウンドトリップ変換を行ないます。
bef_executor
bef_executor プログラムは BEF ファイルの実行ドライバです。それは BEF ファイルを読み込み、ランタイムをセットアップし、そして非同期にそのファイル内の関数 (s) をっ実行します。
要件
Bazel をインストールする
TFRT を構築するために、Bazel をインストールする必要があります。TFRT は Bazel 2.0.0 から 3.1.0 で構築されて検証されています。Bazel をインストールするには Bazel インストール手順 に従ってください。次でインストールを検証できます :
$ bazel --version bazel 3.1.0
clang をインストールする
clang をインストールするためには clang インストール手順 に従ってください。clang, lldb と lld をインストールする自動インストールスクリプトが推奨されます。TFRT は 9.0.0 とそれ以上でビルドされて検証されています。
インストールされた clang の複数のバージョンを持つ場合、clang の正しいバージョンがデフォルトであることを確実にしてください。Ubuntu ベースのシステムでは、デフォルトバージョンを選択するために update-alternatives を利用できます。次のサンプルコマンドは clang-9 をインストールしていることを仮定しています :
$ sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-9 9 $ sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-9 9
次でインストールを検証します :
$ clang --version clang version 9.0.1-6
libstdc++ をインストールする
TFRT は libstdc++8 またはそれ以上を必要とします。clang の選択されたバージョンを次で確認してください :
$ clang++ -v |& grep "Selected GCC" Selected GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/9
上の例では、パスの最後の 9 が clang が libstdc++9 を使用していることを示します、これは TFRT と互換です。
アップグレードする必要がある場合、最も容易な方法は gcc-8 をインストールすることです。インストールするためには以下のコマンドを実行してください :
$ sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test $ sudo apt-get update $ sudo apt-get install -y gcc-8 g++-8
インストールを検証するためには、上の “clang++ -v” チェックを再実行してください。
TFRT を構築して実行する
TFRT をビルドするため、TFRT ワークスペースのルートディレクトリ (そこには WORKSPACE ファイルが位置します) に cd します。ビルド設定のセットは .bazelrc ファイルにあります。有用かもしれない特別な bazel configs を持つ user.bazelrc をレポジトリルートに作成できます。以下のコマンドで tfrt_translate と bef_executor をビルドします :
$ bazel build -c opt //tools:bef_executor $ bazel build -c opt //tools:tfrt_translate
上のコマンドは opt コンパイルモードでバイナリをビルドします。より多くのビルドオプションについては Bazel のドキュメント を確認してください。Bazel は成功的なビルドの最後に出力位置を知らせます (デフォルトは bazel-bin です)。
tfrt_translate と bef_executor がビルドされた後、次のコマンドで .mlir プログラムを実行します :
$ bazel-bin/tools/tfrt_translate -mlir-to-bef path/to/program.mlir | bazel-bin/tools/bef_executor
TFRT は一連の .mlir テストプログラムを提供します。例えば :
$ bazel-bin/tools/tfrt_translate -mlir-to-bef mlir_tests/bef_executor/async.mlir | bazel-bin/tools/bef_executor
どのような出力も端末にプリントアウトされます。
テストする
TFRT は MLIR-ベースのチェックテストを構築するために LLVM の LIT インフラストラクチャと FileCheck ユティリティツールを利用します。これらのテストは文字列タグの幾つかのセットがテストの出力に現れるかを検証します。テストのより多くのイントロダクションとガイドラインは ここ で見つかります。サンプルテストは下で示されます :
// RUN: tfrt_translate -mlir-to-bef %s | bef_executor | FileCheck %s // RUN: tfrt_opt %s | tfrt_opt // CHECK-LABEL: --- Running 'basic_tensor' func @basic_tensor() { %c0 = hex.new.chain %a = dht.create_uninitialized_tensor.i32.2 [3 : i64, 2 : i64] %c1 = dht.fill_tensor_with_constant.i32 %a, %c0 0 : i32 // CHECK: shape = [3, 2], values = [0, 0, 0, 0, 0, 0] %c2 = dht.print_tensor %a, %c1 hex.return }
テストを実行するには、単純に bazel test を起動します :
$ bazel test -c opt //mlir_tests/bef_executor:basics.mlir.test
MLIR テストのスーツは 3 つのディレクトリの下に置かれます :
- ./mlir_tests これは中心的な TFRT コンポーネントとコアカーネルのためのテストを含みます;
- ./backends/common/mlir_tests, ./backends/cpu/mlir_tests これらは CPU ops のためのテストを含みます。
テストスーツを実行するには、次のコマンドを実行します :
$ bazel test -c opt <path/to/test/suite>:all
ここでテストスーツへのパスは上の一つです。
総ての CPU テストを実行するには :
$ bazel test -c opt //... -- -//third_party/...
ここで -//third_party/… は third_party レポジトリのためにビルドファイルで指定されたテストを除きます。
以上