在正在举行的 WWDC 2017 上,苹果宣布发布了 Metal 2,详情可参阅机器之心的报道《苹果开发者大会 WWDC 2017:首次全面展示苹果的人工智能实力》。而差不多在 WWDC 2017 大会开幕时,XMART LABS 在 GitHub 上开源了 Bender——一个基于 Metal 的现代机器学习框架,而值得一提的是,Bender 也是著名动画《飞出个未来》里面的一个金属(metal)机器人主角。
项目地址:https://github.com/xmartlabs/Bender
Bender 是 MetalPerformanceShaders 之上的一个抽象层(abstraction layer),可用于操作神经网络。在 Bender 出现后,苹果机器学习环境中有了自己的框架。
本项目的文档在 Documentation 文件中:
- API 包含了上手使用所需的最重要的信息;
- Supported Layers 解释了其支持哪些层以及它们是如何映射到 TensorFlow 指令的;
- Importing 解释了如何将 TensorFlow 等其它框架的模型导入进来。你可以找到如何为自定义实现增强这个功能的信息。
介绍
Bender 是 MetalPerformanceShaders 之上的一个抽象层(abstraction layer),可用于操作神经网络。在人工智能领域,人们对在移动设备上执行神经网络的兴趣越来越大,即便其训练过程是预先在其它地方完成的。我们希望人们能更轻松地在 iOS 上运行预训练的网络。
Bender 可以让你轻松使用卷积、池化、全连接和一些规范化等最常见的层,从而轻松地定义和运行神经网络。而且这些层接收参数的方式也很灵活。我们希望能加载在 TensorFlow 或 Caffe2 等框架上训练好的模型。目前 Bender 有一个用于 TensorFlow 的适配器(adapter),其可以加载带有变量的图(graph),并将其「翻译」成 Bender 的层(layer)。这个功能仅支持一部分 TensorFlow 指令,但我们计划增强它,使其覆盖更大的范围。
Bender 已经可用了,但也仍处在积极的开发阶段,我们也希望看到社区的需求能推动它的发展。注意,它的 API 还不是很稳定。
我们为什么需要 Bender?
在 Xmartlabs,我们曾经想要启动一个机器学习项目,然后我们调查了可以在 iOS 中使用的框架。我们发现 MetalPerformanceShaders 很有用,但对用户并不太友好,我们发现我们重复了大量代码和信息。这就是我们为什么要开始构建一个能够处理这类事物的框架。
我们还发现我们需要将使用 TensorFlow 训练的模型翻译成 iOS 上可用,为此我们需要编写脚本,使之可以将权重转换成 MPSCNN 格式,并将 TensorFlow 的层中不同类型的参数映射成 MPSCNN 核所使用的参数。TensorFlow 可以为 iOS 进行编译,但目前它并不支持在 GPU 上运行,而这却正是我们需要的。我们也并不想将 TensorFlow 的静态库包含在我们的项目中。所以我们开发了一个适配器,可以将 TF graph 解析并翻译成我们的 Bender layer。
使用方法
你可以使用我们自定义的算子在 Bender 中定义你自己的网络,或者你可以加载从 TensorFlow 导出的模型。你可以通过如下方式定义一个网络和加载一个模型:
import Bender// Define a network and how it will load its weights / parameters
let randomLoader = RandomParameterLoader(maxSize: 7*7*64*1024) network = Network(device: device, inputSize: LayerSize(f: 3, w: 256), parameterLoader: randomLoader)
// Convert a graph from TensorFlow
let url = Bundle.main.url(forResource: "myGraph", withExtension: "pb")!
let converter = TFConverter.default() network.nodes = converter.convertGraph(file: url, type: .binary)
// Initialize the network
network.initialize()
// Run the network
let inputImage = ...network.run(inputImage: image, queue: commandQueue) { output in ...
}
你可以在 Importing 文档了解更多信息。
如果你想自己定义你的网络,你可以如下操作:
let network = ...network.start ->> Convolution(convSize: ConvSize(outputChannels: 16, kernelSize: 3, stride: 2))
->> InstanceNorm()
->> Convolution(convSize: ConvSize(outputChannels: 32, kernelSize: 3, stride: 2), neuronType: .relu)
->> InstanceNorm()
->> FullyConnected(neurons: 128)
->> Neuron(type: .tanh)
->> FullyConnected(neurons: 10)
->> Softmax()...
了解更多请查看 API 文档。
环境要求
- iOS 10.0+
- Xcode 8.3+
参与
- 你可以在 GitHub 上参与和贡献;
- 如果你希望增加新功能,请开启一个问题;
- 如果你发现了 bug 或需要帮助,请先查阅过去的问题、FAQ 和 StackOverflow 上的流程(标签:Bender),然后再提交问题。
在贡献之前,请先查阅 CONTRIBUTING 文件了解更多信息。如果你在你的 App 中使用了 Bender,请告知我们。
样例
按以下三个步骤,可以运行一个样例项目:克隆 Bender 库、打开 Bender 工作空间,运行 Example 项目。
安装
CocoaPods
安装 Bender,在你的 Podfile 中添加以下代码即可:
pod 'MetalBender', :git => 'https://github.com/xmartlabs/Bender.git'
记住 Bender 是为 iOS 10 编译的。所以你必须在你的 Podfile 中加入 platform :ios, '10.0'
作者
- Xmartlabs SRL:https://github.com/xmartlabs
- @xmartlabs:https://twitter.com/xmartlabs
更改日志
参阅 CHANGELOG.md 文件。