Dunfey · Hotel WWDC as data, est. 1983
Front desk everything
Years
Topics

2020 Developer ToolsAI & Machine Learning

WWDC20 · 25 min · Developer Tools / AI & Machine Learning

Use model deployment and security with Core ML

Discover how to deploy Core ML models outside of your app binary, giving you greater flexibility and control when bringing machine learning features to your app. And learn how Core ML Model Deployment enables you to deliver revised models to your app without requiring an app update. We’ll also walk you through how you can protect custom machine learning models through encryption, and preview your model performance in Xcode. For more information on working with Core ML, including bringing over models trained in environments like TensorFlow and PyTorch, we also recommend watching "Get your models on device using Core ML Converters.”

Watch at developer.apple.com ↗

Transcript all transcripts

Code shown on screen · 3 snippets

Flower Classifier using Core ML Model Deployment swift · at 4:34 ↗
private func classifyFlower(in image: CGImage) {
        // Check for a loaded model
        if let model = flowerClassifier {
            classify(image, using: model)
            return
        }
      
        MLModelCollection.beginAccessing(identifier: "FlowerModels") { [self] result in
            var modelURL: URL?
            switch result {
            case .success(let collection):
                modelURL = collection.entries["FlowerClassifier"]?.modelURL
            case .failure(let error):
                handleModelCollectionFailure(for: error)
            }
                                                               
            let result = loadFlowerClassifier(from: modelURL)
                                                               
            switch result {
            case .success(let model):
                classify(image, using: model)
            case .failure(let error):
                handleModelLoadFailure(for: error)
            }
        }
    }

    func loadFlowerClassifier(from modelURL: URL?) -> Result<FlowerClassifier, Error> {
        if let modelURL = modelURL {
            return Result { try FlowerClassifier(contentsOf: modelURL) }
        } else {
            return Result { try FlowerClassifier(configuration: .init()) }
        }
    }
Compiler flag for encrypting a model swift · at 20:03 ↗
--encrypt "$SRCROOT/HelloFlowers/Models/FlowerStylizer.mlmodelkey"

[Production note] or if we're tight for horizontal space we can use this:

--encrypt "$SRCROOT/.../FlowerStylizer.mlmodelkey"
Working with an encrypted model swift · at 20:50 ↗
func stylizeImage() {
    // If we already loaded the model, apply the effect
    if let model = flowerStylizer {
        applyStyledEffect(using: model)
        return
    }
        
    // Otherwise load and apply
    FlowerStylizer.load { [self] result in
            
        switch result {

        case .success(let model):
            flowerStylizer = model
            DispatchQueue.main.async {
                applyStyledEffect(using: model)
            }
                
        case .failure(let error):
            handleFailure(for: error)
                
        }
    }
}

func handleFailure(for error: Error) {
    switch error {
    case MLModelError.modelKeyFetch:
        handleNetworkFailure()
            
    default:
        handleModelLoadError(error)
    }
}

Resources