特斯拉嫌弃 Python,追捧 C++
近年来,发展势头之迅猛唯一能与AI相匹敌的现象就是Python编程语言。对于许多在纷纷设立数据科学和机器学习部门的企业组织来说,Python已成为了首选语言。改用Python的步伐太快了,以至于许多编程语言被认为已过时了。
然而,特斯拉首席执行官Elon Musk在一连串推文中宣布,特斯拉有多么重视召集一流人才来开发与AI有关的项目。他还宣布准备在家中办一场招待会,邀请AI爱好者参加黑客马拉松(hackathon)。
他补充道,虽然用于计算机视觉模型的神经网络是用Python编写的,但特斯拉团队需要编程技能出众的人员,尤其是C和C++方面。
用C/C++编程以制造自动驾驶汽车听起来很奇怪,但Musk的推文确实让人们对Python方面的炒作产生了一些怀疑。
指出了基础设施复杂性种种陷阱的开发人员对此并不苟同。
马斯克称:我们(显然)也在寻找世界一流的芯片设计师加入我们在帕洛阿尔托和奥斯汀的团队。我们的神经网络最初使用Python以便快速迭代,然后转换成C++/C/裸机驱动程序代码以提高速度(这很重要!)。另外,车辆控制和自动驾驶汽车其余全部都需要大批的C++/C工程师。学历不重要,但都必须通过实打实的编程测试。
然而,不可对推文信以为真。信息量常常被压缩,PyTorch的共同开发者Soumith Chintala点明了Musk真正的含意。他解释道,转换成C++并不意味着要使用C++手动重写,而是自动转换成低级运行时代码。
他还补充道,特斯拉团队有自己的ASIC和传感器等,这些可能有其自己的工具、驱动程序、多阶段中间表示(staged IR)和编译器等。
C ++语言还为硬件功能的直接映射以及基于那些映射的零开销抽象提供了便利。
工具盲目崇拜的诅咒
图片来源:英伟达
大多数流行的机器学习框架都依赖C++,比如TensorFlow、Pytorch甚至CUDA。
如上所示,CUDA不仅仅是一种编程语言,更是一种工具包,为使用C/C++的开发人员提供了扩展,以便表达大量的并行处理,并引导编译器处理应用程序中映射到GPU的那部分。
同样,Python也是一种接口,它让用户可以进行交互并利用机器学习功能,无需学习C++的基本细节。
Python主要用作一种接口。作出这样的安排是为了让更多非编程出身的开发人员可以尽快上手、构建机器学习应用程序。
Python易学易用,它之所以大受欢迎就是缘于这一点。然而,如果人们从头开始学起,会发现C ++这种传统语言之类的语言支持的API和接口用起来很容易。
只需借助经过优化的GPU库(比如BLAS)和计算机视觉库(比如OpenCV)。需要速度的一切应用都可以用C++以及Python绑定加以编写。
与C++不同,Python用户可以从零开始编写一个卷积神经网络,用不了50行代码。C++需要了解一些较复杂的知识,这对新手来说是一大弊端。在这里时间很关键。比如说,正整合机器学习工具的物理学家更喜欢像Python这种轻巧而简单的编程语言。然而,C++在库和框架的后台处理所有繁重任务(读取矩阵乘法)。
据PyTorch团队声称,前端的C++让用户可以在无法使用Python或Python工具不适合任务的环境中进行研究。优点总结如下:
如果用户想在每秒帧数高、延迟低的要求下在纯粹的C++游戏引擎中进行强化学习研究,对于这种环境而言,使用纯粹的C ++库比Python库要适合得多。
由于全局解释器锁(GIL),Python一次无法运行多个系统线程。多重处理是一种替代方法,但扩展性欠佳,并存在诸多缺点。C++没有这样的约束或限制,而且它的线种易于使用和创建。
前端的C++将允许用户继续使用C++,无需在训练期间在Python和C++之间来回切换。
然而,由于Python解释器速度慢,因此对于增强学习项目之类的研究工作而言,Python可能仍难以处理。因此,C++库将是正确的选择。
就TensorFlow而言,总体上来说结合了经过高度优化的C++和CUDA。反过来,它们又使用Eigen(高性能C++和CUDA数值库)和英伟达的cuDNN优化深度神经网络库用于卷积之类的功能。