私は最近ディープラーニングや他のMLテクニックの研究を始め、ネットを作りそれをトレーニングするプロセスを単純化するフレームワークを探し始めました、そして私はTensorFlowを見つけました。ディープラーニングを使用して作業する場合、大きなMLシステムをさらに作成するための大きな要因、それではなぜTensorFlowを作成するためにGoogleがpythonを選択したのでしょうか。コンパイルされ、解釈されない言語でそれを作る方が良いでしょうか?
機械学習にC++のような言語よりもPythonを使用する利点は何ですか?
TensorFlowについて理解する最も重要なことは、ほとんどの場合、コアはPythonで書かれていません:高度に最適化されたC++とCUDA(NvidiaのGPUプログラミング言語)の組み合わせで書かれていることです。 。その多くは、 Eigen (高性能C++およびCUDA数値ライブラリ)および NVidiaのcuDNN ( NVidia GP 、 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)
この1つのPython(またはC++関数呼び出し)は、C++のインプロセス呼び出しまたは RPC を使用して、分散バージョンがC++ TensorFlowサーバーを呼び出して通知する実行し、結果をコピーして戻します。
それでは、TensorFlowがPythonをモデルのトレーニングを表現および制御するための最初の十分にサポートされた言語として選択したのはなぜですか?
答えは簡単です:Pythonはおそらくthe C++バックエンドの統合と制御が容易な、広範なデータサイエンティストや機械学習の専門家にとって最も快適な言語です。 、一般的でありながら、Googleの内外で広く使用されており、オープンソースです。 TensorFlowの基本モデルでは、Pythonのパフォーマンスはそれほど重要ではないため、自然に適合しました。また、非常に大きなプラスです NumPy は、Pythonでの前処理を簡単に実行できるようにします。また、高性能で、TensorFlowに送り込んでからCPUを大量に消費します。物事。
また、実行時に使用されないモデルの表現には多くの複雑さがあります-形状の推論(たとえば、matmul(A、B)を実行した場合、結果のデータの形状は?)および自動 勾配 計算。 Pythonでそれらを表現できて良かったことが判明しましたが、長期的にはおそらく他の言語を追加しやすくするためにC++バックエンドに移行すると思います。
(もちろん、将来、モデルを作成して表現するために他の言語をサポートすることを望んでいます。他のいくつかの言語を使用して推論を実行することはすでに非常に簡単です-C++は動作し、Facebookの誰かが貢献しました Go 現在レビュー中のバインディングなど)
TFはPythonで書かれていません。それはC++で書かれていて(そして高性能な数値 ライブラリ と CUDA コードを使っています)、それらを見ればこれをチェックすることができます github 。つまり コアはpythonで書かれていません しかしTFは他の多くの言語へのインターフェースを提供します( python、C++、Java、Go )
あなたがデータ分析の世界から来たのであれば、あなたはそれをnumpy(pythonで書かれていないがPythonへのインターフェースを提供している)のように考えることができます。 Java、Python、PHPから起動できます。
Pythonのフロントエンド(人々がTFでモデルを書く言語)は many理由 のために最も人気があります。私の意見では、主な理由は歴史的なものです:大多数のMLユーザーはすでにそれを使用しています(もう1つの一般的な選択はRです)。
しかし、pythonで書かれているからといって、モデルがpythonで実行されるわけではありません。逆に、TFグラフの評価中にPythonが正しく実行されないようにモデルを作成した場合( tf.py_func() はデバッグ用に存在し、実際には避けるべきです)それはPython側で実行されるからです。
これは、例えば、でこぼことは異なります。例えば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 /何か他のもので流れるグラフを定義すると、それを行いません。
Pythonでは、CおよびC++を使用してネイティブコードとのインターフェースを取りながら、Pythonがもたらす利点を引き続き利用しながら拡張モジュールを作成できます。
TensorFlowはPythonを使用していますが、大量の C++ も含まれています。
これにより、Pythonを使用して人が考えることの少ないオーバーヘッドで実験用のシンプルなインターフェイスを使用でき、C++で最も重要な部分をプログラミングすることでパフォーマンスが向上します。
あなたがチェックすることができる最新の比率 ここ はTensorFlow C++の中に示していますコードの最大50%を取り、Pythonのコードの最大40%を取ります。
C++とPythonはどちらもGoogleの公用語ですので、これがなぜそうなるのか不思議はありません。 C++とPythonが存在する場合に高速回帰を提供する必要があるとしたら...
C++は計算代数の中にあり、Pythonはテストを含む他のすべてのものに使われています。今日のテストがどこにでもあることを知っていれば、なぜPythonコードがTFにそれほど貢献しているのか不思議ではありません。