Working With Core ML Models in Swift Playgrounds
May 17, 2020
Swift Playgrounds has become an amazing way to try out new ideas without having to worry about the overhead of a real app. One framework that works better in a real project in Xcode though is Core ML. Occasionally you might still need to integrate a Core ML model into a playgrounds book. Here's how to do so:
Generating the Interface
To make interacting with a model easier, Xcode automatically generates interfaces for models. Playgrounds can't generate these interfaces so you'll need to let Xcode generate the interfaces:
- Add the model to an empty project in Xcode
- Open the model from the navigator
- Build the project
- In the "Model Class" section, click on the arrow beside your model's name
- Copy everything from the Swift file into a file in your playground
Loading the Actual Model File
Since the generated interface expects a compiled version of the model to be in the app bundle, these lines will have to be replaced in the in the playground:
class var urlOfModelInThisBundle: URL {
let bundle = Bundle(for: ExampleModel.self)
return bundle.url(forResource: "ExampleModel", withExtension:"mlmodelc")!
}
Replace these lines with the following ones:
class var urlOfModelInThisBundle: URL {
return try! MLModel.compileModel(at: [file])
}
Replace [file]
with a Playground file literal of the
original model file.
Unlike Xcode, Playgrounds doesn't automatically compile the Core ML
model and while you could add a compiled version of the
model (.modelc
), the Playgrounds app really doesn't like
these files. Instead of pre-compiling it, the playground now compiles
the model when Core ML needs a compiled version. This can result in
worse performance, but performance isn't a strength of Playgrounds
anyways.
Notes
By using the process described in this post, you can add a model to your playground but the entire process tedious. I'd really appreciate an easier way to train and use these models on the iPad.