ホーム » AutoML » Auto ML : NNI Tutorials : NNI で Trial Run を書く

Auto ML : NNI Tutorials : NNI で Trial Run を書く

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 APINNI 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 行は次を手助けするためのアノテーションです (訳注: ここではハイライトされていません、行の最初に “+” がついています) :

  1. batch_size と dropout_rate を調整する
  2. 100 ステップ毎に test_acc を報告する
  3. 最後に最終結果として 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

 

より多くのトライアル・サンプル

 

以上






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