ONNX Runtime Objective-C API
The ONNX Runtime Objective-C API public headers are located here.
Here is a simple usage example in Objective-C++:
#import <Foundation/Foundation.h>
#import <onnxruntime.h>
// Adds two numbers using ONNX Runtime.
float add(float a, float b) {
// We will run a simple model which adds two floats.
// The inputs are named `A` and `B` and the output is named `C` (A + B = C).
// All inputs and outputs are float tensors with shape [1].
NSString* const kAddModelPath = @"/path/to/add.ort";
// ORT APIs take an optional NSError** parameter that will be set if an error occurs.
// Here, we will omit error handling (i.e., checking results and the NSError object) for brevity.
NSError* err = nil;
// First, we create the ORT environment.
// The environment is required in order to create an ORT session.
// ORTLoggingLevelWarning should show us only important messages.
ORTEnv* ortEnv = [[ORTEnv alloc] initWithLoggingLevel:ORTLoggingLevelWarning
error:&err];
// Next, we will create some ORT values for our input tensors. We have two floats, `a` and `b`.
auto createOrtValue = [&](float* fp) {
// `data` will hold the memory of the input ORT value. We set it to refer to the memory of the given float (*fp).
NSMutableData* data = [[NSMutableData alloc] initWithBytes:fp length:sizeof(float)];
// This will create a value with a tensor with the given float's data, of type float, and with shape [1].
ORTValue* ortValue = [[ORTValue alloc] initWithTensorData:data
elementType:ORTTensorElementDataTypeFloat
shape:@[ @1 ]
error:&err];
return ortValue;
};
ORTValue* aInputValue = createOrtValue(&a);
ORTValue* bInputValue = createOrtValue(&b);
// Now, we will create an ORT session to run our model.
// One can configure session options with a session options object (ORTSessionOptions).
// We use the default options with sessionOptions:nil.
ORTSession* session = [[ORTSession alloc] initWithEnv:ortEnv
modelPath:kAddModelPath
sessionOptions:nil
error:&err];
// With a session and input values, we have what we need to run the model.
// We provide a dictionary mapping from input name to value and a set of output names.
// This run method will run the model, allocating the output(s), and return them in a dictionary mapping from output name to value.
// As with session creation, it is possible to configure run options with a run options object (ORTRunOptions).
// We use the default options with runOptions:nil.
NSDictionary<NSString*, ORTValue*>* outputs =
[session runWithInputs:@{@"A" : aInputValue, @"B" : bInputValue}
outputNames:[NSSet setWithArray:@[ @"C" ]]
runOptions:nil
error:&err];
// After running the model, we can get the output.
ORTValue* cOutput = outputs[@"C"];
// We know the output value is a float tensor with shape [1]. We will just access it directly.
// It is also possible to query the type information of a value.
NSData* cData = [cOutput tensorDataWithError:&err];
float c;
memcpy(&c, cData.bytes, sizeof(float));
return c;
}