目次


TensorFlow 入門

このオープンソースの機械学習用ライブラリーの詳細を探る

Comments

機械学習のコンテキストでの「テンソル」とは、ニューラル・ネットワークを表す数学モデル内で使用される多次元配列のことを指します。別の言葉で言い換えると、テンソルは一般に、マトリックスやベクトルの高次元での一般化です。

テンソルは階数を使用して次元の数を示す単純な概念でありながらも、複雑な n-次元のベクトルやハイパーシェイプを n-次元配列として表現することができます。テンソルには、データ型とシェイプという 2 つのプロパティーがあります。

TensorFlow の概要

TensorFlow はオープンソースの深層学習フレームワークです。2015 年の後期に Apache 2.0 ライセンスの下でリリースされて以来、(TensorFlow をベースとした GitHub プロジェクトの数からすると) 今では世界で最も広く採用されている深層学習フレームワークの 1 つにまでなっています。

TensorFlow の起源は、Google Brain プロジェクトによって開発されたクローズドソースの本番環境向け深層学習システム、Google DistBelief にあります。Google は分散処理用に TensorFlow をゼロから設計し、Google の実動データ・センター内にある TPU (Tensor Processing Unit) と呼ばれる Google のカスタム ASIC (Application-Specific Integrated Circuit) 上で最適に稼働されるようにしました。この設計により、TensorFlow は深層学習アプリケーションに有効に機能するようになっています。

TensorFlow は、サーバー、デスクトップ、およびモバイル・デバイスに搭載された CPU 上、GPU 上、または TPU 上で稼働させることができます。さらに、開発者はローカル側でもクラウド内にでも、複数のオペレーティング・システムとプラットフォーム上に TensorFlow をデプロイできます。TensorFlow と同様の深層学習フレームワークには Torch や Theano などがあり、これらのフレームワークもハードウェア・アクセラレーションに対応し、学究的環境で広く使用されていますが、多くの開発者たちは TensorFlow のほうが分散処理のサポートに優れていて、商用のアプリケーションで使用するには柔軟性もパフォーマンスも上回っていると考えています。

深層学習ニューラル・ネットワークは一般に多数の層で構成され、これらの層の間で多次元配列を使用してデータを転送したり、処理を実行したりします。このようにニューラル・ネットワークを構成する層の間をテンソルが流れることから、このフレームワークには TensorFlow という名前が付けられました。

TensorFlow の主要なプログラミング言語は Python です。安定性は保証されていませんが、Python の他にも C++、Java 言語、Go のアプリケーション・プログラミング・インターフェース (API) を使用できます。また、C#、Haskell、Julia、Rust、Ruby、Scala、R、さらに PHP を対象としたサード・パーティー製バインディングもあります。最近では Google が、Android 上で TensorFlow アプリケーションを実行することを目的に、モバイル用に最適化された TensorFlow-Lite ライブラリーを発表しました。

このチュートリアルでは、TensorFlow システムの概要を紹介するとともに、このフレームワークの利点、サポートされるプラットフォーム、インストールする際の考慮事項、サポート対象の言語とバインディングについて説明します。

TensorFlow の利点

