From 18656f4b647318ff6cfc80a544e680d8fefc4321 Mon Sep 17 00:00:00 2001 From: Scott Roy <161522778+metascroy@users.noreply.github.com> Date: Mon, 28 Apr 2025 15:26:20 -0700 Subject: [PATCH 1/7] fix rank0 coreml --- .../runtime/delegate/coreml_backend_delegate.mm | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/backends/apple/coreml/runtime/delegate/coreml_backend_delegate.mm b/backends/apple/coreml/runtime/delegate/coreml_backend_delegate.mm index 028191ce497..e93a3ca9bd2 100644 --- a/backends/apple/coreml/runtime/delegate/coreml_backend_delegate.mm +++ b/backends/apple/coreml/runtime/delegate/coreml_backend_delegate.mm @@ -88,9 +88,17 @@ ET_LOG(Error, "%s: DataType=%d is not supported", ETCoreMLStrings.delegateIdentifier.UTF8String, (int)tensor.scalar_type()); return std::nullopt; } - + std::vector strides(tensor.strides().begin(), tensor.strides().end()); std::vector shape(tensor.sizes().begin(), tensor.sizes().end()); + + // If tensor is rank 0, wrap in rank 1 + // See https://github.com/apple/coremltools/blob/8.2/coremltools/converters/mil/frontend/torch/exir_utils.py#L73 + if (strides.size() == 0) { + shape.push_back(1); + strides.push_back(1); + } + MultiArray::MemoryLayout layout(dataType.value(), std::move(shape), std::move(strides)); switch (argType) { case ArgType::Input: { @@ -195,7 +203,10 @@ ModelLoggingOptions get_logging_options(BackendExecutionContext& context) { size_t nInputs = nArgs.first; size_t nOutputs = nArgs.second; delegate_args.reserve(nInputs + nOutputs); - + + // Container to hold wrapped scalar input args + std::vector wrapped_scalars; + // inputs for (size_t i = 0; i < nInputs; i++) { auto multi_array = get_multi_array(args[i], ArgType::Input); From d2dfe4989efa3b8eba4c86e9bc0bb61e84002d74 Mon Sep 17 00:00:00 2001 From: Scott Roy <161522778+metascroy@users.noreply.github.com> Date: Mon, 28 Apr 2025 15:49:22 -0700 Subject: [PATCH 2/7] up --- .ci/scripts/test_model.sh | 2 +- .../apple/coreml/runtime/delegate/coreml_backend_delegate.mm | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/.ci/scripts/test_model.sh b/.ci/scripts/test_model.sh index b0725d36eb7..fa922e897d7 100755 --- a/.ci/scripts/test_model.sh +++ b/.ci/scripts/test_model.sh @@ -222,7 +222,7 @@ test_model_with_coreml() { DTYPE=float16 - "${PYTHON_EXECUTABLE}" -m examples.apple.coreml.scripts.export --model_name="${MODEL_NAME}" --compute_precision "${DTYPE}" + "${PYTHON_EXECUTABLE}" -m examples.apple.coreml.scripts.export --model_name="${MODEL_NAME}" --compute_precision "${DTYPE}" --use_partitioner EXPORTED_MODEL=$(find "." -type f -name "${MODEL_NAME}*.pte" -print -quit) if [ -n "$EXPORTED_MODEL" ]; then diff --git a/backends/apple/coreml/runtime/delegate/coreml_backend_delegate.mm b/backends/apple/coreml/runtime/delegate/coreml_backend_delegate.mm index e93a3ca9bd2..ee92e64de44 100644 --- a/backends/apple/coreml/runtime/delegate/coreml_backend_delegate.mm +++ b/backends/apple/coreml/runtime/delegate/coreml_backend_delegate.mm @@ -203,10 +203,7 @@ ModelLoggingOptions get_logging_options(BackendExecutionContext& context) { size_t nInputs = nArgs.first; size_t nOutputs = nArgs.second; delegate_args.reserve(nInputs + nOutputs); - - // Container to hold wrapped scalar input args - std::vector wrapped_scalars; - + // inputs for (size_t i = 0; i < nInputs; i++) { auto multi_array = get_multi_array(args[i], ArgType::Input); From d57ee4ea182650699b71d51fd4b39b37610b763f Mon Sep 17 00:00:00 2001 From: Scott Roy <161522778+metascroy@users.noreply.github.com> Date: Mon, 28 Apr 2025 15:51:22 -0700 Subject: [PATCH 3/7] up --- .../apple/coreml/runtime/delegate/coreml_backend_delegate.mm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/backends/apple/coreml/runtime/delegate/coreml_backend_delegate.mm b/backends/apple/coreml/runtime/delegate/coreml_backend_delegate.mm index ee92e64de44..594cec65f9a 100644 --- a/backends/apple/coreml/runtime/delegate/coreml_backend_delegate.mm +++ b/backends/apple/coreml/runtime/delegate/coreml_backend_delegate.mm @@ -88,13 +88,12 @@ ET_LOG(Error, "%s: DataType=%d is not supported", ETCoreMLStrings.delegateIdentifier.UTF8String, (int)tensor.scalar_type()); return std::nullopt; } - std::vector strides(tensor.strides().begin(), tensor.strides().end()); std::vector shape(tensor.sizes().begin(), tensor.sizes().end()); // If tensor is rank 0, wrap in rank 1 // See https://github.com/apple/coremltools/blob/8.2/coremltools/converters/mil/frontend/torch/exir_utils.py#L73 - if (strides.size() == 0) { + if (shape.size() == 0) { shape.push_back(1); strides.push_back(1); } From 8be20032e652287ff9cdbd6376ac16084d72c139 Mon Sep 17 00:00:00 2001 From: Scott Roy <161522778+metascroy@users.noreply.github.com> Date: Mon, 28 Apr 2025 15:52:07 -0700 Subject: [PATCH 4/7] up --- .../apple/coreml/runtime/delegate/coreml_backend_delegate.mm | 1 + 1 file changed, 1 insertion(+) diff --git a/backends/apple/coreml/runtime/delegate/coreml_backend_delegate.mm b/backends/apple/coreml/runtime/delegate/coreml_backend_delegate.mm index 594cec65f9a..91abbe207c2 100644 --- a/backends/apple/coreml/runtime/delegate/coreml_backend_delegate.mm +++ b/backends/apple/coreml/runtime/delegate/coreml_backend_delegate.mm @@ -88,6 +88,7 @@ ET_LOG(Error, "%s: DataType=%d is not supported", ETCoreMLStrings.delegateIdentifier.UTF8String, (int)tensor.scalar_type()); return std::nullopt; } + std::vector strides(tensor.strides().begin(), tensor.strides().end()); std::vector shape(tensor.sizes().begin(), tensor.sizes().end()); From 1b1ae3b34cf028ed7ee0316e35d34ad4065d4ee9 Mon Sep 17 00:00:00 2001 From: Scott Roy <161522778+metascroy@users.noreply.github.com> Date: Tue, 29 Apr 2025 12:33:13 -0700 Subject: [PATCH 5/7] up --- .../coreml/runtime/delegate/coreml_backend_delegate.mm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/backends/apple/coreml/runtime/delegate/coreml_backend_delegate.mm b/backends/apple/coreml/runtime/delegate/coreml_backend_delegate.mm index 91abbe207c2..9a0b4facc89 100644 --- a/backends/apple/coreml/runtime/delegate/coreml_backend_delegate.mm +++ b/backends/apple/coreml/runtime/delegate/coreml_backend_delegate.mm @@ -241,6 +241,12 @@ ModelLoggingOptions get_logging_options(BackendExecutionContext& context) { std::array new_shape; for (size_t i = nInputs; i < nInputs + nOutputs; i++) { Tensor& t = args[i]->toTensor(); + // If t has rank 0, do not resize. delegate_args[i] will have rank 1 + // because we resized it in get_multi_array + if (t.dim() == 0) { + continue; + } + int rank = delegate_args[i].layout().rank(); assert (rank <= new_shape.size()); for (int d = 0; d < rank; d++) { From e044e5af19e015d1d315e41df324c7041f04b9ba Mon Sep 17 00:00:00 2001 From: Scott Roy <161522778+metascroy@users.noreply.github.com> Date: Tue, 29 Apr 2025 16:49:38 -0700 Subject: [PATCH 6/7] fix broken test --- .../coreml/runtime/test/ETCoreMLModelManagerTests.mm | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/backends/apple/coreml/runtime/test/ETCoreMLModelManagerTests.mm b/backends/apple/coreml/runtime/test/ETCoreMLModelManagerTests.mm index c10a6ba63f2..15e6b023b8e 100644 --- a/backends/apple/coreml/runtime/test/ETCoreMLModelManagerTests.mm +++ b/backends/apple/coreml/runtime/test/ETCoreMLModelManagerTests.mm @@ -172,10 +172,10 @@ - (void)testAutoreleasepoolError { [ETCoreMLTestUtils inputsForModel:model repeatedValues:@[@(2), @(3)] error:&localError]; XCTAssert(inputArrays); - std::vector multiArrays; + std::vector multiArrays; multiArrays.reserve(inputArrays.count + model.orderedOutputNames.count); for (MLMultiArray *array in inputArrays) { - auto dataTypeOpt = to_multiarray_data_type(array.dataType); + auto dataTypeOpt = executorchcoreml::to_multiarray_data_type(array.dataType); XCTAssert(dataTypeOpt.has_value()); auto dataType = dataTypeOpt.value(); @@ -192,7 +192,7 @@ - (void)testAutoreleasepoolError { } multiArrays.emplace_back(array.dataPointer, - MultiArray::MemoryLayout(dataType, dims, strides)); + executorchcoreml::MultiArray::MemoryLayout(dataType, dims, strides)); } auto inputLayout = multiArrays[0].layout(); @@ -205,15 +205,15 @@ - (void)testAutoreleasepoolError { auto originalLayout = multiArrays[0].layout(); auto corruptedDims = originalLayout.shape(); corruptedDims[0] += 1; - multiArrays[0] = MultiArray(multiArrays[0].data(), - MultiArray::MemoryLayout(originalLayout.dataType(), + multiArrays[0] = executorchcoreml::MultiArray(multiArrays[0].data(), + executorchcoreml::MultiArray::MemoryLayout(originalLayout.dataType(), corruptedDims, originalLayout.strides())); } BOOL success = [self.modelManager executeModelWithHandle:modelHandle argsVec:multiArrays - loggingOptions:ModelLoggingOptions() + loggingOptions:executorchcoreml::ModelLoggingOptions() eventLogger:nullptr error:&localError]; XCTAssertFalse(success); From b10783ecd749583a3b1e44d5de6b8e70447bfa14 Mon Sep 17 00:00:00 2001 From: Scott Roy <161522778+metascroy@users.noreply.github.com> Date: Tue, 29 Apr 2025 19:29:59 -0700 Subject: [PATCH 7/7] up --- .../runtime/test/ETCoreMLModelManagerTests.mm | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/backends/apple/coreml/runtime/test/ETCoreMLModelManagerTests.mm b/backends/apple/coreml/runtime/test/ETCoreMLModelManagerTests.mm index 15e6b023b8e..69e3fc09671 100644 --- a/backends/apple/coreml/runtime/test/ETCoreMLModelManagerTests.mm +++ b/backends/apple/coreml/runtime/test/ETCoreMLModelManagerTests.mm @@ -113,7 +113,7 @@ - (void)testAddModelExecution { XCTAssertNotNil(inputs); MLMultiArray *output = [ETCoreMLTestUtils filledMultiArrayWithShape:inputs[0].shape dataType:inputs[0].dataType repeatedValue:@(0) error:&localError]; NSArray *args = [inputs arrayByAddingObject:output]; - XCTAssertTrue([self.modelManager executeModelWithHandle:handle + XCTAssertTrue([self.modelManager executeModelWithHandle:handle args:args loggingOptions:executorchcoreml::ModelLoggingOptions() eventLogger:nullptr @@ -172,10 +172,10 @@ - (void)testAutoreleasepoolError { [ETCoreMLTestUtils inputsForModel:model repeatedValues:@[@(2), @(3)] error:&localError]; XCTAssert(inputArrays); - std::vector multiArrays; + std::vector multiArrays; multiArrays.reserve(inputArrays.count + model.orderedOutputNames.count); for (MLMultiArray *array in inputArrays) { - auto dataTypeOpt = executorchcoreml::to_multiarray_data_type(array.dataType); + auto dataTypeOpt = to_multiarray_data_type(array.dataType); XCTAssert(dataTypeOpt.has_value()); auto dataType = dataTypeOpt.value(); @@ -192,7 +192,7 @@ - (void)testAutoreleasepoolError { } multiArrays.emplace_back(array.dataPointer, - executorchcoreml::MultiArray::MemoryLayout(dataType, dims, strides)); + MultiArray::MemoryLayout(dataType, dims, strides)); } auto inputLayout = multiArrays[0].layout(); @@ -205,15 +205,15 @@ - (void)testAutoreleasepoolError { auto originalLayout = multiArrays[0].layout(); auto corruptedDims = originalLayout.shape(); corruptedDims[0] += 1; - multiArrays[0] = executorchcoreml::MultiArray(multiArrays[0].data(), - executorchcoreml::MultiArray::MemoryLayout(originalLayout.dataType(), + multiArrays[0] = MultiArray(multiArrays[0].data(), + MultiArray::MemoryLayout(originalLayout.dataType(), corruptedDims, originalLayout.strides())); } BOOL success = [self.modelManager executeModelWithHandle:modelHandle argsVec:multiArrays - loggingOptions:executorchcoreml::ModelLoggingOptions() + loggingOptions:ModelLoggingOptions() eventLogger:nullptr error:&localError]; XCTAssertFalse(success);