ディープラーニングツール: TensorFlow システムアーキテクチャと高性能プログラミング

ディープラーニングツール: TensorFlow システムアーキテクチャと高性能プログラミング

2015 年 11 月 9 日、Google は人工知能プラットフォーム TensorFlow をオープンソース化し、これは 2015 年に最も注目されたオープンソース プロジェクトの 1 つとなりました。 Google は、v0.1 から v0.12 までの 12 のバージョン反復を経て、2017 年 2 月 15 日に TensorFlow 1.0 をリリースし、同時に米国カリフォルニア州マウンテンビューで第 1 回 TensorFlow Dev Summit カンファレンスを開催しました。

TensorFlow 1.0 と Dev Summit (2017) のレビュー

以前のバージョンと比較して、TensorFlow 1.0 の機能改善は主に次の点に反映されています。

  • 高速化: TensorFlow 1.0 は XLA コンパイル テクノロジーを使用して、TensorFlow の実行パフォーマンスとメモリ使用率を向上させます。ベンチマーク問題のテスト結果によると、単一マシンの Inception v3 モデルの場合、計算速度は単一マシン 8 GPU の 7.3 倍でした。分散型 Inception v3 モデルの場合、計算速度は複数マシン 64 GPU の 58 倍でした。
  • より柔軟: tf.layers、tf.metrics、tf.losses モデルの高レベル API のサポートに加えて、このバージョンでは keras (高レベル ニューラル ネットワーク ライブラリ) API との完全な互換性も実現されています。
  • より製品指向: TensorFlow Python API はバージョン v1.0 で安定し、製品の互換性の強固な基盤が築かれました。

TensorFlow 1.0 がリリースされた日に、Google は TensorFlow 2017 DEV Summit も開催しました。議題には主に以下の点に関する基調講演が含まれます。

  • 実践的な TensorBoard 可視化テクノロジー: TensorBoard の使用方法と、TensorFlow グラフ モデルとトレーニング データの可視化について説明します。
  • TensorFlow 高レベル API: トレーニング モデルを定義するためのレイヤー、推定器、および既定推定器高レベル API の使用を紹介します。
  • Keras と TensorFlow の統合: モデルの定義とトレーニングのために TensorFlow で Keras API を使用する方法を紹介します。
  • DeepMind における TensorFlow: AlphaGo などのアプリケーションを含む、DeepMind での TensorFlow プラットフォームの使用の典型的な事例を紹介します。
  • 皮膚がんの画像​​分類: スタンフォード大学医学部は、医療診断のために皮膚がんの写真を分類するために TensorFlow を使用しています。
  • モバイルおよび組み込み TensorFlow: Android、iOS などのシステムを含むモバイル端末や組み込みデバイスで TensorFlow モデルを実行する方法を紹介します。
  • 分散 TensorFlow: 分散 TensorFlow の関連技術と、それを大規模モデルのトレーニングに適用する方法を体系的に紹介します。
  • TensorFlow エコシステム: トレーニング データの生成、分散方式での TensorFlow の実行、モデルの提供などの制作プロセスを含む TensorFlow エコシステムについて説明します。
  • TensorFlow Serving を使用して本番環境でモデルを提供する: TensorFlow Serving モデルを本番環境に適用する方法を体系的に説明します。
  • ML ツールキット: 線形回帰、KMeans、その他のアルゴリズム モデルの使用など、TensorFlow の機械学習ライブラリを紹介します。
  • シーケンス モデルと RNN API: 高性能なシーケンス間モデルと関連 API の構築方法を紹介します。
  • ワイド & ディープ ラーニング: ワイド モデルとディープ モデルを組み合わせて包括的なトレーニング モデルを構築する方法を紹介します。
  • マゼンタ、音楽とアートの生成: 強化されたディープラーニング モデルを使用して、音楽のサウンドと芸術的な画像を生成します。
  • ケーススタディ、医療における TensorFlow – 網膜画像: TensorFlow 機械学習プラットフォームを使用して医療用網膜画像を分類し、医療診断を支援します。