以下にリストアップするように、開発者にとって TensorFlow には多くの利点があります。

  • 計算グラフ・モデル。TensorFlow は計算モデルを表現するために、有向グラフと呼ばれるデータ・フロー・グラフを使用します。これにより、このフレームワークでは開発者が組み込みツールを使って、直感的かつ簡単にニューラル・ネットワークの層内での処理を視覚化し、パラメーターや構成を対話式に調整してニューラル・ネットワークを完全なものにできるようになっています。
  • 使いやすい API。Python 開発者は TensorFlow の未加工の低レベル API を使用することも、独自のモデルを開発するために組み込みモデル用の高レベル API ライブラリーを使用することもできます。TensorFlow では多数の組み込みライブラリーと寄与されたライブラリーを使用できるようになっているだけでなく、Keras などの高レベルの深層学習フレームワークを重ね合わせて高レベル API として機能させることもできます。
  • 柔軟なアーキテクチャー。TensorFlow を使用する大きな利点は、その設計がモジュール式であり、拡張性と柔軟性を併せ持っていることです。開発者はコードをほとんど変更せずに、CPU プロセッサー間、GPU プロセッサー間、または TPU プロセッサー間で簡単にモデルを移行できます。当初はトレーニングおよび推測処理を大規模に分散できるようにするために設計されたものの、他の機械学習モデルや既存のモデルのシステム最適化を試みるために TensorFlow を使用することもできます。
  • 分散処理。Google Brain ではゼロから TensorFlow を設計し、Google のカスタム ASIC TPU 上での分散処理に対処できるようにしました。それに加え、複数の NVIDIA GPU コア上で TensorFlow を稼働させることもできます。したがって、開発者は Intel Xeon アーキテクチャー、Xeon Phi ベースの x64 CPU アーキテクチャー、または ARM64 CPU アーキテクチャーを利用できます。TensorFlow はマルチアーキテクチャーおよびマルチコアのシステム上だけでなく、計算集約型の処理をワーカー・タスクとして他に委任する分散プロセスにおいても稼働させることができます。開発者は TensorFlow サーバーのクラスターを複数作成し、それらのクラスターに計算グラフを分配してトレーニングさせることが可能です。TensorFlow は、グラフ内でもグラフ間でも、分散トレーニングを同期的または非同期的に実行できます。また、共通のデータをメモリー内で共有することも、ネットワークで接続された計算ノード間で共有することもできます。
  • パフォーマンス。パフォーマンスは時として議論の分かれるトピックですが、ほとんどの開発者たちの間で共通する認識となっているのは、深層学習フレームワークを最適に実行して少ないエネルギー・コストで優れたパフォーマンスを達成できるかどうかは、基礎となるハードウェアによって左右されるということです。通常は、いずれのフレームワークでも、フレームワークのネイティブ開発プラットフォームが最善の最適化を達成します。TensorFlow は Google TPU 上で最大のパフォーマンスを発揮しますが、さまざまなプラットフォーム上でも優れたパフォーマンスを達成します。これらのプラットフォームには、サーバーとデスクトップだけでなく、組み込みシステムとモバイル・デバイスも含まれます。さらに、このフレームワークは驚くほど多くのプログラミング言語をサポートしています。例えば IBM プラットフォーム上の IBM Watson など、ネイティブに実行される別のフレームワークのほうが TensorFlow よりもパフォーマンスに優れている場合もありますが、それでも開発者たちの間では TensorFlow が好まれています。それは、人工知能プロジェクトは複数のエンド・アプリケーションをターゲットに複数のプラットフォームと複数のプログラミング言語にわたって実行され、そのすべてで一貫した結果を出さなければならないことがあるためです。

TensorFlow のアプリケーション

このセクションでは、TensorFlow が得意とするアプリケーションに注目します。Google はテキストおよび音声検索アプリケーション、言語翻訳アプリケーション、画像検索アプリケーションに独自仕様のバーションの TensorFlow を使用していました。このことから明らかなように、TensorFlow の主な強みは、分類と推測にあります。例えば、Google は Google 検索の結果をランク付けする RankBrain というエンジンを実装するために TensorFlow を使用しました。

TensorFlow を使用すれば、周辺雑音が多い環境での音声認識および音声合成を改善することができます。それは、TensorFlow によってさまざまな声を区別したり、音声をフィルタリングしたりした上で、音声パターンを模倣してテキストをより自然に聞こえる音声に変換できるためです。その上、TensorFlow はさまざまな言語の構文を処理して翻訳の品質を向上させます。さらに、画像と動画の認識や、オブジェクト、ランドマーク、人、感情、アクティビティーの分類にも TensorFlow を使用することができます。画像および動画検索については、TensorFlow はすでに大きな改善をもたらした実績があります。

