Microsoft自動チューニングツール-NNI-インストールと使用法のチュートリアル

前書き

NNIは、Microsoftのオープンソース自動チューニングツールです。パラメータを手動で調整するのは面倒ですが、最近試してみましたが、気持ちがいいです。視覚化作業を一緒にしながらパラメータを調整するのに役立ちます。これはシンプルで明確です。現在の実験の進行状況、検索パラメーター、およびいくつかの最良のハイパーパラメーターの組み合わせを確認できます。例:
以下のカラーマップから、赤い線で表された豊富な情報(つまり、高精度のハイパーパラメータの組み合わせ)を直感的に確認できます。といった

  • 畳み込みカーネルが大きいほど、パフォーマンスが向上します。
  • 完全に接続された大きなレイヤーは必ずしも良いとは限りません。必要なトレーニング時間が長くなり、トレーニング速度が遅すぎる可能性があります。
  • 学習率は低く(0.03未満)、基本的にパフォーマンスは良好です。
  • ReLUは、tanhなどの他の活性化関数よりもはるかに優れています。

  • ここに画像の説明を挿入します
    テストステータスページから、各テストの長さとハイパーパラメータの特定の組み合わせを確認できます。
    ここに画像の説明を挿入します
    コントロールページから、テストのスーパーパラメータの組み合わせをリアルタイムで追加したり、スーパーパラメータの範囲を調整したりできます。

ここに画像の説明を挿入します

この記事は、次の2つの部分に分かれています。

  1. NNIをインストールして使用する方法
  2. デバッグの経験とエラーの概要
最初のステップ:インストール

nniのインストールは非常に簡単です。pipコマンドでインストールできます。そして、参照と学習のための例を提供します。
前提条件:tensorflow、python> = 3.5、

	# 安装nni
    python3 -m pip install --upgrade nni

	# 示例程序,用于学习
	git clone https://github.com/Microsoft/nni.git
    # 如果想运行这个示例程序,需要安装tensorflow
    python3 -m pip install tensorflow

手順2:ハイパーパラメータの検索範囲を設定する

最初にNNIサンプルプログラムを見てみましょう

cd ./nni/examples/trials/mnist/

ディレクトリには、config.yml、mnist.py、search_space.jsonの3つのファイルがあることがわかります。これらの3つのファイルは、それぞれNNI構成ファイル、main.py、ハイパーパラメータ検索スペースを決定します。
1.search_space.jsonファイルを開きます

{
    "dropout_rate":{"_type":"uniform","_value":[0.5, 0.9]},
    "conv_size":{"_type":"choice","_value":[2,3,5,7]},
    "hidden_size":{"_type":"choice","_value":[124, 512, 1024]},
    "batch_size": {"_type":"choice", "_value": [1, 4, 8, 16, 32]},
    "learning_rate":{"_type":"choice","_value":[0.0001, 0.001, 0.01, 0.1]}
}

ここでは、必要に応じて自由に調整できるハイパーパラメータと検索範囲を定義できます。
検索には多くの種類があり、一般的に使用されるものは均一、選択などです。
ただし、この例ではユニフォームと選択の使用法のみを説明しているため、他の多くのブログでは選択と選択の使用法のみを紹介しているので、ここに追加します。詳細については、NNIのgithubヘルプドキュメントを参照してください

{"_type": "choice", "_value": options}
# dropout_rate":{"_type":"uniform","_value":[0.5, 0.9]}的结果为0.5或者0.9

{"_type": "uniform", "_value": [low, high]}

# 变量是 low 和 high 之间均匀分布的值。
# 当优化时,此变量值会在两侧区间内。

{"_type": "quniform", "_value": [low, high, q]}
# 从low开始到high结束,步长为q。
# 比如{"_type": "quniform", "_value": [0, 10, 2]}的结果为0,2,4,6,8,10

{"_type": "normal", "_value": [mu, sigma]}
# 变量值为实数,且为正态分布,均值为 mu,标准方差为 sigma。 优化时,此变量不受约束。

{"_type": "randint", "_value": [lower, upper]}
# 从 lower (包含) 到 upper (不包含) 中选择一个随机整数。

ステップ2:config.yamlを構成し、config.yamlを
開きます

authorName: default
experimentName: example_mnist
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, MetisTuner, GPTuner
  #SMAC (SMAC should be installed through nnictl)
  builtinTunerName: TPE
  classArgs:
    #choice: maximize, minimize
    optimize_mode: maximize
trial:
  command: python3 mnist.py
  codeDir: .
  gpuNum: 0

コマンドに加えて、maxExecDuration、trialConcurrency、gpuNum、optimize_modeを変更する必要があります。通常、ここのパラメーターは変更する必要はありません。

コマンドは、nniの実行後に実行されるコマンドです。mnist.pyをmain.pyまたはtrain.pyおよびその他のメインプログラムに変更します。

