How to add uncompiled .mlmodel to Xcode UnitTests bundle

509 Views Asked by At

I need to add a .mlmodel file to my Unit Tests in order to check programmatic model compilation in my framework. But, since version 12, Xcode automatically compiles any .mlmodel file added to the project and replaces it with .mlmodelc which is unwanted in this context.

So, if I add a TestModel.mlmodel to the project, I can't get a resource URL:

NSBundle *bundle = [NSBundle bundleForClass:ModelTest.class];

// modelURL is nil
NSURL *modelURL = [bundle URLForResource:@"TestModel" 
                           withExtension:@"mlmodel"];

If I open the compiled bundle package I can see TestModel.mlmodelc there.

How can I disable automatic CoreML model compilation in Xcode?

2

There are 2 best solutions below

2
On

When the project is selected in the Project navigator, all compiled files can be found in the Compile Source section of the Build Phases tab. Can you find the file there ? If yes, you can just remove it.

When the file is selected in the Project navigator, you can do the same from the Target Membership section of the File Inspector : if the box beside the name of your target is checked, uncheck it.

Finally if you want this file to be added to the resources of your application, you probably have to add it to the Copy Bundle Resource section of the Build Phase tab (or you can create a specific Copy File Phase for it)

1
On

Why do not you load it directly? https://developer.apple.com/documentation/coreml/downloading_and_compiling_a_model_on_the_user_s_device

static func loadModel(from path: URL, demo: Bool = false) async throws -> MLModel? {
    let modelConfiguration = MLModelConfiguration()
    // the file is already handled by copying resources in Xcode: -> mlmodelc (compiled)
    let compiledModelURL = demo ? path : try await MLModel.compileModel(at: path)

    return try MLModel(contentsOf: compiledModelURL, configuration: modelConfiguration)
}