その柔軟性、拡張性、そしてモジュール式設計のおかげで、TensorFlow を使用することによって開発者が特定のモデルやアプリケーションに縛られることはありません。開発者たちは TensorFlow を使用して機械学習および深層学習アルゴリズムを実装しているだけでなく、統計モデルや一般的な計算モデルの実装にも TensorFlow を使用しています。TensorFlow のアプリケーションと導き出されたモデルについて詳しくは、このリンク先の「TensorFlow in Use」を参照してください。

TensorFlow をサポートしているプラットフォーム

Python 開発環境をサポートしているさまざまなプラットフォームは、TensorFlow をサポートできます。ただし、TensorFlow はサポート対象の GPU にアクセスするために、他のソフトウェア (NVIDIA CUDA ツールキットや cuDNN など) に依存します。TensorFlow の Python バイナリーについては、以下の表に記載するオペレーティング・システムを対象に、TensorFlow バージョン 1.3 (この記事を公開する時点での最新バージョン) 用に事前ビルドされたものが用意されています。

TensorFlow をサポートしているオペレーティング・システム
TensorFlow をサポートしているオペレーティング・システム

注: Ubuntu 上または Windows 上で GPU をサポートするには、CUDA Toolkit 8.0 と cuDNN 6 以降と、使用するツールキットのバーションおよび CUDA Compute Capability 3.0 以降との互換性がある GPU カードが必要です。TensorFlow バージョン 1.2 以降の GPU サポートは、macOS 上では利用できなくなっています。

詳細については、このリンク先の「Installing TensorFlow」を参照してください。

TensorFlow をソースからビルドする

公式のビルド・プロセスでは、Ubuntu 上および macOS 上で、Bazel ビルド・システムを使用して、ソースから TensorFlow をビルドすることになっていますWindows 用の Bazel または Windows 用の CMake を使用した Windows 上でのビルドは極めて実験的なものとなっています。詳細については、このリンク先の「Installing TensorFlow from Sources」を参照してください。

IBM は 2 基の POWER8 プロセッサーと 4 枚の NVIDIA Tesla P100 GPU カードの間で NVIDIA NVLink インターコネクトを使用することによって、S822LC HPC (High Performance Computing) システム上での深層学習用 PowerAI を最適化しています。したがって、開発者は OpenPOWER Linux で稼働する IBM Power Systems 上で TensorFlow をビルドできるようになっています。詳細については、このリンク先の「Deep Learning on OpenPOWER: Building TensorFlow on OpenPOWER Linux Systems」を参照してください。

コミュニティーやベンダーのサポートしている数多くのビルド・プロシージャーを利用することもできます。

TensorFlow でのハードウェア・アクセラレーションの利用方法

多種多様なプロセッサー・アーキテクチャーおよび非プロセッサー・アーキテクチャー上で TensorFlow をサポートするために、Google はベンダーが XLA (Accelerated Linear Algebra) 用の新しいハードウェア・バックエンドを実装できるよう、新しい抽象化インターフェースを導入しました (XLA は、TensorFlow の計算処理を最適化する、ドメイン固有の線形代数用コンパイラーです)。

CPU

現時点では XLA はまだ実験的な段階であるため、TensorFlow は x64 および ARM64 CPU アーキテクチャーを対象にサポート、テスト、ビルドされるようになっています。CPU アーキテクチャー上では、TensorFlow は線形代数を加速化するために、ベクトル処理の拡張機構を使用します。

Intel Xeon ファミリーや Xeon Phi ファミリーなどの Intel CPU 主体の HPC アーキテクチャーでは、線形代数を加速化する方法として深層ニューラル・ネットワーク用 Intel Math Kernel Library のプリミティブ型を使用します。Intel は、最適化された線形代数ライブラリーを使用して事前ビルドして最適化した Python のディストリビューションも提供しています。

