今天在TensorFlow 开发者峰会上,我们宣布下一期课程中的两节课将涵盖Swift for TensorFlow。这些课程将与 Swift 的发明者Chris Lattner共同授课;我们将在课堂上一起展示如何在 Swift for TensorFlow 中迈出实现fastai库等效功能的第一步。我们将展示如何开始使用 Swift 编程,并解释如何使用和扩展 Swift for TensorFlow。
上个月,我展示了 Swift 可以用于高性能数值计算(那篇文章也提供了一些关于 Swift 是什么以及为什么它是一门优秀的语言的背景知识,如果您还没读过,可以看看)。在我对此课题的研究中,我甚至发现 Swift 可以媲美数值库厂商手工优化过的汇编代码的性能。但我曾警告说:“使用 Swift 进行数值编程,例如训练机器学习模型,并不是很多人在做的领域。这方面的信息非常少”。
那么,我们为何此刻拥抱 Swift?因为 Swift for TensorFlow 是我所见的第一个认真尝试将可微分编程深入整合到一种广泛使用的、从零开始设计以追求性能的语言核心中的项目。
fast.ai 对 Swift 的计划
Python、PyTorch 和 fastai 的组合对我们和我们的社区来说运作得非常好。我们有许多正在进行的使用 fastai for PyTorch 的项目,包括即将推出的一本新书、许多新的软件功能以及即将到来的课程中的大部分内容。这个技术栈将继续是我们教学和开发的重点。
Swift for TensorFlow 仍处于非常早期的阶段。我们绝对不建议任何人现在就尝试将他们的所有深度学习项目切换到 Swift!目前,大多数东西还无法工作。大多数计划甚至都还没有开始。对于许多人来说,这是一个完全跳过该项目的好理由。
但对我来说,这是参与其中的一个理由!我喜欢在那些我相信会成功的项目初期就参与进来,并帮助我们的社区也参与进来。事实上,我们对 PyTorch 就是这样做的,在它发布第一个预发布版本后几周内就将其纳入了我们的课程。像这样早期参与项目的人可以对其发展产生巨大影响,很快他们就会发现自己成为了某个正在变得庞大和流行的事物的“内部人士”!
我已经寻找一门真正优秀的数值编程语言超过20年了,所以对我来说,Swift 有可能成为那门语言的可能性让我感到无比兴奋。对于学生来说,有很多项目机会可以选择在 Swift for TensorFlow 中尚未实现的功能,然后提交实现和测试该功能的 PR(Pull Request)。
Python:缺少了什么
在过去三年里,我们在课程中切换使用了许多不同的深度学习库:Theano、TensorFlow、Keras、PyTorch,当然还有我们自己的 fastai 库。但它们都有一个共同点:它们都是 Python 库。这是因为 Python 是当今几乎所有深度学习研究、教学和商业应用中使用的语言。作为一名深度学习实践者而使用除 Python 之外的语言,意味着放弃一个庞大的相互关联的库生态系统,或者通过笨拙的跨语言通信机制来使用 Python 的库。
但 Python 并非设计为快速,也并非设计为安全。相反,它被设计为易用和灵活。为了解决使用“纯 Python”代码的性能问题,我们不得不使用用其他语言(通常是 C 和 C++)编写的库,例如 numpy、PyTorch 和 TensorFlow,它们提供 Python 包装器。为了解决缺乏类型安全的问题,最新版本的 Python 添加了类型注解,允许程序员可选地指定程序中使用的类型。然而,Python 的类型系统无法表达许多类型和类型关系,不进行任何自动化类型推断,也无法在编译时可靠地检查所有类型。因此,在 Python 中使用类型需要大量的额外代码,但其类型安全的级别远远低于其他语言能够提供的水平。
几乎所有 Python 数值编程核心的 C/C++ 库对于研究人员和教育者来说也是一个问题。研究人员无法轻易修改或检查底层代码,因为它需要一套完全不同的工具——对于 MKL 和 cudnn 等库而言,底层代码是优化过的机器语言。教育者无法轻易向学生展示一段代码中到底发生了什么,因为基于 Python 的常规调试和检查方法无法处理其他语言的库。开发者难以对跨越语言边界的代码进行性能分析和优化,而 Python 本身也无法正确优化跨越语言或库边界的代码。
例如,我们一直在对不同类型的循环神经网络架构和归一化层进行大量研究。在这两种情况下,即使在使用 PyTorch 出色的新JIT 编译器时,我们也无法获得与纯 CUDA C 实现相同的性能水平。
去年在 PyTorch 开发者峰会上,我与 Soumith Chintala、贾扬清、Noah Goodman 和 Chris Lattner 参加了一场座谈。在座谈讨论中,我说:“我喜欢 PyTorch 的一切,除了 Python。”我甚至问 Soumith:“你认为有一天我们可能会看到一个‘SwifTorch’吗?”当时我并不知道我们自己很快就会开始使用 Swift!
那么现在怎么办?
最终,任何用 Python 编写的代码都必须处理以下一项或多项问题
- 作为纯 Python 代码运行,这意味着它很慢
- 作为某些 C 库的包装器,这意味着它难以扩展,无法跨库边界进行优化,并且难以进行性能分析和调试
- 被转换成其他语言(例如 PyTorch 使用 TorchScript,或 TensorFlow 使用 XLA),这意味着你实际上不是在最终目标语言中编写,并且必须处理你以为你在编写的语言与实际使用的语言之间的不匹配(至少面临与使用 C 库相同的调试和性能分析挑战)。
另一方面,Swift 与其底层编译器基础设施 LLVM 紧密相连。事实上,Chris Lattner 曾将其描述为“LLVM 的语法糖”。这意味着用 Swift 编写的代码可以充分利用 LLVM 提供的所有性能优化基础设施。此外,Chris Lattner 和 Jacques Pienaar 最近启动了MLIR 编译器基础设施项目,这有可能显著提升 Swift for TensorFlow 的能力。
我们希望能够使用 Swift 来编写深度学习堆栈的每一层,从最高级的网络抽象到最低级的 RNN 单元实现。这样做会有很多好处
- 对于教育来说,一切都不再神秘;你可以清楚地看到你使用的每一段代码中发生了什么
- 对于研究来说,没有什么界限;无论你能想到什么,你都可以实现,并让它全速运行
- 对于开发来说,这门语言会帮助你;你的编辑器会深入理解你的代码,进行智能补全并警告你诸如张量不匹配之类的问题,你的性能分析器会向你展示所有正在进行的步骤,以便你能找到并修复性能问题,你的调试器会让你一步步追踪到调用堆栈的最底层
- 对于部署来说,你可以直接部署你在笔记本电脑上开发时使用的完全相同的代码。无需将其转换为只有你的深度学习服务器才能理解的神秘格式!
总结
对于教育来说,我们的重点始终是解释深度学习的概念,以及实际使用这个工具的实用性。我们发现,只要学生扎实地理解基础知识,并练习将其应用于解决实际问题,他们可以非常容易地(几天内)切换到在不同的库中高效工作。
我们的 Python fastai 库将继续是我们开发和教学的重点。然而,我们将使用 Swift for TensorFlow 进行大量研究,如果它能达到我们认为的潜力,预计它将在未来的课程中越来越多地出现!我们将努力使 Swift 中的实用、世界级深度学习尽可能易于获取——这可能意味着也将我们的 fastai 库(或更好的东西!)带到 Swift 中。现在要确切地说它会是什么样子还为时过早;如果您想参与促成这一切,请务必加入即将到来的课程,无论是亲临旧金山大学现场,还是参加下一期的第二部分MOOC(将于2019年6月推出)。