docs: MotionBricks fit survey (verdict: optional tier) #1
1 changed files with 250 additions and 0 deletions
250
docs/notes/motionbricks-fit.md
Normal file
250
docs/notes/motionbricks-fit.md
Normal file
|
|
@ -0,0 +1,250 @@
|
|||
# MotionBricks fit survey
|
||||
|
||||
Question: can NVIDIA MotionBricks (arXiv 2604.24833, `NVlabs/motionbricks`,
|
||||
Hugging Face weights) serve as an intent layer for Lodur: characters with
|
||||
nervous systems on Ymir, headless, state read as a structure-of-arrays view?
|
||||
|
||||
Sources were read on 2026-11-06 at `NVlabs/motionbricks` commit `54fc563`
|
||||
(2026-10-23) unless stated. This is a survey; nothing was run. Items not
|
||||
established are listed in the last section.
|
||||
|
||||
## Verdict
|
||||
|
||||
**Optional tier, off by default, never core.** Keep the licence question out of
|
||||
the repo (weights are fetched by the user, not committed). Do not adopt now.
|
||||
|
||||
- The licence is not the blocker. The NVIDIA Open Model Agreement carries no
|
||||
field-of-use limit and no no-training clause (quoted below). One clause
|
||||
(indemnity) needs a human to rule on it against the always-open-source rule.
|
||||
- The runtime is the blocker. The shipped runtime is Python plus TensorRT and
|
||||
needs an NVIDIA GPU. Lodur's core is engine-free C# with a headless,
|
||||
deterministic Ymir world. A CPU ONNX path is documented only as an example
|
||||
snippet; its speed and determinism are unmeasured.
|
||||
- The output is a kinematic pose stream on a fixed human skeleton. It does not
|
||||
claim to be physically feasible, which is the right shape for a *target*, and
|
||||
the wrong shape for a body.
|
||||
|
||||
Revisit when (a) a CPU ONNX run of the SOMA model is measured, and (b) Lodur has
|
||||
a body with a humanoid rig to track poses at all (Ymir's SoA world has spheres
|
||||
and static boxes only today).
|
||||
|
||||
## 1. Licences
|
||||
|
||||
| Part | Licence | Source |
|
||||
|---|---|---|
|
||||
| Code | Apache-2.0 | README "License" |
|
||||
| Docs and media | CC-BY-4.0 | README "License" |
|
||||
| Models (SOMA and G1 checkpoints, bundled ONNX) | NVIDIA Open Model Agreement (v. March 9, 2026; release date April 2, 2026) | README; `motionbricks/assets/onnx/LICENSE.md`; SOMA model card |
|
||||
| Sample BVH/CSV motions | NVIDIA Sample Data Evaluation License | `assets/motions/LICENSE.txt` |
|
||||
| Python runtime's TensorRT wheels | NVIDIA TensorRT Software License Agreement (proprietary, distributed with the packages) | README "License" |
|
||||
|
||||
Agreement text: <https://www.nvidia.com/en-us/agreements/enterprise-software/nvidia-open-model-agreement/>.
|
||||
Section numbers did not survive the page; clauses are cited by heading.
|
||||
|
||||
### Open Model Agreement, against the questions asked
|
||||
|
||||
- **Field of use.** None. The preamble: "Works are commercially usable. You are
|
||||
free to create and distribute Derivative Works. NVIDIA does not claim
|
||||
ownership to any outputs generated using the Works or Derivative Works."
|
||||
No clause restricts a domain or use case.
|
||||
- **Training on outputs or on the model.** No clause restricts it. The only
|
||||
termination trigger is: "If You institute patent or copyright litigation
|
||||
against any entity ... alleging that the Work or an output from the Work
|
||||
constitutes direct or contributory patent or copyright infringement, then any
|
||||
licenses granted to You under this License for that Work shall terminate."
|
||||
- **Grant.** "a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
|
||||
irrevocable license to reproduce, prepare Derivative Works of, publicly
|
||||
display, publicly perform, sublicense, and distribute the Work and such
|
||||
Derivative Works in source or object form." (Irrevocable, subject to the
|
||||
litigation clause above.)
|
||||
- **Derivatives.** "Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of, the
|
||||
Work." Lodur calling the model through ONNX is therefore not a Derivative
|
||||
Work of it. Fine-tuned or re-exported weights would be.
|
||||
- **Redistribution.** Allowed "with or without modifications, in source or
|
||||
object form" on three conditions: give recipients a copy of the licence;
|
||||
retain copyright, patent, trademark and attribution notices in the source
|
||||
form of distributed Derivative Works; and, "If the Work includes a 'NOTICE'
|
||||
text file", Derivative Works must carry "Licensed by NVIDIA Corporation under
|
||||
the NVIDIA Open Model Agreement." (The repo has no `NOTICE` file at this
|
||||
commit, so the attribution clause has nothing to trigger on in the code
|
||||
repo; the Hugging Face checkpoint repos were not checked.) You may add
|
||||
"additional or different license terms" to your own modifications.
|
||||
- **Other terms.** Trademarks not granted. As-is warranty and liability
|
||||
disclaimers. Delaware law, Santa Clara County courts. Export and sanctions
|
||||
compliance.
|
||||
- **Indemnity (the clause to rule on).** Under "Accepting Warranty or
|
||||
Additional Liability": "You will indemnify and hold harmless NVIDIA from and
|
||||
against any claim by any third party arising out of or related to your use or
|
||||
distribution of the Works, Derivative Works thereof, or output from the Works
|
||||
or Derivative Works." It sits in a section about offering warranties, but the
|
||||
sentence is not limited to that case on its face. OSI-approved licences do not
|
||||
carry an unconditional user indemnity. Whether that counts against "always
|
||||
open source" is a legal and operator call, not an engineering one.
|
||||
|
||||
### Fit with GameCult's always-open-source rule
|
||||
|
||||
- Code (Apache-2.0): compatible.
|
||||
- Weights: permissive, redistributable and sublicensable, no field-of-use
|
||||
limit. This is not an OSI licence and the indemnity sentence is unusual, so
|
||||
"compatible" is not established until someone rules on it.
|
||||
- Cleanest posture, if ever adopted: Lodur's repo contains no weights. The
|
||||
tier is a documented optional download that the user fetches themselves
|
||||
under NVIDIA's terms. Lodur's own code stays open and separable (the
|
||||
Derivative Works carve-out above). Do not commit the sample motions: they
|
||||
are internal evaluation only and may not be redistributed.
|
||||
- Not a lawyer's reading. Nothing here is legal advice.
|
||||
|
||||
## 2. Training data
|
||||
|
||||
- Trained on Bones RigPlay 1 (RP1): 313,526 clips selected from about 350,000
|
||||
clips / 700 hours, a 4,881-clip validation subset disjoint from training
|
||||
(SOMA model card, "Training Dataset", "Testing Dataset").
|
||||
- Captured by Bones in a studio ("Automatic/Sensors"), processed by NVIDIA into
|
||||
the 30-joint SOMA skeleton at 30 Hz. The corpus is not distributed with the
|
||||
model: "Access to the dataset is governed separately from the model weights."
|
||||
- Bones' own page (<https://bones.studio/datasets>) describes RP01 as
|
||||
"Enterprise-grade · IP-clean · Ready to license" and "full IP clearance",
|
||||
optical Vicon mocap at 120 fps, 170+ performers. That is a commercial
|
||||
product. **No public RP1 licence text was found**, so the terms binding
|
||||
NVIDIA's weights to RP1 are unread.
|
||||
- The separate BONES-SEED dataset (HF `bones-studio/seed`, gated, licence at
|
||||
<https://bones.studio/info/seed-license>) is a different licence from RP1 and
|
||||
is not what the weights were trained on, so it does not bind Lodur. It
|
||||
matters only if Lodur wanted to fine-tune on it: SEED is restricted to
|
||||
"Academic User" or "Qualifying Startup" (under $1,000,000 gross revenue),
|
||||
forbids public mirrors, and forbids using it "to train, fine-tune, or
|
||||
condition any generative model whose primary purpose ... is to generate
|
||||
motion capture data", which excludes fine-tuning MotionBricks on it. (Models
|
||||
that "consume the Dataset ... and produce non-data outputs", such as
|
||||
control policies, are expressly allowed.) Closed data, so it fails the
|
||||
open-source rule for anything Lodur ships.
|
||||
- The model's outputs are motion, not recordings; the model card says nothing
|
||||
on whether generated motion can reproduce training clips. Unverified.
|
||||
|
||||
## 3. Runtime
|
||||
|
||||
- **Official runtime**: Python on NVIDIA Warp, Newton (viewer and scene) and
|
||||
TensorRT. README: "The runtime uses TensorRT, which requires an NVIDIA GPU."
|
||||
Tested on Windows and Linux x86-64 with an RTX 4090 only. `runtime_api.md`:
|
||||
"Engines need a CUDA device." The first launch of each model builds a
|
||||
TensorRT plan, which takes minutes, cached in `.trt-cache/`.
|
||||
- **Headless**: `runtime_api.md` ships "two short scripts in `examples` that
|
||||
call the library without a viewer or the apps". Headless in the sense of
|
||||
no window: yes by the doc. Headless in the sense of no GPU: no.
|
||||
- **Model**: SOMA is about 200M parameters (VQ-VAE 23.4M, pose predictor
|
||||
136.5M, root predictor 40.4M), ONNX opset 17, FP32 and mixed FP16 files,
|
||||
variable batch N. Interface (`onnx_inference.md`): inputs `global_root_values`
|
||||
[N,8,5], `local_root_values` [N,8,4], `local_poses` [N,8,267], three int32
|
||||
masks [N,8] and `allowed_pred_num_tokens` [N,11]; outputs
|
||||
`pred_global_motions` [N,64,366] and `pred_num_tokens` [N]. Files use Git LFS.
|
||||
- **Latency** (`onnx_inference.md`, TensorRT plan alone, RTX 4090, Windows,
|
||||
inputs already on the GPU): SOMA FP32 2.50 ms at N=1 and 5.28 ms at N=32
|
||||
(6,063 requests/s); mixed FP16 1.28 ms at N=1 and 3.93 ms at N=32. Input
|
||||
preparation, decoding and endpoint correction are excluded. The 15,000 FPS /
|
||||
2 ms figures in the paper abstract are consistent with this. Starfire's GTX
|
||||
1070 (8 GB, shared) has no tensor-core FP16 path and is untested.
|
||||
- **CPU path**: `onnx_inference.md` shows an `onnxruntime` session with
|
||||
`providers=["CPUExecutionProvider"]`, but the example loads the G1 model, not
|
||||
SOMA. The SOMA card says "A CPU-versus-GPU inference comparison is not
|
||||
provided." CPU speed for a 200M-parameter model is unmeasured here.
|
||||
- **ONNX leaves work undone**: the ONNX output "includes the boundary frames
|
||||
and has no endpoint correction. The SOMA and G1 engines remove the boundary
|
||||
frames and apply endpoint correction." The SOMA engine also decodes the
|
||||
foot contacts packed in the output, and finds the model's 30 joints from the
|
||||
input rig. A C# consumer would reimplement all of that against Python
|
||||
reference code. Real cost, not estimated.
|
||||
- **Determinism**: not documented. The card warns "Mixed FP16 and FP32 can
|
||||
produce different motion ... Differences can accumulate when generated
|
||||
motion is fed back." Ymir's own stance is byte-equal lanes on the same
|
||||
build, not across CPUs. A model whose output differs across precision and
|
||||
backend, and which is fed its own output, cannot be replayed from a
|
||||
command stream unless its outputs are recorded. Whether the graph itself is
|
||||
free of sampling randomness is unverified.
|
||||
- **Platforms**: Windows and Linux x86-64 only; no macOS or ARM claim.
|
||||
|
||||
## 4. Pose format and skeleton
|
||||
|
||||
SOMA card ("Model Space", "Inference"):
|
||||
|
||||
- 30-joint SOMA skeleton, 30 Hz, Y-up, metres. One output frame is 366 floats:
|
||||
root position and heading (5), joint positions (87), 6D rotations (180),
|
||||
joint velocities (90), foot contacts (4). 6D means the first two columns of
|
||||
a rotation matrix.
|
||||
- One generation returns 18 to 58 valid frames (the ONNX tensor carries 24 to
|
||||
64 raw frames, between boundary frames), conditioned on 4 context poses and
|
||||
1 to 4 target poses; generations chain by feeding the last four poses back.
|
||||
Conditioning is poses and constraints only: no text, no scene geometry.
|
||||
- The skeleton is fixed. Another rig needs retargeting (a SOMA Retargeter
|
||||
exists; not read).
|
||||
- Stated limit, verbatim from the card: "Kinematic motion generation does not
|
||||
establish dynamic feasibility, physical robot tracking, collision avoidance,
|
||||
or safe contact. Physical execution requires a separate controller." And:
|
||||
"Evaluate generated motion in the intended application. Physical execution
|
||||
requires a separate tracking and safety system."
|
||||
|
||||
## 5. How a tracker over Ymir's SoA world would follow it
|
||||
|
||||
Today (`Ymir/docs/soa-world.md`): headless Box3D world, lanes for stable id,
|
||||
kind, position, rotation, linear and angular velocity, spheres and static boxes
|
||||
only. Its own "needed next" list is joints, capsule/box bodies, a torque write
|
||||
path, joint state lanes and contact facts. Lodur's `body-one-interface` says the
|
||||
body consumes only targets and per-muscle strength.
|
||||
|
||||
Reading, not tested:
|
||||
|
||||
1. A MotionBricks tier would sit under *behaviour*. Behaviour picks a target
|
||||
pose set (a few SOMA poses placed ahead of the character) plus per-muscle
|
||||
strength; the model fills the in-between frames at 30 Hz.
|
||||
2. The body maps SOMA joint rotations (6D to quaternion) onto the Ymir
|
||||
ragdoll's joints, retargeted if the ragdoll is not the SOMA 30-joint rig,
|
||||
and drives each joint's PD or motor target toward the frame for the current
|
||||
tick. Strength scales the torque limit. A limb with strength loss lags or
|
||||
misses the target; that is the "motor system that may fail".
|
||||
3. The measured ragdoll state (the SoA lanes plus joint state) feeds back as
|
||||
perception, and, once the character is no longer on the kinematic path (fall,
|
||||
impairment), the context poses for the next generation come from the *real*
|
||||
body, not the previous output (the runtime's `MotionRecorder` / history
|
||||
already takes context from "the last four played frames"). A body that is
|
||||
on the floor is out of distribution for a model trained on upright studio
|
||||
mocap; expect garbage targets then and fall back to Lodur's own ground
|
||||
behaviours (design target: v1 ships those).
|
||||
4. The model runs per character, not per physics tick: 30 Hz targets,
|
||||
one generation per 18 to 58 frames. It is intent, below the nervous system
|
||||
and above the tracker; reflexes overlay it and never wait for it.
|
||||
|
||||
Missing for this to run at all: a jointed humanoid in Ymir's SoA world, a
|
||||
joint motor write path, and a SOMA-to-ragdoll rig mapping. All three are Ymir
|
||||
or Lodur work that exists whether or not MotionBricks is used.
|
||||
|
||||
## 6. Fit
|
||||
|
||||
- Fit: target poses for a motor system that may fail. Kinematic, human-only,
|
||||
upright-trained, poses in and poses out. Not a replacement for the physical
|
||||
body, and the card says as much.
|
||||
- Competing options already in the design target: Lodur's own
|
||||
behaviours emit targets directly (crawl, writhe); a small learned tracker
|
||||
(DReCon scale) is v2. MotionBricks is the only one that supplies natural
|
||||
locomotion and transitions between authored pose targets, and it is the
|
||||
heaviest by orders of magnitude.
|
||||
- Lodur's characters are meant to be hurt, not graceful. Whether upright
|
||||
mocap-derived targets help the interesting 20 seconds (crawl, shock, pass
|
||||
out) is doubtful. They would help locomotion before injury.
|
||||
|
||||
## Unverified
|
||||
|
||||
- Whether the Open Model Agreement's indemnity sentence is acceptable under
|
||||
GameCult's open-source rule (needs a ruling, and likely a lawyer).
|
||||
- RP1 licence text and what it says, if anything, about models trained on it.
|
||||
- Whether the Hugging Face checkpoint repos ship a `NOTICE` file (none in the
|
||||
GitHub repo at `54fc563`), which would trigger the attribution clause.
|
||||
- SOMA ONNX on CPU: speed, memory, and agreement with TensorRT output.
|
||||
- Bit determinism of one backend across runs; any sampling randomness inside
|
||||
the graph.
|
||||
- Behaviour on a GTX 1070 (no tensor-core FP16) and under GPU sharing.
|
||||
- Quality of targets when the body is off the training distribution (prone,
|
||||
one-legged).
|
||||
- SOMA Retargeter licence and fit for Lodur's rig; Lodur has no rig yet.
|
||||
- Effort to port boundary-frame trimming, endpoint correction and foot-contact
|
||||
decoding to C#.
|
||||
- The paper (arXiv 2604.24833) was read at abstract level only.
|
||||
Loading…
Reference in a new issue