他のベンダー (Synopsys、CEVA など) は、マッピングとプロファイラー・ソフトウェアを使用して TensorFlow グラフを変換し、それぞれのプラットフォーム上で最適に実行されるコードを生成しています。この手法を使用する場合、開発者は生成されたコードの移植、プロファイリング、調整を行う必要があります。

GPU

TensorFlow がサポートしている GPU は、特定のパフォーマンス基準を満たす関連バージョンの CUDA ツールキットとの互換性がある特定の NVIDIA GPU です。OpenCL のサポートはロードマップ上の将来的なアイテムとなっていますが、一部のコミュニティーの取り組みではすでに OpenCL 1.2 対応の GPU (AMD など) 上で TensorFlow を実行しています。

TPU

Google によると、TPU ベースのグラフは CPU や GPU ベースのグラフに比べ、15 倍から 30 倍もパフォーマンスに優れているとともに、エネルギー効率にも極めて優れています。Google は高帯域幅のスループット向上を可能にするために、TPU を、シリアル ATA ハード・ディスク・スロット内に収容して PCI Express Gen3 x16 によってホストに接続させる外部アクセラレーターとして設計しました。

Google TPU はベクトル・プロセッサーというよりもマトリックス・プロセッサーであり、ニューラル・ネットワークには高精度の計算よりも、整数の超並列低精度計算が必要であるという事実を利用しています。驚くことではありませんが、マトリックス・プロセッサー (MXU) アーキテクチャーでは 65,536 個の 8 ビット整数乗算器を使用して、あたかも心臓を流れる血液のように、シストリック・アレイ・アーキテクチャーを介して次から次へとデータをプッシュします。

この設計は、シングル・スレッドであるとは言え、単一の高水準命令を使用して MXL 上で複数の低レベル処理をトリガーできる、ある種の複合命令セット・コンピューティング (CISC) アーキテクチャーです。このようなアーキテクチャーでは、メモリーにアクセスしなくても 1 サイクルあたり 128,000 の命令を実行できる潜在能力があります。

したがって、GPU アレイまたは複数命令複数データ式の CPU HPC クラスターに比べ、TPU には大幅なパフォーマンス・ゲインとエネルギー効率が認められます。TPU はサイクルごとに TensorFlow グラフ内のあらゆる対応可能状態のノードを評価することで、深層学習ニューラル・ネットワークのトレーニング時間を他のアーキテクチャーよりも大幅に短縮するのです。

TensorFlow をインストールする際の考慮事項

概して、64 ビットの Python 開発環境をサポートしているプラットフォームであれば、どのプラットフォーム上でも TensorFlow は稼働します。ほとんどの単純なサンプルやチュートリアルをトレーニングしてテストするには、64 ビットの Python 開発環境であれば十分です。けれども研究や専門的な開発には HPC プラットフォームが強く推奨されるという点に、大半の専門家は賛成しています。

プロセッサーとメモリーの要件

深層学習はかなりの計算処理を駆使するため、ベクトル拡張機構と 1 つ以上のハイエンドの CUDA に対応する GPU を備えた高速のマルチコア CPU が標準的な深層学習環境となっています。また、ほとんどの専門家は相当な量の CPU および GPU RAM を確保するよう推奨しています。なぜなら、メモリー転送処理はエネルギーを大量に消費し、パフォーマンスに悪影響をもたらすためです。

深層学習ネットワークのパフォーマンスという点では、次の 2 つのモードについて考慮する必要があります。

  • 開発モード。通常、このモードでの処理能力とメモリーの要件は、トレーニング時間とパフォーマンス、そしてサンプルとデータセットのサイズによって左右されます。これらの要素によって、計算パフォーマンスの限界と、ニューラル・ネットワークのトレーニング時間が決まります。
  • アプリケーション・モード。通常は、トレーニング済みニューラル・ネットワークの分類または推測のリアルタイム・パフォーマンスによって、処理能力とメモリーの要件が決まります。畳み込みニューラル・ネットワークにはより高い低精度計算能力が必要になる一方、全結合ニューラル・ネットワークにはより多くのメモリーが必要になります。