TensorFlow システムアーキテクチャ

TensorFlow は分散型機械学習プラットフォームであり、その主なアーキテクチャを下図に示します。 RPC と RDMA はネットワーク層であり、主にニューラル ネットワーク アルゴリズム パラメータの送信を担当します。 CPU と GPU はデバイス層であり、主にニューラル ネットワーク アルゴリズムの特定の計算操作を担当します。カーネルは、畳み込み演算、活性化演算など、TensorFlow におけるアルゴリズム演算の特定の実装です。分散マスターはサブグラフの構築に使用され、サブグラフを複数のシャードに分割し、異なるサブグラフ シャードを異なるデバイスで実行します。マスターは、サブグラフ シャードを Executor/Worker エンドに分散する役割も担います。 Executor/Work は、デバイス (CPU、GPU など) 上のサブグラフ操作の実行をスケジュールし、グラフ操作の結果を他のワーカーと送受信する役割を担います。 C API は TensorFlow をフロントエンドとバックエンドに分割します。フロントエンド (Python/C++/Java クライアント) は、C API に基づいて TensorFlow バックエンド プログラムの実行をトリガーします。トレーニング ライブラリと推論ライブラリは、モデル トレーニングと推論のためのライブラリ関数であり、ユーザーがアプリケーション モデルを開発するために使用します。

次の図は、クライアント、マスター、ワーカーの内部動作原理を示しています。 「/job:worker/task:0」と「/job:ps/task:0」はワーカー内の実行サービスを表します。 「job:ps」は、モデル パラメータを保存および更新するために使用されるパラメータ サーバーを表します。 「job:worker」は、モデル パラメータを最適化し、同時パラメータをパラメータ サーバーに送信するために使用されます。分散マスターおよびワーカー サービスは、分散 TensorFlow にのみ存在します。 TensorFlow のスタンドアロン バージョンは、ローカル セッションを実装し、ローカル プロセスの内部通信を通じて上記の機能を実装します。

ユーザーは TensorFlow アプリケーションを作成して計算グラフを生成します。クライアント コンポーネントはセッションを作成し、シリアル化テクノロジを使用してグラフ定義を分散マスター コンポーネントに送信します。下の図では、クライアントは s+=w*x+b のグラフ計算モデルを作成します。

クライアントがセッション操作をトリガーすると、Maser は実行するサブグラフを構築します。そして、デバイスの状態に応じて、サブグラフは複数のスライスに分割されます。以下は、マスターによって構築された実行サブグラフです。

次に、サブグラフを分割し、パラメータ サーバー上でモデル パラメータをグループ化し、コンピューティング ワーカー上でグラフ コンピューティング操作をグループ化します。次の図は、実行可能なグラフカット戦略を示しています。

分散マスターは、モデル パラメータの分割に従ってエッジをカットし、次の図に示すように、タスク間で Tensor 情報を送受信するための通信ノードを挿入します。

次に、分散マスターは、次の図に示すように、RegisterGraph メソッドを通じてサブグラフ シャードをタスクに送信します。

マスターは RunGraph を通じてサブグラフ操作をトリガーし、ワーカーは GPU/CPU コンピューティング デバイスを使用して TensorFlow カーネル操作を実行します。 cudaMemcpyAsync は、このノードの CPU と GPU 間でデータを転送するために使用されます。ピアツーピア DMA は、CPU を介したデータのコピーを回避するために、このノードの GPU 間でデータを転送するために使用されます。 TensorFlow は、次の図に示すように、gRPC (TCP) および RDMA (統合イーサネット) テクノロジを使用して、ワーカー間のデータ通信と転送を実装します。

高性能プログラミング

