MLServer GRPC не может преобразовать массив размером 347 в форму (1,)

Я следую примеру, чтобы обслуживать модель sklearn https://github.com/SeldonIO/MLServer/blob/master/docs/examples/sklearn/README.md

Я могу обучить и создать модель, а затем успешно выполнить вызов REST для вывода. Однако сейчас я пытаюсь создать вызов gRPC, и единственный пример, который я смог найти, это https://mlserver.readthedocs.io/en/latest/examples/custom-json/README.html?highlight=grpc#send . -тест-вывод-запрос-grpc

Однако здесь используется другая модель. ТАК Я пытаюсь следовать этому примеру, но заменяю его данными запроса вывода из моего текущего infer.py, см.infer-grpc.pyниже.

поезд.py

      from sklearn import datasets, svm, metrics
from sklearn.model_selection import train_test_split

# The digits dataset
digits = datasets.load_digits()

# To apply a classifier on this data, we need to flatten the image, to
# turn the data in a (samples, feature) matrix:
n_samples = len(digits.images)
data = digits.images.reshape((n_samples, -1))

# Create a classifier: a support vector classifier
classifier = svm.SVC(gamma=0.001)

# Split data into train and test subsets
X_train, X_test, y_train, y_test = train_test_split(
    data, digits.target, test_size=0.5, shuffle=False)

# We learn the digits on the first half of the digits
classifier.fit(X_train, y_train)
import joblib

model_file_name = "mnist-svm.joblib"
joblib.dump(classifier, model_file_name)


infer.py (http)

      import requests
# Import datasets, classifiers and performance metrics
from sklearn import datasets, svm, metrics
from sklearn.model_selection import train_test_split

# The digits dataset
digits = datasets.load_digits()

# To apply a classifier on this data, we need to flatten the image, to
# turn the data in a (samples, feature) matrix:
n_samples = len(digits.images)
data = digits.images.reshape((n_samples, -1))

# Create a classifier: a support vector classifier
classifier = svm.SVC(gamma=0.001)

# Split data into train and test subsets
X_train, X_test, y_train, y_test = train_test_split(
    data, digits.target, test_size=0.5, shuffle=False)

# We learn the digits on the first half of the digits
classifier.fit(X_train, y_train)


x_0 = X_test[0:1]
inference_request = {
    "inputs": [
        {
          "name": "predict",
          "shape": x_0.shape,
          "datatype": "FP32",
          "data": x_0.tolist()
        }
    ]
}

endpoint = "http://localhost:8089/v2/models/mnist-svm/versions/v0.1.0/infer"
response = requests.post(endpoint, json=inference_request)

print(response.json())

вывести-grpc.py

      
import mlserver.types
import requests
import json
import grpc
import mlserver.grpc.converters as converters
import mlserver.grpc.dataplane_pb2_grpc as dataplane
import mlserver.types as types
import requests
# Import datasets, classifiers and performance metrics
from sklearn import datasets, svm, metrics
from sklearn.model_selection import train_test_split

# The digits dataset
digits = datasets.load_digits()

# To apply a classifier on this data, we need to flatten the image, to
# turn the data in a (samples, feature) matrix:
n_samples = len(digits.images)
data = digits.images.reshape((n_samples, -1))

# Create a classifier: a support vector classifier
classifier = svm.SVC(gamma=0.001)

# Split data into train and test subsets
X_train, X_test, y_train, y_test = train_test_split(
    data, digits.target, test_size=0.5, shuffle=False)

# We learn the digits on the first half of the digits
classifier.fit(X_train, y_train)


x_0 = X_test[0:1]



model_name = "mnist-svm"

ip = {"input": x_0.tolist()}


inputs_bytes = json.dumps(x_0.tolist()).encode("UTF-8")

print([len(inputs_bytes)])
print(inputs_bytes)

inference_request = types.InferenceRequest(
    inputs=[
        types.RequestInput(
            name="predict",
            shape=[len(inputs_bytes)],
            datatype="BYTES",
            data=[inputs_bytes],


        )
    ]
)




inference_request_g = converters.ModelInferRequestConverter.from_types(
    inference_request,
    model_name=model_name,
    model_version=None
)

grpc_channel = grpc.insecure_channel("localhost:8081")
grpc_stub = dataplane.GRPCInferenceServiceStub(grpc_channel)

response = grpc_stub.ModelInfer(inference_request_g)
response

выдает ошибку:

      
grpc._channel._InactiveRpcError: <_InactiveRpcError of RPC that terminated with:
    status = StatusCode.UNKNOWN
    details = "Unexpected <class 'ValueError'>: cannot reshape array of size 347 into shape (1,)"

1 ответ

Протокол вывода V2 позволяет отправлять тензоры напрямую. Поэтому, поскольку вы пытаетесь отправить тензор Numpy, вы должны иметь возможность кодировать его как (т.е. без промежуточногоjson.dumpsшаг):

      inference_request = types.InferenceRequest(
    inputs=[
        types.RequestInput(
            name="predict",
            shape=x_0.shape,
            datatype="BYTES",
            data=x_0.tolist()
        )
    ]
)

Обратите внимание, что, начиная с MLServer 1.1.0, вы также можете использовать кодеки для кодирования ваших полезных данных . Таким образом, вы также должны быть в состоянии сделать следующее:

      from mlserver.codecs import NumpyRequestCodec

inference_request = NumpyRequestCodec.encode_request(x_0)
Другие вопросы по тегам