CNN/ViT を使って学習する単純な練習用コードです.
uvを使うことを推奨しています。
インストール方法 (installation)
- 仮想環境の作成
uv venv
- パッケージ依存関係と仮想環境を同期する (パッケージインストール)
uv sync
- パッケージ依存関係を記述したlockfileを生成する
uv lock
- (仮想環境上にて) スクリプトを実行する。
→ 毎回venv環境に入らなくて良いuv run <command>
uv run python3 main.py data=image_folder dataset.root=/mnt/NAS-TVS872XT/dataset-lab/Tiny-ImageNet/ trainer=smoke disable_comet=true
uv run python3 main_pl.py data=image_folder dataset.root=/mnt/NAS-TVS872XT/dataset-lab/Tiny-ImageNet/ trainer=smoke GPU.devices=1 disable_comet=true高速化は初期状態では有効化しません。baseline と比較したい場合だけ、明示的に指定します。
uv run python3 main.py data=image_folder dataset.root=/mnt/NAS-TVS872XT/dataset-lab/Tiny-ImageNet/ trainer=smoke disable_comet=true optimization.compile.enabled=true
uv run python3 main_pl.py data=image_folder dataset.root=/mnt/NAS-TVS872XT/dataset-lab/Tiny-ImageNet/ trainer=smoke GPU.devices=1 disable_comet=true optimization.amp.enabled=true
uv run python3 main_pl.py data=image_folder dataset.root=/mnt/NAS-TVS872XT/dataset-lab/Tiny-ImageNet/ trainer=smoke GPU.devices=1 disable_comet=true optimization.compile.enabled=truemain.py は手動 PyTorch loop の構造を学ぶ入口で、torch.compile のみ opt-in で使えます。AMP は main_pl.py の Lightning 経路で使います。詳しくは Use optimization options を参照してください。
python3 -m venv .venv
source .venv/bin/activate
pip install -U pip
pip install -r requirements.pytorch.txt
pip install -r requirements.txtuv run python3 main.py data=image_folder dataset.root=/mnt/NAS-TVS872XT/dataset-lab/Tiny-ImageNet/ training.num_workers=24 training.batch_size=8 training.num_epochs=5 GPU.use_dp=true
uv run python3 main.py data=image_folder dataset.root=/mnt/NAS-TVS872XT/dataset-lab/Tiny-ImageNet/ training.num_workers=24 training.batch_size=8 training.num_epochs=5 GPU.use_dp=true disable_comet=true
uv run python3 main_pl.py data=image_folder dataset.root=/mnt/NAS-TVS872XT/dataset-lab/Tiny-ImageNet/ training.num_workers=24 training.batch_size=8 training.num_epochs=5 GPU.devices=3
uv run python3 main_pl.py data=image_folder dataset.root=/mnt/NAS-TVS872XT/dataset-lab/Tiny-ImageNet/ training.num_workers=24 training.batch_size=8 training.num_epochs=5 GPU.devices=3 disable_comet=truemain.py は Hydra + 手動 PyTorch loop の教材用入口です。main_pl.py は Hydra + PyTorch Lightning の入口です。
checkpoint 形式は入口ごとに異なります。
main.py:utils.save_to_checkpoint()が保存する.pt形式main_pl.py: LightningTrainerが保存する.ckpt形式
GPU の指定にはCUDA_VISIBLE_DEVICESを使用すること.
- dp (data parallel) は
main.pyで利用可能 - ddp (distributed data parallel)は lightning の
main_pl.pyで利用可能- 注意:複数 GPU を用いる dp や ddp が動作しなくなるため,コード内で GPU 番号を指定するような
torch.device("cuda:0")は使わない.dp や ddp のために,コード内ではtorch.device("cuda")としておく.
- 注意:複数 GPU を用いる dp や ddp が動作しなくなるため,コード内で GPU 番号を指定するような
CUDA_VISIBLE_DEVICES=0,1 uv run python3 main.py data=image_folder dataset.root=/mnt/NAS-TVS872XT/dataset-lab/Tiny-ImageNet/ training.num_workers=24 training.batch_size=8 training.num_epochs=5 GPU.use_dp=true
CUDA_VISIBLE_DEVICES=0,1 uv run python3 main_pl.py data=image_folder dataset.root=/mnt/NAS-TVS872XT/dataset-lab/Tiny-ImageNet/ training.num_workers=24 training.batch_size=8 training.num_epochs=5 GPU.devices=2デバッグ用には launch.json を以下のように設定する.
"env": {
"CUDA_VISIBLE_DEVICES": "0,1",
},task 用にはtasks.jsonに次のように設定する.
"options": {
"env": {
"CUDA_VISIBLE_DEVICES": "0,1",
},
},詳しくは configs/ と docs/how-to/configure_experiment.md を参照.主な override は以下の通り.
dataset.root:データセットの root フォルダtraining.batch_size:バッチサイズtraining.num_workers:データローダーのワーカー数training.num_epochs:エポック数dataまたはdataset.dataset_name:データセットCIFAR10:torchvision の CIFAR10ImageFolder:dataset.rootで指定したフォルダ以下にtrain/とval/のディレクトリがあり,それ以下はカテゴリ名のサブディレクトリに分かれて保存されている画像データセット(torchvision の ImageFolder)
GPU.use_dp=true:main.pyの手動 loop で dp (Data Parallel)を使用するGPU.devices:main_pl.pyの Lightning で使用する GPU 数または GPU 番号(-1は全 GPU)optimization.amp.enabled=true:main_pl.pyの Lightning で AMP を有効化する。既定の precision はbf16-mixedoptimization.compile.enabled=true:main.pyの手動 model またはmain_pl.pyの LightningModule にtorch.compileを適用するdisable_comet=true: cometを無効化して実行する
uv run python3 main.py --help
uv run python3 main_pl.py --helpHydra で合成された設定は uv run python3 main.py --cfg job または uv run python3 main_pl.py --cfg job で確認できます。
comet の設定は,
- このディレクトリの
./.comet.configと, - ホームの
~/.comet.config
の 2 つのファイルを利用する.詳しくはcomet のドキュメントを参照.コード中には API キーなどは書かないこと(logger.py参照).
~/.comet.config:すべてに共通する設定を書く.- comet の API キー,デフォルトの comet workspace を設定.
hide_api_keyは True にすること(しないとログに API キーが残ってしまう)
[comet]
api_key=XXXXXHereIsYourAPIKeyXXXXXXXX
workspace=tttamaki
[comet_logging]
hide_api_key=True- このディレクトリの
./.comet.config:このディレクトリで使用する設定を書く.- comet project name を設定.
- (ここで設定する内容はホームの
~/.comet.configよりも優先されて,上書きされる)
[comet]
project_name=simple_cnn_20230309
[comet_logging]
display_summary_level=0
file=comet_logs/comet_{project}_{datetime}.log
[comet_auto_log]
env_details=True
env_gpu=True
env_host=True
env_cpu=True
cli_arguments=True- コード
Experimentオブジェクトに comet experiment name を設定.必要なら tag を設定する.- コード中には API キーなどは書かない.
- (コード中で設定する内容は,ディレクトリごとの
./.comet.configよりも優先される)
experiment = Experiment() # ここでは何も設定しない
exp_name = datetime.now().strftime('%Y-%m-%d_%H:%M:%S:%f') # これは日時をexperiment nameに設定する例.
experiment.set_name(exp_name)
experiment.add_tag(args.model) # これはモデル名をタグに設定する例..python-version: Pythonのバージョンの指定pyproject.toml: プロジェクトのメタデータ、パッケージ依存関係を記述
PEP 621 – Storing project metadata in pyproject.toml | peps.python.orguv.lock: パッケージのバージョンの指定configs/train.yaml: パラメーターツールHydraを使っています。引数設定はここを触る。
PyTestを利用してください。
uv run pytest test/dataset