Swift:深度学习的下一个热门趋势?

发表时间: 2019-06-02 12:00


要说哪门语言能扛起深度学习的大旗,搁以前就是妥妥的 Python。但深度学习“三巨头”之一 Yann LeCun 就断言,深度学习可能需要一种新的编程语言了,Python 已成为“过去式”。而 Swift 一经开源,就让众多饱受 Python 性能和灵活性困扰的开发者兴奋高呼:“终于可以抛弃 Python 了!”TensorFlow 官网也曾发文吐槽过 Python 种种缺点,如性能极差、运行时依赖包过多,不擅长并发处理等等。研究人员 Max Pechyonkin 日前撰文认为,就深度学习而言, Swift 会是下一个大热门。为什么 Swfit 如此备受青睐?让我们看看 Max Pechyonkin 是怎么说的。

前 言

如果你非常喜欢编程,当你听到 Swift 时,你可能会联想到 iOS 或 MacOS 的应用程序开发。如果你对深度学习感兴趣,那你一定听说过 Swift for TensorFlow(缩写为 S4TF)。然后你就可以扪心自问:“为什么 Google 要为 Swift 创建 TensorFlow 版呢?不是已经有了 Python 版和 C++ 版吗?那为什么还要添加另一种版本呢?”在本文中,我将尽力回答这一问题,并概述为什么应该要认真遵循 S4TF 以及 Swift 语言本身。本文写作目的并非提供非常详细的解释,而是提供包含大量链接的总体概述,这样如果你感兴趣的话,就可以点击这些链接进行更为深入的研究。

译注:Swift for TensorFlow 官网:
https://www.tensorflow.org/swift/

Swift 背后有强大的支持

Swift 是 Chris Lattner 在 Apple 工作时创造的一门语言。Chris Lattner 目前已经跳槽到 Google Brain 工作,Google Brain 是全球最优秀的人工智能研究团队之一。Swift 语言的创建者目前在实验室从事有关深度学习的研究,这一事实表明 Swift 是一个严肃的项目。

不久前,Google 意识到,尽管 Python 是一门优秀的语言,但它有许多难以克服的局限性。TensorFlow 需要一门新的语言,经过长时间的考虑,Swift 被选为候选者。我并不会在本文详细阐述这些内容,不过有一个文档讲述了 Python 的缺点,以及考虑过哪些其他语言,并阐述了最终如何缩小范围到 Swift 的。

这个文档可参阅:
https://github.com/tensorflow/swift/blob/master/docs/WhySwiftForTensorFlow.md

Swift for TensorFlow 不仅仅是一个库

S4TF 不仅仅是另一种语言版本的 TensorFlow。从本质上来讲,它就是 Swift 语言本身的另一个分支(从 Git 意义来说)。这意味着 S4TF 并非一个库;它本身就是一门语言,内置了支持 TensorFlow 所需的所有功能。例如,S4TF 有一个非常强大的自动微分(automatic differentiation)系统,这是计算梯度所需的深度学习的基础之一。对比一下 Python,在 Python 中,自动微分并不是该语言的核心组成部分。最初作为 S4TF 的一部分开发的一些功能,后来集成到 Swift 语言本身中。

译注: S4TF 的 Git 地址:
https://git-scm.com/book/en/v1/Git-Branching-What-a-Branch-Is有关 Swift 的自动微分的资料可参阅:
https://github.com/tensorflow/swift/blob/master/docs/AutomaticDifferentiation.md

Swift 运行特别快

当我第一次知道 Swift 的运行速度和 C 代码一样快的时候,我感到很惊讶。因为我知道 C 是经过高度优化过的,可以实现非常快的运行速度,但这是以微内存管理为代价,结果导致了 C 无法保证内存安全。

现在,Swift 在数值计算中的运行速度与 C 一样块,而且还不存在内存安全问题,还有,Swift 学习起来也容易得多。Swift 背后的 LLVM 编译器非常强大,具有非常高效的性能优化,可确保你的代码运行速度非常快。

译注:Swift 在数值计算中的运算速度与 C 不相上下,可参阅 fast.ai 发布的文章《Swift 的高性能数值编程:探索与思考》(《High Performance Numeric Programming with Swift: Explorations and Reflections》)网址如下:
https://www.fast.ai/2019/01/10/swift-numerics/

