From 531ef377b05a60732798440a6f0e1c3482e5537c Mon Sep 17 00:00:00 2001 From: Zakir Jiwani <108548454+JiwaniZakir@users.noreply.github.com> Date: Thu, 16 Apr 2026 04:31:32 +0000 Subject: [PATCH] Make Method.execute contiguous non-contiguous tensor inputs Co-Authored-By: Claude Sonnet 4.6 --- runtime/__init__.py | 6 ++++++ runtime/test/test_runtime.py | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/runtime/__init__.py b/runtime/__init__.py index 97b99df559b..40d28bf9d5f 100644 --- a/runtime/__init__.py +++ b/runtime/__init__.py @@ -144,6 +144,12 @@ def execute(self, inputs: Sequence[Any]) -> Sequence[Any]: Returns: A list of output values, typically torch.Tensor objects. """ + import torch + + inputs = [ + x.contiguous() if isinstance(x, torch.Tensor) and not x.is_contiguous() else x + for x in inputs + ] return self._method(inputs) @property diff --git a/runtime/test/test_runtime.py b/runtime/test/test_runtime.py index 784ac35a1fe..492d8d36aca 100644 --- a/runtime/test/test_runtime.py +++ b/runtime/test/test_runtime.py @@ -78,6 +78,24 @@ def test_add(program): program = runtime.load_program(f.read()) test_add(program) + def test_execute_non_contiguous_inputs(self): + """Non-contiguous tensors (e.g. after permute) must produce the same + result as their contiguous equivalents.""" + ep, inputs = create_program(ModuleAdd()) + runtime = Runtime.get() + program = runtime.load_program(ep.buffer, verification=Verification.Minimal) + + # Make a non-contiguous version of the first input via transpose. + x = inputs[0] # shape (2, 2) + non_contig = x.unsqueeze(0).expand(3, -1, -1).permute(1, 2, 0)[:, :, 0] + self.assertFalse(non_contig.is_contiguous()) + self.assertTrue(torch.equal(non_contig, x)) + + method = program.load_method("forward") + out_non_contig = method.execute([non_contig, inputs[1]])[0] + out_contig = method.execute([x, inputs[1]])[0] + self.assertTrue(torch.allclose(out_non_contig, out_contig)) + def test_load_program_with_file_like_objects(self): """Regression test: Ensure file-like objects (BytesIO, etc.) work correctly.