仮想マシンの選択肢

現在のところ、多数のコアを使用できる CPU 主体のハードウェアに最適なのは深層学習用の仮想マシン (VM) です。物理的な GPU はホスト・オペレーティング・システムによって制御されることから、GPU アクセラレーションを VM 上に実装するのは簡単なことではありませんが、それには主に 2 つの手法があります。

  • GPU パススルー:
    • この手法は、Citrix Xen、VMware ESXi、カーネル仮想マシン、IBM Power などの Type-1 ハイパーバイザー上でのみ使用できます。
    • パススルーのオーバーヘッドは、CPU、チップセット、ハイパーバイザー、オペレーティング・システムの特定の組み合わせによって大きく異なります。概して、最新世代のハードウェアではオーバーヘッドが大幅に少なくなります。
    • ハイパーバイザーとオペレーティング・システムの組み合わせによって、サポートされる特定のNVIDIA GPU カードが決まります。
  • GPU 仮想化:
    • この手法は、NVIDIA (GRID)、AMD (MxGPU)、Intel (GVT-G) といった主要なすべての CPU ベンダーによってサポートされています。
    • 最新バージョンでは、特定の新しい GPU カード上で OpenCL がサポートされるようになっています (TensorFlow に公式な OpenCL サポートはありません)。
    • NVIDIA GRID の最新バージョンは、特定の新しい GPU カードで CUDA および OpenCL をサポートしています。

Docker にインストールする際の選択肢

Docker コンテナー内または Kubernetes クラスター内で TensorFlow を実行することには多くの利点があります。TensorFlow は、コンテナー・クラスターにマッピングされている TensorFlow サーバーのクラスターに実行タスクとしてグラフを分配できます。Docker を使用する場合に追加される利点として、TensorFlow サーバーが物理的な GPU コア (デバイス) にアクセスして、それらのコアに特定のタスクを割り当てることが可能になります。

開発者は PowerAI OpenPOWER サーバー上の Kubernetes クラスター内に TensorFlow をデプロイすることもできます。それには、このリンク先の記事「TensorFlow Training with Kubernetes on OpenPower Servers using PowerAI」で説明している手順に従って、コミュニティーによりビルドされた Docker イメージをインストールします。

クラウドにインストールする際の選択肢

クラウド・ベースで TensorFlow をインストールするには、次のように多数の選択肢があります。

  • Google Cloud TPU。Google では研究者向けに、クラウド TPU インスタンス上に TensorFlow Research Cloud という TensorFlow のアルファ版オファリングを用意しています。
  • Google Cloud。Google で提供しているカスタム TensorFlow マシン・インスタンスは、特定のリージョン内にある 1 基、4 基、または 8 基の NVIDIA GPU にアクセスできます。
  • IBM Cloud データ・サイエンスおよびデータ管理。IBM が提供している、Jupyter Notebook と Spark を使用した Python 環境には、TensorFlow がプリインストールされています。
  • Amazon Web Services (AWS)。Amazon が提供している AWS 深層学習 AMI (Amazon Machine Images) には、選択肢として、各種の Amazon Elastic Compute Cloud インスタンス上で実行できる NVIDIA GPU サポートが用意されています。TensorFlow、Keras、およびその他の深層学習フレームワークもプリインストールされているこの AMI は、最大 64 基の CPU コアと最大 8 基の NVIDIA GPU (K80) をサポートできます。
  • Azure。Azure Container Service を利用することで、Docker インスタンス上に TensorFlow をセットアップできます。また、TensorFlow を Ubuntu サーバー上にセットアップすることもできます。Azure マシン・インスタンスは、最大 24 基の CPU コアと最大 4 基の NVIDIA GPU (M60 または K80) をサポートできます。
  • IBM Cloud Kubernetes クラスター。IBM Cloud 上の Kubernetes クラスターで、TensorFlow を実行することができます。その場合、コミュニティーによりビルドされた Docker イメージが用意されています。PowerAI サーバー上では、GPU サポートを使用できます。

