Skip to content
Closed
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
93 changes: 48 additions & 45 deletions backends/apple/coreml/runtime/delegate/ETCoreMLModelManager.mm
Original file line number Diff line number Diff line change
Expand Up @@ -690,15 +690,16 @@ - (BOOL)executeModelWithHandle:(ModelHandle *)handle
loggingOptions:(const executorchcoreml::ModelLoggingOptions&)loggingOptions
eventLogger:(const executorchcoreml::ModelEventLogger* _Nullable)eventLogger
error:(NSError * __autoreleasing *)error {
BOOL result = NO;
id<ETCoreMLModelExecutor> executor = [self executorWithHandle:handle];
if (!executor) {
ETCoreMLLogErrorAndSetNSError(error,
0,
"%@: Model is already unloaded.",
NSStringFromClass(self.class));
return NO;
return result;
}

ETCoreMLModel *model = executor.model;
if (args.count != model.orderedInputNames.count + model.orderedOutputNames.count) {
ETCoreMLLogErrorAndSetNSError(error,
Expand All @@ -707,46 +708,49 @@ - (BOOL)executeModelWithHandle:(ModelHandle *)handle
NSStringFromClass(self.class),
static_cast<unsigned long>(model.orderedInputNames.count + model.orderedOutputNames.count),
args.count);
return NO;
return result;
}
NSError *localError = nil;
@autoreleasepool {
NSArray<MLMultiArray *> *inputs = [args subarrayWithRange:NSMakeRange(0, model.orderedInputNames.count)];
NSArray<MLMultiArray *> *outputs = [args subarrayWithRange:NSMakeRange(model.orderedInputNames.count, args.count - model.orderedInputNames.count)];
NSArray<MLMultiArray *> *outputBackings = @[];
if (executor.ignoreOutputBackings == NO) {
outputBackings = outputs;
}

NSArray<MLMultiArray *> *modelOutputs = [self executeModelUsingExecutor:executor
inputs:inputs
outputBackings:outputBackings
loggingOptions:loggingOptions
eventLogger:eventLogger
error:error];
if (!modelOutputs) {
return NO;
error:&localError];
if (modelOutputs) {
::set_outputs(outputs, modelOutputs);
result = YES;
}

::set_outputs(outputs, modelOutputs);
}

return YES;
if (!result) {
if (error) {
*error = localError;
}
}
return result;
}

