diff --git a/docs/source/tutorials_source/bundled_program.bp b/docs/source/tutorials_source/bundled_program.bp index 4180e381bb3..5e17c877da9 100644 Binary files a/docs/source/tutorials_source/bundled_program.bp and b/docs/source/tutorials_source/bundled_program.bp differ diff --git a/exir/verification/verifier.py b/exir/verification/verifier.py index bc510ff6849..a28cccfde77 100644 --- a/exir/verification/verifier.py +++ b/exir/verification/verifier.py @@ -15,6 +15,8 @@ from executorch.exir.dialects.edge._ops import EdgeOpOverload from executorch.exir.error import ExportError, ExportErrorType from executorch.exir.lowered_backend_module import LoweredBackendModule +from executorch.exir.pass_base import ExportPass +from executorch.exir.pass_manager import PassManager from executorch.exir.passes.dim_order_ops_registry import DimOrderOpsMap from executorch.exir.passes.executorch_prim_ops_registry import _EXECUTORCH_SYM_OPS from executorch.exir.passes.replace_aten_with_edge_pass import DISALLOW_LIST @@ -35,6 +37,58 @@ ALLOWED_META_KEYS = {"spec", "stack_trace"} +class AmbiguousDimOrderError(RuntimeError): + """ + Returns an Ambiguous Dimension Order Error when any node's output tensor dim_order + is ambiguous for a list of formats. + """ + def __init__(self, message: str) -> None: + super().__init__(message) + +def assert_unambiguous_dim_order(gm): + class ExampleNOPPass(ExportPass): + """ + Does nothing! + """ + + def call_operator(self, op, args, kwargs, meta): + return super().call_operator( + op, + args, + kwargs, + meta, + ) + + def detect_ambiguity(gm, checks =[torch.contiguous_format, torch.channels_last]): + """ + Check every node's output tensor dim_order and raise if it is ambiguous for a list of formats. + """ + + def get_tensors(node: torch.fx.Node) -> List[torch.Tensor]: + val = node.meta["val"] + if isinstance(val, torch.Tensor): + return [val] + elif isinstance(val, (list, tuple)): + return [tensor for tensor in val if isinstance(tensor, torch.Tensor)] + return [] + + for node in gm.graph.nodes: + if node.op == "call_function": + for tensor in get_tensors(node): + # Let's make sure dim_order is not ambiguous, raise otherwise. + # This is raising because we can't do anything about it. + # The right course of follow up action is to ask user to try with a different example input. + try: + _ = tensor.dim_order( + ambiguity_check=checks + ) + except Exception: + raise AmbiguousDimOrderError("Tensors should not have ambigous dim order, try with a different example input") + + # any pass or passes, just using MemoryFormatOpsPass as an example + dim_order_pass_manager = PassManager(passes=[ExampleNOPPass()]) + dim_order_pass_manager.add_checks(detect_ambiguity) + dim_order_pass_manager(gm) def _check_tensors_are_contiguous(gm: GraphModule) -> None: # Tensors be of contiguous format @@ -281,7 +335,9 @@ def check_additional(self, gm: GraphModule) -> None: if self.check_edge_ops: _check_tensors_are_contiguous(gm) _check_tensor_args_matching_op_allowed_dtype(gm) - + if self.use_dim_order: + assert_unambiguous_dim_order(gm) + def is_valid(self, gm: GraphModule) -> bool: try: self(gm) diff --git a/extension/llm/tokenizers b/extension/llm/tokenizers index ffd2973e887..ea6f2c5ab3e 160000 --- a/extension/llm/tokenizers +++ b/extension/llm/tokenizers @@ -1 +1 @@ -Subproject commit ffd2973e8879f64c78f01a3f4aa0f77bdc5a1abe +Subproject commit ea6f2c5ab3e6fbb0939d1e8ba7f186f66196b7ed diff --git a/preprocess.pt2 b/preprocess.pt2 new file mode 100644 index 00000000000..718ddb728c2 Binary files /dev/null and b/preprocess.pt2 differ diff --git a/src/pytorch-sphinx-theme b/src/pytorch-sphinx-theme new file mode 160000 index 00000000000..4125c834e1a --- /dev/null +++ b/src/pytorch-sphinx-theme @@ -0,0 +1 @@ +Subproject commit 4125c834e1aa0945fde6ef58ff2f77f7abedc460