TensorFlow がサポートしているプログラミング言語

Google は C++ で TensorFlow コアを実装しましたが、TensorFlow の主要なプログラミング言語は Python であり、その API は最も完成度が高く堅牢であるとともに、極めて簡単に使用できます。詳細については、このリンク先の Python API リファレンスを参照してください。この Python API には極めて包括的なドキュメントと拡張手段が備わっており、幅広いコミュニティー・サポートも利用できます。

Python の他に、TensorFlow は以下の言語の API をサポートしています (ただし、安定性は保証されていません)。

  • C++。TensorFlow C++ API は Python API に次いで堅牢な API です。この API は、データ・フロー・グラフを作成および実行する際に使えるだけでなく、TensorFlow Serving にも使用できます。C++ API の詳細については、このリンク先の「C++ API」を参照してください。C++ Serving API の詳細については、このリンク先の「TensorFlow Servicing API」を参照してください。
  • Java 言語。Java 言語の API は実験段階ですが、最近 Android Oreo での TensorFlow のサポートが発表されたこともあり、この API の将来は有望です。詳細については、このリンク先の「tensorflow.org」を参照してください。
  • Go。この極めて実験的な API は、TensorFlow と Google Go プログラミング言語とのバインディングです。詳細については、このリンク先の「package tensorflow」を参照してください。

サード・パーティー製バインディング

Google では、他の言語とのバインディングをサポートするために外部関数インターフェース (FFI) を定義しています。このインターフェースは、TensorFlow の C++ コア関数を C API を使用して公開します。FFI はまだ新しいので、既存のサード・パーティー製バインディングでは使用されていないかもしれません。

GitHub の調査により、コミュニティーまたはベンダーが開発した、C#、Haskell、Julia、Node.js、PHP、R、Ruby、Rust、および Scala 言語を対象としたサード・パーティー製バインディングが存在することが明らかになっています。

Android

TensorFlow アプリケーションを実行するための新たな最適化された TensorFlow-Lite ライブラリーが登場しています。詳細については、このリンク先のブログ投稿「What's New in Android: O Developer Preview 2 & More」を参照してください。

Keras を使用して TensorFlow を単純化する

Keras の層とモデルには、純粋な TensorFlow テンソルとの完全な互換性があります。したがって、Keras は TensorFlow に最適なモデル定義アドオンになっています。開発者は Keras と併せて他の TensorFlow ライブラリーを使用することもできます。詳細については、このリンク先のブログ記事「Keras as a simplified interface to TensorFlow: tutorial」を参照してください。

まとめ

TensorFlow は数ある機械学習用オープンソース・ソフトウェア・ライブラリーのうちの 1 つに過ぎません。けれども、TensorFlow をベースとした GitHub プロジェクトの数からすると、TensorFlow は今では世界で最も広く採用されている深層学習フレームワークの 1 つにまでなっています。このチュートリアルでは、TensorFlow の概要とこれをサポートしているプラットフォーム、そして TensorFlow をインストールする際の考慮事項について説明しました。

TensorFlow を使用したサンプルを調べる準備が整ったら、このリンク先の「TensorFlow を使用してアートを分類する」からコードを入手して、コード・パターンを確かめてください。このコードには、メトロポリタン美術館からデータとラベルを取得して画像分類システムをトレーニングする方法が示されています。


ダウンロード可能なリソース


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Cognitive computing, Open source
ArticleID=1060741
ArticleTitle=TensorFlow 入門
publish-date=07192018