TensorFlow カーネルは C/C++ で開発されており、C++、Python、Java、Go でクライアント API を提供します。特に、Python API は現在主流の TensorFlow モデル開発インターフェースです。しかし、なぜモデルをトレーニングするために C++ API を使用する必要があるのでしょうか? この記事は、次の 2 つの考慮事項に基づいています。まず、Python API を使用してモデルをトレーニングする場合、C/C++ の基礎となるインターフェイスを呼び出すために Python API を常に使用する必要があります。インターフェイスの繰り返し呼び出しは、プログラムの実行パフォーマンスにある程度影響します。さらに重要なのは、GPU 上でモデルをトレーニングするには大量のメモリ スワップが必要になることです。モデルのトレーニングに C++ API を使用すると、コンピューティング パフォーマンスが向上し、GPU メモリ割り当てをより適切に制御できるようになります。

次の図は、Python API のコンピューティング アーキテクチャを示しています。モデル トレーニングの各反復で、プログラムは Python API を介してバッチ データを読み取り、TensorFlow Session Run インターフェースを介してデータを C++ に渡し、ニューラル ネットワーク トレーニングをトリガーします。次の図に示すように:

次の図は、C++ API のコンピューティング アーキテクチャを示しています。モデル トレーニングの各反復では、バッチ データが C++ API を通じて読み取られた後、モデル トレーニングが直接トリガーされます。異なる言語間の API インターフェースの循環呼び出しとデータ転送を削減します。次の図に示すように:

モデルのトレーニングに C++ API を使用するには、まずトレーニング モデルを記述する必要があります。これは Python で行うことができます。まず Python API を使用してトレーニング モデルを記述し、次にグラフ モデルを Protobuf シリアル化ファイルに変換します。次に、C++ API を介してモデル ファイルを読み込み、TensorFlow セッションを作成し、モデル変数を初期化し、トレーニング データを読み込み、ニューラル ネットワーク トレーニングを実行します。プログラムのアーキテクチャを下図に示します。

以下は、Python API を使用してトレーニング モデルを定義する例です。

tf.Session() を sess として使用:

  1. #トレーニングデータにアクセスするためのプレースホルダーテンソルを定義する
  2. x = tf.placeholder(tf.float32, [なし、32]、名前= "x" )
  3. y = tf.placeholder(tf.float32, [なし, 8],名前= "y" )
  4.  
  5. #トレーニングモデルを定義する
  6. w1 = tf.Variable(tf.truncated_normal([32, 16], stddev=0.1))
  7. b1 = tf.Variable(tf.constant(0.0, 形状=[16]))
  8. w2 = tf.Variable(tf.truncated_normal([16, 8], stddev=0.1))
  9. b2 = tf.Variable(tf.constant(0.0, 形状=[8]))
  10. a = tf.nn.tanh(tf.nn.bias_add(tf.matmul(x, w1), b1))
  11. y_out = tf.nn.tanh(tf.nn.bias_add(tf.matmul(a, w2), b2),名前= "y_out" )
  12. コスト = tf.reduce_sum(tf.square(y-y_out)、名前= "コスト" )
  13. オプティマイザー = tf.train.AdamOptimizer().minimize(コスト、名前= "train" )
  14.  
  15. #変数初期化操作を定義する
  16. init = tf.initialize_variables(tf.all_variables(),名前= 'init_all_vars_op' )
  17.  
  18. #グラフモデルをProtobufファイルに変換する
  19. tf.train.write_graph(sess.graph_def, './' , 'mlp.pb' , as_text= False )を実行します。

