TensorFlow,为什么选择 python 语言?
TensorFlow, why was python the chosen language?
我最近开始研究深度学习和其他 ML 技术,我开始寻找可以简化网络构建和训练过程的框架,然后我发现了 TensorFlow,在该领域经验不多,对我来说,它如果使用深度学习,速度似乎是使大型 ML 系统变得更加重要的一个重要因素,那么为什么 python 被 Google 选择来制作 TensorFlow?把它改成一种可以编译但不能解释的语言不是更好吗?
与 C++ 等语言相比,使用 Python 进行机器学习有哪些优势?
Python 允许您使用 C 和 C++ 创建扩展模块,与本机代码交互,并且仍然可以获得 Python 给您的优势。
TensorFlow 使用 Python,是的,但它也包含大量 C++。
这允许一个更简单的实验界面,减少人类思维开销 Python,并通过使用 C++ 编写最重要的部分来提高性能。
关于 TensorFlow 最重要的一点是,在大多数情况下,核心不是用 Python 编写的:它是用高度的组合编写的-优化的 C++ 和 CUDA(Nvidia 的 GPU 编程语言)。其中大部分是通过使用 Eigen (a high-performance C++ and CUDA numerical library) and NVidia's cuDNN (a very optimized DNN library for NVidia GPUs, for functions such as convolutions).
反过来发生的
TensorFlow的模型是程序员用"some language"(很有可能是Python!)来表达模型。该模型以 TensorFlow 结构编写,例如:
h1 = tf.nn.relu(tf.matmul(l1, W1) + b1)
h2 = ...
当Python为运行时,并没有真正执行。相反,实际创建的是一个 dataflow graph,表示接受特定输入、应用特定操作、将结果作为输入提供给其他操作,等等。 此模型由快速 C++ 代码执行,并且在大多数情况下,操作之间的数据永远不会复制回 Python 代码。
然后程序员 "drives" 通过拉动节点来执行这个模型——用于训练,通常在 Python 中,为了服务,有时在 Python 中,有时在原始中C++:
sess.run(eval_results)
这个 Python(或 C++ 函数调用)使用对 C++ 的进程内调用或分布式版本的 RPC 来调用 C++ TensorFlow 服务器以告诉它执行, 然后将结果复制回来。
话虽如此,让我们重新表述一下这个问题:为什么 TensorFlow 选择 Python 作为第一个得到良好支持的语言来表达和控制模型的训练?
答案很简单:Python 可能是 最适合大量数据科学家和机器学习专家的语言,而且易于集成并控制 C++ 后端,同时也是通用的,在 Google 内外广泛使用,并且是开源的。考虑到使用 TensorFlow 的基本模型,Python 的性能并不那么重要,这是很自然的选择。这也是一个巨大的优势,NumPy 可以轻松地在 Python 中进行预处理——同样具有高性能——然后再将其输入 TensorFlow 以处理真正的 CPU-繁重的事情.
表达执行模型时未使用的模型也有很多复杂性——形状推断(例如,如果你执行 matmul(A, B),结果数据的形状是什么?)和自动 gradient 计算。事实证明,能够在 Python 中表达这些内容非常好,但我认为从长远来看,它们可能会转移到 C++ 后端,以便更容易地添加其他语言。
(当然,希望是在未来支持其他语言来创建和表达模型。运行 使用其他几种语言进行推理已经很简单了——C++ 现在可以工作了,来自 Facebook 的人贡献了 Go 个绑定,我们现在正在审核等)
TF没有写成python。它是用 C++ 编写的(并使用高性能数值libraries and CUDA code) and you can check this by looking at their github. So the core is written not in python but TF provide an interface to many other languages (python, C++, Java, Go)
如果你来自数据分析领域,你可以把它想象成 numpy(不是用 python 编写的,但提供了一个 Python 的接口)或者如果你是一个网络开发者- 将其视为一个数据库(PostgreSQL,MySQL,可以从 Java、Python、PHP)
调用
由于 many reasons,Python 前端(人们在 TF 中编写模型的语言)最受欢迎。在我看来,主要原因是历史原因:大多数 ML 用户已经在使用它(另一个流行的选择是 R),所以如果你不提供 python 的接口,你的库很可能注定要默默无闻。
但是在python中编写并不意味着你的模型在python中执行。相反,如果你以正确的方式编写你的模型 Python 在 TF 图的评估期间永远不会执行(除了 tf.py_func(),它存在用于调试并且应该在真实模型中避免正是因为它在Python这边执行。
这与 numpy 等不同。例如,如果你做 np.linalg.eig(np.matmul(A, np.transpose(A))
(即 eig(AA')
),该操作将计算转置在一些快速语言(C++ 或 fortran)中,return 到 python,接受它从 python 和 A 一起计算,并用某种快速语言计算乘法并将 return 乘以 python,然后计算特征值并将 return 乘以 python。因此,尽管 matmul 和 eig 等昂贵的运算得到了有效计算,但您仍然会通过将结果移动到 python 并强制执行来浪费时间。 TF 不会这样做,一旦您定义了图表,您的张量就不是在 python 中而是在 C++/CUDA/something 中流动。
您可以从 here 查看的最新比率显示 TensorFlow C++ 内部占用了约 50% 的代码,Python 占用了约 40% 的代码。
C++ 和 Python 都是 Google 的官方语言,所以难怪为什么会这样。如果我必须在存在 C++ 和 Python 的地方提供快速回归...
C++ 属于计算代数,Python 用于其他一切,包括测试。知道今天的测试是多么普遍,难怪 Python 代码对 TF 的贡献如此之大。
我最近开始研究深度学习和其他 ML 技术,我开始寻找可以简化网络构建和训练过程的框架,然后我发现了 TensorFlow,在该领域经验不多,对我来说,它如果使用深度学习,速度似乎是使大型 ML 系统变得更加重要的一个重要因素,那么为什么 python 被 Google 选择来制作 TensorFlow?把它改成一种可以编译但不能解释的语言不是更好吗?
与 C++ 等语言相比,使用 Python 进行机器学习有哪些优势?
Python 允许您使用 C 和 C++ 创建扩展模块,与本机代码交互,并且仍然可以获得 Python 给您的优势。
TensorFlow 使用 Python,是的,但它也包含大量 C++。
这允许一个更简单的实验界面,减少人类思维开销 Python,并通过使用 C++ 编写最重要的部分来提高性能。
关于 TensorFlow 最重要的一点是,在大多数情况下,核心不是用 Python 编写的:它是用高度的组合编写的-优化的 C++ 和 CUDA(Nvidia 的 GPU 编程语言)。其中大部分是通过使用 Eigen (a high-performance C++ and CUDA numerical library) and NVidia's cuDNN (a very optimized DNN library for NVidia GPUs, for functions such as convolutions).
反过来发生的TensorFlow的模型是程序员用"some language"(很有可能是Python!)来表达模型。该模型以 TensorFlow 结构编写,例如:
h1 = tf.nn.relu(tf.matmul(l1, W1) + b1)
h2 = ...
当Python为运行时,并没有真正执行。相反,实际创建的是一个 dataflow graph,表示接受特定输入、应用特定操作、将结果作为输入提供给其他操作,等等。 此模型由快速 C++ 代码执行,并且在大多数情况下,操作之间的数据永远不会复制回 Python 代码。
然后程序员 "drives" 通过拉动节点来执行这个模型——用于训练,通常在 Python 中,为了服务,有时在 Python 中,有时在原始中C++:
sess.run(eval_results)
这个 Python(或 C++ 函数调用)使用对 C++ 的进程内调用或分布式版本的 RPC 来调用 C++ TensorFlow 服务器以告诉它执行, 然后将结果复制回来。
话虽如此,让我们重新表述一下这个问题:为什么 TensorFlow 选择 Python 作为第一个得到良好支持的语言来表达和控制模型的训练?
答案很简单:Python 可能是 最适合大量数据科学家和机器学习专家的语言,而且易于集成并控制 C++ 后端,同时也是通用的,在 Google 内外广泛使用,并且是开源的。考虑到使用 TensorFlow 的基本模型,Python 的性能并不那么重要,这是很自然的选择。这也是一个巨大的优势,NumPy 可以轻松地在 Python 中进行预处理——同样具有高性能——然后再将其输入 TensorFlow 以处理真正的 CPU-繁重的事情.
表达执行模型时未使用的模型也有很多复杂性——形状推断(例如,如果你执行 matmul(A, B),结果数据的形状是什么?)和自动 gradient 计算。事实证明,能够在 Python 中表达这些内容非常好,但我认为从长远来看,它们可能会转移到 C++ 后端,以便更容易地添加其他语言。
(当然,希望是在未来支持其他语言来创建和表达模型。运行 使用其他几种语言进行推理已经很简单了——C++ 现在可以工作了,来自 Facebook 的人贡献了 Go 个绑定,我们现在正在审核等)
TF没有写成python。它是用 C++ 编写的(并使用高性能数值libraries and CUDA code) and you can check this by looking at their github. So the core is written not in python but TF provide an interface to many other languages (python, C++, Java, Go)
如果你来自数据分析领域,你可以把它想象成 numpy(不是用 python 编写的,但提供了一个 Python 的接口)或者如果你是一个网络开发者- 将其视为一个数据库(PostgreSQL,MySQL,可以从 Java、Python、PHP)
调用由于 many reasons,
Python 前端(人们在 TF 中编写模型的语言)最受欢迎。在我看来,主要原因是历史原因:大多数 ML 用户已经在使用它(另一个流行的选择是 R),所以如果你不提供 python 的接口,你的库很可能注定要默默无闻。
但是在python中编写并不意味着你的模型在python中执行。相反,如果你以正确的方式编写你的模型 Python 在 TF 图的评估期间永远不会执行(除了 tf.py_func(),它存在用于调试并且应该在真实模型中避免正是因为它在Python这边执行。
这与 numpy 等不同。例如,如果你做 np.linalg.eig(np.matmul(A, np.transpose(A))
(即 eig(AA')
),该操作将计算转置在一些快速语言(C++ 或 fortran)中,return 到 python,接受它从 python 和 A 一起计算,并用某种快速语言计算乘法并将 return 乘以 python,然后计算特征值并将 return 乘以 python。因此,尽管 matmul 和 eig 等昂贵的运算得到了有效计算,但您仍然会通过将结果移动到 python 并强制执行来浪费时间。 TF 不会这样做,一旦您定义了图表,您的张量就不是在 python 中而是在 C++/CUDA/something 中流动。
您可以从 here 查看的最新比率显示 TensorFlow C++ 内部占用了约 50% 的代码,Python 占用了约 40% 的代码。
C++ 和 Python 都是 Google 的官方语言,所以难怪为什么会这样。如果我必须在存在 C++ 和 Python 的地方提供快速回归...
C++ 属于计算代数,Python 用于其他一切,包括测试。知道今天的测试是多么普遍,难怪 Python 代码对 TF 的贡献如此之大。