TesnsorFlow を使用して、基本的な機械学習モデルから複雑なディープラーニング ネットワークまで、さまざまなモデルを構築およびトレーニングする方法を理解した後は、トレーニングしたモデルを製品に組み込んで他のアプリケーションで使用できるようにする方法を検討する必要があります。この記事では、これについて詳しく紹介します。この記事は、「TensorFlow Practice for Machine Intelligence」の第 7 章から抜粋したものです。 この記事では、ユーザーが画像をアップロードし、その画像に対して Inception モデルを実行して画像を自動的に分類できるシンプルな Web アプリを作成します。 TensorFlowサービス開発環境を構築する Docker イメージ TensorFlow Serving は、製品で提供されるモデルをユーザーが使用できるようにするサーバーを構築するためのツールです。開発中にこのツールを使用するには、すべての依存関係とツールを手動でインストールしてソースからビルドする方法と、Docker イメージを使用する方法の 2 つがあります。後者の方がより簡単かつクリーンであり、Linux 以外の環境での開発も可能なので、後者を使用します。 Docker イメージに詳しくない場合は、完全なオペレーティング システムを内部で実行する必要のない軽量の仮想マシン イメージと考えてください。 Docker がまだインストールされていない場合は、開発マシンにインストールしてください。詳細なインストール手順を確認するには、ここをクリックしてください (https://docs.docker.com/engine/installation/)。 Docker イメージを使用するには、ローカルでイメージを作成するための設定ファイルである、作者が提供しているファイル (https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile.devel) を使用することもできます。このファイルを使用するには、次のコマンドを使用します。
上記のコマンドを実行した後、すべての依存関係をダウンロードするのに長い時間がかかる場合があることに注意してください。 上記のコマンドを実行した後、このイメージを使用してコンテナを実行するには、次のコマンドを入力します。
このコマンドは、ホーム ディレクトリをコンテナーの /mnt/home パスに読み込み、その内部のターミナルで作業できるようにします。これは、ビルド ツールを実行するときにのみコンテナーを使用しながら、お気に入りの IDE またはエディターを使用してコードを直接編集できるため、非常に便利です。また、ポート 9999 も開かれるので、独自のホストからアクセスでき、後で構築するサーバーで使用できるようになります。 exit コマンドを入力してコンテナ ターミナルを終了し、実行を停止します。必要に応じて上記のコマンドを使用して起動することもできます。 Bazel ワークスペース TensorFlow サービング プログラムは C++ で記述されているため、Google の Bazel ビルド ツールを使用してビルドする必要があります。最近作成したコンテナ内から Bazel を実行します。 Bazel はコード レベルでサードパーティの依存関係を管理し、それらも Bazel でビルドする必要がある場合は自動的にダウンロードしてビルドします。プロジェクトがサポートするサードパーティの依存関係を定義するには、プロジェクト リポジトリのルート ディレクトリに WORKSPACE ファイルを定義する必要があります。 必要な依存関係は TensorFlow Serving ライブラリです。私たちの場合、TensorFlow モデル リポジトリには Inception モデルのコードが含まれています。 残念ながら、この記事の執筆時点では、TensorFlow Serving は Bazel が直接参照する Git リポジトリとしてはまだサポートされていないため、プロジェクトに Git サブモジュールとして含める必要があります。
次に、WORKSPACE ファイルの local_repository ルールを使用して、サードパーティの依存関係をローカルに保存されたファイルとして定義します。さらに、プロジェクトからインポートされた tf_workspace ルールを使用して、TensorFlow の依存関係を初期化する必要があります。
トレーニング済みモデルをエクスポートする モデルのトレーニングが完了し、評価の準備ができたら、データフロー グラフとその変数値をエクスポートして、本番環境で使用できるようにする必要があります。 モデルのデータ フロー グラフは、プレースホルダーから入力を受け取り、それらに対して単一の推論ステップを実行して出力を計算する必要があるため、トレーニング バージョンとは異なる必要があります。 Inception モデルの例や一般的な画像認識モデルでは、入力を JPEG エンコードされた画像を表す文字列にして、それを消費アプリに簡単に渡せるようにする必要があります。これは、TFRecord ファイルからトレーニング入力を読み取ることとはまったく異なります。 入力を定義する一般的な形式は次のとおりです。
上記のコードでは、入力に対してプレースホルダーが定義され、プレースホルダーによって表される外部入力を元の推論モデルに必要な入力形式に変換する関数が呼び出されます。たとえば、JPEG 文字列を Inception モデルに必要な画像形式に変換する必要があります。最後に、元のモデル推論メソッドが呼び出され、変換された入力に基づいて推論結果が取得されます。 たとえば、Inception モデルの場合、次のメソッドが必要です。
この推論方法では、すべてのパラメータに値を割り当てる必要があります。これらのパラメータ値をトレーニングチェックポイントから復元します。前の章では、モデルのトレーニング チェックポイント ファイルを定期的に保存したことを覚えているかもしれません。これらのファイルには、その時点で学習したパラメータが含まれているため、異常が発生してもトレーニングの進行には影響しません。 トレーニングの終了時に、最後に保存されたトレーニング チェックポイント ファイルには、最後に更新されたモデル パラメータが含まれます。これが本番環境で使用するバージョンです。 チェックポイント ファイルを復元するには、次のコードを使用します。
Inception モデルの場合、事前トレーニング済みのチェックポイント ファイルを次のリンクからダウンロードできます: http://download.tensorflow.org/models/image/imagenet/inception-v3-2016-03-01.tar.gz。
最後に、tensorflow_serving.session_bundle.exporter.Exporter クラスを使用してモデルをエクスポートします。セーバーインスタンスを渡すことでそのインスタンスを作成します。次に、exporter.classification_signature メソッドを使用してモデルの署名を作成する必要があります。このシグネチャは、input_tensor が何で、出力テンソルが何であるかを指定します。出力は、出力クラス名のリストを含む classes_tensor と、モデルが各クラスに割り当てたスコア (または確率) を含む socres_tensor で構成されます。通常、カテゴリの数がかなり多いモデルでは、tf.nn.top_k によって選択されたカテゴリのみ、つまりモデルによって割り当てられたスコアの降順で上位 K 個のカテゴリのみが返されるように構成で指定する必要があります。 最後のステップは、exporter.Exporter.init メソッドを呼び出し、出力パス、モデル バージョン番号、およびセッション オブジェクトを受け取る export メソッドを介してモデルをエクスポートするこのシグネチャを適用することです。
Exporter クラス コードには自動生成されたコードへの依存関係があるため、Docker コンテナー内で bazel を使用してエクスポーターを実行する必要があります。 これを行うには、先ほど起動した bazel ワークスペースの exporter.py にコードを保存する必要があります。さらに、次のようなビルド ルールを含む BUILD ファイルが必要になります。
次のコマンドを使用して、コンテナ内でエクスポーターを実行できます。
/tmp/inception-v3 から抽出できるチェックポイント ファイルに基づいて、/tmp/inception-v3/{current_timestamp}/ にエクスポーターを作成します。 初めて実行するときには TensorFlow をコンパイルする必要があるため、時間がかかることに注意してください。 サーバーインターフェースの定義 次に、エクスポートされたモデル用のサーバーを作成する必要があります。 TensorFlow Serving は gRPC プロトコルを使用します (gRPC は HTTP/2 に基づくバイナリ プロトコルです)。サーバーを作成するためのさまざまな言語をサポートし、クライアントスタブを自動的に生成します。 TensorFlow は C++ に基づいているため、独自のサーバーを定義する必要があります。幸いなことに、サーバー側のコードは比較的短いです。 gRPS を使用するには、gRPC の IDL (インターフェイス定義言語) およびバイナリ エンコーディングであるプロトコル バッファーでサービス コントラクトを定義する必要があります。私たちのサービスを定義しましょう。前のエクスポート セクションで説明したように、JPEG エンコードされた画像文字列を入力として受け取り、分類してスコア順にランク付けされた推定カテゴリのリストを返すサービスが必要です。 このようなサービスは、次のように、classification_service.proto ファイルで定義する必要があります。
画像、オーディオ クリップ、またはテキストを受信できるあらゆる種類のサービスに同じインターフェイスを使用できます。 データベース レコードのような構造化された入力を使用するには、ClassificationRequest メッセージを変更する必要があります。たとえば、Iris データセットの分類サービスを構築しようとする場合は、次のようなコードを記述します。
この proto ファイルは、proto コンパイラによってクライアントとサーバーの対応するクラス定義に変換されます。 protobuf コンパイラを使用するには、次のような新しいルールを BUILD ファイルに追加する必要があります。
上記のコード スニペットの上部にある負荷に注意してください。外部からインポートされた protobuf ライブラリから cc_proto_library ルール定義をインポートします。次に、それを使用して proto ファイルのビルド ルールを定義します。 bazel build :classification_service_proto を使用してビルドを実行し、bazel-genfiles/classification_service.grpc.pb.h を通じて結果を検査します。
推論ロジックによれば、ClassificationService::Service は実装する必要があるインターフェースです。 bazel-genfiles/classification_service.pb.h をチェックすることで、リクエスト メッセージとレスポンス メッセージの定義を確認することもできます。
ご覧のとおり、proto 定義は各型の C++ クラス インターフェイスになりました。それらの実装も自動的に生成されるため、直接使用できます。 推論サーバーの実装 ClassificationService::Service を実装するには、エクスポートされたモデルをロードし、その上で推論メソッドを呼び出す必要があります。これは、エクスポートされたモデルから作成され、完全にロードされたデータフロー グラフを含む TF Session オブジェクトと、エクスポーターで定義された分類シグネチャを含むメタデータを含む SessionBundle オブジェクトを通じて実現されます。 エクスポートされたファイル パスから SessionBundle オブジェクトを作成するには、この定型句を処理する便利な関数を定義します。
このコードでは、SessionBundleFactory クラスを使用して SessionBundle オブジェクトを作成し、pathToExportFiles で指定されたパスからエクスポートされたモデルを読み込むように構成します。最後に、作成された SessionBundle インスタンスへの一意のポインターが返されます。 次に、推論で使用するパラメータとして SessionBundle インスタンスを受け取るサービスである ClassificationServiceImpl の実装を定義する必要があります。
分類メソッドの実装には、次の 4 つのステップが含まれます。
最後のコードは、gRPC サーバーをセットアップし、ClassificationServiceImpl (Session-Bundle オブジェクトで構成される) のインスタンスを作成する定型コードです。
このコードをコンパイルするには、BUILD ファイルでルールを定義する必要があります。
このコードを使用すると、コマンド bazel run :server 9999 /tmp/inception-v3/export/{timestamp} を使用して、コンテナーから推論サーバーを実行できます。 クライアントアプリケーション gRPC は HTTP/2 をベースとしているため、将来的にはブラウザから直接 gRPC ベースのサービスを呼び出すことが可能になる可能性がありますが、主流のブラウザが必要な HTTP/2 機能をサポートし、Google がブラウザ側の JavaScript gRPC クライアント プログラムをリリースしない限り、Web アプリからの推論サービスへのアクセスはサーバー側のコンポーネントを介して行う必要があります。 次に、BaseHTTPServer をベースにしたシンプルな Python Web サーバーを構築します。このサーバーは、アップロードされた画像ファイルを処理し、処理のために推論サービスに送信し、推論結果をプレーンテキストで返します。 分類のために推論サーバーに画像を送信する場合、サーバーは簡単なフォームで GET リクエストに応答します。使用されるコードは次のとおりです。
Web アプリ サーバーから推論機能を呼び出すには、ClassificationService の対応する Python プロトコル バッファー クライアントが必要です。これを生成するには、Python プロトコル バッファ コンパイラを実行します。
サービスを呼び出すために使用されるスタブを含む classified_service_pb2.py ファイルが生成されます。 POST リクエストを受信すると、サーバーは送信されたフォームを解析し、それを使用して Classification-Request オブジェクトを作成します。次に、この分類サーバーのチャネルを設定し、そのチャネルにリクエストを送信します。最後に、分類された応答を HTML としてレンダリングし、ユーザーに返します。
サーバーを実行するには、コンテナの外部から python client.py コマンドを使用します。次に、ブラウザで http://localhost:8080 に移動して UI にアクセスします。画像をアップロードして推論がどのように機能するかを確認してください。 製品の準備 この記事を締めくくる前に、分類サーバーを本番環境に適用する方法についても学習します。 まず、コンパイルされたサーバー ファイルをコンテナー内の永続的な場所にコピーし、一時的なビルド ファイルをすべてクリーンアップします。
ここで、コンテナの外部で、その状態を新しい Docker イメージにコミットする必要があります。これは基本的に、仮想ファイル システムへの変更を記録するスナップショットを作成することを意味します。
この方法では、イメージを好みの Docker サービス クラウドにプッシュして提供することができます。 結論 この記事では、トレーニング済みのモデルを提供する方法、それらをエクスポートする方法、そしてこれらのモデルを実行できる高速で軽量なサーバーを構築する方法について学びました。また、他のアプリから TensorFlow モデルを使用するための完全なツールセットを使用して、これらのモデルを使用するシンプルな Web アプリを作成する方法も学びました。 |
<<: 中国のAI研究は米国を上回る?専門家:例えば、ディープラーニングに関する論文の発表数
>>: 敵対的サンプルとディープニューラルネットワークの学習
WSL は Windows 上で GPU を使用してアプリケーションを実行することをサポートするよう...
パート01 背景1.1 GPU アプリケーションのシナリオGPU (グラフィックス プロセッシング ...
この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...
この記事は、公開アカウント「Reading the Core」(ID: AI_Discovery)か...
MOEA フレームワークは、多目的進化アルゴリズム (MOEA) を開発するための Java ライ...
[[416150]]グローバルな AI ガバナンスのコンセンサスを実装し、信頼できる AI テクノロ...
今日の技術的に進歩した世界では、生きているようなデジタルヒューマンが大きな関心を集める新たな分野とな...
AIヘルスケア企業のCEOが、医療におけるAIの応用、AIソリューションの購入方法、ヘルスケア分野に...
この新しいフェーズは、ディープ テクノロジーの開発と採用のかつてない増加、世界の人口動態の大きな変化...
この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...
世界を見渡すと、各国の社会進歩、産業グレードアップ、国防建設などにおける科学技術の価値がますます明ら...