ユニバーサル文節エンコーダー・モデルで文字列形式の入力データを使用¶
モデルのダウンロード¶
この実験では、tfhub.dev の TensorFlow モデルを使用します。
curl --create-dir https://storage.googleapis.com/tfhub-modules/google/universal-sentence-encoder-multilingual/3.tar.gz -o universal-sentence-encoder-multilingual/1/3.tar.gz
tar -xzf universal-sentence-encoder-multilingual/1/3.tar.gz -C universal-sentence-encoder-multilingual/1/
rm universal-sentence-encoder-multilingual/1/3.tar.gz
chmod -R 755 universal-sentence-encoder-multilingual
tree universal-sentence-encoder-multilingual/
universal-sentence-encoder-multilingual/
└── 1
├── assets
├── saved_model.pb
└── variables
├── variables.data-00000-of-00001
└── variables.index
OpenVINO トークナイザー・ライブラリーを使用¶
モデル universal-sentence-encoder-multilingual には、現時点ではコア OpenVINO でサポートされていない SentencepieceTokenizer レイヤーが含まれています。ただし、モデルレイヤーを実行する動的ライブラリーである CPU 拡張機能を使用して実装できます。
イメージ openvino/model_server:2023.3
以降には、CPU 拡張機能を備えたすぐに使用できる OpenVINO モデルサーバーが含まれています。
コンテナ内でモデルサーバーを起動¶
次のコマンドを使用してサービスを開始します。
docker run -d --name ovms -p 9000:9000 -p 8000:8000 -v $(pwd)/universal-sentence-encoder-multilingual:/model openvino/model_server:latest --model_name usem --model_path /model --cpu_extension /ovms/lib/libopenvino_tokenizers.so --plugin_config '{"NUM_STREAMS": 1}' --port 9000 --rest_port 8000
コンテナのログをチェックして、正常に開始されたことを確認します。
docker logs ovms
文字列データを推論要求として送信¶
OpenVINO モデルサーバーは、文字列の形式で入力を受け入れることができます。以下は、tensorflow_serving_api
Python ライブラリーに基づくコードの一部です。
data = np.array(["string1", "string1", "string_n"])
predict_request = predict_pb2.PredictRequest()
predict_request.model_spec.name = "my_model"
predict_request.inputs["input_name"].CopyFrom(make_tensor_proto(data))
predict_response = prediction_service_stub.Predict(predict_request, 10.0)
基本的なクライアントの実行は次のとおりです。
pip install --upgrade pip
pip install -r model_server/demos/universal-sentence-encoder/requirements.txt
python model_server/demos/universal-sentence-encoder/send_strings.py --grpc_port 9000 --string "I enjoy taking long walks along the beach with my dog."
processing time 6.931 ms.
Output shape (1, 512)
Output subset [-0.00552395 0.00599533 -0.01480555 0.01098945 -0.09355522 -0.08445048
-0.02802683 -0.05219319 -0.0675998 0.03127321 -0.03223499 -0.01282092
0.06131846 0.02626886 -0.00983501 0.00298059 0.00141201 0.03229365
0.06957124 0.01543707]
同じことを、REST API インターフェイスや単純な curl
コマンドでも実現できます。
curl -X POST http://localhost:8000/v1/models/usem:predict \
-H 'Content-Type: application/json' \
-d '{"instances": ["dog", "Puppies are nice.", "I enjoy taking long walks along the beach with my dog."]}'
TFS と結果を比較する¶
同じクライアント・コードを使用して、要求を TensorFlow Serving コンポーネントに送信できます。API には完全な互換性があります。
TFS コンテナの開始:
docker run -it -p 8500:8500 -p 9500:9500 -v $(pwd)/universal-sentence-encoder-multilingual:/models/usem -e MODEL_NAME=usem tensorflow/serving --port=9500 --rest_api_port=8500
クライアントの実行:
python model_server/demos/universal-sentence-encoder/send_strings.py --grpc_port 9500 --input_name inputs --output_name outputs --string "I enjoy taking long walks along the beach with my dog."
processing time 12.167000000000002 ms.
Output shape (1, 512)
Output subset [-0.00552387 0.00599531 -0.0148055 0.01098951 -0.09355522 -0.08445048
-0.02802679 -0.05219323 -0.06759984 0.03127313 -0.03223493 -0.01282088
0.06131843 0.02626882 -0.00983502 0.00298053 0.00141208 0.03229369
0.06957125 0.01543701]
注: このモデルはキャッシュをサポートしていないため、
--cache_dir
と一緒に使用しないでください。