feat(mia): one-shot Make-It-Animatable v2 auto-rigger on fv-ml1 GPU 3 (scripts/mia-run)
Image local/mia:0.1.0 built from stacks/mia: MIA v2 @ bbd8b158 (MIT) with its pinned submodules, dread-dev's proven Python lock with the torch family swapped to cu129, and a driver adapted from dread-dev's run_mia.py that seeds every mesh (fix_random + trimesh's module RNG) and writes weights_effective into the npz. Weights stay in fv-ml1's shared HF cache at pinned revisions, mounted read-only. scripts/mia-run mirrors blender-run: --job DIR is shipped to fv-ml1:/tank/mia/jobs, one docker run --rm rigs every mesh, out/ comes back. Acceptance on the four Dread Naught characters: 3.9-4.7 s a mesh (median of 3) plus 12.7 s model load, peak 3,394 MiB; seeded runs bit-identical across rotated mesh order; GPU-vs-CPU distances the same size as sampling noise, with an unseeded GPU run as the positive control.
This commit is contained in:
@@ -0,0 +1,394 @@
|
||||
{
|
||||
"goblin": {
|
||||
"gpu_pipeline_s": [
|
||||
4.569874900858849,
|
||||
4.53466919856146,
|
||||
4.427527715917677
|
||||
],
|
||||
"gpu_model_s": [
|
||||
1.9738918957300484,
|
||||
1.881500325864181,
|
||||
1.8626845581457019
|
||||
],
|
||||
"apose_hint_s": [
|
||||
1.190177327953279,
|
||||
1.4380995847750455,
|
||||
1.2671978930011392
|
||||
],
|
||||
"cpu_pipeline_s": [
|
||||
119.3426258880063,
|
||||
708.4532103899983,
|
||||
160.76836042600917
|
||||
],
|
||||
"peak_reserved_mib": [
|
||||
2712.0,
|
||||
2732.0,
|
||||
2732.0,
|
||||
2712.0
|
||||
],
|
||||
"seeded_maxdiff": {
|
||||
"joints_head": 0.0,
|
||||
"joints_tail": 0.0,
|
||||
"weights": 0.0,
|
||||
"weights_effective": 0.0,
|
||||
"pose_to_rest": 0.0
|
||||
},
|
||||
"cpu_cpu": [
|
||||
{
|
||||
"jh_med": 0.002404872328042984,
|
||||
"jh_max": 0.009904514066874981,
|
||||
"jt_max": 0.010788610205054283,
|
||||
"w_moved_mean": 0.01768580637872219,
|
||||
"w_moved_p95": 0.06185286119580269,
|
||||
"dom_changed": 0.02601522842639594
|
||||
},
|
||||
{
|
||||
"jh_med": 0.0025397357530891895,
|
||||
"jh_max": 0.009374394081532955,
|
||||
"jt_max": 0.010417704470455647,
|
||||
"w_moved_mean": 0.02369445003569126,
|
||||
"w_moved_p95": 0.07524719834327698,
|
||||
"dom_changed": 0.03140862944162436
|
||||
},
|
||||
{
|
||||
"jh_med": 0.0021242855582386255,
|
||||
"jh_max": 0.005268011707812548,
|
||||
"jt_max": 0.0065661026164889336,
|
||||
"w_moved_mean": 0.01971343532204628,
|
||||
"w_moved_p95": 0.06007026135921478,
|
||||
"dom_changed": 0.022208121827411168
|
||||
}
|
||||
],
|
||||
"gpu_cpu": [
|
||||
{
|
||||
"jh_med": 0.002763624768704176,
|
||||
"jh_max": 0.01039000041782856,
|
||||
"jt_max": 0.011829185299575329,
|
||||
"w_moved_mean": 0.025863967835903168,
|
||||
"w_moved_p95": 0.083327516913414,
|
||||
"dom_changed": 0.031725888324873094
|
||||
},
|
||||
{
|
||||
"jh_med": 0.0024375617504119873,
|
||||
"jh_max": 0.006176925264298916,
|
||||
"jt_max": 0.006694309413433075,
|
||||
"w_moved_mean": 0.023365769535303116,
|
||||
"w_moved_p95": 0.07489541918039322,
|
||||
"dom_changed": 0.02728426395939086
|
||||
},
|
||||
{
|
||||
"jh_med": 0.0030529131181538105,
|
||||
"jh_max": 0.00709641445428133,
|
||||
"jt_max": 0.007498544175177813,
|
||||
"w_moved_mean": 0.020390696823596954,
|
||||
"w_moved_p95": 0.06874266266822815,
|
||||
"dom_changed": 0.02950507614213198
|
||||
}
|
||||
],
|
||||
"unseeded_vs_seeded": [
|
||||
{
|
||||
"jh_med": 0.0029595012310892344,
|
||||
"jh_max": 0.007351752370595932,
|
||||
"jt_max": 0.010119971819221973,
|
||||
"w_moved_mean": 0.022764530032873154,
|
||||
"w_moved_p95": 0.06456947326660156,
|
||||
"dom_changed": 0.030139593908629442
|
||||
}
|
||||
],
|
||||
"same_geometry": true
|
||||
},
|
||||
"villager": {
|
||||
"gpu_pipeline_s": [
|
||||
3.9700973057188094,
|
||||
3.9323174457531422,
|
||||
3.9949949418660253
|
||||
],
|
||||
"gpu_model_s": [
|
||||
1.6040664857719094,
|
||||
1.7117067980580032,
|
||||
1.6055225860327482
|
||||
],
|
||||
"apose_hint_s": [
|
||||
1.277365405112505,
|
||||
1.0884231911040843,
|
||||
1.2362516748253256
|
||||
],
|
||||
"cpu_pipeline_s": [
|
||||
114.40334213199094,
|
||||
116.87012534309179,
|
||||
118.42003130697412
|
||||
],
|
||||
"peak_reserved_mib": [
|
||||
2732.0,
|
||||
2712.0,
|
||||
2732.0,
|
||||
2732.0
|
||||
],
|
||||
"seeded_maxdiff": {
|
||||
"joints_head": 0.0,
|
||||
"joints_tail": 0.0,
|
||||
"weights": 0.0,
|
||||
"weights_effective": 0.0,
|
||||
"pose_to_rest": 0.0
|
||||
},
|
||||
"cpu_cpu": [
|
||||
{
|
||||
"jh_med": 0.0013478414621204138,
|
||||
"jh_max": 0.003135952167212963,
|
||||
"jt_max": 0.004719415679574013,
|
||||
"w_moved_mean": 0.015827687457203865,
|
||||
"w_moved_p95": 0.047268014401197433,
|
||||
"dom_changed": 0.0183884988298228
|
||||
},
|
||||
{
|
||||
"jh_med": 0.0016320310533046722,
|
||||
"jh_max": 0.004904848523437977,
|
||||
"jt_max": 0.0048230430111289024,
|
||||
"w_moved_mean": 0.014390517957508564,
|
||||
"w_moved_p95": 0.04615660756826401,
|
||||
"dom_changed": 0.01671681711802073
|
||||
},
|
||||
{
|
||||
"jh_med": 0.0015891867224127054,
|
||||
"jh_max": 0.0036788983270525932,
|
||||
"jt_max": 0.005405386444181204,
|
||||
"w_moved_mean": 0.01590096764266491,
|
||||
"w_moved_p95": 0.050222158432006836,
|
||||
"dom_changed": 0.0183884988298228
|
||||
}
|
||||
],
|
||||
"gpu_cpu": [
|
||||
{
|
||||
"jh_med": 0.001549383858218789,
|
||||
"jh_max": 0.002919533057138324,
|
||||
"jt_max": 0.007295706775039434,
|
||||
"w_moved_mean": 0.015061692334711552,
|
||||
"w_moved_p95": 0.04662124067544937,
|
||||
"dom_changed": 0.01805416248746239
|
||||
},
|
||||
{
|
||||
"jh_med": 0.0012639821507036686,
|
||||
"jh_max": 0.004058246500790119,
|
||||
"jt_max": 0.005211320705711842,
|
||||
"w_moved_mean": 0.016790034249424934,
|
||||
"w_moved_p95": 0.050929658114910126,
|
||||
"dom_changed": 0.01905717151454363
|
||||
},
|
||||
{
|
||||
"jh_med": 0.0015581324696540833,
|
||||
"jh_max": 0.0054196459241211414,
|
||||
"jt_max": 0.005114810075610876,
|
||||
"w_moved_mean": 0.01441498938947916,
|
||||
"w_moved_p95": 0.046087272465229034,
|
||||
"dom_changed": 0.014042126379137413
|
||||
}
|
||||
],
|
||||
"unseeded_vs_seeded": [
|
||||
{
|
||||
"jh_med": 0.0020237602293491364,
|
||||
"jh_max": 0.00419682078063488,
|
||||
"jt_max": 0.005229325499385595,
|
||||
"w_moved_mean": 0.015298573300242424,
|
||||
"w_moved_p95": 0.044845279306173325,
|
||||
"dom_changed": 0.01905717151454363
|
||||
}
|
||||
],
|
||||
"same_geometry": true
|
||||
},
|
||||
"captain": {
|
||||
"gpu_pipeline_s": [
|
||||
3.902754598064348,
|
||||
3.792409762972966,
|
||||
3.9422666197642684
|
||||
],
|
||||
"gpu_model_s": [
|
||||
1.637031597085297,
|
||||
1.6480189089197665,
|
||||
1.741625044029206
|
||||
],
|
||||
"apose_hint_s": [
|
||||
1.3538039769046009,
|
||||
1.244770233053714,
|
||||
1.139452091883868
|
||||
],
|
||||
"cpu_pipeline_s": [
|
||||
125.6441692209919,
|
||||
121.16770973894745,
|
||||
121.56508291099453
|
||||
],
|
||||
"peak_reserved_mib": [
|
||||
2732.0,
|
||||
2732.0,
|
||||
2712.0,
|
||||
2732.0
|
||||
],
|
||||
"seeded_maxdiff": {
|
||||
"joints_head": 0.0,
|
||||
"joints_tail": 0.0,
|
||||
"weights": 0.0,
|
||||
"weights_effective": 0.0,
|
||||
"pose_to_rest": 0.0
|
||||
},
|
||||
"cpu_cpu": [
|
||||
{
|
||||
"jh_med": 0.0017565949819982052,
|
||||
"jh_max": 0.00641083437949419,
|
||||
"jt_max": 0.0061119236052036285,
|
||||
"w_moved_mean": 0.01863820292055607,
|
||||
"w_moved_p95": 0.06350292265415192,
|
||||
"dom_changed": 0.021580102414045354
|
||||
},
|
||||
{
|
||||
"jh_med": 0.0020125731825828552,
|
||||
"jh_max": 0.003998186439275742,
|
||||
"jt_max": 0.006467505358159542,
|
||||
"w_moved_mean": 0.017755920067429543,
|
||||
"w_moved_p95": 0.05389416217803955,
|
||||
"dom_changed": 0.019385515727871252
|
||||
},
|
||||
{
|
||||
"jh_med": 0.0018191682174801826,
|
||||
"jh_max": 0.0042957765981554985,
|
||||
"jt_max": 0.0039120386354625225,
|
||||
"w_moved_mean": 0.02013971656560898,
|
||||
"w_moved_p95": 0.057384975254535675,
|
||||
"dom_changed": 0.019385515727871252
|
||||
}
|
||||
],
|
||||
"gpu_cpu": [
|
||||
{
|
||||
"jh_med": 0.001694112434051931,
|
||||
"jh_max": 0.0057935346849262714,
|
||||
"jt_max": 0.004407331347465515,
|
||||
"w_moved_mean": 0.01909082941710949,
|
||||
"w_moved_p95": 0.06022503599524498,
|
||||
"dom_changed": 0.016093635698610095
|
||||
},
|
||||
{
|
||||
"jh_med": 0.0016945323441177607,
|
||||
"jh_max": 0.005641191732138395,
|
||||
"jt_max": 0.006225286982953548,
|
||||
"w_moved_mean": 0.018217289820313454,
|
||||
"w_moved_p95": 0.0654626339673996,
|
||||
"dom_changed": 0.019019751280175568
|
||||
},
|
||||
{
|
||||
"jh_med": 0.0017832419835031033,
|
||||
"jh_max": 0.003895824309438467,
|
||||
"jt_max": 0.00681948009878397,
|
||||
"w_moved_mean": 0.018107891082763672,
|
||||
"w_moved_p95": 0.05214930698275566,
|
||||
"dom_changed": 0.023043160204828092
|
||||
}
|
||||
],
|
||||
"unseeded_vs_seeded": [
|
||||
{
|
||||
"jh_med": 0.001529946457594633,
|
||||
"jh_max": 0.003934196196496487,
|
||||
"jt_max": 0.005103697534650564,
|
||||
"w_moved_mean": 0.022645380347967148,
|
||||
"w_moved_p95": 0.07639797031879425,
|
||||
"dom_changed": 0.024140453547915143
|
||||
}
|
||||
],
|
||||
"same_geometry": true
|
||||
},
|
||||
"ogre": {
|
||||
"gpu_pipeline_s": [
|
||||
4.71703689894639,
|
||||
4.802805577637628,
|
||||
4.453627999639139
|
||||
],
|
||||
"gpu_model_s": [
|
||||
2.076565559953451,
|
||||
2.098935986869037,
|
||||
1.9066526568494737
|
||||
],
|
||||
"apose_hint_s": [
|
||||
1.3545660751406103,
|
||||
1.3703913709614426,
|
||||
1.3345670951530337
|
||||
],
|
||||
"cpu_pipeline_s": [
|
||||
123.53674800007138,
|
||||
124.70388515893137,
|
||||
336.82813009101665
|
||||
],
|
||||
"peak_reserved_mib": [
|
||||
2732.0,
|
||||
2732.0,
|
||||
2732.0,
|
||||
2732.0
|
||||
],
|
||||
"seeded_maxdiff": {
|
||||
"joints_head": 0.0,
|
||||
"joints_tail": 0.0,
|
||||
"weights": 0.0,
|
||||
"weights_effective": 0.0,
|
||||
"pose_to_rest": 0.0
|
||||
},
|
||||
"cpu_cpu": [
|
||||
{
|
||||
"jh_med": 0.002341177314519882,
|
||||
"jh_max": 0.004295716993510723,
|
||||
"jt_max": 0.010711956769227982,
|
||||
"w_moved_mean": 0.019047463312745094,
|
||||
"w_moved_p95": 0.05714641511440277,
|
||||
"dom_changed": 0.0243612596553773
|
||||
},
|
||||
{
|
||||
"jh_med": 0.0027327858842909336,
|
||||
"jh_max": 0.007534473203122616,
|
||||
"jt_max": 0.011530852876603603,
|
||||
"w_moved_mean": 0.021840794011950493,
|
||||
"w_moved_p95": 0.06544578820466995,
|
||||
"dom_changed": 0.024955436720142603
|
||||
},
|
||||
{
|
||||
"jh_med": 0.0020891886670142412,
|
||||
"jh_max": 0.007218110840767622,
|
||||
"jt_max": 0.007911363616585732,
|
||||
"w_moved_mean": 0.021831553429365158,
|
||||
"w_moved_p95": 0.06872576475143433,
|
||||
"dom_changed": 0.023767082590612002
|
||||
}
|
||||
],
|
||||
"gpu_cpu": [
|
||||
{
|
||||
"jh_med": 0.002296903170645237,
|
||||
"jh_max": 0.005948834586888552,
|
||||
"jt_max": 0.007127378601580858,
|
||||
"w_moved_mean": 0.023190144449472427,
|
||||
"w_moved_p95": 0.06846748292446136,
|
||||
"dom_changed": 0.029411764705882353
|
||||
},
|
||||
{
|
||||
"jh_med": 0.0035880799405276775,
|
||||
"jh_max": 0.0077993483282625675,
|
||||
"jt_max": 0.009203977882862091,
|
||||
"w_moved_mean": 0.02328675426542759,
|
||||
"w_moved_p95": 0.07298485934734344,
|
||||
"dom_changed": 0.030303030303030304
|
||||
},
|
||||
{
|
||||
"jh_med": 0.0032017994672060013,
|
||||
"jh_max": 0.006755590904504061,
|
||||
"jt_max": 0.008556965738534927,
|
||||
"w_moved_mean": 0.020125865936279297,
|
||||
"w_moved_p95": 0.05771474540233612,
|
||||
"dom_changed": 0.026737967914438502
|
||||
}
|
||||
],
|
||||
"unseeded_vs_seeded": [
|
||||
{
|
||||
"jh_med": 0.0030766851268708706,
|
||||
"jh_max": 0.01164184045046568,
|
||||
"jt_max": 0.013770738616585732,
|
||||
"w_moved_mean": 0.023339038714766502,
|
||||
"w_moved_p95": 0.06661652028560638,
|
||||
"dom_changed": 0.035056446821152706
|
||||
}
|
||||
],
|
||||
"same_geometry": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
"""MIA GPU acceptance analysis: timings (median of 3 seeded runs), determinism, and GPU-vs-CPU
|
||||
agreement measured with dread-dev's noise_floor.py metrics against the CPU run-to-run floor."""
|
||||
import itertools, json, statistics as st, sys, numpy as np
|
||||
A, C = sys.argv[1], sys.argv[2]
|
||||
MESHES = ["goblin", "villager", "captain", "ogre"]
|
||||
|
||||
def load(p):
|
||||
d = np.load(p)
|
||||
if "weights_effective" not in d:
|
||||
raise SystemExit(f"{p}: no weights_effective")
|
||||
return d
|
||||
|
||||
def metrics(Ar, Br):
|
||||
H = float(np.ptp(Ar["verts"][:, 1]))
|
||||
dj = np.linalg.norm(Ar["joints_head"] - Br["joints_head"], axis=1) / H
|
||||
dt = np.linalg.norm(Ar["joints_tail"] - Br["joints_tail"], axis=1) / H
|
||||
WA, WB = Ar["weights_effective"], Br["weights_effective"]
|
||||
moved = 0.5 * np.abs(WA - WB).sum(1)
|
||||
return dict(jh_med=float(np.median(dj)), jh_max=float(dj.max()), jt_max=float(dt.max()),
|
||||
w_moved_mean=float(moved.mean()), w_moved_p95=float(np.percentile(moved, 95)),
|
||||
dom_changed=float((WA.argmax(1) != WB.argmax(1)).mean()))
|
||||
|
||||
def rng(ms, k):
|
||||
v = [m[k] for m in ms]
|
||||
return f"{min(v):.4f}..{max(v):.4f}"
|
||||
|
||||
KEYS = ["jh_med", "jh_max", "jt_max", "w_moved_mean", "w_moved_p95", "dom_changed"]
|
||||
out = {}
|
||||
for n in MESHES:
|
||||
g = {r: load(f"{A}/{r}/out/{n}_pred.npz") for r in ("r1", "r2", "r3", "u1")}
|
||||
c = [load(f"{C}/{n}_pred.npz"), load(f"{C}/repeats/{n}_rep2_pred.npz"), load(f"{C}/repeats/{n}_rep3_pred.npz")]
|
||||
runs = {r: json.load(open(f"{A}/{r}/out/{n}_run.json")) for r in ("r1", "r2", "r3", "u1")}
|
||||
same_geom = all(np.array_equal(g["r1"]["verts"], x["verts"]) and np.array_equal(g["r1"]["faces"], x["faces"]) for x in c)
|
||||
# determinism across the 3 seeded runs (different mesh orders): exact?
|
||||
det = {k: max(float(np.abs(g["r1"][k] - g[r][k]).max()) for r in ("r2", "r3"))
|
||||
for k in ("joints_head", "joints_tail", "weights", "weights_effective", "pose_to_rest")}
|
||||
cpu_cpu = [metrics(a, b) for a, b in itertools.combinations(c, 2)] # the CPU noise floor (null)
|
||||
gpu_cpu = [metrics(g["r1"], x) for x in c] # the claim under test
|
||||
unseeded = [metrics(g["u1"], g[r]) for r in ("r1",)] # positive control: must move
|
||||
t = [runs[r]["pipeline_total_wall_s"] for r in ("r1", "r2", "r3")]
|
||||
tm = [runs[r]["model_total_wall_s"] for r in ("r1", "r2", "r3")]
|
||||
ta = [runs[r]["timings"]["vis_blender_apose_hint"]["wall_s"] for r in ("r1", "r2", "r3")]
|
||||
pk = [runs[r]["gpu_peak_reserved_mib"] for r in ("r1", "r2", "r3", "u1")]
|
||||
cpu_t = [json.load(open(p))["pipeline_total_wall_s"] for p in (f"{C}/{n}_run.json", f"{C}/repeats/{n}_rep2_run.json", f"{C}/repeats/{n}_rep3_run.json")]
|
||||
print(f"\n== {n}: verts {runs['r1']['n_verts']}, same geometry as CPU: {same_geom}")
|
||||
print(f" GPU pipeline s: {[round(x,2) for x in t]} median {st.median(t):.2f} | model part median {st.median(tm):.2f} | A-pose-hint export median {st.median(ta):.2f} | CPU pipeline median {st.median(cpu_t):.1f}")
|
||||
print(f" peak torch reserved MiB: {pk}")
|
||||
print(f" seeded r1/r2/r3 max abs diff: " + ", ".join(f"{k} {v:.2e}" for k, v in det.items()))
|
||||
for k in KEYS:
|
||||
print(f" {k:13s} CPU-vs-CPU {rng(cpu_cpu,k)} | GPU-vs-CPU {rng(gpu_cpu,k)} | unseeded-vs-seeded GPU {rng(unseeded,k)}")
|
||||
out[n] = dict(gpu_pipeline_s=t, gpu_model_s=tm, apose_hint_s=ta, cpu_pipeline_s=cpu_t, peak_reserved_mib=pk,
|
||||
seeded_maxdiff=det, cpu_cpu=cpu_cpu, gpu_cpu=gpu_cpu, unseeded_vs_seeded=unseeded, same_geometry=same_geom)
|
||||
init = [json.load(open(f"{A}/{r}/out/goblin_run.json"))["init_wall_s"] for r in ("r1", "r2", "r3", "u1")]
|
||||
print("\nmodel load (init) s per container:", [round(x, 1) for x in init])
|
||||
json.dump(out, open(f"{A}/acceptance.json", "w"), indent=1)
|
||||
Executable
+17
@@ -0,0 +1,17 @@
|
||||
#!/usr/bin/env bash
|
||||
# MIA GPU acceptance: 3 seeded runs (mesh order rotated) + 1 unseeded run, GPU 3 memory polled throughout.
|
||||
set -uo pipefail
|
||||
# Run from a scratch dir holding r1/ r2/ r3/ u1/, each with in/{goblin,villager,captain,ogre}.glb;
|
||||
# then: python3 compare.py <that dir> <dread-dev CPU out/ dir>.
|
||||
A=$(dirname "$(realpath "$0")")
|
||||
cd ~/development/eshpfi-management
|
||||
H=infra-ops@10.251.50.54
|
||||
POLLPID=$(ssh -n $H 'nohup nvidia-smi -i 3 --query-gpu=timestamp,memory.used --format=csv,noheader,nounits -lms 100 > /tank/mia/vram-accept.csv 2>/dev/null & echo $!')
|
||||
echo "poller pid $POLLPID"
|
||||
run() { local r=$1; shift; scripts/mia-run --job "$A/$r" "$@" > "$A/$r.log" 2>&1; local rc=$?; echo "$r rc=$rc"; }
|
||||
run r1 -- goblin=in/goblin.glb villager=in/villager.glb captain=in/captain.glb ogre=in/ogre.glb
|
||||
run r2 -- villager=in/villager.glb captain=in/captain.glb ogre=in/ogre.glb goblin=in/goblin.glb
|
||||
run r3 -- captain=in/captain.glb ogre=in/ogre.glb goblin=in/goblin.glb villager=in/villager.glb
|
||||
run u1 --unseeded -- goblin=in/goblin.glb villager=in/villager.glb captain=in/captain.glb ogre=in/ogre.glb
|
||||
ssh -n $H "kill $POLLPID"
|
||||
rsync -a $H:/tank/mia/vram-accept.csv "$A/"
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user