(株)クラスキャットが先日(2019.2.25)から投稿されている「AutoML」に関する記事[1][2][3]を読んで, マイクロソフト社がオープンソース化したAuto MLツールキットNNI(Neural Network Intelligence)[4][5]に興味を持ち, 少し試してみた.
関連記事:
・AutoML:NNIを試してみた! (1)
・AutoML:NNIを試してみた! (2)
NNIは, 機械学習においてハイパーパラメータやモデル構造等の設計/調整作業を自動的に行うようなツールキットである.
詳しいことが, (株)クラスキャットの「Auto ML : Neural Network Intelligence : 概要」[1]に書かれているので, こちらも参考にしてください.
記事では, TensorFlowによるMNISTの例が紹介されているが, 普段kerasを使っているので kerasでやってみた.
1. 準備
NNIは, pipで簡単にインストールできる.
$ pip install --upgrade nni
また, NNIのソースやサンプルコードはgithubから取得できる.
(2019.3.1時点のバージョンは, v0.5.1)
$ git clone https://github.comhttps://github.com/Microsoft/nni
2. 実行
サンプルコードでは, Optimizerと学習率を以下のように振って学習を行う. (search_space.json参照)
- optimizer : Adam, SDG
- learning_rate : 0.0001, 0.001, 0.002, 0.005, 0.01
$ cd nni/examples/trials/mnist-keras $ nnictl create --config config.yml INFO: expand searchSpacePath: search_space.json to /home/aska/src/nni/examples/trials/mnist-keras/search_space.json INFO: expand codeDir: . to /home/aska/src/nni/examples/trials/mnist-keras/. INFO: Starting restful server... INFO: Successfully started Restful server! INFO: Setting local config... INFO: Successfully set local config! INFO: Starting experiment... INFO: Successfully started experiment! ----------------------------------------------------------------------- The experiment id is MRuenTX5 The Web UI urls are: http://127.0.0.1:8080 http://192.168.11.16:8080 ----------------------------------------------------------------------- You can use these commands to get more information about the experiment ----------------------------------------------------------------------- commands description 1. nnictl experiment show show the information of experiments 2. nnictl trial ls list all of trial jobs 3. nnictl top monitor the status of running experiments 4. nnictl log stderr show stderr log content 5. nnictl log stdout show stdout log content 6. nnictl stop stop an experiment 7. nnictl trial kill kill a trial job by id 8. nnictl --help get help information about nnictl -----------------------------------------------------------------------
学習結果(途中経過も可)は, ブラウザから確認できる.
Overview:
Trials Detail:
3. kerasでnni利用
kerasでnniを利用する場合, TensorFlowの場合と同じように, 以下のように実装, 設定する.
(1) jsonでパラメータ等の探索空間を定義する.
{ "optimizer":{"_type":"choice","_value":["Adam", "SGD"]}, "learning_rate":{"_type":"choice","_value":[0.0001, 0.001, 0.002, 0.005, 0.01]} }
(2) NNIからハイパーパラメータのセットを得てモデルを構築し, 学習を行うように実装する.
import nni # <-- nniモジュールのインポート (省略) # ハイパーパラメータを使ってモデル構築 def create_mnist_model(hyper_params, input_shape=(H, W, 1), num_classes=NUM_CLA\ SSES): ''' Create simple convolutional model ''' layers = [ Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=input_sha\ pe), Conv2D(64, (3, 3), activation='relu'), MaxPooling2D(pool_size=(2, 2)), Flatten(), Dense(100, activation='relu'), Dense(num_classes, activation='softmax') ] model = Sequential(layers) if hyper_params['optimizer'] == 'Adam': optimizer = keras.optimizers.Adam(lr=hyper_params['learning_rate']) else: optimizer = keras.optimizers.SGD(lr=hyper_params['learning_rate'], mome\ ntum=0.9) model.compile(loss=keras.losses.categorical_crossentropy, optimizer=optimiz\ er, metrics=['accuracy']) return model class SendMetrics(keras.callbacks.Callback): ''' Keras callback to send metrics to NNI framework ''' def on_epoch_end(self, epoch, logs={}): ''' Run on end of each epoch ''' LOG.debug(logs) nni.report_intermediate_result(logs["val_acc"]) # <-- 途中経過のレポート def train(args, params): ''' Train model ''' x_train, y_train, x_test, y_test = load_mnist_data(args) model = create_mnist_model(params) model.fit(x_train, y_train, batch_size=args.batch_size, epochs=args.epochs,\ verbose=1, validation_data=(x_test, y_test), callbacks=[SendMetrics(), TensorBoard\ (log_dir=TENSORBOARD_DIR)]) _, acc = model.evaluate(x_test, y_test, verbose=0) LOG.debug('Final result is: %d', acc) nni.report_final_result(acc) # <-- 最終結果のレポート if __name__ == '__main__': : try: # get parameters from tuner RECEIVED_PARAMS = nni.get_next_parameter() LOG.debug(RECEIVED_PARAMS) PARAMS = generate_default_params() # <-- ハイパーパラメータのセットを取得 PARAMS.update(RECEIVED_PARAMS) # train train(ARGS, PARAMS) :
(3) YAMLでconfigファイルを定義する.
authorName: default experimentName: example_mnist-keras trialConcurrency: 1 maxExecDuration: 1h maxTrialNum: 10 #choice: local, remote, pai trainingServicePlatform: local searchSpacePath: search_space.json # <-- 探索空間ファイルを指定 #choice: true, false useAnnotation: false tuner: #choice: TPE, Random, Anneal, Evolution, BatchTuner #SMAC (SMAC should be installed through nnictl) builtinTunerName: TPE classArgs: #choice: maximize, minimize optimize_mode: maximize trial: # ↓ トライアルのプログラム等を指定 command: python3 mnist-keras.py codeDir: . gpuNum: 0
これまでは, ハイパーパラメータを調整をするときには, プログラムの引数にハイパーパラメータを渡し, 学習/評価を何回も行っていた.
しかし, NNIなら簡単なコード修正と, search_space.json内にハイパーパラメータの探索範囲を定義することで, 各種ハイパーパラメータの組み合わせでモデル学習/評価ができ, また学習結果などを一覧で比較, 管理できるのでメッチャ便利そう.
ドキュメントを読んでいると, クライアント側でコードやハイパーパラメータの探索範囲などの定義を準備し, 複数の計算機サーバを使ってリモート学習するようなこともできるようなので, 今後試してみたい.
----
[1] Auto ML : Neural Network Intelligence : 概要 - TensorFlow
[2] Auto ML : Neural Network Intelligence : QuickStart - TensorFlow
[3] Auto ML : NNI Tutorials : NNI で Trial Run を書く - TensorFlow
[4] Neural Network Intelligence Documentation
[5] Microsoft/nn: An open source AutoML toolkit for neural architecture search and hyper-parameter tuning.
|
直感 Deep Learning ―Python×Kerasでアイデアを形にするレシピ
|
現場で使える! TensorFlow開発入門 Kerasによる深層学習モデル構築手法 (AI & TECHNOLOGY)
|
詳解 ディープラーニング ~TensorFlow・Kerasによる時系列データ処理~
|