はじめに
このプロジェクトでは、簡単な TensorFlow モデルを作成し、エクスポートし、その後 Docker と TensorFlow Serving を使ってサービングするまでのプロセスを案内します。TensorFlow はオープンソースの機械学習フレームワークであり、TensorFlow Serving は機械学習モデル用の柔軟で高性能なサービングシステムです。Docker コンテナを使うことで、これらのモデルを一貫してパッケージ化して展開することができます。このプロジェクトが終了するとき、TensorFlow で基本的な機械学習モデルをセットアップし、サービング用にエクスポートし、Docker コンテナ内で TensorFlow Serving を使って展開する方法を理解するようになります。
👀 プレビュー
## TensorFlow Servingコンテナに予測リクエストを送信する
curl -X POST \
http://localhost:9501/v1/models/half_plus_two:predict \
-d '{"signature_name":"serving_default","instances":[[1.0], [2.0], [5.0]]}'
出力:
{
"predictions": [[2.5], [3.0], [4.5]
]
}
🎯 タスク
このプロジェクトでは、以下を学びます。
- TensorFlow と TensorFlow Serving の依存関係をインストールする方法
- 基本的な算術演算用の簡単な TensorFlow モデルを作成する方法
- TensorFlow Serving でサービングするのに適した形式でモデルをエクスポートする方法
- Docker と TensorFlow Serving を使ってモデルをサービングする方法
- 展開されたモデルに予測リクエストを送信し、予測結果を受け取る方法
🏆 成果
このプロジェクトを完了すると、以下のことができるようになります。
- TensorFlow で基本的な機械学習モデルをセットアップする
- サービング用に TensorFlow モデルをエクスポートする
- Docker と TensorFlow Serving を使って TensorFlow モデルを展開する
- 展開されたモデルに予測リクエストを送信し、結果を観察する
依存関係をインストールする
始める前に、環境に TensorFlow をインストールする必要があります。また、Docker Hub から TensorFlow Serving イメージをプルして、コンテナ化された環境でモデルをサービングする準備をします。ターミナルで以下のコマンドを実行してください。
TensorFlow をインストールする:
## TensorFlowをインストールする
pip install tensorflow==2.14.0
## TensorFlowとの互換性の問題を回避するためにnumpyを1.26.4にダウングレードする
pip install numpy==1.26.4
TensorFlow Serving Docker イメージをプルする:
## Docker HubからTensorFlow Servingイメージをプルする
docker pull tensorflow/serving
このステップでは、数値計算と機械学習に強力なライブラリである TensorFlow をインストールし、その後 TensorFlow Serving Docker イメージをプルしました。
TensorFlow Serving は、本番環境で機械学習モデルをサービングするために特別に設計されています。Docker を使用することで、TensorFlow Serving がすべての依存関係を満たした孤立した環境で実行されるようになり、これによりマシン上の他のソフトウェアとの競合を回避できます。
モデルを作成してエクスポートする
このステップでは、基本的な算術演算を行う簡単な TensorFlow モデルを定義します。入力を 0.5 倍にしてから 2 を足します。モデルを定義した後、TensorFlow Serving で使用できる形式にエクスポートします。
~/project/half_plus_two.py でモデルを作成してエクスポートする:
## TensorFlow をインポートする
import tensorflow as tf
## 簡単な Sequential モデルを定義する
model = tf.keras.Sequential([
tf.keras.layers.Dense(units=1, input_shape=[1], use_bias=True)
])
## "0.5 倍にして 2 を足す" 機能を実現するために重みを設定する
weights = [tf.constant([[0.5]]), tf.constant([2.0])]
model.set_weights(weights)
## モデルをコンパイルする(学習しなくても必要)
model.compile(optimizer='sgd', loss='mean_squared_error')
## モデルを SavedModel 形式でエクスポートする
export_path = './saved_model_half_plus_two/1'
tf.saved_model.save(model, export_path)
このステップでは、入力に対して簡単な演算(0.5 倍にして 2 を足す)を行う TensorFlow モデルを定義します。その後、サービングに適した形式にエクスポートされます。
- モデルは、深層学習モデルの構築と訓練に関する高レベルの API である TensorFlow の Keras API を使用して定義されます。モデルは、完全に接続されたニューラルネットワーク層である単一の密集層で構成されています。
- モデルの重みは、目的の演算(0.5 倍にして 2 を足す)を実現するように手動で設定されます。
- このモデルはさらに訓練されない場合でも、その構造を確定するためにコンパイルされます。これは TensorFlow において必須のステップです。
- 最後に、モデルは TensorFlow SavedModel 形式で保存されます。これは、protobuf ファイルとモデルの重みを含む TensorFlow チェックポイントが含まれるディレクトリです。この形式は、モデル展開に TensorFlow Serving が必要とする形式です。
モデルをエクスポートするには、ターミナルで次のスクリプトを実行します:
python half_plus_two.py
モデルは ~/project/saved_model_half_plus_two に保存され、ファイル構造は以下の通りです:
.
└── saved_model_half_plus_two
└── 1
├── assets
├── fingerprint.pb
├── saved_model.pb
└── variables
├── variables.data-00000-of-00001
└── variables.index
Docker と TensorFlow Serving を使ってモデルをサービングする
モデルをエクスポートした後の次のステップは、Docker コンテナ内で TensorFlow Serving を使ってモデルをサービングすることです。これにより、モデルにネットワーク経由でアクセスでき、予測リクエストに応答できるようになります。
ターミナルで Docker を使ってモデルをサービングする:
## Dockerコンテナ内でTensorFlow Servingを使ってモデルをサービングする
docker run -t --rm -p 9500:8500 -p 9501:8501 \
-v "/home/labex/project/saved_model_half_plus_two:/models/half_plus_two" \
-e MODEL_NAME=half_plus_two \
tensorflow/serving
このステップでは、エクスポートされたモデルを Docker コンテナ内で TensorFlow Serving を使ってサービングします。Docker run コマンドは TensorFlow Serving インスタンスを起動し、推論リクエストに対してモデルを利用可能にします。
-pフラグは、Docker コンテナのポートをホストマシンにマップし、ローカルマシンから TensorFlow Serving モデルサーバーにリクエストを送信できるようにします。-vフラグは、ホストマシンから Docker コンテナにボリュームをマウントし、エクスポートされたモデルを TensorFlow Serving に利用可能にします。-e MODEL_NAME環境変数は、サービングするモデルの名前を TensorFlow Serving に伝えます。
このセットアップは、モデルサービング環境をカプセル化し、展開先に関係なく一貫して実行されることを保証します。
モデルに予測リクエストを送信する
最後に、予測リクエストを送信して展開されたモデルをテストします。このリクエストでは、モデルに対して入力値のセットに対してそのロジック(0.5 倍にして 2 を足す)を適用させます。
別の新しいターミナルで予測リクエストを送信する:
## TensorFlow Servingコンテナに予測リクエストを送信する
curl -X POST \
http://localhost:9501/v1/models/half_plus_two:predict \
-d '{"signature_name":"serving_default","instances":[[1.0], [2.0], [5.0]]}'
出力:
{
"predictions": [[2.5], [3.0], [4.5]
]
}
この最後のステップでは、HTTP POST リクエストを送信して展開されたモデルをテストします。このリクエストには、予測が必要なインスタンスを含む JSON ペイロードが含まれています。
curlコマンドは、TensorFlow Serving サーバーに POST リクエストを送信するために使用されます。URL は、モデルと予測 API エンドポイントを指定します。-dフラグは、JSON 形式で予測リクエスト用のデータを提供します。signature_nameキーは、使用するサービング署名を指定します。これは、TensorFlow Serving に実行する計算グラフを伝える方法です。instancesキーには、予測用の入力データが含まれています。
サーバーからの応答には、提供された入力インスタンスに対するモデルによる予測が含まれており、モデルが正常に展開され、予測を行っていることが示されています。
まとめ
このプロジェクトでは、簡単な TensorFlow モデルを作成し、サービング用にエクスポートし、TensorFlow Serving と Docker を使って展開する方法を学びました。必要な依存関係をインストールしてから、基本的なモデルを定義してエクスポートしました。その後、Docker コンテナ内で TensorFlow Serving を使ってモデルをサービングし、予測リクエストを送信してテストしました。このワークフローは、機械学習モデルを拡張可能かつ再現可能な方法で展開するための基本的なスキルです。



