ここには実験の行い方や注意事項をまとめます。
実験を始める時は日付を確認してexperiment/YYYY-MM-DD_実験タイトル
(例: experiment/2023-02-10_fit-jsut
)という名前でブランチを切り、Githubに公開してください。(publish branch.)
実験を進めていくうちに多くの修正や新規ファイルの作成が想定され、迅速に実験を進めるために行います。実験が最終的に完了した時にプルリクエストを送信します。
docker内部で作業した記録はコンテナおよびボリュームが削除されると同時消えてしまいます。また、データセットは容量が大きいためそれぞれのDockerボリュームに保存しておくことはあまり望まれません。Dockerのbindマウントを使用することで、これらの問題を解決します。
方法:
Makefileのdocker-runコマンドに引数を追加します。<PathToDatasetDir>
と<PathToLogDir>
は実行環境によって書き換えてください。
docker run -it \
... \
--mount type=bind,source=<PathToDatasetDir>,target=/workspace/data \
--monnt type=bind,source=<PathToLogDir>,target=/workspace/logs \
...
Note: AWS上ではS3ストレージを直接マウントすることができないため、学習の最後にログデータを/mnt/shared
にコピーするか、zipにしてダウンロードする必要があります!
cp -r ./logs/** -d /mnt/shared/logs
zip -r logs.zip ./logs
Hydraを利用してハイパーパラメータの管理を行っているため簡単に上書きし、実験を行うことができます。
実験を異なるハイパーパラメータで行いたい場合は、configs/experiment
の中にconfigファイルを作成してください。
その中にデフォルトで入っているexample.yaml
を参考に中身を書いていきます。
configs/experiment/your_experiment.yaml
# @package _global_
# 上記の`@package _global_`はpython src/train.py experiment=your_experimentと指定するために必要です。
defaults:
# configファイルごとデフォルト値をオーバライドする場合は次のように書きます。
- override /env: new_env_config.yaml
# 通常値を上書きする時はコンフィグの最上位からたどって指定します。
trainer:
num_episode: 10
gradient_clip_value: 50.0
実行する時は次のようにコマンドライン引数として指定します。
python src/train.py experiment=your_experiment
今回のexperimentコンフィグによるオーバーライドはlightning-hydra-templateを参考にしています。
Hydraはコマンドライン引数を用いて簡単にハイパーパラメータをオーバライドすることができます。実験のログに何をオーバライドしたかは.hydra
フォルダに記録されるので簡単にいくつか試したい場合に重宝します。指定する際はコンフィグの最上位からドット.
区切りで指定します。
例としてエピソード数を変更してみます。
python src/train.py trainer.num_episode=8888
出力結果
[2023-02-09 13:03:04,237][__main__][INFO] - Training configs:
...
trainer:
num_episode: 8888
...
今回の実験も多くの時間がかかるため、コンソールを閉じても実行が続き、再接続できるようにする方法を記述します。
screenパッケージを使用することで走らせたコードを放置したうえで、再開することができるようになります
screen python src/train.py
でsshなどの接続が切れても動き続けますscreen -ls
で切断されたセッションを確認することが出来ます。There are screens on: 2947.a_bsc (Detached) 17657.b_test1 (Detached) 17897.c_test2 (Detached)
screen -r <id>
で再接続することができます。 e.g.screen -r 2947
docker ps
で実行中のコンテナIDを確認します。CONTAINER ID IMAGE ... af810c94c026 148929cdadbd ...
docker exec -it <CONTAINER ID> /bin/bash
でbashに入ることができます。
今回実験した結果はtensorboardを使用することでインタラクティブに確認することが出来ます。 次のようにして起動することができます。そして デフォルトでは http://localhost:6006/ にブラウザからアクセスする事によって使用することが出来ます。
# on /workspace
tensorboard --logdir ./logs
output
...
Serving TensorBoard on localhost; to expose to the network, use a proxy or pass --bind_all
TensorBoard 2.11.2 at http://localhost:6006/ (Press CTRL+C to quit)
tensorboardは通常ローカルホストで起動しますが、VPN上に公開したりなど、外部のデバイスからもアクセスすることが出来ます。
AWS上のJupyter Hubの中でTensorboardを起動し利用する方法は現在わかっていません。