ONNX
onnxruntime
onnx-mlir
quantization
fp32
ONNX_Models / tests /test_mlir_ir_graphs.py
purejomo's picture
Finalize public ONNX/ONNX-MLIR validation release
ed3aeeb
Raw
History Blame Contribute Delete
4.31 kB
from __future__ import annotations
import hashlib
import xml.etree.ElementTree as ET
from pathlib import Path
import pytest
from scripts import build_mlir_ir_graphs as builder
from scripts import mlir_graph_common as common
def digest(path: Path) -> str:
value = hashlib.sha256()
value.update(path.read_bytes())
return value.hexdigest()
def write_mlir(tmp_path: Path, text: str, name: str = "fixture.mlir") -> Path:
path = tmp_path / name
path.write_text(text.strip() + "\n", encoding="utf-8")
return path
def test_onnx_ssa_dependency_and_static_order(tmp_path: Path) -> None:
path = write_mlir(
tmp_path,
"""
module {
func.func @main(%arg0: tensor<1xf32>) -> tensor<1xf32> {
%relu = "onnx.Relu"(%arg0) {onnx_node_name = "Relu_0"} : (tensor<1xf32>) -> tensor<1xf32>
return %relu : tensor<1xf32>
}
}
""",
)
parsed = common.parse_mlir(path, "TEST:fp32:ONNX")
relu = next(row for row in parsed.operations if row["operation"] == "onnx.Relu")
returned = next(row for row in parsed.operations if row["operation"] == "func.return")
assert relu["results"] == ["%relu"]
assert returned["operands"] == ["%relu"]
assert parsed.unresolved_use_count == 0
assert parsed.duplicate_definition_count == 0
assert parsed.producer_after_consumer_count == 0
svg, metadata = common.render_execution_dependency_svg(
parsed,
title="ONNX primary fixture",
graph_id="TEST:fp32:ONNX",
stage="ONNX",
)
ET.fromstring(svg)
assert metadata["rendered_operation_nodes"] == len(parsed.operations)
assert "STATIC_MLIR_PROGRAM_ORDER" in svg
def test_grouped_results_expand_and_resolve(tmp_path: Path) -> None:
path = write_mlir(
tmp_path,
"""
module {
func.func @main(%arg0: tensor<4xf32>) {
%packed : 2 = "onnx.Split"(%arg0) : (tensor<4xf32>) -> (tensor<2xf32>, tensor<2xf32>)
"onnx.Add"(%packed#0, %packed#1) : (tensor<2xf32>, tensor<2xf32>) -> ()
return
}
}
""",
)
parsed = common.parse_mlir(path, "GROUPED:public_quantized:ONNX")
split = next(row for row in parsed.operations if row["operation"] == "onnx.Split")
assert split["results"] == ["%packed#0", "%packed#1"]
assert parsed.unresolved_use_count == 0
def test_primary_only_selection_is_exactly_21_pairs_42_graphs(tmp_path: Path) -> None:
model_ids = [f"M{index:02d}" for index in range(21)]
rows: list[dict[str, str]] = []
for model_id in model_ids:
for variant in common.VARIANTS:
directory = tmp_path / "models" / model_id / variant
directory.mkdir(parents=True)
onnx_path = directory / "onnx.mlir"
onnx_path.write_text("module {}\n", encoding="utf-8")
rows.append(
{
"model_id": model_id,
"task": "fixture",
"variant": variant,
"onnx_status": "PASS",
"onnx_artifact": str(onnx_path.relative_to(tmp_path)),
"onnx_sha256": digest(onnx_path),
"affine_scf_memref_status": "FAIL",
"affine_scf_memref_artifact": "NONE",
"affine_scf_memref_sha256": "NONE",
"krnl_status": "FAIL",
"krnl_artifact": "NONE",
"krnl_sha256": "NONE",
"llvm_status": "FAIL",
"llvm_artifact": "NONE",
"llvm_sha256": "NONE",
"last_fully_successful_ir": "ONNX",
}
)
by_key = builder.require_matrix_rows(rows)
specs, pairs = builder.build_specs(by_key, tmp_path, primary_only=True)
assert len(specs) == 42
assert len({row["graph_id"] for row in specs}) == 42
assert {row["stage"] for row in specs} == {"ONNX"}
assert {row["graph_role"] for row in specs} == {"PRIMARY_ONNX_DIALECT"}
assert len(pairs) == 21
assert {row["pair_common_stage"] for row in pairs} == {"ONNX"}
assert {row["supplemental_lower_graphs"] for row in pairs} == {
"0 (primary ONNX reused as common view)"
}
with pytest.raises(ValueError, match="duplicate IR coverage row"):
builder.require_matrix_rows([*rows, dict(rows[0])])