{ "schema_version": "1.0", "model": { "model_id": "SP02", "model_name": "MLPerf Tiny streaming wakeword 1D DS-CNN", "task": "keyword spotting", "architecture_family": "temporal depthwise-separable CNN", "source_framework": "TensorFlow/Keras H5 and TensorFlow Lite", "source_repository": "https://github.com/mlcommons/tiny/tree/4addd0fa08d216e20637637874e084895f289da4/benchmark/training/streaming_wakeword", "license": "Apache-2.0; MLCommons Tiny repository", "public_quantized_available": true, "paired_fp32_available": true, "pair_compatibility": "VERIFIED", "dataset": "Google Speech Commands v0.02 plus MUSAN for streaming/noise evaluation", "metric": "task-specific quality metric", "input_shape": [ 1, 30, 1, 40 ], "output_shape": [ 1, 3 ], "preprocessing": "16 kHz mono; 1 s; preemphasis 1-2^-5; 64 ms nonperiodic Hamming; 32 ms stride; power spectrum; 40-bin 0-8 kHz LFBE; log10 and clip/scale to [0,1]; 30 frames", "label_space": "ordered 3 classes: Marvin; Silence; Unknown", "eligibility": "ELIGIBLE", "priority": "P0", "random_seed": 20260806 }, "artifacts": { "fp32": { "artifact_id": "SP02-registered-fp32-keras", "source_url": "https://raw.githubusercontent.com/mlcommons/tiny/4addd0fa08d216e20637637874e084895f289da4/benchmark/training/streaming_wakeword/trained_models/str_ww_ref_model.h5", "local_path": "{model_dir}/source/fp32/source_fp32.h5", "format": "Keras H5", "version": "commit 4addd0fa08d216e20637637874e084895f289da4 (2026-07-06 commit date)", "sha256": "b0f267a8ba0bcb911c1098229c32fac21996e4191c9c60d1fda80adaa70a8add", "license": "Apache-2.0; MLCommons Tiny repository" }, "public_quantized": { "artifact_id": "SP02-public-quantized-01", "source_url": "https://raw.githubusercontent.com/mlcommons/tiny/4addd0fa08d216e20637637874e084895f289da4/benchmark/training/streaming_wakeword/trained_models/str_ww_ref_model.tflite", "local_path": "{model_dir}/source/quantized/source_public_quantized.tflite", "format": "TFLite FlatBuffer", "version": "commit 4addd0fa08d216e20637637874e084895f289da4 (2026-07-06 commit date)", "sha256": "3af8550895ba7d5c584277102b5075c52dcfa63ba9d2b2240f37c4e6abd5dd2b", "license": "Apache-2.0; MLCommons Tiny repository" } }, "stages": [ { "id": "acquire_fp32", "stage": "source_acquisition", "variant": "fp32", "command": [ "{python}", "{repo_root}/scripts/stages/copy_artifact.py", "--input", "{repo_root}/research/downloads/speech_kws/mlperf_4addd0f_str_ww_ref_model_fp32.h5", "--output", "{model_dir}/source/fp32/source_fp32.h5", "--sha256", "b0f267a8ba0bcb911c1098229c32fac21996e4191c9c60d1fda80adaa70a8add", "--report", "{model_dir}/source/fp32/copy_metadata.json" ], "inputs": [ "{repo_root}/research/downloads/speech_kws/mlperf_4addd0f_str_ww_ref_model_fp32.h5" ], "outputs": [ "{model_dir}/source/fp32/source_fp32.h5", "{model_dir}/source/fp32/copy_metadata.json" ], "requires": [], "timeout_sec": 180, "failure_code_on_error": "FAIL_SOURCE", "validation_report": "{model_dir}/source/fp32/copy_metadata.json", "options": { "route": "IMMUTABLE_LOCAL_COPY_FROM_REGISTRY", "checksum_required": true, "quantization_generated": false, "weights_modified": false }, "patch": null }, { "id": "validate_fp32", "stage": "baseline_tensorflow_inference", "variant": "fp32", "command": [ "{repo_root}/environment/converters/tf2onnx/.venv/bin/python", "{repo_root}/scripts/stages/inspect_tensorflow.py", "--format", "keras", "--model", "{model_dir}/source/fp32/source_fp32.h5", "--report", "{model_dir}/baseline/fp32_validation.json", "--input-shape", "1,30,1,40", "--input-min", "0.0", "--input-max", "1.0", "--seed", "20260806", "--threads", "1", "--legacy-depthwise-groups-compat" ], "inputs": [ "{model_dir}/source/fp32/source_fp32.h5" ], "outputs": [ "{model_dir}/baseline/fp32_validation.json" ], "requires": [ "acquire_fp32" ], "timeout_sec": 600, "failure_code_on_error": "FAIL_BASELINE", "validation_report": "{model_dir}/baseline/fp32_validation.json", "options": { "runtime": "tensorflow-cpu 2.20.0", "threads": 1, "batch_size": 1 }, "patch": "DESERIALIZATION_ONLY: redundant legacy DepthwiseConv2D groups=1 ignored" }, { "id": "acquire_quantized", "stage": "public_quantized_acquisition", "variant": "public_quantized", "command": [ "{python}", "{repo_root}/scripts/stages/copy_artifact.py", "--input", "{repo_root}/research/downloads/speech_kws/mlperf_4addd0f_str_ww_ref_model_int8.tflite", "--output", "{model_dir}/source/quantized/source_public_quantized.tflite", "--sha256", "3af8550895ba7d5c584277102b5075c52dcfa63ba9d2b2240f37c4e6abd5dd2b", "--report", "{model_dir}/source/quantized/copy_metadata.json" ], "inputs": [ "{repo_root}/research/downloads/speech_kws/mlperf_4addd0f_str_ww_ref_model_int8.tflite" ], "outputs": [ "{model_dir}/source/quantized/source_public_quantized.tflite", "{model_dir}/source/quantized/copy_metadata.json" ], "requires": [], "timeout_sec": 180, "failure_code_on_error": "FAIL_PUBLIC_QUANTIZED_ARTIFACT", "validation_report": "{model_dir}/source/quantized/copy_metadata.json", "options": { "route": "IMMUTABLE_LOCAL_COPY_FROM_REGISTRY", "checksum_required": true, "quantization_generated": false, "weights_modified": false }, "patch": null }, { "id": "validate_quantized", "stage": "public_quantized_inference", "variant": "public_quantized", "command": [ "{python}", "{repo_root}/scripts/stages/inspect_tflite.py", "--model", "{model_dir}/source/quantized/source_public_quantized.tflite", "--report", "{model_dir}/baseline/public_quantized_validation.json", "--seed", "20260806", "--threads", "1" ], "inputs": [ "{model_dir}/source/quantized/source_public_quantized.tflite" ], "outputs": [ "{model_dir}/baseline/public_quantized_validation.json" ], "requires": [ "acquire_quantized" ], "timeout_sec": 600, "failure_code_on_error": "FAIL_PUBLIC_QUANTIZED_LOAD", "validation_report": "{model_dir}/baseline/public_quantized_validation.json", "options": { "runtime": "ai-edge-litert 2.1.6", "threads": 1, "batch_size": 1 }, "patch": null }, { "id": "document_pair_boundary", "stage": "mixed_format_pair_boundary_documentation", "variant": "pair", "artifact_id": "SP02-mixed-format-pair-boundary", "command": [ "{python}", "{repo_root}/scripts/stages/document_mixed_pair_boundary.py", "--fp32-report", "{model_dir}/baseline/fp32_validation.json", "--quantized-report", "{model_dir}/baseline/public_quantized_validation.json", "--report", "{model_dir}/baseline/mixed_pair_boundary.json", "--boundary", "direct", "--preprocessing-evidence", "16 kHz mono; 1 s; preemphasis 1-2^-5; 64 ms nonperiodic Hamming; 32 ms stride; power spectrum; 40-bin 0-8 kHz LFBE; log10 and clip/scale to [0,1]; 30 frames", "--label-space-evidence", "ordered 3 classes: Marvin; Silence; Unknown", "--dataset-evidence", "Google Speech Commands v0.02 plus MUSAN for streaming/noise evaluation" ], "inputs": [ "{model_dir}/baseline/fp32_validation.json", "{model_dir}/baseline/public_quantized_validation.json" ], "outputs": [ "{model_dir}/baseline/mixed_pair_boundary.json" ], "requires": [ "validate_fp32", "validate_quantized" ], "timeout_sec": 120, "failure_code_on_error": "FAIL_BASELINE_PAIR_MISMATCH", "validation_report": "{model_dir}/baseline/mixed_pair_boundary.json", "options": { "boundary": "direct", "does_not_replace_registry_pair_evidence": true }, "patch": null }, { "id": "convert_fp32_onnx", "stage": "tensorflow_fp32_to_onnx_conversion", "variant": "fp32", "command": [ "{repo_root}/environment/converters/tf2onnx/.venv/bin/python", "{repo_root}/scripts/stages/convert_tensorflow_to_onnx.py", "--input", "{model_dir}/source/fp32/source_fp32.h5", "--output", "{model_dir}/onnx/fp32/model_fp32.onnx", "--report", "{model_dir}/onnx/fp32/onnx_conversion.json", "--opset", "16", "--threads", "1", "--format", "keras", "--input-shape", "1,30,1,40", "--legacy-depthwise-groups-compat" ], "inputs": [ "{model_dir}/source/fp32/source_fp32.h5", "{repo_root}/environment/converters/tf2onnx/tool_versions.json" ], "outputs": [ "{model_dir}/onnx/fp32/model_fp32.onnx", "{model_dir}/onnx/fp32/onnx_conversion.json" ], "requires": [ "acquire_fp32" ], "timeout_sec": 1200, "failure_code_on_error": "FAIL_EXPORT", "validation_report": "{model_dir}/onnx/fp32/onnx_conversion.json", "options": { "converter": "tf2onnx 1.17.0", "tensorflow": "2.20.0", "opset": 16, "inference_only": true, "fixed_shape": [ 1, 30, 1, 40 ], "quantization_generated": false }, "patch": "INFERENCE_WRAPPER_AND_DESERIALIZATION_ONLY: fixed batch=1; ignore redundant legacy DepthwiseConv2D groups=1; no layer, weight, or math change" }, { "id": "validate_fp32_onnx", "stage": "onnx_checker_shape_inference_runtime", "variant": "fp32", "command": [ "{python}", "{repo_root}/scripts/stages/inspect_onnx.py", "--model", "{model_dir}/onnx/fp32/model_fp32.onnx", "--report", "{model_dir}/onnx/fp32/onnx_check.json", "--inferred-model", "{model_dir}/onnx/fp32/model_fp32.inferred.onnx", "--seed", "20260806", "--threads", "1" ], "inputs": [ "{model_dir}/onnx/fp32/model_fp32.onnx" ], "outputs": [ "{model_dir}/onnx/fp32/onnx_check.json", "{model_dir}/onnx/fp32/model_fp32.inferred.onnx" ], "requires": [ "convert_fp32_onnx" ], "timeout_sec": 900, "failure_code_on_error": "FAIL_RUNTIME", "validation_report": "{model_dir}/onnx/fp32/onnx_check.json", "options": { "checker": true, "shape_inference": true, "runtime": "onnxruntime 1.22.1" }, "patch": null }, { "id": "compare_fp32_onnx", "stage": "tensorflow_onnx_numerical_comparison", "variant": "fp32", "command": [ "{repo_root}/environment/converters/tf2onnx/.venv/bin/python", "{repo_root}/scripts/stages/compare_tensorflow_target.py", "--source-format", "keras", "--target-format", "onnx", "--source", "{model_dir}/source/fp32/source_fp32.h5", "--target", "{model_dir}/onnx/fp32/model_fp32.onnx", "--report", "{model_dir}/onnx/fp32/onnx_output_compare.json", "--input-shape", "1,30,1,40", "--input-min", "0.0", "--input-max", "1.0", "--seed", "20260806", "--threads", "1", "--atol", "1e-05", "--rtol", "1e-05", "--legacy-depthwise-groups-compat" ], "inputs": [ "{model_dir}/source/fp32/source_fp32.h5", "{model_dir}/onnx/fp32/model_fp32.onnx" ], "outputs": [ "{model_dir}/onnx/fp32/onnx_output_compare.json" ], "requires": [ "validate_fp32_onnx" ], "timeout_sec": 900, "failure_code_on_error": "FAIL_NUMERICAL_MISMATCH", "validation_report": "{model_dir}/onnx/fp32/onnx_output_compare.json", "options": { "same_seed_source_vs_target": true, "atol": 1e-05, "rtol": 1e-05, "official_quality_metric": "NOT_RUN" }, "patch": "INFERENCE_WRAPPER_AND_DESERIALIZATION_ONLY: fixed batch=1; ignore redundant legacy DepthwiseConv2D groups=1; no layer, weight, or math change" }, { "id": "convert_quantized_onnx", "stage": "public_quantized_tflite_to_onnx", "variant": "public_quantized", "command": [ "{python}", "{repo_root}/scripts/stages/convert_tflite_to_onnx.py", "--converter-python", "{repo_root}/environment/converters/tf2onnx/.venv/bin/python", "--input", "{model_dir}/source/quantized/source_public_quantized.tflite", "--output", "{model_dir}/onnx/quantized/model_quantized.onnx", "--report", "{model_dir}/onnx/quantized/onnx_conversion.json", "--tool-versions", "{repo_root}/environment/converters/tf2onnx/tool_versions.json", "--opset", "16" ], "inputs": [ "{model_dir}/source/quantized/source_public_quantized.tflite", "{repo_root}/environment/converters/tf2onnx/tool_versions.json" ], "outputs": [ "{model_dir}/onnx/quantized/model_quantized.onnx", "{model_dir}/onnx/quantized/onnx_conversion.json" ], "requires": [ "acquire_quantized" ], "timeout_sec": 1200, "failure_code_on_error": "FAIL_EXPORT", "validation_report": "{model_dir}/onnx/quantized/onnx_conversion.json", "options": { "dequantize": false, "quantization_generated": false, "independent_variant_conversion": true }, "patch": null }, { "id": "validate_quantized_onnx", "stage": "onnx_checker_shape_inference_runtime", "variant": "public_quantized", "command": [ "{python}", "{repo_root}/scripts/stages/inspect_onnx.py", "--model", "{model_dir}/onnx/quantized/model_quantized.onnx", "--report", "{model_dir}/onnx/quantized/onnx_check.json", "--inferred-model", "{model_dir}/onnx/quantized/model_quantized.inferred.onnx", "--seed", "20260806", "--threads", "1" ], "inputs": [ "{model_dir}/onnx/quantized/model_quantized.onnx" ], "outputs": [ "{model_dir}/onnx/quantized/onnx_check.json", "{model_dir}/onnx/quantized/model_quantized.inferred.onnx" ], "requires": [ "convert_quantized_onnx" ], "timeout_sec": 900, "failure_code_on_error": "FAIL_RUNTIME", "validation_report": "{model_dir}/onnx/quantized/onnx_check.json", "options": { "checker": true, "shape_inference": true, "runtime": "onnxruntime 1.22.1" }, "patch": null }, { "id": "inspect_quantized_onnx_preservation", "stage": "onnx_quantization_preservation", "variant": "public_quantized", "command": [ "{python}", "{repo_root}/scripts/stages/inspect_onnx_quantization.py", "--onnx-check", "{model_dir}/onnx/quantized/onnx_check.json", "--report", "{model_dir}/onnx/quantized/onnx_quantization_inspection.json" ], "inputs": [ "{model_dir}/onnx/quantized/onnx_check.json" ], "outputs": [ "{model_dir}/onnx/quantized/onnx_quantization_inspection.json" ], "requires": [ "validate_quantized_onnx" ], "timeout_sec": 120, "failure_code_on_error": "FAIL_QUANTIZATION_PRESERVATION", "validation_report": "{model_dir}/onnx/quantized/onnx_quantization_inspection.json", "options": { "float_fallback_is_failure": true, "accepted": [ "QDQ", "QOPERATOR", "MIXED_QOPERATOR_QDQ" ] }, "patch": null }, { "id": "compare_quantized_onnx", "stage": "tflite_onnx_numerical_comparison", "variant": "public_quantized", "command": [ "{python}", "{repo_root}/scripts/stages/compare_tflite_onnx.py", "--tflite", "{model_dir}/source/quantized/source_public_quantized.tflite", "--onnx", "{model_dir}/onnx/quantized/model_quantized.onnx", "--report", "{model_dir}/onnx/quantized/onnx_output_compare.json", "--seed", "20260806", "--threads", "1", "--atol", "0", "--rtol", "0" ], "inputs": [ "{model_dir}/source/quantized/source_public_quantized.tflite", "{model_dir}/onnx/quantized/model_quantized.onnx" ], "outputs": [ "{model_dir}/onnx/quantized/onnx_output_compare.json" ], "requires": [ "validate_quantized_onnx" ], "timeout_sec": 900, "failure_code_on_error": "FAIL_NUMERICAL_MISMATCH", "validation_report": "{model_dir}/onnx/quantized/onnx_output_compare.json", "options": { "strict_integer_or_float_output_match": true, "atol": 0.0, "rtol": 0.0 }, "patch": null } ] }