2016-02-28 16 views
65

私は最近、ディープラーニングやその他のMLテクニックを勉強し始めました。ネットを構築して訓練するプロセスを単純化するフレームワークを探し始めました。それから、TensorFlowはフィールドでの経験がほとんどありませんでした。深い勉強に取り組んでいれば大きなMLシステムを作る上で大きな要因です。だから、なぜPythonがTensorFlowを作るために選ばれたのですか?コンパイルして解釈することのできない言語に翻訳する方が良いのではないでしょうか?TensorFlow、なぜpythonが選ばれた言語ですか?

機械学習のためにC++のような言語でPythonを使用する利点は何ですか?

+1

マイナーニックピック:編集と解釈は相反するものではありません。さらに、任意のプログラミング言語は、コンパイラまたはインタープリタ、またはその両方で実装されてもよい。ソフトウェアエンジニアリングの違いについての素敵な[回答](https://softwareengineering.stackexchange.com/a/269878/121035)があります。 – 8bittree

答えて

117

TensorFlowについて実現するために最も重要なことは、ほとんどの部分は、コアはPythonで書かれていない、ということである。これは、高度に最適化されたC++およびCUDA(プログラミングのGPUは、NVIDIAの言語)の組み合わせで書かれています。その多くは、Eigen(高性能C++およびCUDA数値ライブラリ)とNVidia's cuDNNNVidia GPUsの場合は非常に最適化されたDNNライブラリ、convolutionsなどの関数)を使用して行われます。

TensorFlowのモデルは、プログラマがモデルを表現するために "some language"(おそらくPython!)を使用しているということです。

のようなTensorFlow構成で書かれたこのモデルは、Pythonの実行時には実際には実行されません。代わりに、実際に作成されるものは、特定の入力を受け取り、特定の操作を適用し、結果を他の操作への入力として供給するなどと言うdataflow graphです。 このモデルは高速なC++コードによって実行され、ほとんどの場合、操作間のデータは決してPythonコードにコピーされません。

その後プログラマ「ドライブ」ノードを引っ張ることで、このモデルの実行 - 訓練のため、通常はPythonで、及びサービス提供のために、時々、Pythonで、時には生のC++で:

sess.run(eval_results) 

この1 Python(またはC++関数呼び出し)は、C++のインプロセス呼び出しまたはRPCのいずれかを使用して分散バージョンを実行し、C++ TensorFlowサーバーを呼び出して実行を指示してから結果をコピーします。

TensorFlowは、なぜモデルのトレーニングを表現し制御するための最初のよくサポートされている言語としてPythonを選択したのですか?

その答えは簡単です:Pythonはおそらく一般的でありながら、統合およびC++バックエンドを制御するようにしてもそれは簡単だデータ科学者と機械学習の専門家の広い範囲のための最も快適な言語あり、 Googleの内部と外部の両方で広く使用されています。 TensorFlowの基本モデルでは、Pythonのパフォーマンスはそれほど重要ではなく、自然にフィットしていました。また、NumPyは、CPU負荷の高いもののためにTensorFlowに供給する前に、Pythonで前処理を行い、高性能でも簡単に行うことができます。

形状の推論を実行するときに使用されないモデルを表現することには、複雑さがたくさんあります(例えば、matmul(A、B)を行う場合、結果のデータの形は何ですか?)自動gradient計算。長期的には、おそらくC++バックエンドに移り、他の言語を簡単に追加できるようになると思うが、Pythonでそれらを表現できるのはうれしいことであることが分かった。

(もちろん、モデルを作成して表現するために将来他の言語をサポートすることを望んでいるのですが、C言語での推論を実行するのはかなり簡単です。

+1

「他のいくつかの言語を使って推論を実行することは、すでにかなり簡単です」で「推論」を定義していますか?Prologプログラマーであれば、それは場所外の言葉のように思える。 –

+1

モデルの順方向パスだけを実行します。それをデータ対トレーニングに適用する。 – dga

+0

形状推論に関して。私はいくつかのニューラルネットワークを静的に型付けされた言語に変換するだけであり、PtyhonのDuck型入力はコードの一部を書くのをはるかに容易にします。 filp側では、Pythonコードを型で書くことは、実行前に型を取得するPtyhonを学ぶときにはるかに難しくなります。私は、Ptyhonを使用する他の言語よりも多くのランタイムエラーがF#であることを認識しています。答えにダックタイピングがあることは注目に値するかもしれません。 –

3

Pythonでは、CおよびC++を使用して拡張モジュールを作成し、ネイティブコードとインターフェースをとり、Pythonが提供する利点を引き続き得ることができます。

TensorFlowはPythonを使用していますが、大量のC++も含んでいます。

これは、Pythonで人間が思考するオーバーヘッドの少ない簡単なインタフェースを可能にし、C++で最も重要な部分をプログラミングすることでパフォーマンスを向上させます。

11

TFはpythonで書かれていません。これはC++で書かれており、高性能の数値librariesCUDAコードを使用しています。これはgithubを見て確認できます。だから、the core is written not in pythonしかしTF他の多くの言語(python, C++, Java, Go)へのインタフェースを提供

enter image description here

あなたはデータ分析の世界から来た場合、あなたはそれについて考えることができますnumpyの(Pythonで書かれ、それにインターフェースを提供しないようにパイソン)またはあなたがウェブ開発者であれば -


のJavaやPython、PHPから呼び出すことができます(PostgreSQLのは、MySQL、)データベースとしてそれについて考えるのPythonフロントエンド(人々がモデルを記述する言語TFの中で)最も普及しているのはmanyです。私の意見では、主な理由は歴史的です:大多数のMLユーザはすでにそれを使用しています(もう1つの人気のある選択肢は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 /何かに流れます。

関連する問題