Yann LeCun 曾说,深度学习可能需要一种新的编程语言了。现在 Swift 来了!没错,这就是让万千饱受 Python 缺点困扰的开发者兴奋不已的深度学习语言。本文便将带领读者详细了解一下为什么 Swift 将成为深度学习的下一大热门。

当你听到 Swift 的时候,第一反应肯定会想到 iOS 或者 MacOS 的应用程序开发。当你玩儿过深度学习,也肯定听说过 Swift for Tensorflow (缩写为 S4TF)。

而后你就会产生困惑:「为什么谷歌要为 Swift 创建 TensorFlow 版本呢?已经有了 Python 和 C++ 版本了,为什么还要添加另一种语言?」

在这篇文章中,作者将尝试回答这些问题,并告诉你为什么要认真遵循 S4TF 以及 Swift 语言本身。 本文的目的不是提供非常详细的解释,而是提供下文大量链接内容的一般概述,方便读者深入挖掘。

Swift for Tensorflow 官方地址:

https://www.tensorflow.org/swift/

www.tensorflow.org

Swift 「背景硬」:背后有强大的支持

Swift 是 Chris Lattner 在苹果公司工作时创建的。 Swift 语言的创造者现在在实验室从事深度学习的研究,这一事实应该告诉你,这就是一个严肃的项目。

前段时间,谷歌的员工意识到一件事情:尽管 Python 是一种优秀的语言,但它有许多难以克服的局限性 ——TensorFlow 需要一种新的语言。

经过长时间的考虑,Swift 被选为候选语言。作者没有在本文详细介绍,但下方链接中的文档描述了 Python 的缺点、在候选语言筛选过程中考虑哪些语言,以及最终为何 Swift 当选。

https://github.com/tensorflow/swift/blob/master/docs/WhySwiftForTensorFlow.md

github.com

对于 TensorFlow 来说,Swift 不仅仅是一个库

Swift 对于 TensorFlow 不仅仅是另一种语言的 TF。

它本质上是 Swift 语言本身的另一个分支 (在 git 术语中)。这意味著 S4TF 不是一个库;它本身就是一种语言,内置了支持 TensorFlow 所需的所有功能的特性。

例如,S4TF 中有非常强大的自动微分系统,这是计算梯度所需要的深度学习的基础之一。对比一下 Python,在 Python 中,自动微分不是语言的核心组件。最初作为 S4TF 的一部分开发的功能后来被集成到 Swift 语言本身。

Git 地址:

What a Branch Is

git-scm.com

图标

有关自动微分:

https://github.com/tensorflow/swift/blob/master/docs/AutomaticDifferentiation.md

github.com

Swift 速度极快

当作者第一次知道 Swift 的运行速度和 C 代码一样快时,作者表示非常惊讶。

我们知道 C 语言是高度优化的,可以达到非常高的速度,但这是以微管理内存为代价的,这导致 C 语言不是内存安全的。此外,C 语言并不是一门很容易学的语言。

现在,Swift 在数值计算中运行得和 C 一样快,而且它没有内存安全问题,而且它更容易学习。Swift 背后的 LLVM 编译器非常强大,并且有非常高效的优化,这就确保了代码运行的速度。

Swift 为何和 C 一样快:

High Performance Numeric Programming with Swift: Explorations and Reflections

www.fast.ai

在 Swift 中可以使用 Python,C 和 C ++ 代码

由于适用于机器学习的 Swift 还处于早期阶段,这意味著适合 Swift 的机器学习库并不多。

但不必过于担心这一点,因为 Swift 具有惊人的 Python 互操作性。

只需导入 Swift 中的任何 Python 库,它就能正常工作。类似地,可以将 C 和 C++ 的库导入 Swift(对于 C++,需要确保头文件是用纯 C 编写的,没有 C++ 特性)。

有关 Python 互操作性:

https://github.com/tensorflow/swift/blob/master/docs/PythonInteroperability.md

github.com

导入 C 和 C++ 库:

How to import a C library in Swift using the Swift Package Manager

oleb.net

总而言之,如果需要特定功能,但尚未在 Swift 中实现,则可以导入相应的 Python,C 或 C ++ 包。

Swift 可以在非常底层的地方运行

如果你曾经使用过 TensorFlow,那么通常情况下可能是通过 Python 包完成的。

在底层,Python 版本的 TensorFlow 库底层有 C 代码。所以当你调用 TensorFlow 中的任何函数时,在某种程度上你会碰到一些 C 代码。

这意味著检查源代码的速度是有限的。例如,如果你想了解卷积是如何实现的,你无法看到 Python 代码,因为它是在 C 语言中实现的。

在 Swift 中,情况就不同了。Chris Lattner 称 Swift 是 「LLVM (汇编语言) 的语法糖」。

从本质上说,Swift 非常接近硬体,而且在硬体之间没有其他用 C 编写的代码层。这也意味著 Swift 代码运行速度非常快。这就使得开发人员能够从高到低,任何层次都可以开始检查代码,而无需使用 C。

有关 「LLVM (汇编语言) 的语法糖」:

fast.ai Embracing Swift for Deep Learning

www.fast.ai

接下来的一步

Swift 只是谷歌深度学习创新的一部分。还有一个非常相关的组件:MLIR,代表多级中间表示。

MLIR 将是谷歌统一的编译器基础设施,允许用 Swift (或任何其他受支持的语言) 编写代码,并将其编译到任何受支持的硬体。

目前,针对不同的目标硬体有大量的编译器,但是 MLIR 将改变这一点,不仅允许代码重用,还允许编写定制的编译器底层组件。它还将允许研究人员应用机器学习来优化底层演算法:

虽然 MLIR 充当 ML 的编译器,但我们也看到它可以在编译器中使用机器学习技术! 一点尤其重要,因为开发数值库的工程师的扩展速度赶不上 ML 模型或硬体的多样化。

想像一下,如果我们能够使用深度学习来帮助优化数据的低级内存分块演算法 (类似于 Halide 试图完成的任务) 会怎么样。

有关 MLIR:

https://medium.com/tensorflow/mlir-a-new-intermediate-representation-and-compiler-framework-beba999ed18d

medium.com

有关 Halide:

www.youtube.com

总结

如果你对深入学习感兴趣,那么 Swift 是一门你应该开始学习的语言。

与 Python 相比,它有许多优势。谷歌正在大力投资,使 Swift 成为其 TensorFlow ML 基础设施的一个关键组件,而且很有可能 Swift 将成为深度学习的语言。

所以,早点学习 Swift 总不会有错的。


推荐阅读:
相关文章