ついにTensorFlow 2.0 α版がリリースされた。TensorFlowにとって初めてのメジャーバージョンのアップデートになる。初期リリース〜2.0正式リリースまでの歩みを示し、2.0の新機能の概要を紹介する。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
ご注意:本記事は、@IT/Deep Insider編集部(デジタルアドバンテージ社)が「deepinsider.jp」というサイトから、内容を改変することなく、そのまま「@IT」へと転載したものです。このため用字用語の統一ルールなどは@ITのそれとは一致しません。あらかじめご了承ください。
2019年3月6日〜7日(米国時間)に開発者カンファレンス「TensorFlow Dev Summit 2019」が開催された。そこでTensorFlow 2.0のα(Alpha)版のリリースが発表され、現α版時点での新機能と改変の内容が説明された。
最初に、ライブラリ「TensorFlow」の利用者にとって一番重要な改変ポイントだけ、簡単に示しておこう。それは、
の2点である。
1点目については、tf.kerasが標準化されたことに伴い、TensorFlow 1.x時代に乱立したいくつかの高レベルAPIが排除されることになった。1.x時代(執筆時点)においても高レベルAPIを使う場合は、シンプルで使いやすいAPIのtf.kerasを使用するのが一般的ではあった。ただし、分散深層学習といったスケーラブルな機能が必要な場合は、同じく高レベルAPI(むしろ“中”レベルAPIとも言うべき)のtf.estimator(Estimators)を使う必要があった。TensorFlow 2.0以降でもtf.estimatorは残されており使用できるが、そのパワーはtf.kerasにも統合されている。つまり2.0では、tf.kerasでも分散深層学習が可能になっている。
2点目については、TensorFlow 1.xまで静的な「グラフ」モードがデフォルト挙動だったが、2.0以降では動的な「Eager実行」モードがデフォルト挙動に変更された。Eager実行になると、Pythonコーディング環境でのデバッグ作業などがやりやすくなるという利点がある。特に機械学習モデルのプロトタイピングや研究段階の作業では非常に役に立つ機能だ。それでいて、「AutoGraph」(自動グラフ)という機能により、パフォーマンスの良さや、エキスポートしやすさといった「グラフ」モードの利点も併せて享受できる。つまり良いところ取りである。
これらの話を中心に、本稿では、主に基調講演の内容から、TensorFlow 2.0 α版の新機能の概要をコンパクトにお伝えする。
まず前半では、TensorFlow 2.0への歩みと、実際のリリース時期について紹介する。後半では、どのような機能が追加されるのかの概要を見ていく。
現在、TensorFlowは非常に速いスピードでアップデートされてきている。その歩みは、
となっており(図1)、たった3年4カ月間で大きな躍進を果たしている(※リリース履歴はこちら)。
今や、世界中の人々が、GitHub:tensorflow/tensorflowにスターを付けている(図2はスターを点にした世界地図)。
そのダウンロード数は4100万にものぼる(図3)。
そんなTensorFlowの次期メジャーバージョン「2.0」のα版が、2019年3月6日(米国時間)のTensorFlow Dev Summit 2019に合わせてリリースされたわけだが、あくまでこれはバージョン2.0の初期プレビュー(=α版)リリースという位置付けである。これから2〜3カ月かけて、正式版に向けた実装のテストと最適化が進められていくことになる。そういった作業が終わるのが、春ごろ(※「春」の定義はあいまいではあるが……)を目指しているとのこと。通常のアップデートリリースよりも時間がかかる見込みだ。RC版が出てから、(1.0の時と同じなら恐らく1カ月後くらいで)最終の正式版がリリースされる予定である。まとめると今後は、
といったタイムラインでリリース作業が進められていくと考えられる(図4)。
より細かくプロジェクトの進捗をフォローしたい人は、
をウォッチしてほしい。
それでは、TensorFlow 2.0の概要説明に入っていこう。
これまでのTensorFlow 1.xの利用者からは、
といったフィードバックや要望が寄せられていたという。というのも、TensorFlow 1.xには試験的にさまざまな機能が、しかも重複を気にせずに搭載されてきた、という問題があったからだ。例えばディープラーニングのモデルを簡単に作る高レベルAPIが、何種類も存在していた(具体的には、tf.keras、tf.estimator、tf.layers、tf.contrib.learn、tf.contrib.slimなど)。利用者から見ると、「どれを使うべきか判断しづらい」「サンプルプログラムの書き方が高レベルAPIの種類ごとに違うので、サンプルコードも選ぶ必要がある」といった課題があった。
TensorFlow 2.0は、これらの要望に応えるべく、
といった点を重視していく(図6)。
本稿では、上記の「簡単」「パワフル」の2点について、さらに掘り下げて見ていこう。
新しいTensorFlow 2.0の全体構成をまとめると、図7のようになる。
左側が訓練(TRAINING)時に使う機能、右側が運用環境へのデプロイ(DEPLOYMENT)時から使う機能である。
右側を見ると、これまでどおり、デプロイ先はさまざまなものが用意されている(※既存の機能なので説明は割愛)。
左側にある訓練時の機能には変更があったので、訓練時のワークフローについてより細かく見てみよう。
図7の左から、最初に「データの取得と加工」をtf.dataを使って行い、機械学習モデルに入力する特徴データを作成する。なお、tf.estimator(Estimators)の機能を使う場合は、特徴カラム(Feature Columns: 生データとEstimatorsの間の中間物)も作成する。
次に、「モデル構築」をtf.keras(Keras)で行う。もちろん、低レベルAPIにより完全に独自のカスタムモデルを作ったり、“中”レベルAPIのtf.estimatorで事前に作成された標準的な機械学習モデルのパッケージ(Pre-made Estimators)を使ったりすることもできる。
さらに、「訓練」をEager実行(即時実行)とAutoGraph(自動グラフ)で行う。繰り返しになるが、TensorFlow 2.0では、Eager実行モードがデフォルトの挙動となった(※TensorFlow 1.xではグラフモードがデフォルトの挙動)。この2つの機能は、次節でもう少し詳しく説明しよう。
最後に、「保存」をSavedModel形式で行う。保存したパッケージは、前述のとおり、さまざまな運用環境にデプロイできる。
Eager実行とは、ライブラリ「Chainer」など(※実際にChainerからインスパイアされた機能)で言うdefine-by-run(通常のPythonコーディングと同じように、定義と実行が同時に行われる)と同じ実行方法のことである。
Eager実行では、従来のようにわざわざデータフローグラフを事前に定義したうえで、セッション(tf.Session)を明示的に開始し、それから実行(run())する(これをdefine-and-runと呼ぶ)、という複数段階の手順を踏む必要がない。例えば図8-1にあるPythonコードの制御フロー(while文)は、即時に実行されることになる。
このため、モデルを構築する際のデバッグがしやすくなるので、効率的に機械学習の実装を進められるという利点がある。
AutoGraphとは、通常のPythonコードを自動的にTensorFlowのグラフに変換する機能である。従来は、TensorFlowの「テンソル」を使ってデータフローグラフを定義していた。
新しいAutoGraph機能では、煩雑なテンソルに関する記述をしなくても、自然でシンプルなPython構文を使ってグラフが定義できるようになるというわけだ。例えば図8-2にある関数定義(@tf.functionデコレーターが付加されたdef文)のPythonコードによって、そのグラフが生成されることになる。
この機能により、グラフの利点であるパフォーマンスの良さや、モデルのエキスポートしやすさといった、従来の利点も維持できる。
TensorFlow 2.0では、Eager実行だけでなく、@tf.function+AutoGraphによるグラフであっても、デバッグ機能が強化されている。例えば図8-3ではモデルのグラフ内に、split関数の引数に指定した数値がエラーを起こしているが、そのエラーの内容が通常のPythonコーディングと同じように見られることを示している。より効率的にディープラーニングを実装していけるというわけだ。
少し脱線したが、「訓練時のワークフロー」に話を戻す。これらの手順のいくつかについて、実際の例を見てみよう(※以下の内容は、TensorFlow 1.xでも実装できることが含まれているので、注意してほしい。TensorFlow 2.0における典型的な訓練ワークフローを説明しているだけである)。
Copyright© Digital Advantage Corp. All Rights Reserved.