ユニバーサル文節エンコーダー・モデルで文字列形式の入力データを使用

モデルのダウンロード

この実験では、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 と一緒に使用しないでください。