diff --git a/.gitignore b/.gitignore index 7ee90c9..124e4b3 100644 --- a/.gitignore +++ b/.gitignore @@ -25,7 +25,7 @@ # --- プロジェクト固有 --- # 臨床データ・合成データ(絶対にコミットしない) -data/ +/data/ # 学習結果(指標・図・チェックポイント) runs/ diff --git a/CLAUDE.md b/CLAUDE.md index 6e3cd7f..1a09ab9 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -5,7 +5,7 @@ ## 開発進捗 -最新: 臨床データ 1085 枚を Newton へ転送完了.次は PLAN_02 の Step 1(基盤: 設定スキーマ・合成データ・manifest・患者単位分割) +最新: PLAN_02 Step 3(データセット集計・ややあり込み/除外の切り替え)完了.次は Step 4(学習パイプライン最小版) ※ 本欄は**最新ステップ 1 行のみ上書き更新**.詳細な進捗履歴(動機・設計判断・失敗パターン)は [docs/PROGRESS.md](docs/PROGRESS.md) に追記する.運用ルールは `.claude/rules/progress-log.md` を参照(該当ファイル編集時に自動ロードされる). ## 必須ルール(コード実装時) @@ -90,6 +90,7 @@ - アーキテクチャ設計: docs/04_SPEC/SPEC_01_アーキテクチャ設計.md - 学習・評価仕様: docs/04_SPEC/SPEC_02_学習・評価仕様.md +- リモート実行仕様: docs/04_SPEC/SPEC_03_リモート実行仕様.md ### 05_TECH(技術設計) @@ -98,3 +99,4 @@ ### 06_TEST(テスト) - データセット構成調査: docs/06_TEST/TEST_01_データセット構成調査.md +- データセット集計結果: docs/06_TEST/TEST_02_データセット集計結果.md diff --git a/configs/newton.yaml b/configs/newton.yaml new file mode 100644 index 0000000..f7908cd --- /dev/null +++ b/configs/newton.yaml @@ -0,0 +1,12 @@ +# 計算サーバ(Newton)上の実データを指す設定(SPEC_01「データ契約」) +# 臨床データはサーバ上にのみ置く.手元ではこの設定で実行しない. +# 環境変数 TIAS_DATA_ROOT が設定されていれば data.root より優先される. +data: + root: ~/data/TIASJudgeModel + manifest: manifest.csv # data.root からの相対パス + +split: + seed: 42 + val_ratio: 0.15 + test_ratio: 0.15 + n_folds: 5 diff --git a/configs/remote.yaml b/configs/remote.yaml new file mode 100644 index 0000000..5d8994f --- /dev/null +++ b/configs/remote.yaml @@ -0,0 +1,30 @@ +# リモート実行ツール tias-remote のサーバ設定(SPEC_03「サーバ設定」) +# 臨床データは各サーバの data_dir に事前配置する(ツールはデータを転送しない.ENV_03). +# 環境変数での上書き: +# TIAS_REMOTE_JUMP 踏み台(jump_host)を上書き.空文字なら直接接続(研究室 LAN 内) +# TIAS_REMOTE_SSH 手元の ssh 実行ファイル +# TIAS_REMOTE_ALLOW_SELF 1 でサーバ上実行の検出を無効化 +jump_host: labpc # 踏み台(~/.ssh/config の Host 名).null なら直接接続 +connect_timeout_sec: 15 +gpu_free: + max_memory_used_mib: 1024 # 使用中メモリがこれ未満 + max_utilization_percent: 10 # かつ使用率がこれ未満なら「空き」(いずれも観測中の最大値で判定) + observe_sec: 10 # この秒数だけ観測してから判定する(0 なら瞬間値のみ.0〜120) + sample_interval_ms: 500 # 観測の間隔(100〜5000) +servers: + - name: Newton + address: 192.168.23.14 + user: hasegawa + priority: 1 # 小さいほど優先 + remote_dir: ~/work/TIASJudgeModel + data_dir: ~/data/TIASJudgeModel + uv: ~/.local/bin/uv + data_ready: true # 臨床データが配置済みか + - name: Archimedes + address: 192.168.23.15 + user: hasegawa + priority: 2 + remote_dir: ~/work/TIASJudgeModel + data_dir: ~/data/TIASJudgeModel + uv: ~/.local/bin/uv + data_ready: true # 2026-09-27 にデータ配置済み(ENV_03) diff --git a/configs/synthetic.yaml b/configs/synthetic.yaml new file mode 100644 index 0000000..7abc709 --- /dev/null +++ b/configs/synthetic.yaml @@ -0,0 +1,12 @@ +# 手元確認用: 合成データ(scripts/make_synthetic_dataset.py の出力)を指す設定 +# data.root の相対パスはカレントディレクトリ(リポジトリのルート)基準. +# 環境変数 TIAS_DATA_ROOT が設定されていれば data.root より優先される. +data: + root: data/synthetic + manifest: manifest.csv # data.root からの相対パス + +split: + seed: 42 + val_ratio: 0.15 + test_ratio: 0.15 + n_folds: 5 diff --git "a/docs/02_ENV/ENV_01_\346\212\200\350\241\223\343\202\271\343\202\277\343\203\203\343\202\257.md" "b/docs/02_ENV/ENV_01_\346\212\200\350\241\223\343\202\271\343\202\277\343\203\203\343\202\257.md" index 5310992..0225d88 100644 --- "a/docs/02_ENV/ENV_01_\346\212\200\350\241\223\343\202\271\343\202\277\343\203\203\343\202\257.md" +++ "b/docs/02_ENV/ENV_01_\346\212\200\350\241\223\343\202\271\343\202\277\343\203\203\343\202\257.md" @@ -67,10 +67,12 @@ ## CPU / GPU の依存差 (CPU / GPU Dependencies) -`torch` を PyPI からそのまま依存に入れると,**Linux では CUDA 付きの wheel,Windows では CPU 版の wheel** が選ばれるため,同一の `pyproject.toml` で「手元 = CPU,サーバ = GPU」が成立する見込みである. +**Linux(両サーバ)は PyTorch 公式の CUDA 12.6 版(cu126)**,**Windows(手元)は PyPI の CPU 版**を使う.`pyproject.toml` の `[tool.uv.sources]` で,`torch`・`torchvision` の取得元を `sys_platform == 'linux'` のときだけ cu126 インデックスに向けている. -- サーバでの初回 `uv sync` 後に `torch.cuda.is_available()` が `True` になることを確認する(環境構築手順に含める) -- 想定どおりにならない場合は PyTorch 公式インデックスを `[tool.uv.sources]` で指定する方式に切り替える +- 経緯: 当初は PyPI の wheel をそのまま使い,Linux では CUDA 13 版(cu130)が入っていた.Newton(ドライバ 595・CUDA 13.2 対応)では動いたが,**Archimedes はドライバ 535(CUDA 12.2 まで)のため cu130 版では GPU が使えなかった**(2026-09-27 に判明) +- cu126 版は CUDA のマイナーバージョン互換により 12.2 のドライバでも動く.Archimedes で行列積・畳み込みの逆伝播まで,Newton でも CUDA の動作を確認した(torch は 2.14.0 のまま) +- **両サーバで同じ torch ビルドになる**ため,どちらのサーバで学習しても条件がそろう +- 将来 torch を上げるときは,cu126 版が提供され続けているか(`https://download.pytorch.org/whl/cu126/torch/`)と,Archimedes のドライバ(535)で動くかを確認する ## 採用しなかった選択肢 (Rejected Alternatives) diff --git "a/docs/02_ENV/ENV_02_\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" "b/docs/02_ENV/ENV_02_\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" index 23bb7ce..0b3a296 100644 --- "a/docs/02_ENV/ENV_02_\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" +++ "b/docs/02_ENV/ENV_02_\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" @@ -40,8 +40,12 @@ | Host 名 | アドレス | 用途 | | --- | --- | --- | -| `Newton` | `Newton.local`(研究室 LAN 内) | 学習の実行.RTX A6000×3・Ubuntu 22.04・uv・Python 3.12 | -| `Newton-via-lab` | 研究室 PC を ProxyJump した経路 | 学外から接続する場合 | +| `Newton` | `192.168.23.14`(研究室 LAN 内.`Newton.local`) | 学習の実行.RTX A6000×3・Ubuntu 22.04・uv | +| `Archimedes` | `192.168.23.15`(研究室 LAN 内) | 学習の実行.RTX A6000×2・Ubuntu 22.04・uv(2026-09-27 導入).**`/home` の空きが少ない**(2026-09-27 時点で使用率 97%・空き 64 GB) | +| 踏み台 `labpc` | 研究室 PC(Tailscale 経由) | 学外から接続する場合は `-J labpc` を付ける | + +- どちらのサーバを使うかはリモート実行ツールが空き GPU から自動で選ぶ([SPEC_03](../04_SPEC/SPEC_03_リモート実行仕様.md).Newton 優先) +- `Newton-via-lab` のような別名は `~/.ssh/config` で定義しているが,Archimedes には別名が無い.リモート実行ツールはアドレスと `-J labpc` で直接指定するため別名に依存しない - SSH の鍵と `~/.ssh/config` は **SmTIAS-LightSim で構築済みのものを流用する**(設定手順は同プロジェクトの `docs/02_ENV/ENV_02_環境構築手順.md`「研究室サーバ編」を参照) - **サーバ上では編集しない**.コードは常に手元から送る(次節) @@ -49,12 +53,13 @@ ## 日常の流れ (Daily Workflow) -リモート実行ツール(ENV_01.`sm-remote` の移植)を使う.コマンド名・オプションは実装時に確定し,`ENV_04_開発コマンド.md` に記載する. +リモート実行ツール `tias-remote` を使う(コマンドは [ENV_04](ENV_04_開発コマンド.md)「リモート実行」,仕様は [SPEC_03](../04_SPEC/SPEC_03_リモート実行仕様.md)). 1. 手元でコードを編集する -2. コードをサーバへ送る(tar over ssh) -3. GPU の空きを確認し,tmux 内で学習を実行する -4. 結果(指標・図・ログ)を回収する +2. `uv run tias-remote gpus` で空き状況を見る(任意) +3. `uv run tias-remote run --name <ジョブ名> -- <コマンド>` で起動する(空いている GPU を両サーバから自動で選び,コードを送ってから tmux で起動する) +4. `uv run tias-remote logs <ジョブ名>` で様子を見る +5. `uv run tias-remote pull <実験ID>` で結果(指標・図・ログ)を持ち帰る ## 環境再現性のルール (Reproducibility Rules) @@ -71,4 +76,5 @@ | 学外からの転送が遅い | Tailscale が DERP 中継経由になっている | `tailscale ping` で経路を確認し,転送は差分だけにする | | ファイル操作系のツールが全てブロックされる | フック用の Python が見つからない | `python3` / `python` / `py` のいずれかが起動できるようにする | | サーバで `uv: command not found` | 非対話 ssh の PATH に `~/.local/bin` が入らない | コマンドの前に `export PATH="$HOME/.local/bin:$PATH"` を付ける(リモート実行ツールもこれを行う) | +| `tias-remote` で「接続不可(Host key verification failed)」 | 手元の `known_hosts` にそのサーバの **IP アドレスのホスト鍵**が無い(別名 `newton.local` 等でしか接続したことが無い) | 一度 `ssh -J labpc hasegawa@ exit` を実行して登録する.既存の別名の鍵と同じかを `ssh-keygen -lF ` と `ssh-keygen -lF <別名>` の指紋で確かめる | | 踏み台経由で `connect failed`(ホスト名不明) | 踏み台側の mDNS(`Newton.local`)の解決が一時的に失敗する | 時間をおいて再試行する.頻発する場合は踏み台の `~/.ssh/config` で Newton を IP 指定にする | diff --git "a/docs/02_ENV/ENV_03_\347\256\241\347\220\206\350\200\205\347\224\250\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" "b/docs/02_ENV/ENV_03_\347\256\241\347\220\206\350\200\205\347\224\250\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" index e1142dc..1443770 100644 --- "a/docs/02_ENV/ENV_03_\347\256\241\347\220\206\350\200\205\347\224\250\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" +++ "b/docs/02_ENV/ENV_03_\347\256\241\347\220\206\350\200\205\347\224\250\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" @@ -47,6 +47,30 @@ `uv sync` は CUDA 版 PyTorch が入るため時間がかかる.`True` と GPU 台数が出ることを確認する.`False` の場合は [ENV_01「CPU / GPU の依存差」](ENV_01_技術スタック.md)に従う. +## Archimedes 側の初期設定 (Archimedes Setup) + +2026-09-27 に実施.Newton と同じ構成にそろえる. + +1. **手元の公開鍵を登録する**(パスワード認証が必要なため人間が実行する) + + ```powershell + type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh -J labpc hasegawa@192.168.23.15 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys" + ``` + + 聞かれるのは **Archimedes の `hasegawa` アカウントのパスワード**(研究室 PC には鍵で入れるので聞かれない) + +2. **uv をユーザー領域に入れる**(Archimedes には未導入だった).シェルの設定ファイルを書き換えないよう `UV_NO_MODIFY_PATH=1` を付ける(リモート実行ツールは `~/.local/bin/uv` を絶対パスで呼ぶため PATH の設定は不要) + + ```bash + curl -LsSf https://astral.sh/uv/install.sh | env UV_NO_MODIFY_PATH=1 sh + ``` + +3. ディレクトリを作る(Newton と同じ.データ側は `chmod 700`) +4. 研究室 PC の専用鍵(下記「研究室 PC から Newton への鍵設定」と同じ鍵)を Archimedes の `~/.ssh/authorized_keys` にも追記する +5. 臨床データを研究室 PC から直送する(下記の手順で `$rhost` を `hasegawa@192.168.23.15` にする) + +> ⚠ **Archimedes の `/home` は共用ディスクがほぼ満杯**(2026-09-27 時点で使用率 97%・空き 64 GB).このプロジェクトの使用量の目安はデータ 0.4 GB・Python 環境(CUDA 版 PyTorch)6〜8 GB・学習結果(重み 1 本約 0.1 GB × 実験数).重みを溜め込まないこと. + ## 臨床データの初回コピー (Initial Data Copy) 原本は研究室 PC に置き,**研究室 LAN 内で Newton へ一度だけコピーする**.手元 PC を経由させない. @@ -131,7 +155,7 @@ ### 実施記録 (Completion Record) -2026-09-27 に上記手順で転送完了.Newton 側 `~/data/TIASJudgeModel/images/` に **9 ディレクトリ・1085 ファイル(443 MB)**.研究室 PC 側の件数と完全一致し,非 PNG は 0 件.ディレクトリ権限は `drwx------`.転送は研究室 PC → Newton の直送であり,手元 PC は制御コマンドのみを送っている(画像は手元を通っていない). +2026-09-27 に上記手順で転送完了.**Newton・Archimedes の両方**の `~/data/TIASJudgeModel/images/` に **9 ディレクトリ・1085 ファイル(443 MB)**.研究室 PC 側の件数と完全一致し,非 PNG は 0 件.ディレクトリ権限は `drwx------`.転送は研究室 PC → Newton の直送であり,手元 PC は制御コマンドのみを送っている(画像は手元を通っていない). 以降は再転送しない.データセットの内容確認(枚数・クラス分布・破損チェック)はサーバ上のコマンドで行い,**集計結果のみ**を手元で見る. diff --git "a/docs/02_ENV/ENV_04_\351\226\213\347\231\272\343\202\263\343\203\236\343\203\263\343\203\211.md" "b/docs/02_ENV/ENV_04_\351\226\213\347\231\272\343\202\263\343\203\236\343\203\263\343\203\211.md" index 16988fe..3c8c94e 100644 --- "a/docs/02_ENV/ENV_04_\351\226\213\347\231\272\343\202\263\343\203\236\343\203\263\343\203\211.md" +++ "b/docs/02_ENV/ENV_04_\351\226\213\347\231\272\343\202\263\343\203\236\343\203\263\343\203\211.md" @@ -2,7 +2,8 @@ 日常の開発で使うコマンドの一覧.**コマンドを推測せず必ず本ファイルを参照する**(新しく確定・変更された時は本ファイルに反映する). -※ 学習・評価・リモート実行のコマンドは未実装のため本ファイルには未記載(実装時に追記する). +※ 学習・評価のコマンドは未実装のため本ファイルには未記載(実装時に追記する). +※ Git Bash ではログの日本語が文字化けする.先頭に `PYTHONIOENCODING=utf-8` を付けると正しく表示される. ## 環境 (Environment) @@ -13,12 +14,59 @@ | 開発用依存の追加 | `uv add --dev <パッケージ>` | pytest・ruff 等 | | Python の実行 | `uv run python <スクリプト>` | 仮想環境を明示的に有効化しなくてよい | +## データ (Data) + +| 目的 | コマンド | 備考 | +| --- | --- | --- | +| 合成データの生成 | `uv run python scripts/make_synthetic_dataset.py` | 出力は `data/synthetic/`(`images/