Auto ML : NNI Tutorials : NNI で Trial Run を書く (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 02/27/2019
* 本ページは、NNI の以下のドキュメントを翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
NNI Tutorials : NNI で Trial Run を書く
NNI のトライアルはモデル上で configuration (e.g., ハイパーパラメータのセット) を適用する個々の試行です。
NNI トライアルを定義するためには、最初にパラメータのセット (i.e., 探索空間) を定義してそれからモデルを更新する必要があります。NNI はトライアルを定義するために貴方に 2 つのアプローチを提供します : NNI API と NNI Python アノテーション です。 より多くのトライアル・サンプルは こちら を参照できるでしょう。
NNI API
Step 1 – 探索空間パラメータ・ファイルを準備する
サンプルは下で示されます :
{ "dropout_rate":{"_type":"uniform","_value":[0.1,0.5]}, "conv_size":{"_type":"choice","_value":[2,3,5,7]}, "hidden_size":{"_type":"choice","_value":[124, 512, 1024]}, "learning_rate":{"_type":"uniform","_value":[0.0001, 0.1]} }
探索空間について更に学習するためには SearchSpaceSpec.md を参照してください。
チューナーはこの探索空間から configuration を生成します、つまり、範囲から各ハイパーパラメータのための値を選択します。
Step 2 – モデル・コードを更新する
- Import NNI
NNI API を使用するためにトライアル・コードに “import nni” を含めます。 - チューナーから configuration を得る。
RECEIVED_PARAMS = nni.get_next_parameter()
RECEIVED_PARAMS はオブジェクトです、 例えば :
{"conv_size": 2, "hidden_size": 124, "learning_rate": 0.0307, "dropout_rate": 0.2029}
- メトリックデータを定期的に報告する (オプション)。
nni.report_intermediate_result(metrics)
メトリクスは任意の python オブジェクトです。ユーザが NMI 組み込みチューナー/アセッサーを使用するのであれば、メトリクスは 2 つの形式だけを持つことができます: 1) 数字 e.g., float, int, 2) 辞書オブジェクト、これは default と名前付けられたキーを持ちその値は数字です。このメトリクスは アセッサー に報告されます。通常は、メトリクスは定期的に評価された損失か精度であり得ます。
- configuration のパフォーマンスを報告する。
nni.report_final_result(metrics)
メトリクスはまた任意のオブジェクトであり得ます。ユーザが NNI 組み込みチューナー/アセッサーを使用するのであれば、メトリクスは report_intermediate_result (の場合) と同じ形式ルールに従います、数字はモデルのパフォーマンスを示します、例えば、モデルの精度、損失 etc. このメトリクスは チューナー に報告されます。
Step 3 – NNI API を有効にする
NNI API モードを有効にするには、useAnnotation を false に設定して SearchSpace ファイル (丁度 step 1 で定義しました) のパスを提供する必要があります :
useAnnotation: false searchSpacePath: /path/to/your/search_space.json
実験 configuration をどのようにセットアップするかについてより多くの情報は こちら を参照できます。
* NNI により提供されるより多くの API (e.g., nni.get_sequence_id()) については こちら を参照してください。
NNI Python アノテーション
トライアルを書くための代替は python のための NNI シンタクスを使用します。任意のアノテーションのように単純に、NNI アノテーションは貴方のコードでコメントのように動作します。貴方の既存のコードに構造を作成したり任意の他の大きな変更を行なう必要はありません。NNI アノテーションの数行で、次が可能です :
- 調整したい変数 (= variables) をアノテートする
- どの範囲内で変数を調整することを望むか指定する
- どの変数をアセッサーに中間結果として報告することを望むかをアノテートする
- どの変数をチューナーに最終結果 (e.g. モデル精度) として報告することを望むかをアノテートする
再度、MNIST を例に取れば、それは NNI アノテーションでトライアルを書くために 2 ステップだけを要求します。
Step 1 – アノテーションでコードを更新する
以下は NNI アノテーションのための tensorflow コード・スニペットです、そこではハイライトされた 4 行は次を手助けするためのアノテーションです (訳注: ここではハイライトされていません、行の最初に “+” がついています) :
- batch_size と dropout_rate を調整する
- 100 ステップ毎に test_acc を報告する
- 最後に最終結果として test_acc を報告する
注目すべきことは : これらの新たに追加されたコードはアノテーションですので、それは貴方の以前のコードロジックを実際には変更しません、NNI がインストールされていない環境で通常のようにコードを依然として実行することができます。
with tf.Session() as sess: sess.run(tf.global_variables_initializer()) + """@nni.variable(nni.choice(50, 250, 500), name=batch_size)""" batch_size = 128 for i in range(10000): batch = mnist.train.next_batch(batch_size) + """@nni.variable(nni.choice(1, 5), name=dropout_rate)""" dropout_rate = 0.5 mnist_network.train_step.run(feed_dict={mnist_network.images: batch[0], mnist_network.labels: batch[1], mnist_network.keep_prob: dropout_rate}) if i % 100 == 0: test_acc = mnist_network.accuracy.eval( feed_dict={mnist_network.images: mnist.test.images, mnist_network.labels: mnist.test.labels, mnist_network.keep_prob: 1.0}) + """@nni.report_intermediate_result(test_acc)""" test_acc = mnist_network.accuracy.eval( feed_dict={mnist_network.images: mnist.test.images, mnist_network.labels: mnist.test.labels, mnist_network.keep_prob: 1.0}) + """@nni.report_final_result(test_acc)"""
NOTE:
- @nni.variable はそれに続く行上で効果があり、それは割り当てステートメントでその左辺値は @nni.variable でキーワード名により指定されなければなりません。
- @nni.report_intermediate_result/@nni.report_final_result はその行でデータをアセッサー/チューナーに送ります。
アノテーション・シンタックスとその使用方法についてのより多くの情報については、Annotation を参照してください。
Step 2 – NNI アノテーションを有効にする
YAML configuration ファイルでは、NNI アノテーションを有効にするために useAnnotation を true に設定する必要があります :
useAnnotation: true
より多くのトライアル・サンプル
- MNIST examples
- Finding out best optimizer for Cifar10 classification
- How to tune Scikit-learn on NNI
- Automatic Model Architecture Search for Reading Comprehension.
- Tuning GBDT on NNI
以上