sm-remote 移植,実験記録は軽量自作,CI なしと決め ENV_01 を作成した.
.github/dependabot.yml(uv + github-actions)・.gitignore 更新(data/・runs/・重み)・pyproject.toml(Python 3.12)・パッケージ骨組み・README を作成し,ENV_02〜ENV_04 を整備した.Newton に ~/work/TIASJudgeModel と ~/data/TIASJudgeModel(700)を作り,コードを tar over ssh で送って uv sync を通し torch 2.14.0+cu130・CUDA 有効・GPU 3 台を確認した.
[tool.uv.sources] での対処は不要).GPU は 3 台のうち 1 台が他ユーザー使用中で,共用前提の GPU 指定が必要uv sync が PyPI からのダウンロードで connection reset(safetensors)→ 再試行中 / ② 非対話 ssh では uv が PATH に無く command not found(export PATH="$HOME/.local/bin:$PATH" が必要)/ ③ 踏み台経由で Newton.local の名前解決が一時的に失敗(再試行で復帰).② ③ は ENV_02 のトラブルシューティングに記録したmanifest.csv を学習の唯一の入口とし,patient_id を必須にした.取得できない場合に画像 ID を患者 ID と見なす代替はしない(同一患者が分割を跨ぐと評価が壊れる).claude/rules/ に coding-style・project-structure・testing・error-handling を作成し(path-scoped rule),pyproject.toml に ruff の選択ルールと pytest の slow マーカーを追加した.CLAUDE.md の必須ルール欄にプロジェクト固有の制約(データの持ち出し禁止・患者単位分割・色拡張の禁止等)を明記した.
<クラス>_あり / <クラス>_ややあり,淡紅は「(正常)」のみ)に PNG 計 1085 枚.5 クラス集約で 暗赤紅 380・淡紅 337・紫 145・紅 119・淡白 104(不均衡 3.7 倍).全画像 Format24bppRgb(アルファなし)でマスク外は黒 (0,0,0).サイズは幅 449〜900・高さ 279〜1025 でばらばら(舌領域のバウンディングボックス切り出し)severity 列として保持し,学習は 5 クラス(9 クラスは最小 51 枚・不均衡 6.6 倍で不利).評価では severity 別の層別 recall を見る.リサイズの余白は背景と同じ黒で埋める.クラス表示名は元データに合わせ「暗赤紅」に修正patient_id 単位で分割し,将来複数枚が入っても壊れないようにする(前提が変わった時に patient_id を実 ID へ入れ直す)<label>_<severity> の ASCII スラッグへ対応付けてコピーする手順を ENV_03 に記載したclinical-data)を使う方針を ENV_03 に明記した-EncodedCommand(UTF-16LE + Base64)で渡すと引用符の問題を回避できるscp を実行させる形にし,画像は研究室 LAN 内で直送した(手元 PC は制御コマンドのみ).件数はフォルダごとに元と完全一致,非 PNG は 0 件.手順と実施記録は ENV_03.
scp "...\*.png" は使えない.ファイルを列挙して 100 件ずつ渡す(コマンドライン長の上限対策).日本語フォルダ名は <label>_<severity> の ASCII スラッグへ対応付けて転送したimages/<label>_<severity>/ 構成を前提に,manifest を学習の唯一の入口とする土台を作った.仕様は SPEC_01「manifest の検証規則」「設定ファイル」と SPEC_02「データ分割」に反映した.
StratifiedGroupKFold ではなく患者一覧への StratifiedKFold を使う(1 患者 1 ラベルなら層化がより正確)--overwrite は生成時の目印ファイルがある場所だけを消す(--out の指定ミスで実データを消す事故を防ぐ).gitignore の data/ がパッケージ本体 src/tias_judge_model/data/ にも一致し,パッケージが Git に入らない状態だった → /data/(リポジトリ直下のみ)に修正.PNG は受け付けたままとする(実データはすべて小文字で実害なし)tias-remote を実装(Newton・Archimedes の 2 サーバ対応): SmTIAS-LightSim の sm-remote を移植し,空いている GPU を両サーバから自動で選んでジョブを起動し,結果を回収ホワイトリストに従って持ち帰るツールにした.仕様は SPEC_03.
figures/ 直下に限定した(*.png を広く許すと,誤分類例の舌画像などを持ち帰る経路になる).pull は受信した tar を全件検査し,1 件でも不正があれば何も展開しないCUDA_DEVICE_ORDER=PCI_BUS_ID を渡す(CUDA と nvidia-smi で GPU 番号がずれ,空きと判定したのとは別の GPU を使う事故を防ぐ)known_hosts 未登録で失敗した(これまで別名 newton.local でしか接続していなかった)→ IP で登録し,既存の鍵と指紋が一致することを確認 / ② ジョブ終了を待つループが,ログの終了行の書式(実際は exit N)を読み違えて空回りしたtias-dataset(manifest 生成・集計)と「ややあり」の実験切り替えを実装し,実データを集計: 両サーバで manifest を生成し,Newton で 1085 枚を集計して集計値と図だけを回収した(結果は TEST_02).
data.severities)tias-remote run --cpu を追加した.manifest 生成・集計は CPU だけで動くのに,run が必ず空き GPU を要求していた(Newton の GPU が全て使用中で起動できない状況があった).git を送らないため tias-remote run が手元で求めて TIAS_GIT_COMMIT で渡すtias-train cv を実装し,実データで 4 モデル × 2 条件 × 3 seed の交差検証を実行: ユーザー就寝中(2026-09-28 00:23〜)に,確認を省略して実装→テスト→リファクタ→実行まで進めた(ユーザーの許可による.作業ブランチへのコミットも許可済み.GPU は Archimedes の 2 枚を使う許可).結果は TEST_03.
data.severities に関わらず全程度で評価し,部分集合(all・common・mild)ごとに指標を出す.これで「ややあり込み/除外」を同じ土俵で比べられるmetrics.json と history.csv に残す(ユーザー要望).1 本(5 fold)2〜4 分,36 本で合計 88 分inverse・sqrt_inverse)とバランス・サンプリングを追加し,2 モデル × 3 通り × 2 条件 × 3 seed で実験: TEST_03 で紫・淡白の再現率が低かったため.結果は TEST_04.
CrossEntropyLoss(weight=w) の既定は重みの和で割るため正規化が効かない.tester の指摘で仕様に明記).損失の大きさを対策なしと揃え,学習率の意味を変えないinverse が安定して効く(込み・除外とも common macro F1 +0.04,11〜12/15 fold.除外で 0.632).ResNet-50(1e-3)ではほぼ効かない.淡白・紫の再現率は +0.1〜0.2 上がるが淡紅・暗赤紅が下がる入れ替わりがあり,macro F1 の改善は小さい.紫は対策後も 0.3〜0.55tias-train color-cv を追加し,CNN と同じ分割で 18 本を実験: ラベルが色そのもので,データが少ないため,手作りの色特徴のほうが強い可能性を確かめた(ユーザーの選択).結果は TEST_05.
split.json が一致することをテストで確認).これで CNN の結果と fold どうしの対応比較ができるinverse は macro F1 を下げたが,淡白 0.81・紫 0.60 と少数クラスの再現率はこれまでで最高