今年的苹果WWDC全球开发者大会为我们带来了硬件和软件更新。其中,AppleCoreML框架还带来了三项更新:更多的层类型、更多的模型加密支持以及在CloudKit上托管模型更新的能力。移动机器学习在2020年已经不再是炙手可热的新鲜事物,让应用智能化早已成为行业的标准做法。去年,Apple对CoreML进行了重大更新。今年的更新要简单得多:更多的图层类型,更多的模型加密支持,以及在CloudKit上托管模型更新的能力。CoreML是一个Apple框架,用于将机器学习模型集成到应用程序中。优势在于CoreML通过利用CPU、GPU和神经引擎优化设备性能,同时最大限度地减少内存占用和功耗。严格在用户设备上运行模型将消除对网络连接的任何需求,这有助于保持用户数据的私密性和应用程序的响应性。CoreML也是其他几个Apple框架和功能的基础。CoreML是视觉处理、自然语言、语音转换音频文本、音频识别的核心模型。CoreML本身是建立在低级原语之上的,例如Accelerate和BNNS以及MetalPerformanceShaders。更多层类型,为CoreML带来更多特性这些新层类型是:新层类型只能在更高版本中使用,这意味着系统必须是iOS14和macOS11.0,或更高版本。另一个有用的改进是InnerProductLayerBatchedMatMulLayer的8位量化操作。在早期版本的CoreML中,用户可以量化权重,但在加载模型时权重会被反量化为浮点数。使用新的int8DynamicQuantize函数,权重在加载时保持为8位整数值,实际计算也使用整数进行。使用INT8进行计算的潜力是巨大的,在速度方面可能比浮点运算快得多。但研究人员指出,这是否只对CPU而不是GPU有利,因为GPU确实更喜欢浮点数。也许即将到来的神经引擎更新将支持INT8运算。CPU上的CoreML现在也可以使用16位浮点运算,而不是32位浮点运算(在A11Bionic及更高版本上)。16位浮点数现在是一流的Swift数据类型。有了CPU原生支持的16位浮点数,CoreML的速度可以提高一倍以上!在CloudKit上,托管模型更新是可能的。这个新的CoreML功能允许用户独立于应用程序更新模型。现有应用程序不需要发布应用程序更新,只需下载新版本的mlmodel文件即可。这不是一个新想法,一些第三方供应商为此提供了SDK,并且自己构建它并不太困难。使用Apple解决方案的优势在于模型托管在AppleCloud上。用户的应用中可能有多个模型,模型集合可以将多个模型捆绑在一起。更新时,应用程序会立即更新所有模型。用户可以在CloudKit仪表板上创建这些集合。在应用程序中,用户还可以使用MLModelCollection下载和管理模型更新。要准备用于部署的CoreML模型,Xcode中有一个创建模型存档按钮。这将写入.mlarchive文件。用户可以将此模型版本上传到CloudKit仪表板,然后将其放入模型集合中。(mlarchive实际上只是一个包含mlmodelc文件夹内容的zip文件。)另一个不错的功能是用户可以为不同的用户部署不同的模型集合。例如,iPhone上的摄像头与iPad上的摄像头不同,因此用户可能需要创建两个版本的模型,然后将一个发送到应用程序的iPhone端,另一个发送到iPad端。用户可以为设备(iPhone/iPad/TV/watch)、操作系统和版本、区域代码、语言代码和应用程??序版本创建定位规则。新模型的版本部署不是即时的。应用程序需要首先在某个时刻检测到有可用的新模型并自动下载该模型,并将其放置在应用程序的沙箱中。但用户无法控制何时或如何发生这种情况,CoreML可能会在手机未使用时在后台执行下载。因此,最好使用内置模型作为后备来交付应用程序,例如可以处理iPhone和iPad的通用模型。模型加密可防止专有技术被盗。过去,窃取用户的CoreML模型并将其粘贴到其他应用程序中非常容易。从iOS14/macOS11.0开始,CoreML可以自动加密和解密模型,让陌生人无法窥视用户的mlmodelc文件夹。无论用户是否有新的CloudKit部署,加密都是可能的。Xcode加密编译出来的模型mlmodelc并不是原来的mlmodel文件。此模型在用户设备上永久加密。CoreML仅在应用程序实例化模型时自动解密模型。这个解密版本不会作为文件存储在任何地方,只存储在内存中。首先,用户需要一个加密密钥,用户不需要管理这个密钥。Xcode的CoreML模型查看器中现在有一个“创建加密密钥”按钮。当用户单击此按钮时,Xcode会生成一个与Apple开发人员团队帐户关联的新加密密钥。这个过程会创建一个新的.mlmodelkey文件。此密钥存储在Apple的服务器上,但用户也可以获得在Xcode中加密模型所需的本地副本,而无需将此加密密钥嵌入到应用程序中。要加密CoreML模型,用户可以将--encryptYourModel.mlmodelkey添加到模型的编译器标志中。或者,如果要使用CloudKit部署,则需要在创建模型文件时提供加密密钥。要在应用程序实例化时解密模型,CoreML需要通过网络从Apple的服务器获取加密密钥,因此显然需要网络连接。CoreML仅在用户首次使用该模型时需要网络连接。如果网络出现故障且未下载加密密钥,应用程序将无法实例化CoreML模型。因此,用户应该使用新的YourModel.load()函数。它可以完成处理程序并提示用户响应加载错误。该功能易于在应用程序中实现,解决了盗用专有技术的问题。此外,CreateML今年也有了很大的改进,提供了新的模板和训练功能。使用新版Xcode12,用户可以暂停和继续训练,保存模型检查点,预览模型运行状态,用户可以更好地控制训练过程。在CreateML.framework中,提供了更多视觉和自然语言的API。
