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 0177f44..5067710 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" @@ -103,7 +103,7 @@ - `run` はサーバのプロジェクトルートで `~/.local/bin/uv run ` を tmux セッション(名前 = `--name`.既定は起動時刻)でデタッチ起動する.接続が切れても継続し,出力は `output/_remote_logs/.log` に開始行・終了コード行付きで追記される.同名のジョブが実行中ならエラーになる - `run` は既定で `SM_RENDER_VARIANT=cuda_ad_rgb` を渡す(sm-render が YAML の variant より優先して使う.GPU は手元の CPU の 37〜72 倍速く,Newton の `llvm_ad_rgb` と結果が一致することを 2026-09-13 に確認済み).YAML の variant のまま回すときは `--yaml-variant` -- GPU(`cuda_ad_rgb`)の結果は,同じコード・同じ YAML でも**実行ごとに画素単位で変わる**(2026-09-13 に基準シーン 3 回で確認.約 97% の画素が MC ノイズ程度に異なり,画素の相関は 0.98).平均・CoV などの集計指標は 1e-4 以内で一致するので条件比較には使えるが,画素単位で過去のレンダと突き合わせる用途には向かない.原因(seed の扱いか GPU の並列加算の順序か)と,`llvm_ad_rgb` でも同様かは未確認 +- レンダ結果は,同じコード・同じ YAML・同じ seed でも**実行ごとに画素単位で変わる**(GPU・CPU とも.2026-09-13 に Newton で確認).同じシーンオブジェクトを 2 回レンダした差は丸め誤差(並列加算の順序)だけで平均も一致するが,シーンを読み込み直すと約 97% の画素が MC ノイズ程度に変わる(平均の差 3〜7e-4).コーネルボックスでは読み込み直しても丸め誤差だけなので,このシーン固有の現象.読み込み時に並列で作られる加速構造かサンプリング用の表の丸め差が,最大 16 回の反射で経路の分岐として増幅されていると推定している(どちらかは未切り分け).sm-render は毎回シーンを読み込むので,1 回ごとに別のノイズ実現と考える.集計指標の条件比較には問題ないが,画素単位で過去のレンダと突き合わせる用途には向かない - CPU(`llvm_*` / `scalar_*`)で回すときは `--threads N` で Dr.Jit のスレッド数に上限を付ける(共用サーバの 64 スレッドを占有しないため) - GPU は `status` で空きを見てから `--gpu` で指定する(未指定だと CUDA は 0 番を使う).その他の環境変数は `--env KEY=VALUE` で渡せる - サーバで pytest を回すときは `--yaml-variant` を付ける(variant の上書きをテストに持ち込まないため): `uv run sm-remote run --name pytest-all --yaml-variant -- python -m pytest -m ""` diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 1a0ebee..9e5753a 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -96,4 +96,4 @@ - **研究室サーバ(Newton)で計算する仕組みを整備 — GPU で手元の 37〜72 倍 (2026-09-13)**: 手元 Windows の CPU レンダ(1 条件 5〜10 分)を研究室の GPU サーバで回せるようにした.初回セットアップ(SSH 鍵認証 → uv でユーザー領域に Python 3.12 → 転送 → `uv sync`)を ENV_02「研究室サーバ編」に,日常の操作(送信・tmux でのジョブ起動・状態確認・ログ・結果の持ち帰り)を `sm-remote` CLI として実装し ENV_04 にまとめた.使えるのは Newton のみ(Einstein はホームディレクトリが無く鍵登録不可,Archimedes は鍵未登録).**結果**: 代表 2 シーン(spp=1024)で cuda_ad_rgb は手元 llvm の 37〜72 倍(立方体 L240 285 s→7 s,球 r135 558 s→8 s).Newton の llvm と平均の相対差 1e-5・CoV 差 5e-5 以下で一致したため,サーバでは cuda を既定にした.**設計判断**: ① GitHub 認証をサーバに置かない(ユーザー判断: 計算して結果を受け取るだけ)→ 手元の作業ツリーをそのまま送るので未コミットの実験設定も回せる / ② Windows に rsync が無いため Python の tarfile で送受信(PowerShell と Git Bash で同じ挙動)/ ③ 同じ YAML のまま手元は llvm・サーバは cuda で回せるよう variant を環境変数で上書きし,共用サーバの 64 スレッドを占有しないよう Dr.Jit のスレッド数上限を追加(llvm で loadavg 33→87 を実測).**失敗パターン・発見**: ① スイープ生成スクリプトが `_tmp` YAML に Windows の絶対パスを書いておりサーバで読めない → YAML からの相対パスに変更 / ② `llvm_init` が Ubuntu の `libLLVM-15.so` 形式を探せず誤警告 → 探索対象に追加 / ③ Phase 2 のテストで pull 展開のパストラバーサル対策の穴(`..`・バックスラッシュ・ハードリンク経由で `src/` を上書きできる)が見つかり,`/consult`(advisor: Fable)の判断で名前の構造検査とリンクの一律拒否に強化 / ④ 作業中に Smart App Control が評価モードからオンに切り替わり(処理中の通知のボタン操作が契機とみられる),mitsuba 3.7.1 の `mitsuba_ext` まで import 不能になった.ファイル単位の例外が無く再インストールでも直らないため,ユーザー判断で SAC をオフにした(08-30 の「SAC 無効化は不採用」を変更.経緯は ENV_04).**未解決・次**: 球 r135 だけ手元の過去結果と CoV が 0.0864 vs 0.0835 と食い違う(Newton の llvm と cuda は一致しているので GPU 起因ではない.08-31 のロフト形状コミット前の古いメッシュでレンダした可能性があるが未確定). - **学外からの接続**: Tailscale に登録済みの研究室 PC(サーバとは別)に OpenSSH Server を入れて Tailscale からのみ受け付け,SSH の踏み台(ProxyJump)にして Newton に入れるようにした(Newton 側は無変更.大学 VPN やサブネットルーターより影響範囲が自分の PC に閉じる).失敗パターン: 研究室 PC は管理者アカウントのため鍵を `C:\ProgramData\ssh\administrators_authorized_keys` に置く必要があるうえ,両 PC の管理者 PowerShell のプロンプトが同一で鍵を手元 PC に登録してしまった → `hostname` で確かめてから実行する(手順は ENV_02「学外から接続する」). - - **GPU の結果は画素単位では再現しない**: 最終確認で基準シーンを同条件の cuda で 3 回回すと,約 97% の画素が MC ノイズ程度に異なった(相関 0.98.平均の差 2e-4 以下・CoV の差 1e-5).リファクタ前のコードどうしでも同じ程度に違うので,コード変更ではなく GPU 側の非決定性.集計指標の比較には問題ないが,画素単位の突き合わせには使えない.原因(seed の扱い/並列加算の順序)と llvm でも同様かは未確認.裏返せば,同じ条件の繰り返しで未実施の**ノイズフロア**を測れる可能性がある. + - **レンダは画素単位では再現しない(GPU・CPU とも)**: 最終確認で基準シーンを同条件で繰り返すと,約 97% の画素が MC ノイズ程度に異なった(平均の差 3〜7e-4・CoV の差 1e-5).切り分け実験: ① 同じシーンオブジェクトを 2 回レンダ → 丸め誤差だけ(並列加算の順序.平均は一致)/ ② シーンを読み込み直す → ノイズ程度の差 / ③ コーネルボックスは読み込み直しても丸め誤差だけ.=このシーン固有で,読み込み時に並列で作られる加速構造かサンプリング用の表の丸め差が,最大 16 回の反射で経路の分岐として増幅されると推定(どちらかは未切り分け).過去の「seed 固定で決定論的」という前提は厳密には成り立たないが,集計指標の比較には影響しない.裏返せば,同じ条件の繰り返しで未実施の**ノイズフロア**を測れる.