Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/winml/modelkit/optim/capabilities/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

from . import (
activation,
algebraic,
attention,
conv,
elimination,
Expand All @@ -30,6 +31,7 @@

__all__ = [
"activation",
"algebraic",
"attention",
"conv",
"elimination",
Expand Down
43 changes: 43 additions & 0 deletions src/winml/modelkit/optim/capabilities/algebraic.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# -------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License.
# --------------------------------------------------------------------------
"""Opt-in, exact algebraic graph-rewrite capabilities."""

from __future__ import annotations

from ..registry import BoolCapability, CapabilityCategory


STATIC_SPLIT_TO_SLICE = BoolCapability(
name="static-split-to-slice",
ort_name=None,
description=(
"Replace statically bounded Split operations with standard Slice operations "
"while preserving output tensors"
),
category=CapabilityCategory.REWRITE,
default=False,
)

CONV_CHANNEL_AFFINE_FOLDING = BoolCapability(
name="conv-channel-affine-folding",
ort_name=None,
description=(
"Fold safe scalar or channel-wise constant Mul/Add branches into Conv "
"weights and bias; direct and static Split/Slice routing only"
),
category=CapabilityCategory.REWRITE,
default=False,
)

CONV_ADD_BATCH_NORMALIZATION_FOLDING = BoolCapability(
name="conv-add-batch-normalization-folding",
ort_name=None,
description=(
"Fold inference-mode BatchNormalization after Conv plus a static Add "
"tensor into Conv parameters"
),
category=CapabilityCategory.REWRITE,
default=False,
)
17 changes: 16 additions & 1 deletion src/winml/modelkit/optim/pipes/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,11 @@

from typing import Any

from .algebraic import (
ALGEBRAIC_CAPABILITIES,
AlgebraicRewritePipe,
AlgebraicRewritePipeConfig,
)
from .base import BasePipe, OptimizationError, PipeConfig, caps_dict
from .fusion import ORTFusionPipe, ORTFusionPipeConfig
from .graph import GRAPH_CAPABILITIES, ORTGraphPipe, ORTGraphPipeConfig
Expand All @@ -22,12 +27,19 @@
# - ORTGraphPipe: ORT graph-level optimizations (C++ optimizer), including constant folding.
# Runs first so downstream pipes see a constant-folded graph (e.g. Reshape shape inputs
# become literal constants, enabling skeleton-based pattern matching).
# - AlgebraicRewritePipe: Exact topology-based algebraic rewrites (after ORT folding).
# - RewritePipe: Pattern-based subgraph rewriting (runs after ORT constant folding so that
# shape constants are visible, but before ORTFusionPipe so normalised patterns are
# available for transformer fusions).
# - ORTFusionPipe: ORT transformer fusions (Python optimizer)
# - SurgeryPipe: Post-optimization model surgery (runs last to clamp constants after folding)
PIPES: list[type[BasePipe]] = [ORTGraphPipe, RewritePipe, ORTFusionPipe, SurgeryPipe]
PIPES: list[type[BasePipe]] = [
ORTGraphPipe,
AlgebraicRewritePipe,
RewritePipe,
ORTFusionPipe,
SurgeryPipe,
]


def get_all_capabilities() -> dict[str, Any]:
Expand All @@ -43,9 +55,12 @@ def get_all_capabilities() -> dict[str, Any]:


__all__ = [
"ALGEBRAIC_CAPABILITIES",
"GRAPH_CAPABILITIES",
"PIPES",
"SURGERY_CAPABILITIES",
"AlgebraicRewritePipe",
"AlgebraicRewritePipeConfig",
"BasePipe",
"ORTFusionPipe",
"ORTFusionPipeConfig",
Expand Down
Loading
Loading