AutoML : NNI 1.5 : 自動調整 : 上級 : チューナーのカスタマイズ (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 05/31/2020
* 本ページは、NNI の以下のドキュメントを翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
自動調整 : 上級 : チューナーのカスタマイズ
チューナーをカスタマイズする
NNI は組込みチューナーで先端技術の調整アルゴリズムを提供します。NNI は調整要件のために貴方自身でチューナーを構築することをサポートします。
貴方自身の調整アルゴリズムを実装することを望むのであれば、カスタマイズされたチューナーを実装できます、行なうべき 3 つのことがあります :
- 基底 Tuner クラスを継承する
- receive_trial_result と generate_parameter 関数を実装する
- 実験 YAML config ファイルで貴方のカスタマイズされたチューナーを configure する
ここにサンプルがあります :
1. 基底 Tuner クラスを継承する
from nni.tuner import Tuner class CustomizedTuner(Tuner): def __init__(self, ...):
2. receive_trial_result と generate_parameter 関数を実装する
from nni.tuner import Tuner class CustomizedTuner(Tuner): def __init__(self, ...): ... def receive_trial_result(self, parameter_id, parameters, value, **kwargs): ''' Receive trial's final result. parameter_id: int parameters: object created by 'generate_parameters()' value: final metrics of the trial, including default metric ''' # your code implements here. ... def generate_parameters(self, parameter_id, **kwargs): ''' Returns a set of trial (hyper-)parameters, as a serializable object parameter_id: int ''' # your code implements here. return your_parameters
receive_trial_result はパラメータ入力として parameter_id, parameters, value を受け取ります。また、Tuner はトライアルが送ったものと正確に同じ value オブジェクトを受け取ります。
generate_parameters 関数から返される your_parameters は NNI SDK により json オブジェクトとして pack されます。NNI SDK は json オブジェクトを unpack してトライアルは正確に同じ your_parameters を Tuner から受け取ります。
例えば : 貴方がこのように generate_parameters を実装する場合 :
def generate_parameters(self, parameter_id, **kwargs): ''' Returns a set of trial (hyper-)parameters, as a serializable object parameter_id: int ''' # your code implements here. return {"dropout": 0.3, "learning_rate": 0.4}
それは貴方のチューナーが常にパラメータ {“dropout”: 0.3, “learning_rate”: 0.4} を生成することを意味します。それからトライアルは API nni.get_next_parameter() を呼び出すことにより {“dropout”: 0.3, “learning_rate”: 0.4} を受け取ります。ひとたびトライアルが結果 (通常はある種のメトリクス) とともに終了すれば、それは API nni.report_final_result() を呼び出すことにより結果をチューナーに送ることができます、例えば nni.report_final_result(0.93) です。それから貴方のチューナーの receive_trial_result 関数は次のように結果を受け取ります :
parameter_id = 82347 parameters = {"dropout": 0.3, "learning_rate": 0.4} value = 0.93
貴方のチューナーの作業ディレクトリは <home>/nni/experiments/<experiment_id>/log で、これは環境変数 NNI_LOG_DIRECTORY で受け取ることができて、従って、貴方自身のチューナーのディレクトリでファイル (e.g., data.txt) にアクセスすることを望む場合、open(‘data.txt’, ‘r’) は使用できないことに注意してください。代わりに、以下を使用するべきです :
_pwd = os.path.dirname(__file__) _fd = open(os.path.join(_pwd, 'data.txt'), 'r')
これは貴方のチューナーが貴方のチューナーのディレクトリで実行されないからです (i.e., pwd は貴方自身のチューナーのディレクトリではありません)。
3. 実験 YAML config ファイルで貴方のカスタマイズされたチューナーを configure する
NNI は貴方のカスタマイズされたチューナークラスの位置を特定してクラスをインスタンス化する必要がありますので、カスタマイズされたチューナークラスの位置を指定してパラメータとしてリテラル値を __init__ コンストラクタに渡す必要があります。
tuner: codeDir: /home/abc/mytuner classFileName: my_customized_tuner.py className: CustomizedTuner # Any parameter need to pass to your tuner class __init__ constructor # can be specified in this optional classArgs field, for example classArgs: arg1: value1
より詳細なサンプルは以下を見ることができるでしょう :
より進んだ automl アルゴリズムを書く
上のメソッドは通常は一般的なチューナーを書くために十分です。けれども、よりパワフルな automl アルゴリズムを持つために、ユーザはより多くのメソッド、例えば、中間結果、トライアルの状態 (アセッサーのメソッド) も望むかも知れません。そのため、アドバイザーと呼ばれるもう一つの概念を持ちます、これは src/sdk/pynni/nni/msg_dispatcher_base.py の MsgDispatcherBase から直接に継承します。カスタマイズされたアドバイザーをどのように書くかについては ここ を参照してください。
以上