以下は、C++ API を使用して Protobuf グラフ モデルをロードし、トレーニングを実行する例です。

  1. #include "tensorflow/core/public/session.h"  
  2. #include "tensorflow/core/graph/default_device.h"  
  3. 名前空間 tensorflow を使用します。
  4.  
  5. int main( int argc, char * argv[]) {
  6. //Protobuf モデル ファイル名
  7. std::string graph_definition = "mlp.pb" ;
  8. //Tensorflowセッション
  9. セッション* セッション;
  10.  
  11. //グラフモデルオブジェクトを定義する
  12. グラフ定義 graph_def;
  13. SessionOptions オプション;
  14.  
  15. //セッションの実行結果を保存する
  16. std::vector<Tensor> 出力;
  17.  
  18. #Protobufモデルファイルをグラフモデルオブジェクトにロードします
  19. TF_CHECK_OK(ReadBinaryProto(Env:: Default (), graph_definition, &graph_def));
  20.  
  21. // デフォルトでは、モデルのトレーニング操作は GPU 0 で実行されます
  22. graph::SetDefaultDevice( "/gpu:0" , &graph_def);
  23.  
  24. //GPUメモリ使用量パラメータを設定する
  25. opts.config.mutable_gpu_options()->set_per_process_gpu_memory_fraction(0.5);
  26. opts.config.mutable_gpu_options()->set_allow_growth( true );
  27.  
  28. //TensorFlowセッションを作成する
  29. TF_CHECK_OK(NewSession(opts, &session));
  30.  
  31. // グラフオブジェクトをセッションにロードする
  32. TF_CHECK_OK(セッション->作成(graph_def));
  33.  
  34. // モデルパラメータ初期化操作を実行する
  35. TF_CHECK_OK(セッション->実行({}, {}, { "init_all_vars_op" }, nullptr));
  36.  
  37. //データ型と次元情報を含むモデル入力データを定義する
  38. テンソル x(DT_FLOAT、TensorShape({100、32}));
  39. テンソル y(DT_FLOAT, TensorShape({100, 8}));
  40.  
  41. //テンソルを行列に変換し、テンソルデータを初期化する
  42. 自動 _XTensor = x.matrix< float >();
  43. 自動 _YTensor = y.matrix< float >();
  44. _XTensor.setRandom();
  45. _YTensor.setRandom();
  46.  
  47. ( int i = 0; i < 10; ++i)の場合{
  48. //モデルのトレーニング操作を実行します。{{ "x" , x}、{ "y" , y}} は入力データの Tensor 名と Tensor オブジェクトを表します。{ "cost" } は出力値を取得するための操作名を表します。&outputs は"cost"操作を実行した後に返される Tensor オブジェクトを表します。
  49. TF_CHECK_OK(セッション->実行({{ "x" , x}, { "y" , y}}, { "cost" }, {}, &outputs));
  50.  
  51. //「コスト」操作を実行した後の結果を取得します
  52. フロートコスト = 出力[0].スカラー<フロート>()(0);
  53. std::cout << "コスト: " << cost << std::endl;
  54.  
  55. // 「トレーニング」操作を実行する
  56. TF_CHECK_OK(session->Run({{ "x" , x}, { "y" , y}}, {}, { "train" }, nullptr)); // トレーニング
  57. 出力をクリアします。
  58. }
  59.  
  60. //セッションを閉じてセッションオブジェクトを削除する
  61. セッション->閉じる();
  62. セッションを削除します
  63. 0を返します
  64. }

C++ プログラムが作成されるときに、コンパイル中にリンクする必要があるヘッダー ファイルはオープン ソースによって整理され、/usr/lib/python2.7/site-packages/tensorflow/include ディレクトリに保存されます。コンパイルして実行するときは、libtensorflow_cc.so をリンクする必要があります。ライブラリ ファイルは次のようにコンパイルできます: bazel build -c opt //tensorflow:libtensorflow_cc.so –copt=-m64 –linkopt=-m64 –spawn_strategy=standalone –genrule_strategy=standalone –verbose_failures。詳細については、TensorFlow ソースコードの公式コンパイルドキュメントを参照してください。

要約する

この記事では、まず TensorFlow 1.0 の主な新機能と TensorFlow 2017 Dev Summit の主な議題について説明します。現時点では、TensorFlow の GitHub スターランキングは 51,000 以上、フォークランキングは 24,000 以上に達し、コミットは 15,000 以上あります。 TensorFlow の新バージョンが継続的にリリースされ、新機能が継続的に追加されることにより、TensorFlow はより柔軟に使用でき、操作が高速になり、より製品指向的に使用されるようになり、現在主流のディープラーニング プラットフォームの 1 つになりました。