maxExecDurationは、NNI全体がパラメーターを自動的に調整する時間です。1回のトレーニングの時間ではないことに注意してください(最初から1回のトレーニングに必要な最大時間として理解しました)。GPUで実行している場合は、次のようになります。 10の異なるパラメーターをトレーニングするには、トレーニングに2時間かかるたびに、この値は20hに設定されます。

trialConcurrencyは同時トレイルの数です。これは、以下のgpuNumではなく、GPUの数に応じて設定する必要があります。トレイルはパラメーターを調整するプロセスを表すためです。ある種のハイパーパラメーターを使用してtrain.pyを実行し、同時実行数をxに設定すると理解されるため、トレーニングにはx人のトレーナーがいます。

gpuNumは、各トレイルに必要なGPUの数であり、nniチューニング全体に必要なGPUの数ではありません。大規模なタスクの場合、1回のトレーニングにN GPUが必要な場合、この値はNに設定されます。1回のトレーニングで十分な場合は、1つのGPUで十分です。この値を1に設定してください。GPUはありませんか?惨めな言葉を書きたい...

したがって、最後に必要なGPUの総数はtrialConcurrency gpuNumです。これは、トレイルの数各トレイルに必要なGPUの数です。

optimize_modeは最適化の方向に対応します。最大と最小の2つの方法があります。それを設定する方法は次のステップで説明されています。
一般的に、ここでの構成で十分です。

グリッド検索アルゴリズムやその他の詳細な調整が必要な場合は、NNIのgithubヘルプドキュメントを参照してください。

3番目のステップは、コードを変更することです
# 引入nni
import nni
"""
设置参数自动更新,假设params 是我们的默认参数
注意params是**字典**类型的变量
"""
params = vars(get_params())
tuner_params= nni.get_next_parameter() # 这会获得一组搜索空间中的参数
params.update(tuner_params)
"""
向nni报告我们的结果
如果test_acc是准确率,那第二步(5)optimize_mode就选maximize。如果这里的test_acc如果是loss,
那第二步(5)optimize_mode就选minimize,也可以填其他训练的指标
另外这里的报告结果都是数字,一般选择float类型
"""
nni.report_intermediate_result(test_acc)
'''
report_intermediate_result是汇报中间结果,一般可以设置每个epoch报告一次
'''
nni.report_final_result(best_acc)
'''
report_final_result是汇报最终结果,可以是last_acc,也可以设置为报告best_acc
'''

多くの経験者は、report_intermediate_resultは損失を報告し、report_final_resultは正確さを報告すると言います。このステートメントは間違っています。
これら2つのレポートの内容は同じ意味を持つ必要があります(どちらも損失または正確性など)。
理由については以下で説明します。

4番目のステップは、2行のコードを直接実行することです。
cd ./YourCode_dir
nnictl create --config config.yml -p 8888

コードディレクトリに切り替えて、直接実行します。
-pは、使用されるポート番号を表します。コードがconda仮想環境を使用している場合は、conda仮想環境をアクティブ化する必要があることに注意してください。

5番目のステップは、トレーニングプロセスを表示することです

現時点では「成功」という言葉が出てくると思いますが、わくわくしないでください。チューニングが成功したわけではありません。とにかく、何回成功したかわかりません。

以下に示すように、コマンドラインで指定されたWebサイトを開き、[Trail Detial]-> [Intermediate result]をクリックします。
ここに画像の説明を挿入します
開く速度が速すぎると、WATINGステータスになります。しばらくするとRUNNINGが始まりますのでご安心ください。直接失敗する場合は、コードを確認してください。

report_intermediate_resultが各エポックのレポートである場合、エポックを実行すると、デフォルトメトリックが表示され、その後にブラケット(LATEST)が表示されます。この時点で、作業は基本的に完了しています。おめでとうございます。

report_final_resultがトレーニング終了時のレポートである場合、トレーニングが終了した後、デフォルトのメトリック(FINAL)値があります。

したがって、これは、report_intermediate_resultとreport_final_resultが実際にはデフォルトのメトリックであり、意味のある測定値であり、両方がモデルの品質を測定するために使用されることを示しています。

下の図はハイパーパラメータ曲線です。実際、上の図から、チューニングを開始したばかりで、成功したトレイルはごくわずかであることがわかります。しかし、私はこれらの条件下でそれを言いたいです!この曲線は美しすぎる!
ここに画像の説明を挿入します

ステップ6停止

ハイパーパラメータの検索を続行したくない場合は、nnictlstopを使用して自動パラメータ調整を停止できます。
ただし、これは、次のトレイルが開始されず、実行が終了していないトレイルが実行を継続することを意味します。トレイルを終了する場合は、nvidia-smiを使用してトレーニングプロセスのPIDを見つけ、kill -9PIDを使用してプロセスを強制終了できます。

おすすめ

転載: blog.csdn.net/yangdashi888/article/details/104263431