Run InternVLA synthetic policy with Radeon Cosmos handoff

This commit is contained in:
tzhouam committed 2026-09-24 01:12:27 +08:00
1 parent b796c787ec
commit 9df5ac8836
21 files changed
+2020 -16

No files matched your search

@@ -0,0 +1,93 @@
#!/usr/bin/env python3
"""Export the unchanged InternVLA Cosmos encoder as a fixed-shape graph."""
from __future__ import annotations
import argparse
import hashlib
import importlib.util
import json
import sys
import time
import types
from pathlib import Path
def sha256(path: Path) -> str:
digest = hashlib.sha256()
with path.open("rb") as source:
for block in iter(lambda: source.read(8 << 20), b""):
digest.update(block)
return digest.hexdigest()
def main() -> None:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--encoder", type=Path, required=True)
parser.add_argument("--output", type=Path, required=True)
parser.add_argument("--report", type=Path, required=True)
parser.add_argument("--batch-size", type=int, default=6)
args = parser.parse_args()
import torch
source_dir = Path(__file__).resolve().parents[3] / "vllm_omni" / "diffusion" / "models" / "internvla_a1"
package = types.ModuleType("internvla_cosmos_export")
package.__path__ = [str(source_dir)]
sys.modules[package.__name__] = package
spec = importlib.util.spec_from_file_location(f"{package.__name__}.model_cosmos", source_dir / "model_cosmos.py")
if spec is None or spec.loader is None:
raise RuntimeError("cannot load pinned Cosmos source")
module = importlib.util.module_from_spec(spec)
sys.modules[spec.name] = module
spec.loader.exec_module(module)
encoder_path = args.encoder.resolve(strict=True)
encoder_model = module.load_cosmos_component(encoder_path, component="encoder", device="cpu")
class LatentOnly(torch.nn.Module):
def __init__(self, inner: torch.nn.Module) -> None:
super().__init__()
self.inner = inner
def forward(self, pixels: torch.Tensor) -> torch.Tensor:
result = self.inner(pixels)
return result if isinstance(result, torch.Tensor) else result[0]
model = LatentOnly(encoder_model).eval()
image = torch.linspace(-1, 1, args.batch_size * 3 * 256 * 256, dtype=torch.float32).view(
args.batch_size, 3, 256, 256
)
started = time.perf_counter()
with torch.no_grad():
reference = model(image)
exported = torch.export.export(model, (image,), strict=False)
actual = exported.module()(image)
export_s = time.perf_counter() - started
reference_tensor = reference
actual_tensor = actual
if not torch.allclose(reference_tensor, actual_tensor, atol=1e-5, rtol=1e-5):
raise RuntimeError("exported CPU graph does not match source module")
args.output.parent.mkdir(parents=True, exist_ok=True)
torch.export.save(exported, args.output)
report = {
"status": "passed",
"scope": "fixed-shape Cosmos CI8x8 encoder graph; no InternVLA action-policy claim",
"encoder_sha256": sha256(encoder_path),
"source_sha256": {name: sha256(source_dir / name) for name in ("model_cosmos.py", "cosmos_ci_torch.py")},
"torch": torch.__version__,
"input_shape": list(image.shape),
"input_dtype": str(image.dtype),
"output_shape": list(reference_tensor.shape),
"max_abs_export_error": float((reference_tensor - actual_tensor).abs().max()),
"export_s": export_s,
"artifact_sha256": sha256(args.output),
"artifact_bytes": args.output.stat().st_size,
"artifact_path": str(args.output.resolve()),
}
args.report.parent.mkdir(parents=True, exist_ok=True)
args.report.write_text(json.dumps(report, indent=2) + "\n", encoding="utf-8")
print(json.dumps(report, indent=2))
if __name__ == "__main__":
main()
@@ -54,11 +54,13 @@ def main() -> None:
parser.add_argument("--encoder", type=Path, required=True)
parser.add_argument("--output", type=Path, required=True)
parser.add_argument("--dml-index", type=int, default=1)
parser.add_argument("--batch-size", type=int, default=1)
parser.add_argument("--model-dtype", choices=("float32", "bfloat16"), default="float32")
parser.add_argument("--warmups", type=int, default=1)
parser.add_argument("--repeats", type=int, default=20)
args = parser.parse_args()
if args.warmups < 0 or args.repeats < 1:
parser.error("invalid warmup or measured count")
if args.warmups < 0 or args.repeats < 1 or args.batch_size < 1:
parser.error("invalid batch size, warmup or measured count")
import numpy as np
import psutil
@@ -83,8 +85,8 @@ def main() -> None:
"device_name": device_name,
"torch": torch.__version__,
"torch_directml": __import__("importlib.metadata", fromlist=["version"]).version("torch-directml"),
"input_shape": [1, 3, 256, 256],
"input_dtype": "float32",
"input_shape": [args.batch_size, 3, 256, 256],
"input_dtype": args.model_dtype,
"warmups": args.warmups,
"repeats": args.repeats,
}
@@ -94,9 +96,12 @@ def main() -> None:
image[:, 0, 48:208, 48:208] = 1
image[:, 1, 48:208, 48:208] = -1
image[:, 2, :, :] = torch.linspace(-1, 1, 256)[None, None, :]
image = image.repeat(args.batch_size, 1, 1, 1)
model_dtype = getattr(torch, args.model_dtype)
image = image.to(model_dtype)
started = time.perf_counter()
cpu_model = source.load_cosmos_component(encoder, component="encoder", device="cpu")
cpu_model = source.load_cosmos_component(encoder, component="encoder", device="cpu").to(model_dtype)
report["cpu_load_s"] = time.perf_counter() - started
with safe_open(str(encoder), framework="pt", device="cpu") as checkpoint:
checkpoint_keys = set(checkpoint.keys())
@@ -125,7 +130,7 @@ def main() -> None:
set(report["checkpoint_unexpected_keys"]) != set(checkpoint_buffers)):
raise RuntimeError("Cosmos encoder checkpoint/state keys do not match")
started = time.perf_counter()
dml_model = source.load_cosmos_component(encoder, component="encoder", device="cpu").to(dml)
dml_model = source.load_cosmos_component(encoder, component="encoder", device="cpu").to(dtype=model_dtype, device=dml)
report["dml_load_and_transfer_s"] = time.perf_counter() - started
if {parameter.device.type for parameter in cpu_model.parameters()} != {"cpu"}:
raise RuntimeError("CPU reference encoder placement differs")
@@ -0,0 +1,225 @@
#!/usr/bin/env python3
"""Compare complete InternVLA actions on CPU with a Radeon Cosmos handoff.
The policy and action sampler remain on CPU. Only its Cosmos encoder is
replaced by Omni's existing external torch-DirectML graph worker. The test
uses synthetic observations and does not establish robot-task quality.
"""
from __future__ import annotations
import argparse
import hashlib
import json
import math
import os
import time
import traceback
from pathlib import Path
def sha256(path: Path) -> str:
digest = hashlib.sha256()
with path.open("rb") as source:
for block in iter(lambda: source.read(8 << 20), b""):
digest.update(block)
return digest.hexdigest()
def rank(values: list[float], fraction: float) -> float:
return sorted(values)[math.ceil(len(values) * fraction) - 1]
def main() -> None:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--model-dir", type=Path, required=True)
parser.add_argument("--cosmos-dir", type=Path, required=True)
parser.add_argument("--processor-dir", type=Path, required=True)
parser.add_argument("--graph", type=Path, required=True)
parser.add_argument("--export-report", type=Path, required=True)
parser.add_argument("--output", type=Path, required=True)
parser.add_argument("--warmups", type=int, default=1)
parser.add_argument("--repeats", type=int, default=20)
args = parser.parse_args()
if args.warmups < 0 or args.repeats < 1:
parser.error("warmups must be nonnegative and repeats must be positive")
os.environ["INTERNVLA_A1_COSMOS_DIR"] = str(args.cosmos_dir.resolve(strict=True))
os.environ["INTERNVLA_A1_PROCESSOR_DIR"] = str(args.processor_dir.resolve(strict=True))
os.environ["HF_HUB_OFFLINE"] = "1"
import numpy as np
import psutil
import torch
from vllm_omni.diffusion.data import OmniDiffusionConfig
from vllm_omni.diffusion.registry import initialize_model
from vllm_omni.diffusion.request import OmniDiffusionRequest
from vllm_omni.diffusion.worker.request_batch import DiffusionRequestBatch
from vllm_omni.edge.local.external.client import ExternalWorker
from vllm_omni.edge.local.external.launch import ROUTE_TORCH_DML, resolve
from vllm_omni.inputs.data import OmniDiffusionSamplingParams
graph = args.graph.resolve(strict=True)
export_report = json.loads(args.export_report.read_text(encoding="utf-8"))
if export_report["artifact_sha256"] != sha256(graph):
raise RuntimeError("exported graph hash differs from the pinned manifest")
if export_report["input_shape"] != [6, 3, 256, 256] or export_report["input_dtype"] != "torch.float32":
raise RuntimeError("wrong Cosmos export shape or precision")
model_dir = args.model_dir.resolve(strict=True)
checkpoint = model_dir / "model.safetensors"
if not checkpoint.is_file():
raise FileNotFoundError(checkpoint)
report = {
"scope": "InternVLA real Place_Markpen checkpoint, synthetic zero camera/state observations and zero diffusion noise; CPU BF16 policy with FP32 Radeon Cosmos encoder; no robot-task quality claim",
"model_checkpoint_sha256": sha256(checkpoint),
"graph_sha256": export_report["artifact_sha256"],
"graph_export": export_report,
"policy_torch": torch.__version__,
"warmups": args.warmups,
"repeats": args.repeats,
"status": "running",
}
worker = None
try:
config = OmniDiffusionConfig(
model=str(model_dir),
model_class_name="InternVLAA1Pipeline",
dtype=torch.bfloat16,
custom_pipeline_args={
"device": "cpu", "dtype": "bfloat16", "compile_model": False,
"enable_regional_compile": False, "enable_warmup": False,
"strict_load": True, "processor_model_name": str(args.processor_dir.resolve()),
},
)
started = time.perf_counter()
pipeline = initialize_model(config)
report["policy_load_s"] = time.perf_counter() - started
if pipeline.runtime_mode() != "real_checkpoint_loaded":
raise RuntimeError(f"unexpected policy mode: {pipeline.runtime_mode()}")
if {p.device.type for p in pipeline.policy.parameters()} != {"cpu"}:
raise RuntimeError("policy did not load wholly on CPU")
report["policy_parameters_device"] = "cpu"
inputs = pipeline._build_fake_batch_inputs()
noise = torch.zeros((1, pipeline.config.chunk_size, pipeline.config.max_action_dim), dtype=torch.float32)
route = resolve(ROUTE_TORCH_DML)
if not route.available:
raise RuntimeError(f"DirectML route unavailable: {route.reason}")
worker = ExternalWorker(route)
started = time.perf_counter()
hello = worker.start()
load_report = worker.load(graph, example_inputs={"pixels": np.zeros((6, 3, 256, 256), dtype=np.float32)})
report["worker_start_and_graph_load_s"] = time.perf_counter() - started
report["worker_hello"] = {key: hello.get(key) for key in ("torch", "torch_directml", "available_providers", "executable")}
report["worker_load"] = load_report.to_dict()
if (load_report.device_name != "AMD Radeon(TM) 890M Graphics" or
load_report.fraction_on_target != 1.0 or
load_report.outputs[0]["shape"] != [6, 16, 32, 32]):
raise RuntimeError("Radeon placement or output shape not verified")
class ExternalCosmosEncoder(torch.nn.Module):
def __init__(self):
super().__init__()
self.calls = 0
self.timings = []
def forward(self, pixels: torch.Tensor) -> torch.Tensor:
if pixels.device.type != "cpu" or tuple(pixels.shape) != (6, 3, 256, 256):
raise RuntimeError(f"unexpected encoder input: {pixels.device}, {tuple(pixels.shape)}")
# DirectML BF16 aborts this runtime; the FP32 graph is an
# explicit artifact change, then latents return as policy BF16.
array = pixels.detach().float().contiguous().numpy()
output, timing = worker.run({"pixels": array})
self.calls += 1
self.timings.append(timing.to_dict())
latent = output["out_0"]
if latent.shape != (6, 16, 32, 32) or not np.isfinite(latent).all():
raise RuntimeError("bad DirectML Cosmos latent")
return torch.from_numpy(latent).to(pixels.dtype)
external_encoder = ExternalCosmosEncoder()
cosmos = pipeline.policy.model.cosmos
cpu_encoder = cosmos._enc_model
def actions(encoder: torch.nn.Module) -> np.ndarray:
cosmos._enc_model = encoder
result = pipeline.forward(DiffusionRequestBatch(requests=[
OmniDiffusionRequest(
prompt="",
sampling_params=OmniDiffusionSamplingParams(extra_args={
"batch_inputs": inputs, "noise": noise, "decode_image": False,
}),
request_id="internvla-hybrid-synthetic-observation",
)
]))
if result.error:
raise RuntimeError(result.error)
tensor = result.output["payload"]["actions"]
if tensor.device.type != "cpu" or tuple(tensor.shape) != (1, 50, 32):
raise RuntimeError(f"bad policy action shape/device: {tensor.shape} {tensor.device}")
if not torch.isfinite(tensor).all():
raise RuntimeError("policy actions nonfinite")
return tensor.detach().float().cpu().contiguous().numpy()
cpu_wall = []
hybrid_wall = []
errors = []
reference = actual = None
for index in range(args.warmups + args.repeats):
started = time.perf_counter()
reference = actions(cpu_encoder)
cpu_s = time.perf_counter() - started
started = time.perf_counter()
actual = actions(external_encoder)
hybrid_s = time.perf_counter() - started
if index >= args.warmups:
cpu_wall.append(cpu_s)
hybrid_wall.append(hybrid_s)
errors.append({
"max_abs": float(np.max(np.abs(reference - actual))),
"relative_l2": float(np.linalg.norm(reference - actual) / np.linalg.norm(reference)),
"cosine": float(np.dot(reference.ravel(), actual.ravel()) / (
np.linalg.norm(reference) * np.linalg.norm(actual)
)),
})
assert reference is not None and actual is not None
cosmos._enc_model = cpu_encoder
report.update({
"status": "passed",
"action_shape": list(actual.shape),
"cpu_action_sha256_last": hashlib.sha256(reference.tobytes()).hexdigest(),
"hybrid_action_sha256_last": hashlib.sha256(actual.tobytes()).hexdigest(),
"cpu_wall_s": cpu_wall,
"hybrid_wall_s": hybrid_wall,
"per_request_action_error": errors,
"max_action_abs_error": max(e["max_abs"] for e in errors),
"max_action_relative_l2_error": max(e["relative_l2"] for e in errors),
"min_action_cosine": min(e["cosine"] for e in errors),
"cpu_p50_wall_s": rank(cpu_wall, .5),
"cpu_p95_wall_s": rank(cpu_wall, .95),
"hybrid_p50_wall_s": rank(hybrid_wall, .5),
"hybrid_p95_wall_s": rank(hybrid_wall, .95),
"external_encoder_calls": external_encoder.calls,
"external_encoder_timings": external_encoder.timings,
"worker_stats": worker.stats(),
"parent_rss_bytes_after": psutil.Process().memory_info().rss,
"wsl_available_bytes_after": psutil.virtual_memory().available,
})
except BaseException as exc:
report["status"] = "failed"
report["error"] = f"{type(exc).__name__}: {exc}"
report["traceback"] = traceback.format_exc()
raise
finally:
if worker is not None:
worker.close()
args.output.parent.mkdir(parents=True, exist_ok=True)
args.output.write_text(json.dumps(report, indent=2) + "\n", encoding="utf-8")
print(json.dumps({key: value for key, value in report.items() if key not in (
"cpu_wall_s", "hybrid_wall_s", "per_request_action_error", "external_encoder_timings"
)}, indent=2))
if __name__ == "__main__":
main()
@@ -5,6 +5,7 @@ This extends the [60-cell device × model matrix](../e2e_profiling_20260922/evid
| Device / model | Verified depth | Observed output and time | Remaining gate |
|---|---|---|---|
| Native Windows HX370 Radeon 890M / InternVLA-A1 Cosmos CI8x8 encoder | Component C; unchanged Omni encoder source in separate DirectML/PyTorch 2.4 environment, not an Omni full-policy stage | One warmup + 20 serial patterned 256×256 image encodes, including upload/readback: Radeon p50/p95 26.56/27.49 ms versus CPU 156.49/158.71 ms; relative L2 error 4.73e-07. Encoder weights and output device checked. | Complete policy/action and real-observation parity; policy/controller runtime compatibility, bounded handoff, shared-RAM admission and end-to-end benefit. [Raw evidence](evidence/internvla_cosmos_radeon890m/README.md). |
| WSL HX370 CPU policy + Radeon 890M DirectML Cosmos / InternVLA-A1 Place_Markpen | Complete synthetic action-policy path through Omni diffusion and its external graph worker; FP32 encoder to BF16 policy, not robot-task qualification | One warmup pair + 20 alternating measured CPU/hybrid complete requests returned finite `[1,50,32]` actions. Hybrid wall p50/p95 2.952/3.322 s versus CPU 3.178/3.266 s; 16/20 paired faster but the hybrid tail regressed. Action relative L2 difference 0.9007%, cosine 0.999959. The selected Radeon adapter and graph hash were checked. | Real observations/reference actions, units/timestamps, integrated admission/cancellation, loading peak and sustained tail/power; [raw evidence](evidence/internvla_cosmos_radeon890m/README.md). |
| WSL HX370 CPU / Qwen3-TTS 0.6B CustomVoice BF16 | Scoped complete-request Omni resident CPU whole-session stage (P for two named texts; not playable streaming) | One warmup + 20 serial requests returned identical 3.44 s WAVs; nearest-rank complete-request wall p50/p95 8.27/8.47 s (RTF 2.40/2.46), excluding 19.82 s startup. One pinned Whisper tiny.en transcription matched the reference (WER 0); public `AsyncOmni` audio, 10 GiB admission, 4 GiB refusal and cancellation drain passed. The WSL PCM differs from the native Windows output for the same checkpoint/settings. | Cross-OS numerical/quality investigation, playable streaming, post-cancel restart, loading peak, concurrency and sustained power; [raw evidence](evidence/qwen_tts_omni_wsl_cpu/README.md). |
| WSL HX370 CPU / MiniCPM-o 4.5 Q4_K_M/F16 GGUF | Scoped complete-request Omni C++ whole-session graph stage (P for one synthetic combined spoken-question+image input; CPU-only model execution) | All 20 measured requests after one warmup answered the red-square question correctly with complete nonzero 24 kHz speech. Nearest-rank complete-request wall p50/p95 22.67/24.83 s; audio duration 1.60–2.92 s, maximum sampled worker RSS 13.70 GB. One WAV independently transcribed exactly (Whisper tiny.en WER 0). 24 GiB admission, 8 GiB refusal and cancellation with zero remaining ledger passed. | Real multimodal suites, playable streaming, speech alignment, post-cancel restart, loading peak, concurrency and sustained power; [raw evidence](evidence/minicpmo_omni_wsl_cpu/README.md). |
| Native Windows HX370 CPU / MiniCPM-o 4.5 Q4_K_M/F16 GGUF | Scoped complete-request Omni C++ whole-session graph stage (P for one synthetic combined audio+image input) | Correct red-square answer, 2.24 s 24 kHz WAV; one cold request 24.34 s, sampled RSS 13.11 GB. 24 GiB admission, 8 GiB refusal and in-flight cancellation with zero remaining reservation passed. | Real multimodal suites, playable streaming, repeated latency, loading peak, post-cancel restart and sustained power; [raw evidence](evidence/minicpmo_omni_cpp/README.md). |
@@ -1,6 +1,6 @@
# InternVLA Cosmos image-encoder component on Radeon 890M
# InternVLA Cosmos encoder and synthetic hybrid policy on Radeon 890M
This is a **component (C) pass**, not an InternVLA action-policy (P) pass. The unchanged Omni `model_cosmos.py` and `cosmos_ci_torch.py` loaded the pinned Cosmos-Tokenizer-CI8x8 encoder and executed one patterned `[1,3,256,256]` float32 image in `[-1,1]` on CPU and DirectML Radeon 890M. The pattern is synthetic; no camera, language, proprioception, diffusion action loop, unit/timestamp or robot-task quality is covered.
The first experiment below is a **component (C) pass**. The unchanged Omni `model_cosmos.py` and `cosmos_ci_torch.py` loaded the pinned Cosmos-Tokenizer-CI8x8 encoder and executed one patterned `[1,3,256,256]` float32 image in `[-1,1]` on CPU and DirectML Radeon 890M. The pattern is synthetic; this component result alone covers no camera, language, proprioception, diffusion action loop, unit/timestamp or robot-task quality. A later section records a separate complete synthetic policy path.
The host was a Ryzen AI 9 HX 370 on native Windows 11 build 26200, AMD Radeon 890M driver 32.0.22018.6001 (2026-08-12), PyTorch 2.4.1+cpu and torch-directml 0.2.5.dev240914. The separate DirectML environment is not the installed Omni/vLLM 0.29 policy environment. Explicit DirectML device index 1 resolved to `AMD Radeon(TM) 890M Graphics`; all encoder parameters and the pre-readback output were checked on `privateuseone`. The encoder checkpoint SHA256 is `520a3b878e72ee872faccb1211b5d622d194c0fdd177f2f6df097586b8fa98e5`. Source SHA256 values are in [profile20.json](profile20.json). The 88 persistent encoder state tensors all had checkpoint keys. Two nonpersistent patcher buffers were also present in the checkpoint and ignored by the existing model loader; the wavelet buffer differs by at most `7.55e-05` because the checkpoint uses BF16 while the source constructs FP32. The same source-generated buffer was used for CPU and DirectML.
@@ -19,3 +19,93 @@ $env:PYTHONUTF8 = '1'
--output "$root\vllm-omni-edge\benchmarks\edge_harness\results\e2e_expansion_20260923\evidence\internvla_cosmos_radeon890m\profile20.json" `
--warmups 1 --repeats 20 --dml-index 1
```
## Fixed six-frame component and complete synthetic policy
The policy's three-camera × two-history fixture sends **six** frames through
Cosmos in one call. A separate [six-frame component profile](profile_batch6_20.json)
used one warmup plus 20 serial patterned calls: Radeon p50/p95
133.82/144.88 ms including upload/readback, CPU FP32 835.17/851.48 ms,
relative L2 error `5.14e-07`. This is a more relevant shape than the first
single-image component test, but still not a whole-policy measurement.
DirectML in the tested PyTorch 2.4 worker **aborts on BF16**; the
[fatal log](bf16_batch6_probe.log) is retained. The existing InternVLA policy
uses BF16 Cosmos on CPU. Rather than silently cast it, the hybrid experiment
uses an explicitly FP32 fixed-shape [`.pt2` export](export_batch6.json) of the
same checkpoint, then converts the returned latent to the policy's BF16.
`torch.export(..., strict=False)` produced a CPU output identical to the
unchanged source on the export sample. The 129,872,312-byte graph is stored
outside Git at the report's artifact path; its SHA256 is
`9111b3841893acaaa11cf45715d246da3ac9cdd03c7b33fb3c7c20fe38d74704`.
The experiment refuses a hash, shape or dtype mismatch. Recreate it with
[`export_internvla_cosmos.py`](../../../../experiments/export_internvla_cosmos.py).
The [hybrid policy probe](../../../../experiments/probe_internvla_hybrid_actions.py)
loaded the real Place_Markpen checkpoint strictly in the WSL CPU Omni
diffusion pipeline, kept the Qwen3-VL/flow action policy on CPU and used
Omni's existing external `torch-dml` worker for only the Cosmos encoder.
The worker reported the selected adapter as `AMD Radeon(TM) 890M Graphics`;
its output remained on DirectML before readback. Its graph placement report
counts one **output tensor**, not every internal operation; no per-operator
attribution was captured. The controller used PyTorch 2.13.0+cpu, vLLM
0.28.0 and current Omni 0.29 source (a version mismatch warning remains);
the worker used PyTorch 2.4.1+cu121 over WSL GPU-PV. The underlying host was
the same Windows 11 build 26200 HX370/Radeon with driver 32.0.22018.6001.
Both policies received identical synthetic zero camera/state observations,
empty task and zero diffusion noise; output was a finite `[1,50,32]` action
tensor. This is a **synthetic complete policy path**, not a real robot-task
E2E result. The checkpoint's `train_config.json` says `action_mode=delta`,
but physical units, joint order, observation timestamps, action horizon and
reference action quality were not validated.
The [paired 20-request result](hybrid_profile20.json) alternated CPU-only and
CPU+Radeon complete policy calls after one warmup pair, with one loaded policy
and persistent worker. Nearest-rank complete-request wall p50/p95 was
**3.178/3.266 s** on CPU and **2.952/3.322 s** on the hybrid. The paired
median improvement was 0.207 s (16/20 hybrid calls faster), but the hybrid
p95 regressed because several DirectML calls took about 0.5 s instead of
about 0.15 s. The largest action max-absolute difference was `0.00715`,
relative L2 `0.9007%`, cosine `0.999959`; the difference was repeatable on
this one fixture. No task tolerance is established, and the FP32/BF16 change
needs real-observation reference actions before deployment. Policy load was
32.96 s, worker start+graph load 3.34 s; these costs are excluded from the
request percentiles. Parent RSS after profiling was 9.30 GB and worker peak
RSS 0.91 GB; these are not shared-iGPU allocation or loading-peak bounds.
Power and thermal state were not recorded.
The [first hybrid smoke](hybrid_smoke.json) and the later
[selected-adapter check](hybrid_selected_adapter.json) are retained. The
candidate still lacks an Omni graph-stage deployment plan with combined
shared-RAM admission, cancellation/restart validation, observation/action
metadata and real input quality. A single cold request loses the worker
startup cost, and the latency tail currently prevents a general speedup
claim. Keep CPU as the qualified baseline until those gates pass.
Recreate the graph with the recorded Windows PyTorch 2.4 environment. Use the
freshly generated report alongside its graph, since serialization may produce
a different byte hash on another run:
```powershell
$root = '\\wsl.localhost\Ubuntu\home\zhout\project\edge_infer'
$env:PYTHONUTF8 = '1'
& 'C:\Users\zhout\w2\qwen_dml_venv\Scripts\python.exe' `
"$root\vllm-omni-edge\benchmarks\edge_harness\experiments\export_internvla_cosmos.py" `
--encoder "$root\models\Cosmos-Tokenizer-CI8x8\encoder.safetensors" `
--output "$root\models\InternVLA-cosmos-encoder-batch6.pt2" `
--report "$root\models\InternVLA-cosmos-encoder-batch6.export.json" --batch-size 6
```
Reproduce the complete synthetic policy probe from this repository root on
WSL, using the matching local export report:
```bash
PYTHONPATH="$PWD" OMP_NUM_THREADS=8 MKL_NUM_THREADS=8 TOKENIZERS_PARALLELISM=false \
../.venvs/omni-cpu/bin/python benchmarks/edge_harness/experiments/probe_internvla_hybrid_actions.py \
--model-dir ../models/InternVLA-A1-3B-FT-Place_Markpen \
--cosmos-dir ../models/Cosmos-Tokenizer-CI8x8 \
--processor-dir ../models/Qwen3-VL-2B-Instruct-processor \
--graph ../models/InternVLA-cosmos-encoder-batch6.pt2 \
--export-report ../models/InternVLA-cosmos-encoder-batch6.export.json \
--output /tmp/internvla-hybrid-profile.json --warmups 1 --repeats 20
```
@@ -0,0 +1 @@
[F924 00:53:57.000000000 dml_util.cc:118] Invalid or unsupported data type BFloat16.
@@ -0,0 +1,28 @@
{
"status": "passed",
"scope": "fixed-shape Cosmos CI8x8 encoder graph; no InternVLA action-policy claim",
"encoder_sha256": "520a3b878e72ee872faccb1211b5d622d194c0fdd177f2f6df097586b8fa98e5",
"source_sha256": {
"model_cosmos.py": "81f523767d356f16856fa35521bc637ac5df9fc8383ca11fc9a58875eb4c97c7",
"cosmos_ci_torch.py": "a88015b3854b8da730b89c6a35eb3b23721608797208847d9b4cb9a8b8d60f5e"
},
"torch": "2.4.1+cpu",
"input_shape": [
6,
3,
256,
256
],
"input_dtype": "torch.float32",
"output_shape": [
6,
16,
32,
32
],
"max_abs_export_error": 0.0,
"export_s": 3.224664800101891,
"artifact_sha256": "9111b3841893acaaa11cf45715d246da3ac9cdd03c7b33fb3c7c20fe38d74704",
"artifact_bytes": 129872312,
"artifact_path": "\\\\wsl.localhost\\Ubuntu\\home\\zhout\\project\\edge_infer\\models\\InternVLA-cosmos-encoder-batch6.pt2"
}
@@ -0,0 +1,28 @@
{
"status": "passed",
"scope": "fixed-shape Cosmos CI8x8 encoder graph; no InternVLA action-policy claim",
"encoder_sha256": "520a3b878e72ee872faccb1211b5d622d194c0fdd177f2f6df097586b8fa98e5",
"source_sha256": {
"model_cosmos.py": "81f523767d356f16856fa35521bc637ac5df9fc8383ca11fc9a58875eb4c97c7",
"cosmos_ci_torch.py": "a88015b3854b8da730b89c6a35eb3b23721608797208847d9b4cb9a8b8d60f5e"
},
"torch": "2.4.1+cpu",
"input_shape": [
6,
3,
256,
256
],
"input_dtype": "torch.float32",
"output_shape": [
6,
16,
32,
32
],
"max_abs_export_error": 0.0,
"export_s": 3.224664800101891,
"artifact_sha256": "9111b3841893acaaa11cf45715d246da3ac9cdd03c7b33fb3c7c20fe38d74704",
"artifact_bytes": 129872312,
"artifact_path": "\\\\wsl.localhost\\Ubuntu\\home\\zhout\\project\\edge_infer\\models\\InternVLA-cosmos-encoder-batch6.pt2"
}
@@ -0,0 +1,416 @@
{
"scope": "InternVLA real Place_Markpen checkpoint, synthetic zero camera/state observations and zero diffusion noise; CPU BF16 policy with FP32 Radeon Cosmos encoder; no robot-task quality claim",
"model_checkpoint_sha256": "586799539888c69c35f84d083e559cc5f0ba887801d000e70e65f58d3f85c313",
"graph_sha256": "9111b3841893acaaa11cf45715d246da3ac9cdd03c7b33fb3c7c20fe38d74704",
"graph_export": {
"status": "passed",
"scope": "fixed-shape Cosmos CI8x8 encoder graph; no InternVLA action-policy claim",
"encoder_sha256": "520a3b878e72ee872faccb1211b5d622d194c0fdd177f2f6df097586b8fa98e5",
"source_sha256": {
"model_cosmos.py": "81f523767d356f16856fa35521bc637ac5df9fc8383ca11fc9a58875eb4c97c7",
"cosmos_ci_torch.py": "a88015b3854b8da730b89c6a35eb3b23721608797208847d9b4cb9a8b8d60f5e"
},
"torch": "2.4.1+cpu",
"input_shape": [
6,
3,
256,
256
],
"input_dtype": "torch.float32",
"output_shape": [
6,
16,
32,
32
],
"max_abs_export_error": 0.0,
"export_s": 3.224664800101891,
"artifact_sha256": "9111b3841893acaaa11cf45715d246da3ac9cdd03c7b33fb3c7c20fe38d74704",
"artifact_bytes": 129872312,
"artifact_path": "\\\\wsl.localhost\\Ubuntu\\home\\zhout\\project\\edge_infer\\models\\InternVLA-cosmos-encoder-batch6.pt2"
},
"policy_torch": "2.13.0+cpu",
"warmups": 1,
"repeats": 20,
"status": "passed",
"policy_load_s": 32.959274790016934,
"policy_parameters_device": "cpu",
"worker_start_and_graph_load_s": 3.3366938079707325,
"worker_hello": {
"torch": "2.4.1+cu121",
"torch_directml": "unknown",
"available_providers": [
"NVIDIA GeForce RTX 5090 Laptop GPU\u0000",
"AMD Radeon(TM) 890M Graphics\u0000"
],
"executable": "/home/zhout/project/edge_infer/.venvs/dml/bin/python"
},
"worker_load": {
"ep": "dml",
"graph_path": "/home/zhout/project/edge_infer/models/InternVLA-cosmos-encoder-batch6.pt2",
"session_providers": [
"torch-directml"
],
"available_providers": [
"torch-directml"
],
"node_counts": {
"dml": 1,
"cpu": 0
},
"total_nodes": 1,
"target_nodes": 1,
"fraction_on_target": 1.0,
"session_create_s": 0.8180774669745006,
"warmup_s": 0.677739959966857,
"rss_bytes": 696750080,
"inputs": [
{
"name": "pixels",
"shape": [
6,
3,
256,
256
]
}
],
"outputs": [
{
"name": "out_0",
"shape": [
6,
16,
32,
32
]
}
],
"profile_path": "",
"ep_directory": "",
"requested_provider_missing": "",
"fallback_note": "",
"onnxruntime": "",
"note": ""
},
"action_shape": [
1,
50,
32
],
"cpu_action_sha256_last": "db60d6590e242694948f7dcdf873b2fff44819d31b0b178fdad5ec9608d46140",
"hybrid_action_sha256_last": "256b244d3b6a8745391690ff88182a5f0f6f9325d279de1e9c5287a00c463798",
"cpu_wall_s": [
3.266188815992791,
3.2130069519625977,
3.200305638019927,
3.182389290013816,
3.2533019420225173,
3.163670579029713,
3.1292421899852343,
3.1379489160026424,
3.258549672027584,
3.2664072579937056,
3.162602616008371,
3.1880405800184235,
3.1626134979887865,
3.1519040080020204,
3.178045471024234,
3.110473181004636,
3.1697323330445215,
3.1663852329947986,
3.2292595140170306,
3.2074096809956245
],
"hybrid_wall_s": [
3.1687436809879728,
2.9065867449971847,
2.9316007799934596,
3.405398574017454,
2.9016875599627383,
2.891013133979868,
2.9670994469779544,
3.3216434589703567,
2.911582596017979,
3.267322317988146,
2.9339384569902904,
2.8921132480027154,
3.0768511260394007,
3.2951800349983387,
2.9927860139869153,
3.008475508017,
2.9399544459884055,
3.071420267049689,
2.8709001630195417,
2.952331782958936
],
"per_request_action_error": [
{
"max_abs": 0.007147848606109619,
"relative_l2": 0.009007224813103676,
"cosine": 0.9999594688415527
},
{
"max_abs": 0.007147848606109619,
"relative_l2": 0.009007224813103676,
"cosine": 0.9999594688415527
},
{
"max_abs": 0.007147848606109619,
"relative_l2": 0.009007224813103676,
"cosine": 0.9999594688415527
},
{
"max_abs": 0.007147848606109619,
"relative_l2": 0.009007224813103676,
"cosine": 0.9999594688415527
},
{
"max_abs": 0.007147848606109619,
"relative_l2": 0.009007224813103676,
"cosine": 0.9999594688415527
},
{
"max_abs": 0.007147848606109619,
"relative_l2": 0.009007224813103676,
"cosine": 0.9999594688415527
},
{
"max_abs": 0.007147848606109619,
"relative_l2": 0.009007224813103676,
"cosine": 0.9999594688415527
},
{
"max_abs": 0.007147848606109619,
"relative_l2": 0.009007224813103676,
"cosine": 0.9999594688415527
},
{
"max_abs": 0.007147848606109619,
"relative_l2": 0.009007224813103676,
"cosine": 0.9999594688415527
},
{
"max_abs": 0.007147848606109619,
"relative_l2": 0.009007224813103676,
"cosine": 0.9999594688415527
},
{
"max_abs": 0.007147848606109619,
"relative_l2": 0.009007224813103676,
"cosine": 0.9999594688415527
},
{
"max_abs": 0.007147848606109619,
"relative_l2": 0.009007224813103676,
"cosine": 0.9999594688415527
},
{
"max_abs": 0.007147848606109619,
"relative_l2": 0.009007224813103676,
"cosine": 0.9999594688415527
},
{
"max_abs": 0.007147848606109619,
"relative_l2": 0.009007224813103676,
"cosine": 0.9999594688415527
},
{
"max_abs": 0.007147848606109619,
"relative_l2": 0.009007224813103676,
"cosine": 0.9999594688415527
},
{
"max_abs": 0.007147848606109619,
"relative_l2": 0.009007224813103676,
"cosine": 0.9999594688415527
},
{
"max_abs": 0.007147848606109619,
"relative_l2": 0.009007224813103676,
"cosine": 0.9999594688415527
},
{
"max_abs": 0.007147848606109619,
"relative_l2": 0.009007224813103676,
"cosine": 0.9999594688415527
},
{
"max_abs": 0.007147848606109619,
"relative_l2": 0.009007224813103676,
"cosine": 0.9999594688415527
},
{
"max_abs": 0.007147848606109619,
"relative_l2": 0.009007224813103676,
"cosine": 0.9999594688415527
}
],
"max_action_abs_error": 0.007147848606109619,
"max_action_relative_l2_error": 0.009007224813103676,
"min_action_cosine": 0.9999594688415527,
"cpu_p50_wall_s": 3.178045471024234,
"cpu_p95_wall_s": 3.266188815992791,
"hybrid_p50_wall_s": 2.952331782958936,
"hybrid_p95_wall_s": 3.3216434589703567,
"external_encoder_calls": 21,
"external_encoder_timings": [
{
"worker_s": 0.8607061729999259,
"round_trip_s": 0.8648391110473312,
"transport_s": 0.004132938047405332
},
{
"worker_s": 0.3715811110450886,
"round_trip_s": 0.3743669349933043,
"transport_s": 0.0027858239482156932
},
{
"worker_s": 0.14860690099885687,
"round_trip_s": 0.15083393501117826,
"transport_s": 0.0022270340123213828
},
{
"worker_s": 0.14834689296549186,
"round_trip_s": 0.15213954000500962,
"transport_s": 0.0037926470395177603
},
{
"worker_s": 0.5417412479873747,
"round_trip_s": 0.5445115080219693,
"transport_s": 0.002770260034594685
},
{
"worker_s": 0.14636369701474905,
"round_trip_s": 0.1487328299554065,
"transport_s": 0.002369132940657437
},
{
"worker_s": 0.1489313739584759,
"round_trip_s": 0.1511367280036211,
"transport_s": 0.0022053540451452136
},
{
"worker_s": 0.14715390495257452,
"round_trip_s": 0.15077846799977124,
"transport_s": 0.003624563047196716
},
{
"worker_s": 0.4843184489873238,
"round_trip_s": 0.48674986098194495,
"transport_s": 0.0024314119946211576
},
{
"worker_s": 0.14651734399376437,
"round_trip_s": 0.1493279380374588,
"transport_s": 0.0028105940436944366
},
{
"worker_s": 0.500042352010496,
"round_trip_s": 0.5025758480187505,
"transport_s": 0.0025334960082545877
},
{
"worker_s": 0.14640763704665005,
"round_trip_s": 0.1490332469693385,
"transport_s": 0.0026256099226884544
},
{
"worker_s": 0.14674461202230304,
"round_trip_s": 0.1490190249751322,
"transport_s": 0.0022744129528291523
},
{
"worker_s": 0.1487067990237847,
"round_trip_s": 0.15151096595218405,
"transport_s": 0.0028041669283993542
},
{
"worker_s": 0.511554681987036,
"round_trip_s": 0.5144772549974732,
"transport_s": 0.0029225730104371905
},
{
"worker_s": 0.23890922096325085,
"round_trip_s": 0.24169003596762195,
"transport_s": 0.0027808150043711066
},
{
"worker_s": 0.2586796889663674,
"round_trip_s": 0.2610690040164627,
"transport_s": 0.0023893150500953197
},
{
"worker_s": 0.14408373599871993,
"round_trip_s": 0.14687694498570636,
"transport_s": 0.0027932089869864285
},
{
"worker_s": 0.2575082419789396,
"round_trip_s": 0.2602673360379413,
"transport_s": 0.0027590940590016544
},
{
"worker_s": 0.15473052201559767,
"round_trip_s": 0.1571155230049044,
"transport_s": 0.002385000989306718
},
{
"worker_s": 0.147569980006665,
"round_trip_s": 0.14973747095791623,
"transport_s": 0.0021674909512512386
}
],
"worker_stats": {
"runs": 21,
"total_run_s": 5.799204566923436,
"rss_bytes": 695242752,
"peak_rss_bytes": 910659584,
"report": {
"ep": "dml",
"device_name": "AMD Radeon(TM) 890M Graphics\u0000",
"torch": "2.4.1+cu121",
"session_create_s": 0.8180774669745006,
"session_providers": [
"torch-directml"
],
"available_providers": [
"torch-directml"
],
"inputs": [
{
"name": "pixels",
"shape": [
6,
3,
256,
256
]
}
],
"warmup_s": 0.677739959966857,
"node_counts": {
"dml": 1,
"cpu": 0
},
"total_nodes": 1,
"target_nodes": 1,
"fraction_on_target": 1.0,
"outputs": [
{
"name": "out_0",
"shape": [
6,
16,
32,
32
]
}
],
"rss_bytes": 696750080
}
},
"parent_rss_bytes_after": 9302196224,
"wsl_available_bytes_after": 22021693440
}
@@ -0,0 +1,178 @@
/home/zhout/project/edge_infer/vllm-omni-edge/vllm_omni/version.py:55: RuntimeWarning: vLLM and vLLM-Omni appear to have mismatched major/minor versions:
--> vLLM-Omni version 0.29.0rc2.dev71+g00510ce38.d20260922
--> vLLM version 0.28.0
This will likely cause compatibility issues.
warn_if_misaligned_vllm_version()
W0924 01:01:44.263000 3704894 torch/utils/_pytree.py:630] <enum 'KernelPreference'> is an Enum subclass and is now natively supported by torch.compile as an opaque value type. Calling register_constant() on Enum subclasses is deprecated and will be an error in a future release.
W0924 01:01:44.286000 3704894 torch/utils/_pytree.py:630] <enum 'ScaleCalculationMode'> is an Enum subclass and is now natively supported by torch.compile as an opaque value type. Calling register_constant() on Enum subclasses is deprecated and will be an error in a future release.
INFO 09-24 01:01:45 [importing.py:53] Triton is installed but 0 active driver(s) found (expected 1). Disabling Triton to prevent runtime errors.
WARNING 09-24 01:01:45 [importing.py:65] Triton is installed, but doesn't include CPU backend. Disabling Triton.
INFO 09-24 01:01:45 [importing.py:88] Triton not installed or not compatible; certain GPU-related functions will not be available.
INFO 09-24 01:01:46 [patch.py:259] NVFP4 W4A4 weight_scale NaN-clamp: installed.
INFO 09-24 01:01:46 [patch.py:510] inductor factorable-divisibility patch: installed.
INFO 09-24 01:01:46 [patch.py:646] CPU AOT compile-cache load shim installed: compiled models are reused across engine starts instead of being recompiled.
INFO 09-24 01:01:46 [patch.py:756] CPU weight-load memory release installed (set VLLM_OMNI_CPU_RELEASE_MEMORY=0 to disable).
INFO 09-24 01:01:50 [pipeline_internvla_a1.py:164] Loading InternVLA-A1 weights from /home/zhout/project/edge_infer/models/InternVLA-A1-3B-FT-Place_Markpen
{
"scope": "InternVLA real Place_Markpen checkpoint, synthetic zero camera/state observations and zero diffusion noise; CPU BF16 policy with FP32 Radeon Cosmos encoder; no robot-task quality claim",
"model_checkpoint_sha256": "586799539888c69c35f84d083e559cc5f0ba887801d000e70e65f58d3f85c313",
"graph_sha256": "9111b3841893acaaa11cf45715d246da3ac9cdd03c7b33fb3c7c20fe38d74704",
"graph_export": {
"status": "passed",
"scope": "fixed-shape Cosmos CI8x8 encoder graph; no InternVLA action-policy claim",
"encoder_sha256": "520a3b878e72ee872faccb1211b5d622d194c0fdd177f2f6df097586b8fa98e5",
"source_sha256": {
"model_cosmos.py": "81f523767d356f16856fa35521bc637ac5df9fc8383ca11fc9a58875eb4c97c7",
"cosmos_ci_torch.py": "a88015b3854b8da730b89c6a35eb3b23721608797208847d9b4cb9a8b8d60f5e"
},
"torch": "2.4.1+cpu",
"input_shape": [
6,
3,
256,
256
],
"input_dtype": "torch.float32",
"output_shape": [
6,
16,
32,
32
],
"max_abs_export_error": 0.0,
"export_s": 3.224664800101891,
"artifact_sha256": "9111b3841893acaaa11cf45715d246da3ac9cdd03c7b33fb3c7c20fe38d74704",
"artifact_bytes": 129872312,
"artifact_path": "\\\\wsl.localhost\\Ubuntu\\home\\zhout\\project\\edge_infer\\models\\InternVLA-cosmos-encoder-batch6.pt2"
},
"policy_torch": "2.13.0+cpu",
"warmups": 1,
"repeats": 20,
"status": "passed",
"policy_load_s": 32.959274790016934,
"policy_parameters_device": "cpu",
"worker_start_and_graph_load_s": 3.3366938079707325,
"worker_hello": {
"torch": "2.4.1+cu121",
"torch_directml": "unknown",
"available_providers": [
"NVIDIA GeForce RTX 5090 Laptop GPU\u0000",
"AMD Radeon(TM) 890M Graphics\u0000"
],
"executable": "/home/zhout/project/edge_infer/.venvs/dml/bin/python"
},
"worker_load": {
"ep": "dml",
"graph_path": "/home/zhout/project/edge_infer/models/InternVLA-cosmos-encoder-batch6.pt2",
"session_providers": [
"torch-directml"
],
"available_providers": [
"torch-directml"
],
"node_counts": {
"dml": 1,
"cpu": 0
},
"total_nodes": 1,
"target_nodes": 1,
"fraction_on_target": 1.0,
"session_create_s": 0.8180774669745006,
"warmup_s": 0.677739959966857,
"rss_bytes": 696750080,
"inputs": [
{
"name": "pixels",
"shape": [
6,
3,
256,
256
]
}
],
"outputs": [
{
"name": "out_0",
"shape": [
6,
16,
32,
32
]
}
],
"profile_path": "",
"ep_directory": "",
"requested_provider_missing": "",
"fallback_note": "",
"onnxruntime": "",
"note": ""
},
"action_shape": [
1,
50,
32
],
"cpu_action_sha256_last": "db60d6590e242694948f7dcdf873b2fff44819d31b0b178fdad5ec9608d46140",
"hybrid_action_sha256_last": "256b244d3b6a8745391690ff88182a5f0f6f9325d279de1e9c5287a00c463798",
"max_action_abs_error": 0.007147848606109619,
"max_action_relative_l2_error": 0.009007224813103676,
"min_action_cosine": 0.9999594688415527,
"cpu_p50_wall_s": 3.178045471024234,
"cpu_p95_wall_s": 3.266188815992791,
"hybrid_p50_wall_s": 2.952331782958936,
"hybrid_p95_wall_s": 3.3216434589703567,
"external_encoder_calls": 21,
"worker_stats": {
"runs": 21,
"total_run_s": 5.799204566923436,
"rss_bytes": 695242752,
"peak_rss_bytes": 910659584,
"report": {
"ep": "dml",
"device_name": "AMD Radeon(TM) 890M Graphics\u0000",
"torch": "2.4.1+cu121",
"session_create_s": 0.8180774669745006,
"session_providers": [
"torch-directml"
],
"available_providers": [
"torch-directml"
],
"inputs": [
{
"name": "pixels",
"shape": [
6,
3,
256,
256
]
}
],
"warmup_s": 0.677739959966857,
"node_counts": {
"dml": 1,
"cpu": 0
},
"total_nodes": 1,
"target_nodes": 1,
"fraction_on_target": 1.0,
"outputs": [
{
"name": "out_0",
"shape": [
6,
16,
32,
32
]
}
],
"rss_bytes": 696750080
}
},
"parent_rss_bytes_after": 9302196224,
"wsl_available_bytes_after": 22021693440
}
@@ -0,0 +1,186 @@
{
"scope": "InternVLA real Place_Markpen checkpoint, synthetic zero camera/state observations and zero diffusion noise; CPU BF16 policy with FP32 Radeon Cosmos encoder; no robot-task quality claim",
"model_checkpoint_sha256": "586799539888c69c35f84d083e559cc5f0ba887801d000e70e65f58d3f85c313",
"graph_sha256": "9111b3841893acaaa11cf45715d246da3ac9cdd03c7b33fb3c7c20fe38d74704",
"graph_export": {
"status": "passed",
"scope": "fixed-shape Cosmos CI8x8 encoder graph; no InternVLA action-policy claim",
"encoder_sha256": "520a3b878e72ee872faccb1211b5d622d194c0fdd177f2f6df097586b8fa98e5",
"source_sha256": {
"model_cosmos.py": "81f523767d356f16856fa35521bc637ac5df9fc8383ca11fc9a58875eb4c97c7",
"cosmos_ci_torch.py": "a88015b3854b8da730b89c6a35eb3b23721608797208847d9b4cb9a8b8d60f5e"
},
"torch": "2.4.1+cpu",
"input_shape": [
6,
3,
256,
256
],
"input_dtype": "torch.float32",
"output_shape": [
6,
16,
32,
32
],
"max_abs_export_error": 0.0,
"export_s": 3.224664800101891,
"artifact_sha256": "9111b3841893acaaa11cf45715d246da3ac9cdd03c7b33fb3c7c20fe38d74704",
"artifact_bytes": 129872312,
"artifact_path": "\\\\wsl.localhost\\Ubuntu\\home\\zhout\\project\\edge_infer\\models\\InternVLA-cosmos-encoder-batch6.pt2"
},
"policy_torch": "2.13.0+cpu",
"warmups": 0,
"repeats": 1,
"status": "passed",
"policy_load_s": 29.15763967798557,
"policy_parameters_device": "cpu",
"worker_start_and_graph_load_s": 3.116139805992134,
"worker_hello": {
"torch": "2.4.1+cu121",
"torch_directml": "unknown",
"available_providers": [
"NVIDIA GeForce RTX 5090 Laptop GPU\u0000",
"AMD Radeon(TM) 890M Graphics\u0000"
],
"executable": "/home/zhout/project/edge_infer/.venvs/dml/bin/python"
},
"worker_load": {
"ep": "dml",
"graph_path": "/home/zhout/project/edge_infer/models/InternVLA-cosmos-encoder-batch6.pt2",
"device_name": "AMD Radeon(TM) 890M Graphics",
"placement_granularity": "output_device",
"session_providers": [
"torch-directml"
],
"available_providers": [
"torch-directml"
],
"node_counts": {
"dml": 1,
"cpu": 0
},
"total_nodes": 1,
"target_nodes": 1,
"fraction_on_target": 1.0,
"session_create_s": 0.8267001520143822,
"warmup_s": 0.5573145250091329,
"rss_bytes": 696872960,
"inputs": [
{
"name": "pixels",
"shape": [
6,
3,
256,
256
]
}
],
"outputs": [
{
"name": "out_0",
"shape": [
6,
16,
32,
32
]
}
],
"profile_path": "",
"ep_directory": "",
"requested_provider_missing": "",
"fallback_note": "",
"onnxruntime": "",
"note": ""
},
"action_shape": [
1,
50,
32
],
"cpu_action_sha256_last": "db60d6590e242694948f7dcdf873b2fff44819d31b0b178fdad5ec9608d46140",
"hybrid_action_sha256_last": "256b244d3b6a8745391690ff88182a5f0f6f9325d279de1e9c5287a00c463798",
"cpu_wall_s": [
3.2618731430266052
],
"hybrid_wall_s": [
3.699077647004742
],
"per_request_action_error": [
{
"max_abs": 0.007147848606109619,
"relative_l2": 0.009007224813103676,
"cosine": 0.9999594688415527
}
],
"max_action_abs_error": 0.007147848606109619,
"max_action_relative_l2_error": 0.009007224813103676,
"min_action_cosine": 0.9999594688415527,
"cpu_p50_wall_s": 3.2618731430266052,
"cpu_p95_wall_s": 3.2618731430266052,
"hybrid_p50_wall_s": 3.699077647004742,
"hybrid_p95_wall_s": 3.699077647004742,
"external_encoder_calls": 1,
"external_encoder_timings": [
{
"worker_s": 0.9252440289710648,
"round_trip_s": 0.9288088360335678,
"transport_s": 0.0035648070625029504
}
],
"worker_stats": {
"runs": 1,
"total_run_s": 0.9252440289710648,
"rss_bytes": 692346880,
"peak_rss_bytes": 911052800,
"report": {
"ep": "dml",
"device_name": "AMD Radeon(TM) 890M Graphics\u0000",
"placement_granularity": "output_device",
"torch": "2.4.1+cu121",
"session_create_s": 0.8267001520143822,
"session_providers": [
"torch-directml"
],
"available_providers": [
"torch-directml"
],
"inputs": [
{
"name": "pixels",
"shape": [
6,
3,
256,
256
]
}
],
"warmup_s": 0.5573145250091329,
"node_counts": {
"dml": 1,
"cpu": 0
},
"total_nodes": 1,
"target_nodes": 1,
"fraction_on_target": 1.0,
"outputs": [
{
"name": "out_0",
"shape": [
6,
16,
32,
32
]
}
],
"rss_bytes": 696872960
}
},
"parent_rss_bytes_after": 9297932288,
"wsl_available_bytes_after": 21906087936
}
@@ -0,0 +1,181 @@
/home/zhout/project/edge_infer/vllm-omni-edge/vllm_omni/version.py:55: RuntimeWarning: vLLM and vLLM-Omni appear to have mismatched major/minor versions:
--> vLLM-Omni version 0.29.0rc2.dev71+g00510ce38.d20260922
--> vLLM version 0.28.0
This will likely cause compatibility issues.
warn_if_misaligned_vllm_version()
W0924 01:10:49.657000 3705598 torch/utils/_pytree.py:630] <enum 'KernelPreference'> is an Enum subclass and is now natively supported by torch.compile as an opaque value type. Calling register_constant() on Enum subclasses is deprecated and will be an error in a future release.
W0924 01:10:49.680000 3705598 torch/utils/_pytree.py:630] <enum 'ScaleCalculationMode'> is an Enum subclass and is now natively supported by torch.compile as an opaque value type. Calling register_constant() on Enum subclasses is deprecated and will be an error in a future release.
INFO 09-24 01:10:50 [importing.py:53] Triton is installed but 0 active driver(s) found (expected 1). Disabling Triton to prevent runtime errors.
WARNING 09-24 01:10:50 [importing.py:65] Triton is installed, but doesn't include CPU backend. Disabling Triton.
INFO 09-24 01:10:50 [importing.py:88] Triton not installed or not compatible; certain GPU-related functions will not be available.
INFO 09-24 01:10:51 [patch.py:259] NVFP4 W4A4 weight_scale NaN-clamp: installed.
INFO 09-24 01:10:51 [patch.py:510] inductor factorable-divisibility patch: installed.
INFO 09-24 01:10:51 [patch.py:646] CPU AOT compile-cache load shim installed: compiled models are reused across engine starts instead of being recompiled.
INFO 09-24 01:10:51 [patch.py:756] CPU weight-load memory release installed (set VLLM_OMNI_CPU_RELEASE_MEMORY=0 to disable).
INFO 09-24 01:10:55 [pipeline_internvla_a1.py:164] Loading InternVLA-A1 weights from /home/zhout/project/edge_infer/models/InternVLA-A1-3B-FT-Place_Markpen
{
"scope": "InternVLA real Place_Markpen checkpoint, synthetic zero camera/state observations and zero diffusion noise; CPU BF16 policy with FP32 Radeon Cosmos encoder; no robot-task quality claim",
"model_checkpoint_sha256": "586799539888c69c35f84d083e559cc5f0ba887801d000e70e65f58d3f85c313",
"graph_sha256": "9111b3841893acaaa11cf45715d246da3ac9cdd03c7b33fb3c7c20fe38d74704",
"graph_export": {
"status": "passed",
"scope": "fixed-shape Cosmos CI8x8 encoder graph; no InternVLA action-policy claim",
"encoder_sha256": "520a3b878e72ee872faccb1211b5d622d194c0fdd177f2f6df097586b8fa98e5",
"source_sha256": {
"model_cosmos.py": "81f523767d356f16856fa35521bc637ac5df9fc8383ca11fc9a58875eb4c97c7",
"cosmos_ci_torch.py": "a88015b3854b8da730b89c6a35eb3b23721608797208847d9b4cb9a8b8d60f5e"
},
"torch": "2.4.1+cpu",
"input_shape": [
6,
3,
256,
256
],
"input_dtype": "torch.float32",
"output_shape": [
6,
16,
32,
32
],
"max_abs_export_error": 0.0,
"export_s": 3.224664800101891,
"artifact_sha256": "9111b3841893acaaa11cf45715d246da3ac9cdd03c7b33fb3c7c20fe38d74704",
"artifact_bytes": 129872312,
"artifact_path": "\\\\wsl.localhost\\Ubuntu\\home\\zhout\\project\\edge_infer\\models\\InternVLA-cosmos-encoder-batch6.pt2"
},
"policy_torch": "2.13.0+cpu",
"warmups": 0,
"repeats": 1,
"status": "passed",
"policy_load_s": 29.15763967798557,
"policy_parameters_device": "cpu",
"worker_start_and_graph_load_s": 3.116139805992134,
"worker_hello": {
"torch": "2.4.1+cu121",
"torch_directml": "unknown",
"available_providers": [
"NVIDIA GeForce RTX 5090 Laptop GPU\u0000",
"AMD Radeon(TM) 890M Graphics\u0000"
],
"executable": "/home/zhout/project/edge_infer/.venvs/dml/bin/python"
},
"worker_load": {
"ep": "dml",
"graph_path": "/home/zhout/project/edge_infer/models/InternVLA-cosmos-encoder-batch6.pt2",
"device_name": "AMD Radeon(TM) 890M Graphics",
"placement_granularity": "output_device",
"session_providers": [
"torch-directml"
],
"available_providers": [
"torch-directml"
],
"node_counts": {
"dml": 1,
"cpu": 0
},
"total_nodes": 1,
"target_nodes": 1,
"fraction_on_target": 1.0,
"session_create_s": 0.8267001520143822,
"warmup_s": 0.5573145250091329,
"rss_bytes": 696872960,
"inputs": [
{
"name": "pixels",
"shape": [
6,
3,
256,
256
]
}
],
"outputs": [
{
"name": "out_0",
"shape": [
6,
16,
32,
32
]
}
],
"profile_path": "",
"ep_directory": "",
"requested_provider_missing": "",
"fallback_note": "",
"onnxruntime": "",
"note": ""
},
"action_shape": [
1,
50,
32
],
"cpu_action_sha256_last": "db60d6590e242694948f7dcdf873b2fff44819d31b0b178fdad5ec9608d46140",
"hybrid_action_sha256_last": "256b244d3b6a8745391690ff88182a5f0f6f9325d279de1e9c5287a00c463798",
"max_action_abs_error": 0.007147848606109619,
"max_action_relative_l2_error": 0.009007224813103676,
"min_action_cosine": 0.9999594688415527,
"cpu_p50_wall_s": 3.2618731430266052,
"cpu_p95_wall_s": 3.2618731430266052,
"hybrid_p50_wall_s": 3.699077647004742,
"hybrid_p95_wall_s": 3.699077647004742,
"external_encoder_calls": 1,
"worker_stats": {
"runs": 1,
"total_run_s": 0.9252440289710648,
"rss_bytes": 692346880,
"peak_rss_bytes": 911052800,
"report": {
"ep": "dml",
"device_name": "AMD Radeon(TM) 890M Graphics\u0000",
"placement_granularity": "output_device",
"torch": "2.4.1+cu121",
"session_create_s": 0.8267001520143822,
"session_providers": [
"torch-directml"
],
"available_providers": [
"torch-directml"
],
"inputs": [
{
"name": "pixels",
"shape": [
6,
3,
256,
256
]
}
],
"warmup_s": 0.5573145250091329,
"node_counts": {
"dml": 1,
"cpu": 0
},
"total_nodes": 1,
"target_nodes": 1,
"fraction_on_target": 1.0,
"outputs": [
{
"name": "out_0",
"shape": [
6,
16,
32,
32
]
}
],
"rss_bytes": 696872960
}
},
"parent_rss_bytes_after": 9297932288,
"wsl_available_bytes_after": 21906087936
}
@@ -0,0 +1,183 @@
{
"scope": "InternVLA real Place_Markpen checkpoint, synthetic zero camera/state observations and zero diffusion noise; CPU BF16 policy with FP32 Radeon Cosmos encoder; no robot-task quality claim",
"model_checkpoint_sha256": "586799539888c69c35f84d083e559cc5f0ba887801d000e70e65f58d3f85c313",
"graph_sha256": "9111b3841893acaaa11cf45715d246da3ac9cdd03c7b33fb3c7c20fe38d74704",
"graph_export": {
"status": "passed",
"scope": "fixed-shape Cosmos CI8x8 encoder graph; no InternVLA action-policy claim",
"encoder_sha256": "520a3b878e72ee872faccb1211b5d622d194c0fdd177f2f6df097586b8fa98e5",
"source_sha256": {
"model_cosmos.py": "81f523767d356f16856fa35521bc637ac5df9fc8383ca11fc9a58875eb4c97c7",
"cosmos_ci_torch.py": "a88015b3854b8da730b89c6a35eb3b23721608797208847d9b4cb9a8b8d60f5e"
},
"torch": "2.4.1+cpu",
"input_shape": [
6,
3,
256,
256
],
"input_dtype": "torch.float32",
"output_shape": [
6,
16,
32,
32
],
"max_abs_export_error": 0.0,
"export_s": 3.224664800101891,
"artifact_sha256": "9111b3841893acaaa11cf45715d246da3ac9cdd03c7b33fb3c7c20fe38d74704",
"artifact_bytes": 129872312,
"artifact_path": "\\\\wsl.localhost\\Ubuntu\\home\\zhout\\project\\edge_infer\\models\\InternVLA-cosmos-encoder-batch6.pt2"
},
"policy_torch": "2.13.0+cpu",
"warmups": 0,
"repeats": 1,
"status": "passed",
"policy_load_s": 29.812130431004334,
"policy_parameters_device": "cpu",
"worker_start_and_graph_load_s": 3.608572050987277,
"worker_hello": {
"torch": "2.4.1+cu121",
"torch_directml": "unknown",
"available_providers": [
"NVIDIA GeForce RTX 5090 Laptop GPU\u0000",
"AMD Radeon(TM) 890M Graphics\u0000"
],
"executable": "/home/zhout/project/edge_infer/.venvs/dml/bin/python"
},
"worker_load": {
"ep": "dml",
"graph_path": "/home/zhout/project/edge_infer/models/InternVLA-cosmos-encoder-batch6.pt2",
"session_providers": [
"torch-directml"
],
"available_providers": [
"torch-directml"
],
"node_counts": {
"dml": 1,
"cpu": 0
},
"total_nodes": 1,
"target_nodes": 1,
"fraction_on_target": 1.0,
"session_create_s": 0.8515134960180148,
"warmup_s": 0.8757424399955198,
"rss_bytes": 696877056,
"inputs": [
{
"name": "pixels",
"shape": [
6,
3,
256,
256
]
}
],
"outputs": [
{
"name": "out_0",
"shape": [
6,
16,
32,
32
]
}
],
"profile_path": "",
"ep_directory": "",
"requested_provider_missing": "",
"fallback_note": "",
"onnxruntime": "",
"note": ""
},
"action_shape": [
1,
50,
32
],
"cpu_action_sha256_last": "db60d6590e242694948f7dcdf873b2fff44819d31b0b178fdad5ec9608d46140",
"hybrid_action_sha256_last": "256b244d3b6a8745391690ff88182a5f0f6f9325d279de1e9c5287a00c463798",
"cpu_wall_s": [
3.4815611069789156
],
"hybrid_wall_s": [
4.190806481987238
],
"per_request_action_error": [
{
"max_abs": 0.007147848606109619,
"relative_l2": 0.009007224813103676,
"cosine": 0.9999594688415527
}
],
"max_action_abs_error": 0.007147848606109619,
"max_action_relative_l2_error": 0.009007224813103676,
"min_action_cosine": 0.9999594688415527,
"cpu_p50_wall_s": 3.4815611069789156,
"cpu_p95_wall_s": 3.4815611069789156,
"hybrid_p50_wall_s": 4.190806481987238,
"hybrid_p95_wall_s": 4.190806481987238,
"external_encoder_calls": 1,
"external_encoder_timings": [
{
"worker_s": 1.3663232960388996,
"round_trip_s": 1.370061487017665,
"transport_s": 0.0037381909787654877
}
],
"worker_stats": {
"runs": 1,
"total_run_s": 1.3663232960388996,
"rss_bytes": 697073664,
"peak_rss_bytes": 910974976,
"report": {
"ep": "dml",
"device_name": "AMD Radeon(TM) 890M Graphics\u0000",
"torch": "2.4.1+cu121",
"session_create_s": 0.8515134960180148,
"session_providers": [
"torch-directml"
],
"available_providers": [
"torch-directml"
],
"inputs": [
{
"name": "pixels",
"shape": [
6,
3,
256,
256
]
}
],
"warmup_s": 0.8757424399955198,
"node_counts": {
"dml": 1,
"cpu": 0
},
"total_nodes": 1,
"target_nodes": 1,
"fraction_on_target": 1.0,
"outputs": [
{
"name": "out_0",
"shape": [
6,
16,
32,
32
]
}
],
"rss_bytes": 696877056
}
},
"parent_rss_bytes_after": 9304088576,
"wsl_available_bytes_after": 21880107008
}
@@ -0,0 +1,178 @@
/home/zhout/project/edge_infer/vllm-omni-edge/vllm_omni/version.py:55: RuntimeWarning: vLLM and vLLM-Omni appear to have mismatched major/minor versions:
--> vLLM-Omni version 0.29.0rc2.dev71+g00510ce38.d20260922
--> vLLM version 0.28.0
This will likely cause compatibility issues.
warn_if_misaligned_vllm_version()
W0924 01:00:26.790000 3704813 torch/utils/_pytree.py:630] <enum 'KernelPreference'> is an Enum subclass and is now natively supported by torch.compile as an opaque value type. Calling register_constant() on Enum subclasses is deprecated and will be an error in a future release.
W0924 01:00:26.813000 3704813 torch/utils/_pytree.py:630] <enum 'ScaleCalculationMode'> is an Enum subclass and is now natively supported by torch.compile as an opaque value type. Calling register_constant() on Enum subclasses is deprecated and will be an error in a future release.
INFO 09-24 01:00:28 [importing.py:53] Triton is installed but 0 active driver(s) found (expected 1). Disabling Triton to prevent runtime errors.
WARNING 09-24 01:00:28 [importing.py:65] Triton is installed, but doesn't include CPU backend. Disabling Triton.
INFO 09-24 01:00:28 [importing.py:88] Triton not installed or not compatible; certain GPU-related functions will not be available.
INFO 09-24 01:00:28 [patch.py:259] NVFP4 W4A4 weight_scale NaN-clamp: installed.
INFO 09-24 01:00:28 [patch.py:510] inductor factorable-divisibility patch: installed.
INFO 09-24 01:00:28 [patch.py:646] CPU AOT compile-cache load shim installed: compiled models are reused across engine starts instead of being recompiled.
INFO 09-24 01:00:29 [patch.py:756] CPU weight-load memory release installed (set VLLM_OMNI_CPU_RELEASE_MEMORY=0 to disable).
INFO 09-24 01:00:35 [pipeline_internvla_a1.py:164] Loading InternVLA-A1 weights from /home/zhout/project/edge_infer/models/InternVLA-A1-3B-FT-Place_Markpen
{
"scope": "InternVLA real Place_Markpen checkpoint, synthetic zero camera/state observations and zero diffusion noise; CPU BF16 policy with FP32 Radeon Cosmos encoder; no robot-task quality claim",
"model_checkpoint_sha256": "586799539888c69c35f84d083e559cc5f0ba887801d000e70e65f58d3f85c313",
"graph_sha256": "9111b3841893acaaa11cf45715d246da3ac9cdd03c7b33fb3c7c20fe38d74704",
"graph_export": {
"status": "passed",
"scope": "fixed-shape Cosmos CI8x8 encoder graph; no InternVLA action-policy claim",
"encoder_sha256": "520a3b878e72ee872faccb1211b5d622d194c0fdd177f2f6df097586b8fa98e5",
"source_sha256": {
"model_cosmos.py": "81f523767d356f16856fa35521bc637ac5df9fc8383ca11fc9a58875eb4c97c7",
"cosmos_ci_torch.py": "a88015b3854b8da730b89c6a35eb3b23721608797208847d9b4cb9a8b8d60f5e"
},
"torch": "2.4.1+cpu",
"input_shape": [
6,
3,
256,
256
],
"input_dtype": "torch.float32",
"output_shape": [
6,
16,
32,
32
],
"max_abs_export_error": 0.0,
"export_s": 3.224664800101891,
"artifact_sha256": "9111b3841893acaaa11cf45715d246da3ac9cdd03c7b33fb3c7c20fe38d74704",
"artifact_bytes": 129872312,
"artifact_path": "\\\\wsl.localhost\\Ubuntu\\home\\zhout\\project\\edge_infer\\models\\InternVLA-cosmos-encoder-batch6.pt2"
},
"policy_torch": "2.13.0+cpu",
"warmups": 0,
"repeats": 1,
"status": "passed",
"policy_load_s": 29.812130431004334,
"policy_parameters_device": "cpu",
"worker_start_and_graph_load_s": 3.608572050987277,
"worker_hello": {
"torch": "2.4.1+cu121",
"torch_directml": "unknown",
"available_providers": [
"NVIDIA GeForce RTX 5090 Laptop GPU\u0000",
"AMD Radeon(TM) 890M Graphics\u0000"
],
"executable": "/home/zhout/project/edge_infer/.venvs/dml/bin/python"
},
"worker_load": {
"ep": "dml",
"graph_path": "/home/zhout/project/edge_infer/models/InternVLA-cosmos-encoder-batch6.pt2",
"session_providers": [
"torch-directml"
],
"available_providers": [
"torch-directml"
],
"node_counts": {
"dml": 1,
"cpu": 0
},
"total_nodes": 1,
"target_nodes": 1,
"fraction_on_target": 1.0,
"session_create_s": 0.8515134960180148,
"warmup_s": 0.8757424399955198,
"rss_bytes": 696877056,
"inputs": [
{
"name": "pixels",
"shape": [
6,
3,
256,
256
]
}
],
"outputs": [
{
"name": "out_0",
"shape": [
6,
16,
32,
32
]
}
],
"profile_path": "",
"ep_directory": "",
"requested_provider_missing": "",
"fallback_note": "",
"onnxruntime": "",
"note": ""
},
"action_shape": [
1,
50,
32
],
"cpu_action_sha256_last": "db60d6590e242694948f7dcdf873b2fff44819d31b0b178fdad5ec9608d46140",
"hybrid_action_sha256_last": "256b244d3b6a8745391690ff88182a5f0f6f9325d279de1e9c5287a00c463798",
"max_action_abs_error": 0.007147848606109619,
"max_action_relative_l2_error": 0.009007224813103676,
"min_action_cosine": 0.9999594688415527,
"cpu_p50_wall_s": 3.4815611069789156,
"cpu_p95_wall_s": 3.4815611069789156,
"hybrid_p50_wall_s": 4.190806481987238,
"hybrid_p95_wall_s": 4.190806481987238,
"external_encoder_calls": 1,
"worker_stats": {
"runs": 1,
"total_run_s": 1.3663232960388996,
"rss_bytes": 697073664,
"peak_rss_bytes": 910974976,
"report": {
"ep": "dml",
"device_name": "AMD Radeon(TM) 890M Graphics\u0000",
"torch": "2.4.1+cu121",
"session_create_s": 0.8515134960180148,
"session_providers": [
"torch-directml"
],
"available_providers": [
"torch-directml"
],
"inputs": [
{
"name": "pixels",
"shape": [
6,
3,
256,
256
]
}
],
"warmup_s": 0.8757424399955198,
"node_counts": {
"dml": 1,
"cpu": 0
},
"total_nodes": 1,
"target_nodes": 1,
"fraction_on_target": 1.0,
"outputs": [
{
"name": "out_0",
"shape": [
6,
16,
32,
32
]
}
],
"rss_bytes": 696877056
}
},
"parent_rss_bytes_after": 9304088576,
"wsl_available_bytes_after": 21880107008
}
@@ -0,0 +1,114 @@
{
"scope": "InternVLA real Cosmos CI8x8 image encoder component; synthetic patterned 256x256 input; no full policy or robot-task claim",
"source_files_sha256": {
"model_cosmos.py": "81f523767d356f16856fa35521bc637ac5df9fc8383ca11fc9a58875eb4c97c7",
"cosmos_ci_torch.py": "a88015b3854b8da730b89c6a35eb3b23721608797208847d9b4cb9a8b8d60f5e"
},
"encoder_sha256": "520a3b878e72ee872faccb1211b5d622d194c0fdd177f2f6df097586b8fa98e5",
"device_name": "AMD Radeon(TM) 890M Graphics",
"torch": "2.4.1+cpu",
"torch_directml": "0.2.5.dev240914",
"input_shape": [
6,
3,
256,
256
],
"input_dtype": "float32",
"warmups": 1,
"repeats": 20,
"cpu_load_s": 0.5824802999850363,
"checkpoint_tensor_count": 90,
"encoder_state_tensor_count": 88,
"checkpoint_missing_keys": [],
"checkpoint_unexpected_keys": [
"encoder.patcher._arange",
"encoder.patcher.wavelets"
],
"nonpersistent_buffer_comparison": {
"encoder.patcher._arange": {
"checkpoint_shape": [
2
],
"model_shape": [
2
],
"checkpoint_dtype": "torch.int64",
"model_dtype": "torch.int64",
"max_abs_error": 0.0
},
"encoder.patcher.wavelets": {
"checkpoint_shape": [
2
],
"model_shape": [
2
],
"checkpoint_dtype": "torch.bfloat16",
"model_dtype": "torch.float32",
"max_abs_error": 7.551908493041992e-05
}
},
"dml_load_and_transfer_s": 0.65743709995877,
"status": "passed",
"output_shape": [
6,
16,
32,
32
],
"cpu_output_sha256_float32": "e9e6cf789cbefb1c2f288cf17066f257a89de5548d528e66d2e984ddfddfbe79",
"dml_output_sha256_float32": "f371d1faaf6dfe00759a15d4b238844b6c75aba7757d10683a6b72a7c7c95df0",
"max_abs_error": 1.049041748046875e-05,
"relative_l2_error": 5.140985308571544e-07,
"cosine_similarity": 0.9999999403953552,
"cpu_nearest_rank_p50_wall_s": 0.8351699999766424,
"cpu_nearest_rank_p95_wall_s": 0.8514761000405997,
"dml_nearest_rank_p50_wall_s": 0.13381510006729513,
"dml_nearest_rank_p95_wall_s": 0.14488479995634407,
"cpu_times_s": [
0.8759546000510454,
0.8428523000329733,
0.8379843001021072,
0.837651600013487,
0.8445929000154138,
0.8227816999424249,
0.835246599977836,
0.8439408000558615,
0.8240886999992654,
0.8341848999261856,
0.825562399928458,
0.8514761000405997,
0.8318861000007018,
0.8337026999797672,
0.8306489000096917,
0.8351699999766424,
0.8360441999975592,
0.8495628000237048,
0.8333365999860689,
0.79932450002525
],
"dml_times_s": [
0.3357291999273002,
0.12866579997353256,
0.1395762999309227,
0.13055210001766682,
0.12943259999155998,
0.13381510006729513,
0.13458940002601594,
0.13404289993923157,
0.1437174000311643,
0.12850900006014854,
0.12948820006567985,
0.12899790005758405,
0.1348303999984637,
0.12745120003819466,
0.13730459997896105,
0.14488479995634407,
0.1366466999752447,
0.12663509999401867,
0.13856200000736862,
0.1294181999983266
],
"process_rss_bytes_after": 2996514816
}
@@ -0,0 +1,70 @@
{
"scope": "InternVLA real Cosmos CI8x8 image encoder component; synthetic patterned 256x256 input; no full policy or robot-task claim",
"source_files_sha256": {
"model_cosmos.py": "81f523767d356f16856fa35521bc637ac5df9fc8383ca11fc9a58875eb4c97c7",
"cosmos_ci_torch.py": "a88015b3854b8da730b89c6a35eb3b23721608797208847d9b4cb9a8b8d60f5e"
},
"encoder_sha256": "520a3b878e72ee872faccb1211b5d622d194c0fdd177f2f6df097586b8fa98e5",
"device_name": "AMD Radeon(TM) 890M Graphics",
"torch": "2.4.1+cpu",
"torch_directml": "0.2.5.dev240914",
"input_shape": [
6,
3,
256,
256
],
"input_dtype": "float32",
"warmups": 1,
"repeats": 20,
"cpu_load_s": 0.5824802999850363,
"checkpoint_tensor_count": 90,
"encoder_state_tensor_count": 88,
"checkpoint_missing_keys": [],
"checkpoint_unexpected_keys": [
"encoder.patcher._arange",
"encoder.patcher.wavelets"
],
"nonpersistent_buffer_comparison": {
"encoder.patcher._arange": {
"checkpoint_shape": [
2
],
"model_shape": [
2
],
"checkpoint_dtype": "torch.int64",
"model_dtype": "torch.int64",
"max_abs_error": 0.0
},
"encoder.patcher.wavelets": {
"checkpoint_shape": [
2
],
"model_shape": [
2
],
"checkpoint_dtype": "torch.bfloat16",
"model_dtype": "torch.float32",
"max_abs_error": 7.551908493041992e-05
}
},
"dml_load_and_transfer_s": 0.65743709995877,
"status": "passed",
"output_shape": [
6,
16,
32,
32
],
"cpu_output_sha256_float32": "e9e6cf789cbefb1c2f288cf17066f257a89de5548d528e66d2e984ddfddfbe79",
"dml_output_sha256_float32": "f371d1faaf6dfe00759a15d4b238844b6c75aba7757d10683a6b72a7c7c95df0",
"max_abs_error": 1.049041748046875e-05,
"relative_l2_error": 5.140985308571544e-07,
"cosine_similarity": 0.9999999403953552,
"cpu_nearest_rank_p50_wall_s": 0.8351699999766424,
"cpu_nearest_rank_p95_wall_s": 0.8514761000405997,
"dml_nearest_rank_p50_wall_s": 0.13381510006729513,
"dml_nearest_rank_p95_wall_s": 0.14488479995634407,
"process_rss_bytes_after": 2996514816
}
@@ -2,7 +2,7 @@
All 60 pairings have a disposition. The timing tables below remain the 2026-09-22 measurements. The configuration matrix and affected per-cell reasons incorporate the [2026-09-23 scoped recovery runs](../../../e2e_recovery_20260923/README.md) and [WSL CPU/native Windows expansion](../../../e2e_expansion_20260923/README.md). The expansion adds separate 20-request serial MiniCPM-o text-to-speech profiles on WSL CPU and native Windows GPU, a Spark output-head component profile on the HX370 AMD NPU, complete Spark text-request profiles through standalone llama.cpp and a bounded Omni whole-session stage on native Windows CPU and Radeon 890M, native Windows CPU Qwen3-TTS text-to-WAV profiles through both standalone PyTorch and a bounded Omni whole-session stage, and a hybrid CPU+Radeon 890M Qwen3-TTS profile likewise repeated through a bounded Omni whole-session stage. A pinned GGUF MiniCPM-o route adds combined image+audio to text+speech runs on WSL CPU, native Windows CPU and native Windows Radeon 890M+CPU. All three now pass a bounded complete request through an Omni graph stage; the WSL CPU path additionally passed one warmup plus 20 serial measured requests. These are scoped synthetic cases, not full release qualification.
The Radeon 890M InternVLA cell now has a separate 20-call [Cosmos image-encoder component profile](../../../e2e_expansion_20260923/evidence/internvla_cosmos_radeon890m/README.md). It remains **NOT E2E** because no complete action-policy workload ran on that placement.
The Radeon 890M InternVLA cell now has a [Cosmos image-encoder component profile and a separate CPU+Radeon complete synthetic action-policy profile](../../../e2e_expansion_20260923/evidence/internvla_cosmos_radeon890m/README.md). It remains short of robot-task E2E qualification because real observations, reference actions, units/timestamps, complete admission and lifecycle are unverified.
## Configuration × model
@@ -20,7 +20,7 @@ NOT E2E means no complete device/model workload was verified. “Scoped E2E” i
| PC HX370: CPU / native Windows | scoped E2E: Omni Spark text | scoped E2E: Omni CPU text → complete WAV | NOT E2E | scoped E2E: Omni GGUF image+audio → text+speech | synthetic policy pass |
| PC HX370 + RTX 5090 Laptop / WSL | profile completed | profile completed | scoped E2E: text + image | scoped E2E: text/image/audio → speech | synthetic policy pass |
| PC HX370 + RTX 5090 Laptop / Windows | profile completed | profile completed | NOT E2E | scoped E2E: text/image/audio → speech | synthetic policy pass |
| PC HX370 + Radeon 890M / Windows worker | scoped E2E: Omni Spark text | scoped E2E: Omni Radeon talker/codec + CPU predictor | NOT E2E | scoped E2E: Omni Radeon+CPU image+audio → text+speech | NOT E2E (Cosmos encoder component passed) |
| PC HX370 + Radeon 890M / Windows worker | scoped E2E: Omni Spark text | scoped E2E: Omni Radeon talker/codec + CPU predictor | NOT E2E | scoped E2E: Omni Radeon+CPU image+audio → text+speech | synthetic policy pass: CPU policy + Radeon Cosmos |
| PC HX370 + AMD NPU / Windows worker | NOT E2E (output-head component passed) | NOT E2E | NOT E2E | NOT E2E | NOT E2E |
| PC CPU+iGPU+NPU +/- discrete GPU, joint model execution | NOT E2E | NOT E2E | NOT E2E | NOT E2E | NOT E2E |
| PC Snapdragon X Elite CRD / AI Hub | NOT E2E | NOT E2E | NOT E2E | NOT E2E | NOT E2E |
@@ -57,7 +57,7 @@ NOT E2E means no complete device/model workload was verified. “Scoped E2E” i
| PC HX370 + Radeon 890M / Windows worker | Qwen3-TTS 0.6B CustomVoice | SCOPED_E2E_OMNI_COMPLETE_REQUEST_HYBRID | The pinned Q8_0 CustomVoice talker, F16 codec and punctuation GGUFs completed two named text-to-WAV requests through an Omni whole-session CrispASR stage on native Windows. The runtime log identifies Radeon 890M Vulkan0 for talker/codec and the 432 MB code predictor pinned to CPU FP32; this is not all-Radeon or NPU execution. Both PCM hashes exactly match the earlier standalone outputs. Whisper tiny.en transcribed the first Omni WAV and both standalone WAVs exactly (WER 0 as an intelligibility proxy). One warmup plus 20 serial complete Omni requests for 2.56 s of audio had identical PCM and nearest-rank wall p50/p95 3.298/3.336 s (RTF 1.29/1.30). A public AsyncOmni audio request passed; cancellation drained the worker without stale output or remaining reservation. The earlier standalone profile was 3.310/3.345 s. The default Vulkan configuration previously fell back to CPU, all-Vulkan ran away to a 360-frame cap, and DirectML failed waveform quality. No playable stream, post-cancel restart, loading peak, broad speech quality or sustained power/thermal run is claimed. | Validate playable streaming, restart/recovery, broader voice quality, shared-RAM/GPU peak, concurrency and sustained real-time behavior before wider qualification; [Omni raw evidence](../../../e2e_expansion_20260923/evidence/qwen_tts_omni_hybrid/README.md), [standalone evidence](../../../e2e_expansion_20260923/evidence/qwen_tts_radeon890m_joint/README.md), [failed DirectML route](../../../e2e_expansion_20260923/evidence/qwen_tts_radeon890m_directml/README.md). |
| PC HX370 + Radeon 890M / Windows worker | Qwen3.8-27B | NOT_E2E_PROFILEABLE | FP32 448x448 vision tower: DirectML 85/113 nodes; normalized max error 9.095e-06 versus torch CPU. Historical component path, not full 27B or current graph-stage image-to-text integration. | Recover the hashed tower bundle and qualify its current Omni graph handoff with the language stage. |
| PC HX370 + Radeon 890M / Windows worker | MiniCPM-o 4.5 | SCOPED_E2E_OMNI_COMPLETE_REQUEST_HYBRID | The same pinned GGUF set ran one combined synthetic spoken-question+JPEG → text+speech request through a bounded Omni whole-session graph stage. Logs verify `GGML_VK_VISIBLE_DEVICES=1`, Radeon 890M Vulkan0 language (37/37 layers) and vision, with CPU TTS/Token2Wav/vocoder. It answered “The square in the image is red.” and produced 2.60 s of 24 kHz speech in 18.27 s complete-request wall time (one cold sample, zero warmups); sampled worker RSS peaked at 15.57 GB. The stage verified artifact and binary hashes, reserved 24 GiB shared RAM, emitted a terminal audio event, and in-flight cancellation left no stale output or reservation. The prior standalone prompted run took 18.63 s and its output transcribed with WER 0. This is CPU+iGPU joint execution, not all-Radeon or NPU execution; neither run qualifies general quality or sustained performance. | Validate real multimodal quality, playable streaming, post-cancel restart, loading peak, repeated/concurrent latency and sustained thermal behavior. [Omni raw evidence](../../../e2e_expansion_20260923/evidence/minicpmo_omni_cpp/README.md), [standalone prompted evidence](../../../e2e_expansion_20260923/evidence/minicpmo_cpp_radeon890m_prompted/README.md). |
| PC HX370 + Radeon 890M / Windows worker | InternVLA-A1 | COMPONENT_PASS; NOT_E2E_PROFILEABLE | The pinned Cosmos CI8x8 image encoder ran on Radeon 890M through DirectML with weights and pre-readback output checked on that device. One warmup plus 20 serial patterned `[1,3,256,256]` component requests, including upload/readback, gave nearest-rank wall p50/p95 26.56/27.49 ms versus 156.49/158.71 ms for the same source on CPU; relative L2 output error was 4.73e-07. This is the real vision-tokenizer component only. The separate DirectML/PyTorch 2.4 environment cannot host the installed Omni/vLLM 0.29 policy directly; no complete Radeon or Radeon+CPU action-policy path, real-observation quality, state/admission or handoff benefit is verified. | Build and validate a bounded component-to-policy handoff in the current Omni controller only if whole-request gain exceeds transfer, startup and shared-RAM costs; check action parity on real observations, units/timestamps and cancellation. [Raw component evidence](../../../e2e_expansion_20260923/evidence/internvla_cosmos_radeon890m/README.md). |
| PC HX370 + Radeon 890M / Windows worker | InternVLA-A1 | SYNTHETIC_POLICY_PASS_HYBRID; NOT_TASK_E2E | The real Place_Markpen checkpoint strict-loaded in WSL CPU Omni diffusion. Its Cosmos encoder ran as a pinned FP32 fixed-six-frame export in Omni's external DirectML worker; the selected device was verified as Radeon 890M, and the remainder of the BF16 policy/action loop stayed on CPU. One warmup plus 20 alternating identical synthetic zero-observation/noise requests produced finite `[1,50,32]` actions. Complete-request wall p50/p95 was 2.952/3.322 s hybrid versus 3.178/3.266 s CPU; 16/20 paired calls were faster, but the hybrid tail regressed. Action relative L2 difference was 0.9007% and cosine 0.999959, without a task tolerance. DirectML BF16 aborted, so FP32 encoder is an explicit precision change. Worker startup+graph load took 3.34 s, excluded from warm timing. This proves a scoped synthetic CPU+iGPU policy path, not real-observation quality, action units/time, complete shared-RAM admission, cancellation or sustained benefit. | Validate real observation/reference-action quality and metadata, integrate an admitted bounded graph-stage plan with cancellation/restart, and resolve latency-tail and startup amortization before deployment. [Raw hybrid and component evidence](../../../e2e_expansion_20260923/evidence/internvla_cosmos_radeon890m/README.md). |
| PC HX370 + AMD NPU / Windows worker | Spark-X2.5 | COMPONENT_PASS; NOT_E2E_PROFILEABLE | The real 1.7B output head (RMS norm and full 131,072-logit projection) ran through Omni `external.graph.v1` with VitisAI: one fused NPU partition and seven CPU nodes per request. The A16W8 graph matched top-1 on four captured activations (full-logit SNR 55.43–56.81 dB). One warmup plus 20 serial repeated-input component requests gave p50/p95 10.21/12.44 ms, versus 17.97/20.29 ms for the original FP32 output head on the same Omni CPU stage. NPU startup was 18.21 s versus 4.48 s for FP32 CPU, and NPU worker peak RSS was 3.52 GiB versus 2.06 GiB. No full prefill/decode/KV/sampling, real handoff, power, or sustained run was verified. | Measure an actual vLLM-to-output-head handoff and whole-generation cost, state/cancellation, memory admission and quality before considering a split plan; [component evidence](../../../e2e_expansion_20260923/evidence/spark_amd_npu_output_head/README.md). |
| PC HX370 + AMD NPU / Windows worker | Qwen3-TTS 0.6B CustomVoice | NOT_E2E_PROFILEABLE | No placement- and quality-verified whole-model graph bundle/stateful adapter for this model on this AMD route. Small backend graphs do not establish model support. | Supply and validate the missing matching artifact/backend, then run the complete specified workload. |
| PC HX370 + AMD NPU / Windows worker | Qwen3.8-27B | NOT_E2E_PROFILEABLE | The tested A16W8 whole-vision-tower export failed NPU placement. This conclusion is specific to that export, not all future Qwen/NPU combinations. | Validate a supported export or smaller useful component, including same-checkpoint numerical quality. |
+9 -3
View File
@@ -33,9 +33,15 @@ and output were checked on DirectML, with one warmup and 20 measured patterned
256×256 encodes at 26.56/27.49 ms p50/p95 including transfer and readback,
versus 156.49/158.71 ms for the same CPU source. Relative L2 error was
4.73e-07. The separate older DirectML runtime cannot host the current Omni
policy directly. M4 remains open for complete actions, real observations,
time/units, state/admission and a measured full-request handoff benefit; no
joint CPU+iGPU InternVLA E2E status is inferred from this component timing.
policy directly. A follow-up fixed-six-frame FP32 export ran in the existing
Omni external DirectML worker while the real-weight BF16 action policy stayed
on WSL CPU. Twenty paired synthetic complete-policy requests after one warmup
gave hybrid p50/p95 2.952/3.322 s versus CPU 3.178/3.266 s, with 16/20 paired
calls faster but a worse hybrid tail. Action relative L2 difference was 0.9007%
without a task tolerance. This advances M4 to a synthetic CPU+iGPU policy
path, while real observations/reference actions, units/time, shared-RAM
admission, cancellation and sustained benefit remain open. It does not turn
the joint CPU+iGPU+NPU matrix cell into a pass.
The WSL RTX MiniCPM-o image-to-text+speech path now passes for one 448×448
synthetic red-square image under an explicit 0.61 thinker GPU budget. The
+14
View File
@@ -152,6 +152,20 @@ def test_verify_placement_accepts_a_real_split(a16w8_graph, npu_device):
assert verify_placement(plan, report) is None
def test_load_report_preserves_selected_adapter_name():
from vllm_omni.edge.local.external.client import LoadReport
report = LoadReport.from_body(
{"device_name": "AMD Radeon(TM) 890M Graphics\x00", "fraction_on_target": 1.0,
"placement_granularity": "output_device", "target_nodes": 1, "total_nodes": 1},
ep="dml", graph_path="cosmos.pt2",
)
assert report.device_name == "AMD Radeon(TM) 890M Graphics"
assert report.placement_granularity == "output_device"
assert "1/1 outputs" in report.summary()
assert report.to_dict()["device_name"] == report.device_name
def test_refusing_a_plan_cannot_be_opened(a16w8_graph, npu_device):
plan = plan_external_stage(_artifact(a16w8_graph, fmt=FORMAT_ONNX_FP16), [npu_device])
with pytest.raises(PlacementRefused):
+8 -2
View File
@@ -64,6 +64,8 @@ class LoadReport:
ep: str
graph_path: str
device_name: str = ""
placement_granularity: str = "graph_nodes"
session_providers: tuple[str, ...] = ()
available_providers: tuple[str, ...] = ()
node_counts: dict[str, int] = field(default_factory=dict)
@@ -89,6 +91,8 @@ class LoadReport:
return cls(
ep=ep,
graph_path=graph_path,
device_name=str(body.get("device_name") or "").rstrip("\x00"),
placement_granularity=str(body.get("placement_granularity") or "graph_nodes"),
session_providers=tuple(body.get("session_providers") or ()),
available_providers=tuple(body.get("available_providers") or ()),
node_counts=dict(body.get("node_counts") or {}),
@@ -116,9 +120,11 @@ class LoadReport:
placement = f"placement unverified ({self.note or 'no profiled run'})"
else:
split = ", ".join(f"{k}={v}" for k, v in sorted(self.node_counts.items()))
placement = f"{self.target_nodes}/{self.total_nodes} nodes on {self.ep} ({split})"
counted = "outputs" if self.placement_granularity == "output_device" else "nodes"
placement = f"{self.target_nodes}/{self.total_nodes} {counted} on {self.ep} ({split})"
device_suffix = f" ({self.device_name})" if self.device_name else ""
return (
f"{Path(self.graph_path).name} on {self.ep}: {placement}; "
f"{Path(self.graph_path).name} on {self.ep}{device_suffix}: {placement}; "
f"session {self.session_create_s:.3f}s, warmup {self.warmup_s:.3f}s, "
f"worker rss {self.rss_bytes / 2**20:.0f} MiB"
)
+1
View File
@@ -150,6 +150,7 @@ def _load(state: _Session, body: dict[str, Any], tensors: dict[str, np.ndarray])
info: dict[str, Any] = {
"ep": "dml",
"device_name": device_name,
"placement_granularity": "output_device",
"torch": torch.__version__,
"session_create_s": create_s,
"session_providers": ["torch-directml"],