TensorFlowについて理解する最も重要なことは、コアがPythonで書かれていないことです。コアは高度に最適化されたC ++とCUDA(NvidiaのGPUプログラミング言語)の組み合わせで書かれています。多くのことが起こるのは、順番に、使用して固有(高機能C ++およびCUDA数値計算ライブラリ)とNVIDIAのcuDNN(のために非常に最適化されたDNNライブラリNVidiaのGPUのような機能のために、コンボリューションを)。
TensorFlowのモデルは、プログラマーがモデルを表現するために「何らかの言語」(おそらくPython!)を使用することです。このモデルは、次のようなTensorFlow構文で記述されています。
h1 = tf.nn.relu(tf.matmul(l1, W1) + b1)
h2 = ...
Pythonの実行時に実際には実行されません。代わりに、実際に作成されるのは、特定の入力を取り、特定の操作を適用し、結果を他の操作への入力として提供するなどのデータフローグラフです。 このモデルは高速C ++コードによって実行され、ほとんどの場合、操作間を行き来するデータがPythonコードにコピーされることはありません。
次に、プログラマーはノードをプルすることによってこのモデルの実行を「駆動」します-通常はPythonでのトレーニングのために、そして時にはPythonで、時には生のC ++でのサービングのために:
sess.run(eval_results)
この1つのPython(またはC ++関数呼び出し)は、C ++へのインプロセスコールまたはRPCのいずれかを使用して、分散バージョンをC ++ TensorFlowサーバーに呼び出し、実行するように指示し、結果をコピーします。
それで、それで、質問を言い換えてみましょう:TensorFlowがモデルのトレーニングを表現および制御するための最初の十分にサポートされた言語としてPythonを選択したのはなぜですか?
その答えは簡単です。Pythonは、広範囲のデータサイエンティストや機械学習のエキスパートにとっておそらく最も快適な言語であり、C ++バックエンドを統合して制御するのも簡単ですが、一般的であり、内部と外部の両方で広く使用されていますGoogleの、そしてオープンソース。TensorFlowの基本モデルでは、Pythonのパフォーマンスはそれほど重要ではないので、自然な適合でした。また、NumPyを使用すると、Pythonでの前処理を簡単に(しかも高性能で)実行できるため、TensorFlowにフィードしてからCPUを大量に使用することが容易になります。
また、モデルの実行時に使用されないモデルの表現には、複雑な要素があります-形状推論(たとえば、matmul(A、B)を実行した場合、結果のデータの形状は何ですか?)および自動勾配計算。Pythonでそれらを表現できるのは素晴らしいことでしたが、長期的には他の言語を追加しやすくするためにC ++バックエンドに移行するでしょう。
(もちろん、モデルを作成および表現するために将来的に他の言語をサポートすることを望んでいます。他のいくつかの言語を使用して推論を実行することはすでに非常に簡単です。C++は現在機能しています。Facebookの誰かがGoバインディングを提供しており、現在検討中です、など)