みらいテックラボ

音声・画像認識や機械学習など, 週末プログラマである管理人が興味のある技術の紹介や実際にトライしてみた様子などメモしていく.

AutoML:NNIを試してみた! (1)

(株)クラスキャットが先日(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:
f:id:moonlight-aska:20190301162206p:plain

Trials Detail:
f:id:moonlight-aska:20190301162732p:plain

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.




PythonとKerasによるディープラーニング

PythonとKerasによるディープラーニング


直感 Deep Learning ―Python×Kerasでアイデアを形にするレシピ

直感 Deep Learning ―Python×Kerasでアイデアを形にするレシピ


現場で使える! TensorFlow開発入門 Kerasによる深層学習モデル構築手法 (AI & TECHNOLOGY)

現場で使える! TensorFlow開発入門 Kerasによる深層学習モデル構築手法 (AI & TECHNOLOGY)


詳解 ディープラーニング ~TensorFlow・Kerasによる時系列データ処理~

詳解 ディープラーニング ~TensorFlow・Kerasによる時系列データ処理~