你可以在 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如何将 C 和 C++ 库导入 Swift,可参阅文章《如何使用 Swift 包管理器将 C 库导入 Swift 》(《How to import a C library in Swift using the Swift Package Manager》),网址如下:
https://oleb.net/blog/2017/12/importing-c-library-into-swift/

总之,如果你需要特定的功能,但尚未在 Swift 中实现的话,你可以导入相应的 Python、C 或 C++ 包。这点令人印象深刻!

Swift 可以在非常低的底层中运行

如果你曾经使用过 TensorFlow,那么很有可能是通过 Python 包来实现的。在底层,Python 版的 TensorFlow 库下面有 C 代码。因此,当你调用 TensorFlow 中的任何函数时,在某种程度上你会碰到一些 C 代码。这意味着,当你尝试检查源代码时,存在一个下限。例如,如果你想知道卷积是如何实现的,但你却无法看到相关的 Python 代码,因为它是用 C 实现的。

如果是 Swift,那情况就不一样了。Chris Lattner 称 Swfit 是“LLVM『汇编语言』的语法糖”。也就是说,从本质上来讲,Swift 非常靠近硬件,而且在这两者之间没有用 C 语言编写的其他代码层。这就意味着,Swift 代码运行速度如上所述非常快。这一切使得开发人员能够从非常高的层次开始检查代码到非常低的层次,而无需使用 C。

译注:语法糖,syntactic sugar,也译为糖衣语法,是由英国计算机科学家 Peter John Landin 发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便进程员使用。通常来说使用语法糖能够增加进程的可读性,从而减少进程代码出错的机会。LLVM 的语法糖可参阅文章《fast.ai 拥抱 Swift 进行深度学习》(《fast.ai Embracing Swift for Deep Learning》),网址如下:
https://www.fast.ai/2019/03/06/fastai-swift/

下一步的方向

Swift 只是 Google 深度学习创新的一部分,还有一个非常密切相关的组成部分:MLIR,表示多级中间语言。MLIR 将是 Google 的统一编译器基础,允许用 Swift(或任何其他支持的语言)编写代码,并将其编译到任何支持的硬件。目前,有许多针对不同目标硬件的编译器,但 MLIR 将改变这一点,不仅允许代码重用,而且还允许编写编译器的自定义底层组件。它还允许研究人员应用机器学习来优化低级算法。

译注:中间语言(英语:Intermediate language),在计算机科学中,是指一种应用于抽象机器(abstract machine)的编程语言,它设计的目的,是用来帮助我们分析计算机进程。这个术语源自于编译器,在编译器将源代码编译为目标代码的过程中,会先将源代码转换为一个或多个的中间表述,以方便编译器进行最佳化,并产生出目的机器的机器语言。有关 MLIR 更多信息可参阅《MLIR:一种新的中间语言和编译框架》(《MLIR: A new intermediate representation and compiler framework》),网址如下:
https://medium.com/tensorflow/mlir-a-new-intermediate-representation-and-compiler-framework-beba999ed18d虽然 MLIR 充当了机器学习的编译器,但我们也看到了它支持在编译器中使用机器学习技术!这一点尤为重要,因为开发数值库的工程师的扩展速度赶不上机器学习模型,也不及硬件的多样化。

想象一下,如果我们能够使用深度学习来帮助优化数据的低级内存分块算法(memory tiling algorithms)(类似于 Halide 试图完成的任务)会怎么样。此外,这只是机器学习在编译器中的开始,还有其他创造性应用等待我们去开发!

译注:有关 Halide 更多信息可观看视频《使用 Halide 进行快速图像处理》(《Fast Image Processing using Halide》),视频网址如下:
https://www.youtube.com/watch?v=3uiEyEKji0M

结 语

如果你对深度学习很感兴趣,那么 Swift 就是一门你应该开始学习的语言。和 Python 相比,Swift 有很多优势。Google 正大力投资,使 Swift 成为其 TensorFlow 机器学习基础的关键组成部分,而 Swift 有望成为深度学习的语言。因此,现在就开始学 Swift 吧,及早加入,你将获得先发优势。


推荐阅读

《阿里线下智能方案进化史》

《阿里妈妈:电商预估模型的发展与挑战》

《推荐系统工程师必看:Embedding 技术在深度学习 CTR 模型中的应用》

......

本专题收录了深度学习话题下的 249 篇文章,查看了解更多