手元からコードを送り,研究室の複数の GPU サーバ(Newton・Archimedes)のうち空いている GPU を自動で選んでジョブを実行し,結果を回収ホワイトリストに従って持ち帰るツール tias-remote の仕様.SmTIAS-LightSim の sm-remote を移植し,複数サーバ対応と回収制限を加えたもの.
BatchMode=yes.パスワード入力を求めない)configs/remote.yaml に置き,pydantic で検証する(未知のキーは拒否).
jump_host: labpc # 踏み台.null なら直接接続
connect_timeout_sec: 15
gpu_free:
max_memory_used_mib: 1024 # 使用中メモリがこれ未満
max_utilization_percent: 10 # かつ使用率がこれ未満なら「空き」
observe_sec: 10 # この秒数だけ観測してから判定する(0 なら瞬間値のみ)
sample_interval_ms: 500 # 観測の間隔
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: false
| 検証規則 | 内容 |
|---|---|
servers | 1 件以上.name は重複不可 |
priority | 整数.同じ値のときは servers の記載順で優先 |
name | 英数字・_・- のみ(コマンド引数・表示に使うため) |
| 閾値 | max_memory_used_mib は 0 以上.max_utilization_percent は 0〜100 |
| 観測 | observe_sec は 0〜120(0 は瞬間値のみで判定).sample_interval_ms は 100〜5000 |
connect_timeout_sec | 1 以上 |
環境変数による上書き:
| 環境変数 | 効果 |
|---|---|
TIAS_REMOTE_JUMP | jump_host を上書きする.空文字なら直接接続(研究室 LAN 内にいるとき) |
TIAS_REMOTE_SSH | 手元の ssh 実行ファイル(Windows の既定は C:\Windows\System32\OpenSSH\ssh.exe) |
TIAS_REMOTE_ALLOW_SELF | 1 でサーバ上実行の検出を無効化する(誤検出時の逃げ道) |
<user>@<address>.jump_host があれば -J <jump_host> を付ける-o BatchMode=yes -o ConnectTimeout=<connect_timeout_sec> を付けるuv は設定の絶対パス(~ 展開)で呼び,PATH に ~/.local/bin を加える(非対話 ssh では ~/.local/bin が PATH に無い.ENV_02)各サーバで次を取得する(ssh 1 回で行う).
GPU の一覧(1 行 1 GPU)
nvidia-smi --query-gpu=index,uuid,name,memory.used,memory.total,utilization.gpu --format=csv,noheader,nounits
観測: observe_sec 秒間,sample_interval_ms 間隔で GPU ごとの使用率と使用中メモリを繰り返し取得する(nvidia-smi --query-gpu=index,utilization.gpu,memory.used --format=csv,noheader,nounits -lms <間隔> を timeout <秒> で打ち切る等)
プロセス別の観測: 同じ時間,プロセスごとの SM 使用率を取得する(nvidia-smi pmon -s u -d 1 -c <秒>.上の観測と並行して実行する)
GPU 上の計算プロセス(gpu_uuid で GPU と対応付ける)
nvidia-smi --query-compute-apps=gpu_uuid,pid,used_memory --format=csv,noheader,nounits
各プロセスの所有ユーザーと起動からの経過秒数(ps -o user=,etimes= -p <pid> 等)
※ --query-compute-apps と pmon の C(計算)種別のみを数え,画面描画のプロセス(G 種別.Xorg 等)は含めない.C+G のように両方を含む種別は計算として数える.
※ nvidia-smi は「最後に使った時刻」の履歴を持たないため取得しない.代わりに観測中の使用率とプロセスの経過時間で判断する.
観測中の最大値で閾値を判定する(瞬間値だけでは,起動と停止を繰り返す GPU を「空き」と誤認するため.2026-09-27 に Newton で 10 秒間に 0〜74% を往復する GPU を実測).
| 状態 | 条件 | 選択 |
|---|---|---|
| 未使用 | 観測中ずっと閾値内(使用率の最大 < max_utilization_percent かつ使用中メモリの最大 < max_memory_used_mib)で,計算プロセスが 1 つも無い | 最優先 |
| 空き(利用者あり) | 観測中ずっと閾値内だが計算プロセスがある.または計算プロセスの一覧が取得できなかった(利用者不明) | 未使用が無いときのみ |
| 使用中 | 観測中に一度でも閾値を超えた | 選ばない |
| 状態不明 | GPU の行が解釈できない,または観測のサンプルが 1 つも得られない | 選ばない(取得できない GPU を使わないため) |
observe_sec: 0(または --observe 0)のときは従来どおり 1 回の瞬間値で判定する表示のために,観測中の使用率から GPU ごとに型を付ける(判定には使わない.判定は上の表).
| 型 | 条件 |
|---|---|
| 常時使用 | 使用率が 0% を超えたサンプルが全体の 80% 以上 |
| 断続的に使用 | 使用率が 0% を超えたサンプルが 1 つ以上・80% 未満 |
| メモリ確保のみ | 使用率が 0% を超えたサンプルが無く,計算プロセスがある |
| 未使用 | 使用率が 0% を超えたサンプルが無く,計算プロセスも無い |
プロセス別の観測(pmon)が得られた場合は,プロセスごとにも観測中の SM 使用率の最大値を表示する.得られなかった場合は GPU 単位の型だけを表示する.
run で GPU を指定しないとき)data_ready: true のサーバ(--no-data を付けたときは全サーバ).--server を指定したときはそのサーバのみpriority 昇順(同値は記載順)→ GPU の index 昇順で最初のものを選ぶ例: Newton の空き GPU がすべて利用者ありで,Archimedes に未使用の GPU があれば,Newton の方が優先順位が高くても Archimedes を選ぶ.
明示指定:
--server NAME --gpu I で GPU を直接指定できる.指定した GPU が「未使用」「空き(利用者あり)」なら起動する(後者は利用者を警告表示する).使用中・状態不明ならエラーにし,--force を付けたときだけ警告を出して実行する--gpu だけの指定は不可(どのサーバか曖昧になるため --server を必須とする)--force でも起動しない)--server に data_ready: false のサーバを指定した場合も,--no-data が無ければエラー(候補サーバの規則を明示指定にも適用する)gpus・status は各 GPU について次を表示する.
gpus と run は --observe SEC で観測時間を上書きできる(--observe 0 で瞬間値のみ.急ぐとき用).観測は全サーバで並行して行う.
※ 判定から起動までの間に他者が使い始める競合は防げない(既知の制約).
| サブコマンド | 動作 |
|---|---|
gpus [--observe SEC] | 全サーバの GPU 一覧(状態・使い方の型・利用者)と,run が選ぶ GPU を表示する |
push [--server NAME] | コードを送る.省略時は接続できる全サーバ |
run --name NAME [--server S] [--gpu I \| --cpu] [--force] [--no-data] [--no-push] [--observe SEC] [--env K=V ...] -- CMD... | GPU を選び,そのサーバへコードを送り(--no-push で省略),tmux でジョブを起動する |
status | 全サーバの実行中ジョブと GPU の状況 |
logs NAME [-n N] [-f] | ジョブのログを表示する.ジョブのあるサーバを自動で探す |
kill NAME | ジョブを止める.ジョブのあるサーバを自動で探す |
pull RUN_ID [--server S] [--with-checkpoints] | 実験結果を回収ホワイトリストに従って持ち帰る |
src/・scripts/・tests/・configs/・pyproject.toml・uv.lock・.python-version 等).git/・.venv/・__pycache__/・.pytest_cache/・.ruff_cache/・data/・runs/・.claude/remote_dir に上書き展開する(Windows に rsync が無いため)_・- のみ,1〜64 文字remote_dir で <uv> run <CMD> を実行する.接続が切れても継続するCUDA_VISIBLE_DEVICES=<選んだ GPU の index>・TIAS_DATA_ROOT=<そのサーバの data_dir>・CUDA_DEVICE_ORDER=PCI_BUS_ID(CUDA の GPU 番号を nvidia-smi の index にそろえる.そろえないと空きと判定したのと別の GPU を使いうる)・PYTHONUNBUFFERED=1・TIAS_GIT_COMMIT(手元の git rev-parse --short HEAD.未コミットの変更があれば末尾に -dirty.git が使えなければ設定しない.サーバには .git を送らないため,実験 ID の git ハッシュをここから得る.SPEC_01「実験の出力」)・--env で指定したもの.--env 以外の 5 つは --env で上書きできない(GPU の割り当てと実験の記録を迂回させないため)remote_dir/runs/_remote_logs/<ジョブ名>.log に,開始行(サーバ名・GPU・日時)と終了コード行(=== [日時] exit <終了コード>)を付けて追記する--dry-run を付けると GPU の選択までを行い,送信・起動はしない--cpu: GPU を使わないジョブ(manifest の生成・データセットの集計等)用.GPU の観測・選択を行わず,CUDA_VISIBLE_DEVICES を空文字で渡す(GPU を誤って掴まないため).サーバは --server で指定したもの,省略時は候補サーバ(data_ready: true.--no-data で全サーバ)を priority 順に見て最初に接続できたもの.--gpu・--force・--observe とは同時に指定できない.ログの開始行の GPU は「なし(CPU)」とするremote_dir/runs/<RUN_ID>/ 配下で,SPEC_01「回収ホワイトリスト」に名前が一致するファイルのみ.checkpoints/*.pt は --with-checkpoints のときだけfigures/*.png は figures/ の直下のみを対象とする(figures/sub/x.png は回収しない)RUN_ID に /・\・.. を含むもの,空文字,.・- で始まるもの,制御文字・前後の空白を含むものは拒否するruns/_remote_logs/)は pull の対象外.logs で表示する--server を省略したときは全サーバを探し,見つかったのが 1 台ならそこから回収する.複数台にあればエラー(--server の指定を求める).どこにも無ければエラーruns/<RUN_ID>/(同名ファイルは上書き)..・絶対パス・ドライブ文字・バックスラッシュ)・リンク(シンボリック・ハード)が 1 つでもあれば何も展開せずに中止する手元のホスト名がいずれかのサーバの name と一致したら,自分自身へ ssh しようとしているとみなして止める(大文字小文字とドメイン部分は無視して比べる.TIAS_REMOTE_ALLOW_SELF=1 で無効化).
--config PATH(既定はプロジェクトルートの configs/remote.yaml)observe_sec 秒)を行うのは gpus・run・status.push・kill・logs・pull はジョブやファイルの有無だけを見るため観測しない.claude/rules/testing.md)nvidia-smi 出力(GPU 状態・観測サンプル・pmon・計算プロセス)と ps 出力の解析,gpu_uuid による対応付けと 4 段階の判定(観測中の最大値で判定すること・状態不明・利用者不明・サンプル 0 件の扱いを含む)data_ready・--server・--gpu・--force・空き無し)BatchMode・タイムアウト)