如果你懂编程,在听到 Swift 时,你可能会想到为 iOS 或 MacOS 开发应用程序。如果你懂深度学习,那么你肯定听闻过 Swift for Tensorflow(简称 S4TF):https://www.tensorflow.org/swift。那么你可能会问自己:「谷歌为什么要为 Swift 创建一个 TensorFlow 版本呢?毕竟已经有 Python 和 C++版本了;为什么还要增加一种语言?」我将在本文中尝试回答这一问题,并会列出你应该认真关注 S4TF 以及 Swift 语言本身的原因。本文的目的并非进行详尽的解释,而是要提供一般性的概述,文中也会带有大量链接以帮助你更深度地了解。
Swift 背后有强有力的支持
Swift 是 Chris Lattner 在苹果公司工作时创造的。现在,Chris Lattner 在谷歌大脑工作,而谷歌大脑是当今世界上最优秀的人工智能团队之一。Swift 语言的创造者现在正在一家研究深度学习的实验室工作,这足以说明这个项目是严肃的。
一段时间前,谷歌的人意识到,即使 Python 语言非常出色,也仍然存在一些难以克服的局限性。TensorFlow需要一种新语言。经过长时间的斟酌之后,Swift 成为了一个候选项。我这里不会谈及细节,但这里有一份文档描述了 Python 以及其它被考虑过的语言的缺陷,还会解释为何最终将范围缩小到了 Swift:https://github.com/tensorflow/swift/blob/master/docs/WhySwiftForTensorFlow.md
Swift forTensorFlow不只是一个软件库
Swift forTensorFlow不只是另一种语言的TensorFlow。它本质上是 Swift 语言本身的另一个分支。也就是说,S4TF 不只是一个软件库;它本身即是一门语言,其中内置了支持TensorFlow所需的所有功能。举个例子,S4TF 自带非常强大的自动微分系统,这是深度学习在计算梯度时所需的基础功能之一。对比一下 Python——自动微分并非该语言的核心组件。S4TF 中某些新开发的功能之后也被整合进了 Swift 语言。
Swift 速度很快
在我刚得知 Swift 的运行速度和 C 语言代码一样快时,我震惊了。我知道 C 语言经过高度优化,能够达到非常高的速度,但这需要对内存进行微管理(这让 C 语言不能保证内存安全)。另外,C 语言也非常不容易学习。
现在,Swift 在数值运算方面与 C 语言一样快,而且还没有内存安全问题,学习难度也低得多。Swift 背后的 LLVM 非常强大,能够进行非常高效的优化,这能确保你的代码高速运行。
你可以在 Swift 中使用 Python、C 和 C++ 代码
因为用于机器学习的 Swift 还处于非常早期的阶段,所以目前针对 Swift 的机器学习库还不多。但你也不用过于担心这一点,因为 Swift 具备出色的 Python 解释能力。你可以直接将任何 Python 库导入 Swift 进行使用。类似地,你也可将 C 和 C++ 库导入 Swift(对于 C++,你要确保头文件是以 C 语言写的,没有 C++ 的特性)。
总的来说,如果你需要特定的功能,但 Swift 中尚未实现,那么你可以导入对应的 Python、C 或 C++ 软件包。很了不起!
Swift 可以做到非常低层
如果你用过TensorFlow,那么你很可能是通过 Python 使用的。在表层之下,Python 版本的TensorFlow库的下面是 C 代码。所以当你调用TensorFlow中的任意函数时,你都会在某个层级上遇到 C 代码。这意味着如果你要检查其源代码,你所能到达的层级是很有限的。比如说,如果你想要查看卷积的实现方式,那么你不会看到为此编写的 Python 代码,因为它是用 C 语言实现的。
Swift 则不一样。Chris Lattner 将 Swift 称为「LLVM(汇编语言)的句法糖果(https://www.fast.ai/2019/03/06/fastai-swift/)」。这意味着 Swift 本质上非常靠近硬件,其间没有用 C 语言编写的其它层的代码。这也意味着 Swift 代码非常快,就像前面提到的那样。这样的特性让开发者既能在非常高的层级上检查代码,也能深入非常低的层级,同时无需涉及 C 语言。
Swift 的未来发展
Swift 只是谷歌在深度学习领域的创新的一部分。另外还有一个非常相关的组件:MLIR:https://medium.com/tensorflow/mlir-a-new-intermediate-representation-and-compiler-framework-beba999ed18d。MLIR 表示 Multi-Level Intermediate Representation,即多级中间表示。MLIR 将会成为谷歌的统一编译器基础设施,让开发者可以用 Swift(或其它任何支持的语言)写代码,然后将其编译到任何支持的硬件。目前,针对不同的目标硬件有很多不同的编译器,而 MLIR 将改变这种情况。这不仅能让代码实现复用,而且还支持开发者为该编译器编写定制的低层组件。它还允许研究者应用机器学习来优化低层算法:
尽管 MLIR 是用作机器学习的编译器,我们也看到它也能在编译器内部实现机器学习技术的应用!这是尤其重要的,因为开发数值库的工程师的增长速度赶不上机器学习模型或硬件多样化的速度。
想象一下,如果能够基于数据使用深度学习来帮助优化低层的内存分片算法(这正是 Halide 语言想要实现的功能),会怎么样?有关 Halide 语言的更多信息:https://www.youtube.com/watch?v=3uiEyEKji0M。这还仅仅是个开始,机器学习在编译器中更多有创意的应用正在路上!
总结
如果你在深度学习领域,那么你可能就应该开始学习 Swift 了。它相比于 Python 有很多优势。谷歌正在大力投入,想要将 Swift 打造成TensorFlow机器学习基础设施的一大关键组成部分,而且 Swift 很有可能会变成一门深度学习语言。所以,早点参与到 Swift 的发展中能为你提供先发优势。
进一步探索
fast.ai《拥抱用于深度学习的 Swift》:https://www.fast.ai/2019/03/06/fastai-swift/
了解 Swift forTensorFlow:https://towardsdatascience.com/machine-learning-with-swift-for-tensorflow-9167df128912