应用程序安装后,将Core ML Models分发到用户的设备上。
概述
在用户的设备上下载并编译模型-而不是将它与你的应用程序绑定在一起-这对特定用例是有用的。如果您的应用程序用不同的模型来支持各种特性,不强迫用户下载每一个模型,而是在后台单独下载模型可以节省带宽和存储空间。同样,不同的场景和区域可能使用不同的Core ML models。或者可以为用户离线调整模型,并通过无线方式提供更新。
在后台实现下载和编译
模型定义文件(.mlmodel)在被编译之前必须放在设备上。使用URLSession,CloudKit或者其他网络工具包将应用程序的模型下载到用户设备上。
调用compileModel(at:)生成.mlmodelc文件来初始化一个MLModel实例。这个模型拥有和绑定在应用程序中的模型相同的功能。
//编译模型文件并通过编译版本创建MLModel实例。
let compiledUrl = try MLModel.compileModel(at: modelUrl)
let model = try MLModel(contentsOf: compiledUrl)
将可重用模型移动到永久位置
要限制带宽使用,请尽可能避免重复下载和编译过程。模型在一个临时的位置被编译。如果这个被编译的模型可以复用,把它移动到一个永久存放的位置,例如你的应用程序支持的目录。
//拷贝.mlmodelc文件到应用程序支持的目录
// 获取应用程序支持的目录
let fileManager = FileManager.default
let appSupportDirectory = try! fileManager.url(for: .applicationSupportDirectory,
in: .userDomainMask, appropriateFor: compiledUrl, create: true)
// 在支持的目录下创建一个永久的URL
let permanentUrl = appSupportDirectory.appendingPathComponent(compiledUrl.lastPathComponent)
do {
// 如果这个文件存在,替换他,否则,拷贝文件到这个目录下
if fileManager.fileExists(atPath: permanentUrl.absoluteString) {
_ = try fileManager.replaceItemAt(permanentUrl, withItemAt: compiledUrl)
} else {
try fileManager.copyItem(at: compiledUrl, to: permanentUrl)
}
} catch {
print("Error during copy: \(error.localizedDescription)")
}
网友评论