次に、クライアント、マスター、ワーカー、カーネルの概念と操作方法を含むTensorFlowのシステムアーキテクチャを紹介しました。これは、大規模な分散トレーニングに適した機械学習プラットフォームです。上記のシステムアーキテクチャから、TensorFlow カーネルは C/C++ で開発されていることがわかります。Python API を使用してモデルをトレーニングする場合、Python で C/C++ の基盤となるインターフェースを継続的に呼び出す必要があります。インターフェースの繰り返し呼び出しは、プログラムの実行パフォーマンスに一定の影響を与えます。高性能コンピューティングをお探しの場合は、この記事の「高性能コンピューティング」セクションで推奨されている方法を試してみてください。

参考文献

  1. http://www.tensorflow.org
  2. ディープラーニングツール: 分散TensorFlowとサンプル分析
  3. ディープラーニングツール:TensorFlowの活用

著者について

Wu Wei 博士は現在、IBM Spectrum Computing の研究開発エンジニアです。主にビッグデータ、ディープラーニング、クラウドコンピューティング等の分野で研究開発を行っています。

<<:  私が人工知能に興味がない理由

>>:  一貫性のあるハッシュを使用して重要な負荷を分散する

ブログ    
ブログ    
ブログ    

推薦する

中国がAI技術の輸出を制限! TikTokアルゴリズムの名前が挙がり、売却または制限される

[[339978]]米国のTikTok狩りは続く。 8月27日、ByteDanceがTikTokの北...

何をするにしても使い始めるべき 7 つの超便利な AI ツール

正直なところ、テクノロジーの未来は人工知能 (AI) の進歩と密接に結びついています。 OpenAI...

ドライバー疲労モニタリングシステムの開発動向に関する簡単な分析

車両に先進運転支援システムが搭載されることで、ドライバーの安全性と快適性がさらに向上しました。先進運...

...

AIが中古高級品の真贋を判別、同社は精度は99.1%と主張

12月26日、高級品鑑定機関Entrupyは人工知能技術を使用して、さまざまなブランドのハンドバッグ...

スーパーマーケットチェーンのシュナックスは、米国の111店舗にシムベのロボット技術を導入すると発表

海外メディアのTechCrunchによると、セントルイスに本拠を置くスーパーマーケットチェーン「シュ...

著者の半数以上が中国人です! Google Researchの画像表現モデルALIGNがImageNetを支配

[[399343]]ニューラル ネットワークは実際には表現を学習しています。CV の分野では、優れ...

Microsoft CTO: AI は地方の住民がパンデミックを乗り切るのにどのように役立つのでしょうか?

[[324043]]この記事はLeiphone.comから転載したものです。転載する場合は、Lei...

ロボットとIoTがサプライチェーンに与える影響

過去1年ほど、COVID-19パンデミックの影響により、効率的なサプライチェーンの重要性が特に顕著に...

AIが人種差別や性差別も学習したのはなぜでしょうか?

[[232177]]外見の偏見や言語の差別など、AI による差別についてはこれまでたくさん話してき...

アメリカの科学者が、将来AI人工知能に代わるAGIの概念を提唱しました!

人工知能の分野の中心にあるのは、いつの日か人間と同じくらい賢い機械を作ることができるようになるという...

Facebookは、さまざまな機械学習の問題に適用できる、勾配フリー最適化のためのオープンソースツール「Nevergrad」をリリースしました。

自然言語処理や画像分類から翻訳など、ほとんどの機械学習タスクは、モデル内のパラメータやハイパーパラメ...

人工知能オンライン機能システムのデータアクセス技術

1. オンライン機能システム主流のインターネット製品では、古典的な計算広告、検索、推奨から、垂直分野...

...

MITのコンピューターの先駆者ジョエル・モーゼス氏が死去! 50年前にコンピューターに微積分を教えた

コンピューターの専門家がまた一人亡くなりました! 著名なコンピューター科学者で、MITのコンピュータ...