【问题标题】:TensorFlow, why was python the chosen language?TensorFlow,为什么选择 python 语言?
【发布时间】:2016-06-11 04:53:20
【问题描述】:

我最近开始研究深度学习和其他 ML 技术,我开始寻找可以简化构建网络和训练它的过程的框架,然后我发现了 TensorFlow,在该领域几乎没有经验,对我来说,似乎如果使用深度学习,速度是制作大型 ML 系统的一个重要因素,那么为什么谷歌选择 Python 来制作 TensorFlow?把它放在一种可以编译而不是解释的语言上不是更好吗?

相对于 C++ 等语言进行机器学习,使用 Python 有哪些优势?

【问题讨论】:

  • 小吹牛:编译和解释不是对立的。此外,任何编程语言都可以用编译器或解释器或两者来实现。有一个很好的answer 关于软件工程的区别。

标签: python c++ machine-learning tensorflow


【解决方案1】:

您可以从here 中查看的最新比率显示 TensorFlow C++ 占用约 50% 的代码,而 Python 占用约 40% 的代码。

C++ 和 Python 都是 Google 的官方语言,所以难怪会这样。如果我必须在存在 C++ 和 Python 的地方提供快速回归......

C++ 在计算代数中,而 Python 用于其他一切,包括测试。知道测试在今天是多么普遍,难怪 Python 代码对 TF 有这么大的贡献。

【讨论】:

    【解决方案2】:

    关于 TensorFlow,最重要的一点是,在大多数情况下,核心不是用 Python 编写的:它是用高度优化的 C++ 和 CUDA(Nvidia 的语言编程 GPU)。反过来,通过使用 Eigen(一个高性能 C++ 和 CUDA 数值库)和 NVidia's cuDNN(一个针对 NVidia GPUs 的非常优化的 DNN 库,用于 convolutions 等函数),其中大部分发生了。

    TensorFlow 的模型是程序员使用“某种语言”(很可能是 Python!)来表达模型。这个模型,用 TensorFlow 结构编写,例如:

    h1 = tf.nn.relu(tf.matmul(l1, W1) + b1)
    h2 = ...
    

    在 Python 运行时并未实际执行。相反,实际创建的是dataflow graph,它表示接受特定输入、应用特定操作、将结果作为输入提供给其他操作,等等。 此模型由快速 C++ 代码执行,并且在大多数情况下,操作之间的数据永远不会复制回 Python 代码

    然后程序员通过拉动节点来“驱动”该模型的执行——用于训练,通常使用 Python,用于服务,有时使用 Python,有时使用原始 C++:

    sess.run(eval_results)
    

    这个 Python(或 C++ 函数调用)使用对 C++ 的进程内调用或分布式版本的 RPC 调用 C++ TensorFlow 服务器以告诉它执行,然后复制回结果。

    话虽如此,让我们重新表述这个问题:为什么 TensorFlow 选择 Python 作为第一个得到良好支持的语言来表达和控制模型的训练?

    答案很简单:对于大量数据科学家和机器学习专家来说,Python 可能是最舒适的语言,它也很容易集成和控制 C++ 后端,同时还通用,在谷歌内外广泛使用,并且是开源的。鉴于使用 TensorFlow 的基本模型,Python 的性能并不那么重要,它是天作之合。 NumPy 让在 Python 中进行预处理变得容易——同样具有高性能——在将其输入到 TensorFlow 以处理真正占用大量 CPU 的事情之前,这也是一个巨大的优势。

    在表达模型时还存在很多复杂性,而这些模型在执行时并未使用——形状推断(例如,如果您执行 matmul(A, B),结果数据的形状是什么?)和自动gradient 计算。事实证明,能够用 Python 表达这些内容很好,但我认为从长远来看,它们可能会转移到 C++ 后端,以便更轻松地添加其他语言。

    (当然,希望在未来支持其他语言来创建和表达模型。使用其他几种语言运行推理已经非常简单——C++ 现在可以工作了,来自 Facebook 的某人贡献了 Go 绑定我们现在正在审查,等等)

    【讨论】:

    • 你如何在It's already quite straightforward to run inference using several other languages 中定义“推理”作为 Prolog 程序员,它不适合我;这似乎是一个不合适的词。
    • 只运行模型的前向传递。将其应用于数据与训练。
    • 关于形状推断。我正在将一些神经网络转换为静态类型语言,仅供学习使用,而 Ptyhon 中的 Duck 类型肯定会使这部分代码更容易编写。另一方面,在没有类型的情况下编写 Python 代码会使学习 Ptyhon 在运行前正确获取类型变得更加困难。与其他语言 F# 相比,我看到使用 Ptyhon 的运行时错误要多得多。可能值得注意的是 Duck 输入了答案。
    • 虽然这是真的,但我认为 python 的输入是间接原因。在谷歌常用的语言中——quora.com/…——Python 最适合普通机器学习博士。唯一真正的选择是 C++(我不知道有多少人使用 Lua,Torch 使用的语言),而 C++ 离 ML 工具箱的舒适区还很远。很多 ML 人都来自 matlab 背景,numpy 越来越受欢迎。当然,鸭子打字可能是流行的基础,但这超出了我的范围。
    • 谢谢,很好的总结。 Guy Coder——关于游戏中的“推理”意义,请参阅the Wikipedia article on statistical inference。它是 inductive 推理,而不是 Prolog 执行的 deduction 类型。
    【解决方案3】:

    TF 不是用 python 编写的。它是用 C++ 编写的(并使用高性能数字 librariesCUDA 代码),您可以通过查看他们的 github 来检查这一点。所以the core is written not in python 但 TF 提供了许多其他语言的接口 (python, C++, Java, Go)

    如果您来自数据分析领域,您可以将其视为 numpy(不是用 Python 编写,但提供 Python 的接口),或者如果您是 Web 开发人员 - 将其视为数据库(PostgreSQL, MySQL,可以从Java、Python、PHP调用)


    由于manyreasons,Python 前端(人们在 TF 中编写模型的语言)是最流行的。在我看来,主要原因是历史原因:大多数 ML 用户已经在使用它(另一个流行的选择是 R),所以如果你不提供 python 接口,你的库很可能注定要默默无闻。


    但是用python编写并不意味着你的模型是用python执行的。相反,如果您以正确的方式编写模型,则在评估 TF 图期间永远不会执行 Python(tf.py_func() 除外,它存在用于调试,并且应该在真实模型中完全避免,因为它是在 Python 一侧执行的)。

    这与例如 numpy 不同。例如,如果您执行np.linalg.eig(np.matmul(A, np.transpose(A))(即eig(AA')),该操作将使用某种快速语言(C++ 或 fortran)计算转置,将其返回给 python,将其与 A 一起从 python 中获取,并计算一些乘法快速语言并将其返回给python,然后计算特征值并将其返回给python。因此,尽管 matmul 和 eig 等昂贵的操作可以有效地计算,但您仍然会通过将结果移回 python 并强制执行来浪费时间。 TF 不会这样做,一旦你定义了图,你的张量就不会在 python 中流动,而是在 C++/CUDA/其他东西中流动。

    【讨论】:

    【解决方案4】:

    Python 允许您使用 C 和 C++ 创建扩展模块,与本机代码交互,同时仍能获得 Python 为您提供的优势。

    TensorFlow 使用 Python,是的,但它也包含大量 C++

    这允许使用更简单的界面进行实验,减少 Python 的人为思维开销,并通过使用 C++ 编程最重要的部分来提高性能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多