はじめに
私は機械知能研究室に所属し,CV分野の研究に取り組んでいます.機械知能研究室では,ロボットの視覚機能や,自律的に行動するための知能システムに関する研究が行われています.
研究室の詳細は以下をご覧ください.
深層学習の実験では,GPUサーバ上で長時間学習を回すことがあります.
しかし,PCを開いていない間に学習が止まっていたり,明らかにうまく学習できていない設定のまま計算資源を使い続けていたりすることがあります.
特に,外出中や移動中など,すぐにPCを開けない場面では,「今のRunはちゃんと動いているのか」「このまま続けてよいのか」をスマホから確認できると便利です.
必要であれば,その場でRunを止めたり,次に試す設定を考えたりできると,実験運用の無駄を少し減らせそうです.
Weights & Biases(W&B)を活用すると,学習中の損失や検証結果をWeb上で確認できます.W&BにはiOS Appもあり,スマホからRunの状態やグラフを確認できます.
今回は,W&B iOS Appを「見るためのアプリ」として使うだけではなく,実験の確認や停止,さらに再実行の流れまで試してみます.
目次
- はじめに
- 今回行うこと
- W&B iOS Appのインストール
- 学習コードへのW&B組み込み
- iOS Appから実行結果を確認
- W&B Launchでパラメータ変更・再実行の仕組みを構築
- スマホからパラメータを変更したRunを再投入
- iOS Appから再実行結果を確認
- まとめ
今回行うこと
本記事では,以下の流れで W&B iOS AppとW&B Launch を試します.
- W&B iOS Appをインストールする
- 学習コードにW&Bを組み込む
- iOS AppからProject,Run,Loss,configなどを確認
- うまく学習できていないRunを,スマホから停止する
- W&B LaunchでJob,Queue,Agentを準備する
- パラメータを変更したRunをQueueに再投入する
- 再実行されたRunをiOS Appから確認する
なお,W&B iOS App単体でパラメータ変更と再実行が完結するわけではありません.パラメータ変更後の再実行には W&B Launchを使用します.
W&B iOS Appのインストール
W&B iOS AppはApp Storeからインストールできます.
インストール後,W&Bアカウントでログインすると,自分のProjectやRunをスマホから確認できます.
登録などはQiitaでまとめている方がいらっしゃいましたので,そちらをご確認ください.
学習コードへのW&B組み込み
学習コードには,以下のように組み込みました.今回は,Qiita検証用に作成したProjectを使います.
import wandb
wandb.init(
project="qiita-wandb-ios-demo",
group="mobile-check",
name="normal_run",
config={
"initial_lr": initial_lr,
"num_epoch": num_epoch,
"bs": bs,
"train_patch": train_patch,
}
)
学習中には,確認したい値だけを記録します.
wandb.log({
"progress/epoch": epoch,
"progress/step_in_epoch": step + 1,
"train/step_loss": total_loss.item(),
"lr": optimizer.state_dict()['param_groups'][0]['lr'],
})
epoch終了後には,validationの結果も記録します.
wandb.log({
"train/loss": avg_total_loss,
"val/score": val_score,
})
iOS Appから実行結果を確認
学習を開始すると,W&B iOS AppからRunを確認できます.
スマホからでも,Runの状態,学習中のLoss,validation score,実行中のconfigなどを確認できました.
W&B Launchでパラメータ変更・再実行の仕組みを構築
W&B Launchを使って,パラメータを変更したRunを再投入する仕組みを作ります.
Launchの導入方法は以下で確認できます.
W&B Launchでは,以下の3つを使います.
- Job:実行する学習コードのテンプレート
- Queue:実行待ちのJobを並べておく場所
- Agent:Queueを監視し,実際に学習を実行するプロセス
GPUサーバ側では,あらかじめLaunch Agentを起動しておきます.
wandb launch-agent -q Queueの名前 --max-jobs 1
学習コードをJobとして登録し,Queueに投入します.
これにより,Agentが追加されたJobを順次取得・実行し,同じ学習コードを異なるパラメータで再投入できるようになります.
LaunchからRunを投入し,iOS Appで確認・停止する
Runを投入すると,GPUサーバ側で起動しているAgentがQueueからJobを取得し,学習が開始されます.
開始されたRunは,W&B iOS Appからも確認できます.
lossの推移や設定値を確認したところ,このRunは継続するよりも,設定を見直して再実行した方がよさそうだと判断しました.
そこで,iOS AppからRunを停止します.
これにより,PCを開かなくても,外出先から不要なRunを停止できることが確認できました.
ただし,iOS AppでできるのはRunの確認や停止までです.
パラメータを変更して再実行するには,W&B Launchを使って同じJobを再投入します.
次に,停止したRunのConfigを参考にしながら,LaunchのOverridesでパラメータを変更し,新しいRunとして再実行します.
スマホからパラメータを変更したRunを再投入
スマホブラウザからW&B Launchを開きます.
今回は,事前に作成しておいた同じJobを使い,Launch時のOverridesだけを変更します.
JobやQueueは作り直さず,実行時のパラメータのみを変更して再投入します.
変更後,JobをQueueに投入します.
GPUサーバ側で起動しているAgentがQueueを監視しているため,投入されたJobを取得し,新しいRunとして学習を開始します.
Overridesを使う際の注意点
Launch時にOverridesで値を変更しても,学習コード側がその値を参照していなければ,実際の学習設定には反映されません.
今回の実装では args もOverridesで変更し,学習コード側では argparse で受け取った値を使うようにしています.
例:
args = parser.parse_args()
initial_lr = args.initial_lr
optimizer = optim.Adam(model.parameters(), lr=initial_lr)
Overridesを使う際には,run_config を変更するのか,args を変更するのかに合わせて,コード側でもその値を参照するようにしておく必要があります.
iOS Appから再実行結果を確認
再投入したRunも,W&B iOS Appから確認できました.
このように,iOS AppでRunを確認・停止し,スマホブラウザからW&B Launchを使ってパラメータを変更したRunを再投入する流れを確認できました.
今回試してみて,スマホブラウザからLaunchを開き,Overridesを変更してQueueに投入する操作自体は比較的簡単だと感じました.
一方で,W&B Launchを初めて使う場合は,Job,Queue,Agentの役割を理解するまで少し時間がかかりました.また,Launch Agentを実行する環境側では,学習コードや必要なライブラリ,データセットのパスが正しく整っている必要があります.
まとめ
本記事では,W&B iOS AppとW&B Launchを使って,スマホ起点で実験を確認・停止・再実行する流れを試しました.
試した結果,W&B iOS App単体でパラメータ変更と再実行を完結させることはできませんでした.
パラメータを変更したRunを投入するには,W&B Launchを使い,Job Queueに投入する必要があります.
しかし,一度 Job,Queue,Agentを用意しておけば,再実行時にはLaunch時のOverridesだけを変更すればよいため,毎回PCでコマンドを打ち直す必要がありません.
外出先や移動中でも次のRunを投入できるため,実験運用は少し楽になるかもしれません.
興味のある方は試してみてください.