- (BOOL)executeModelWithHandle:(ModelHandle *)handle
argsVec:(std::vector<executorchcoreml::MultiArray>&)argsVec
loggingOptions:(const executorchcoreml::ModelLoggingOptions&)loggingOptions
eventLogger:(const executorchcoreml::ModelEventLogger* _Nullable)eventLogger
error:(NSError * __autoreleasing *)error {
BOOL result = NO;
id<ETCoreMLModelExecutor> executor = [self executorWithHandle:handle];
if (!executor) {
ETCoreMLLogErrorAndSetNSError(error,
0,
"%@: Model is already unloaded.",
NSStringFromClass(self.class));
return NO;
return result;
}

ETCoreMLModel *model = executor.model;
if (argsVec.size() != model.orderedInputNames.count + model.orderedOutputNames.count) {
ETCoreMLLogErrorAndSetNSError(error,
Expand All @@ -755,45 +759,44 @@ - (BOOL)executeModelWithHandle:(ModelHandle *)handle
NSStringFromClass(self.class),
static_cast<unsigned long>(model.orderedInputNames.count + model.orderedOutputNames.count),
argsVec.size());
return NO;
return result;
}

std::vector<executorchcoreml::MultiArray> inputArgs(argsVec.begin(), argsVec.begin() + model.orderedInputNames.count);
std::vector<executorchcoreml::MultiArray> outputArgs(argsVec.begin() + model.orderedInputNames.count, argsVec.end());
NSError *localError = nil;
@autoreleasepool {
NSArray<MLMultiArray *> *inputs = [model prepareInputs:inputArgs error:error];
if (!inputs) {
return NO;
}

NSArray<MLMultiArray *> *outputBackings = @[];
if (executor.ignoreOutputBackings == NO) {
outputBackings = [model prepareOutputBackings:outputArgs error:error];
}

if (!outputBackings) {
return NO;
}

NSArray<MLMultiArray *> *modelOutputs = [self executeModelUsingExecutor:executor
inputs:inputs
outputBackings:outputBackings
loggingOptions:loggingOptions
eventLogger:eventLogger
error:error];
if (!modelOutputs) {
return NO;
NSArray<MLMultiArray *> *inputs = [model prepareInputs:inputArgs error:&localError];
if (inputs) {
NSArray<MLMultiArray *> *outputBackings = @[];
if (executor.ignoreOutputBackings == NO) {
outputBackings = [model prepareOutputBackings:outputArgs error:&localError];
}
if (outputBackings) {
NSArray<MLMultiArray *> *modelOutputs = [self executeModelUsingExecutor:executor
inputs:inputs
outputBackings:outputBackings
loggingOptions:loggingOptions
eventLogger:eventLogger
error:&localError];
if (modelOutputs) {
// Resize for dynamic shapes
for (int i = 0; i < outputArgs.size(); i++) {
auto new_size = to_vector<size_t>(modelOutputs[i].shape);
outputArgs[i].resize(new_size);
argsVec[model.orderedInputNames.count + i].resize(new_size);
}
::set_outputs(outputArgs, modelOutputs);
result = YES;
}
}
}

// Resize for dynamic shapes
for (int i = 0; i < outputArgs.size(); i++) {
auto new_size = to_vector<size_t>(modelOutputs[i].shape);
outputArgs[i].resize(new_size);
argsVec[model.orderedInputNames.count + i].resize(new_size);
}
if (!result) {
if (error) {
*error = localError;
}
::set_outputs(outputArgs, modelOutputs);
return YES;
}
return result;
}

- (BOOL)unloadModelWithHandle:(ModelHandle *)handle {
Expand Down
33 changes: 18 additions & 15 deletions backends/apple/coreml/runtime/delegate/MLModel_Prewarm.mm
Original file line number Diff line number Diff line change
Expand Up @@ -72,26 +72,29 @@ + (MLMultiArray *)zeroedMultiArrayWithShape:(NSArray<NSNumber *> *)shape
@implementation MLModel (Prewarm)

- (BOOL)prewarmUsingState:(nullable id)state error:(NSError * __autoreleasing *)error {
NSError *localError = nil;
BOOL result = NO;
@autoreleasepool {
id<MLFeatureProvider> inputs = ::get_zeroed_inputs(self, error);
if (!inputs) {
return NO;
}


id<MLFeatureProvider> outputs = nil;
if (state != nil) {
id<MLFeatureProvider> inputs = ::get_zeroed_inputs(self, &localError);
if (inputs) {
id<MLFeatureProvider> outputs = nil;
if (state) {
#if MODEL_STATE_IS_SUPPORTED
if (@available(macOS 15.0, iOS 18.0, tvOS 18.0, watchOS 11.0, *)) {
outputs = [self predictionFromFeatures:inputs usingState:(MLState *)state error:error];
return outputs != nil;
}
if (@available(macOS 15.0, iOS 18.0, tvOS 18.0, watchOS 11.0, *)) {
outputs = [self predictionFromFeatures:inputs usingState:(MLState *)state error:&localError];
}
#endif
}
if (!outputs) {
outputs = [self predictionFromFeatures:inputs error:&localError];
}
result = outputs != nil;
}

outputs = [self predictionFromFeatures:inputs error:error];
return outputs != nil;
}
if (!result && error) {
*error = localError;
}
return result;
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -296,7 +296,7 @@ bool execute(Handle* handle,
loggingOptions:logging_options
eventLogger:event_logger
error:&error]) {
ec = static_cast<ErrorCode>(error.code);
ec = error ? static_cast<ErrorCode>(error.code) : ErrorCode::BrokenModel;
return false;
}

Expand Down
Loading