RabbitDaisuke commited on
Commit
3410a06
·
verified ·
1 Parent(s): 88ee5cb

Update browser execution-path benchmark 7eca78d68fa8fdd23b53e286d859d8d6e2f752dc

Browse files
Files changed (2) hide show
  1. benchmark/benchmark.js +6 -3
  2. benchmark/index.html +1 -1
benchmark/benchmark.js CHANGED
@@ -68,7 +68,7 @@ async function measure(){
68
  runContext={source:{width:video.videoWidth,height:video.videoHeight,duration:video.duration},inputShape:[1,3,384,288],sampleFractions:[.2,.5,.8],roiPercent:Object.fromEntries(['x','y','w','h'].map(k=>[k,Number($(k).value)])),views,iterations,warmupRuns:5};
69
  for(const variant of variants){
70
  if(stopped)break;const data=await bytes(variant.file,variant.sha256);
71
- const routes=modes.map(mode=>({mode,flavour:'patched'}));
72
  if($('original').checked&&variant.policy==='fp32')routes.push({mode:MODES[0],flavour:'original'});
73
  for(const {mode,flavour} of routes){
74
  if(stopped)break;
@@ -106,7 +106,10 @@ $('native-input').onclick=()=>{if(!preparedInputs)return;if(new Uint8Array(new U
106
  try{
107
  const model=await(await get(`https://huggingface.co/api/models/${REPO}`)).json();revision=model.sha;base=`https://huggingface.co/${REPO}/resolve/${revision}/`;catalog=await(await get(base+'models.json')).json();
108
  if(catalog.keypointCount!==133)throw Error('全身133点のカタログではありません');$('models').replaceChildren();
109
- for(const v of catalog.variants){const label=document.createElement('label'),checkbox=document.createElement('input');checkbox.type='checkbox';checkbox.value=v.id;checkbox.checked=v.id==='rtmw3d-l-fp32';label.append(checkbox,document.createTextNode(`${v.id} · ${(v.sizeBytes/1e6).toFixed(0)}MB`));$('models').append(label);}
110
- for(const m of MODES){const label=document.createElement('label'),checkbox=document.createElement('input');checkbox.type='checkbox';checkbox.value=m.id;checkbox.checked=true;label.append(checkbox,document.createTextNode(m.label));$('modes').append(label);}
 
 
 
111
  $('start').disabled=false;status(`HF revision ${revision}\n全候補:全133点。FP16・INT8の速さを仮定しません。`);
112
  }catch(e){status(String(e.message||e));}
 
68
  runContext={source:{width:video.videoWidth,height:video.videoHeight,duration:video.duration},inputShape:[1,3,384,288],sampleFractions:[.2,.5,.8],roiPercent:Object.fromEntries(['x','y','w','h'].map(k=>[k,Number($(k).value)])),views,iterations,warmupRuns:5};
69
  for(const variant of variants){
70
  if(stopped)break;const data=await bytes(variant.file,variant.sha256);
71
+ const routes=modes.filter(mode=>requestedModes.includes(mode.id)||(variant.policy==='fp32'&&mode.id==='standard')).map(mode=>({mode,flavour:'patched'}));
72
  if($('original').checked&&variant.policy==='fp32')routes.push({mode:MODES[0],flavour:'original'});
73
  for(const {mode,flavour} of routes){
74
  if(stopped)break;
 
106
  try{
107
  const model=await(await get(`https://huggingface.co/api/models/${REPO}`)).json();revision=model.sha;base=`https://huggingface.co/${REPO}/resolve/${revision}/`;catalog=await(await get(base+'models.json')).json();
108
  if(catalog.keypointCount!==133)throw Error('全身133点のカタログではありません');$('models').replaceChildren();
109
+ const experimentalResponse=await fetch(base+'experiments/catalog.json',{credentials:'omit',referrerPolicy:'no-referrer'});
110
+ if(experimentalResponse.ok){const extra=await experimentalResponse.json();if(extra.keypointCount!==133||extra.schema!=='rtmw3d-head-experiments/v1')throw Error('実験カタログの全身出力契約が不正です');for(const v of extra.variants){if(!catalog.variants.some(existing=>existing.id===v.id))catalog.variants.push(v);}}
111
+ else if(experimentalResponse.status!==404)throw Error('実験カタログの取得に失敗: '+experimentalResponse.status);
112
+ for(const v of catalog.variants){const label=document.createElement('label'),checkbox=document.createElement('input');checkbox.type='checkbox';checkbox.value=v.id;checkbox.checked=v.id==='rtmw3d-l-fp32'||(v.experimental&&v.qualityPassed);label.append(checkbox,document.createTextNode(`${v.id} · ${(v.sizeBytes/1e6).toFixed(0)}MB${v.experimental?' · 等価FP32実験':''}`));$('models').append(label);}
113
+ for(const m of MODES){const label=document.createElement('label'),checkbox=document.createElement('input');checkbox.type='checkbox';checkbox.value=m.id;checkbox.checked=m.id==='nhwc';label.append(checkbox,document.createTextNode(m.label));$('modes').append(label);}
114
  $('start').disabled=false;status(`HF revision ${revision}\n全候補:全133点。FP16・INT8の速さを仮定しません。`);
115
  }catch(e){status(String(e.message||e));}
benchmark/index.html CHANGED
@@ -1,6 +1,6 @@
1
  <!doctype html><html lang="ja"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>全身RTMW3D · GPU比較</title><style>
2
  *{box-sizing:border-box}body{max-width:1280px;margin:32px auto;padding:0 22px;background:#f5f5f0;color:#20352c;font:14px/1.7 system-ui,sans-serif}h1{font-size:26px}section{background:#fff;border:1px solid #dce4d8;border-radius:9px;padding:20px;margin:16px 0}button,select,input{font:inherit;padding:8px}button{background:#194f40;color:white;border:0;border-radius:5px;cursor:pointer}button:disabled{opacity:.4;cursor:default}label{display:inline-flex;gap:7px;align-items:center;margin:6px 18px 6px 0}input[type=number]{width:76px;border:1px solid #cbd5c5;border-radius:4px}video{max-height:280px;width:100%;background:#102a23}table{border-collapse:collapse;width:100%;font-size:12px}td,th{padding:9px;border-bottom:1px solid #e3e8df;text-align:left}#models{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}#status{white-space:pre-wrap;overflow-wrap:anywhere;font-size:12px}small{color:#718168}a{color:#286951}.table-wrap{overflow-x:auto}.bad{color:#a04c33}canvas{display:none}.note{font-size:12px;color:#6e7f65}</style><script type="module" src="./benchmark.js"></script></head><body>
3
- <h1>足首・足先を含む全身RTMW3DのWebGPU比較</h1><p>全候補は133点を保持します。同じモデルと動画入力で、数値形式・GPUメモリ再利用・実行経路を比較します。</p><p class="note">1〜4入力は1セッションを時分割する推論負荷です。物理カメラの同期・三角測量・SteamVR送出の実測ではありません。映像は端末から送信しません。</p><label><input id="original" type="checkbox" checked>FP32で未パッチJSEP版の標準経路も比較する</label><p class="note">同じORT 1.27.0 JSEPのパッチ前後を比較します。別実装のwebgpu-only配布物とは区別します。</p>
4
  <p><a href="./mediapipe.html">MediaPipe Pose / Holistic比較</a> · <a href="./native_benchmark.py" download>ネイティブGPU診断スクリプト</a></p><p><button id="native-input" disabled>同じ入力を端末内へ保存</button> <small>ネイティブ比較用。正規化済みの画像3枚を含む診断ファイルです。端末内でのみ使用してください。通常の結果JSONには画像を含みません。</small></p>
5
  <section><h2>1. ローカル動画と人物範囲</h2><input id="video-file" type="file" accept="video/*"><video id="video" controls playsinline muted></video><div><label>ROI左 % <input id="x" type="number" value="0" min="0" max="99"></label><label>ROI上 % <input id="y" type="number" value="0" min="0" max="99"></label><label>ROI幅 % <input id="w" type="number" value="100" min="1" max="100"></label><label>ROI高 % <input id="h" type="number" value="100" min="1" max="100"></label></div><small>全身と足先が入る範囲を指定してください。3時刻の同じROIを各モデルで使用します。解像度はモデル入力288×384にだけ変換します。</small></section>
6
  <section><h2>2. 比較候補</h2><div id="models">カタログ取得中…</div><p class="note">同じLまたはXのFP32基準も自動で測定します。FP32との差は正解データに対する精度ではありません。初回は選択したモデルだけ取得・キャッシュします。</p><h2>3. 実行経路</h2><div id="modes"></div><p class="note">標準経路も基準として自動測定します。GPUバッファ再利用とGraph Captureも、入力転送・GPU完了・133関節の読戻しを含めて測ります。Graph Captureで未対応演算があれば失敗理由を記録します。差分基準は身体・股関節・膝・足首・足先それぞれXY p95 ≤ 3px、Z p95 ≤ 5cm、信頼度低下なしです。観測不足では合格にしません。</p><label><input id="profile" type="checkbox" checked>計測後に別セッションで演算別GPU診断を記録</label><p class="note">診断にはtimestamp-queryが必要です。診断時の負荷は速度計測へ含めません。JSONに動画名・映像・端末識別情報は保存しません。</p><label>入力相当数 <select id="views"><option>1</option><option>2</option><option>3</option><option>4</option></select></label><label>計測推論回数 <input id="iterations" type="number" value="200" min="12" max="1000"></label><button id="start" disabled>選択した全身モデルを比較</button> <button id="stop" disabled>停止</button> <button id="download" disabled>結果JSON</button><pre id="status" role="status"></pre></section>
 
1
  <!doctype html><html lang="ja"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>全身RTMW3D · GPU比較</title><style>
2
  *{box-sizing:border-box}body{max-width:1280px;margin:32px auto;padding:0 22px;background:#f5f5f0;color:#20352c;font:14px/1.7 system-ui,sans-serif}h1{font-size:26px}section{background:#fff;border:1px solid #dce4d8;border-radius:9px;padding:20px;margin:16px 0}button,select,input{font:inherit;padding:8px}button{background:#194f40;color:white;border:0;border-radius:5px;cursor:pointer}button:disabled{opacity:.4;cursor:default}label{display:inline-flex;gap:7px;align-items:center;margin:6px 18px 6px 0}input[type=number]{width:76px;border:1px solid #cbd5c5;border-radius:4px}video{max-height:280px;width:100%;background:#102a23}table{border-collapse:collapse;width:100%;font-size:12px}td,th{padding:9px;border-bottom:1px solid #e3e8df;text-align:left}#models{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}#status{white-space:pre-wrap;overflow-wrap:anywhere;font-size:12px}small{color:#718168}a{color:#286951}.table-wrap{overflow-x:auto}.bad{color:#a04c33}canvas{display:none}.note{font-size:12px;color:#6e7f65}</style><script type="module" src="./benchmark.js"></script></head><body>
3
+ <h1>足首・足先を含む全身RTMW3DのWebGPU比較</h1><p>全候補は133点を保持します。同じモデルと動画入力で、数値形式・GPUメモリ再利用・実行経路を比較します。</p><p class="note">1〜4入力は1セッションを時分割する推論負荷です。物理カメラの同期・三角測量・SteamVR送出の実測ではありません。映像は端末から送信しません。</p><p class="note">等価FP32実験は、時間を占める出力直前の2つの畳み込みを、同じFP32重みの明示的im2col+行列積へ置き換えた候補です。split8は積の和を8分割して最後に足します。学習済み重み・133関節・入力解像度を維持します。CPU変換検査済みで、実GPUの速度と誤差はこの画面で比較します。</p><label><input id="original" type="checkbox">FP32で未パッチJSEP版の標準経路も比較する</label><p class="note">同じORT 1.27.0 JSEPのパッチ前後を比較します。別実装のwebgpu-only配布物とは区別します。</p>
4
  <p><a href="./mediapipe.html">MediaPipe Pose / Holistic比較</a> · <a href="./native_benchmark.py" download>ネイティブGPU診断スクリプト</a></p><p><button id="native-input" disabled>同じ入力を端末内へ保存</button> <small>ネイティブ比較用。正規化済みの画像3枚を含む診断ファイルです。端末内でのみ使用してください。通常の結果JSONには画像を含みません。</small></p>
5
  <section><h2>1. ローカル動画と人物範囲</h2><input id="video-file" type="file" accept="video/*"><video id="video" controls playsinline muted></video><div><label>ROI左 % <input id="x" type="number" value="0" min="0" max="99"></label><label>ROI上 % <input id="y" type="number" value="0" min="0" max="99"></label><label>ROI幅 % <input id="w" type="number" value="100" min="1" max="100"></label><label>ROI高 % <input id="h" type="number" value="100" min="1" max="100"></label></div><small>全身と足先が入る範囲を指定してください。3時刻の同じROIを各モデルで使用します。解像度はモデル入力288×384にだけ変換します。</small></section>
6
  <section><h2>2. 比較候補</h2><div id="models">カタログ取得中…</div><p class="note">同じLまたはXのFP32基準も自動で測定します。FP32との差は正解データに対する精度ではありません。初回は選択したモデルだけ取得・キャッシュします。</p><h2>3. 実行経路</h2><div id="modes"></div><p class="note">標準経路も基準として自動測定します。GPUバッファ再利用とGraph Captureも、入力転送・GPU完了・133関節の読戻しを含めて測ります。Graph Captureで未対応演算があれば失敗理由を記録します。差分基準は身体・股関節・膝・足首・足先それぞれXY p95 ≤ 3px、Z p95 ≤ 5cm、信頼度低下なしです。観測不足では合格にしません。</p><label><input id="profile" type="checkbox" checked>計測後に別セッションで演算別GPU診断を記録</label><p class="note">診断にはtimestamp-queryが必要です。診断時の負荷は速度計測へ含めません。JSONに動画名・映像・端末識別情報は保存しません。</p><label>入力相当数 <select id="views"><option>1</option><option>2</option><option>3</option><option>4</option></select></label><label>計測推論回数 <input id="iterations" type="number" value="200" min="12" max="1000"></label><button id="start" disabled>選択した全身モデルを比較</button> <button id="stop" disabled>停止</button> <button id="download" disabled>結果JSON</button><pre id="status" role="status"></pre></section>