O TensorFlow Serving é um mecanismo de inferência para modelos de deep learning. Ele permite implantar modelos no formato TensorFlow SavedModel como services online e oferece suporte a recursos como troca dinâmica e gerenciamento de versões. Com o recurso de implantação baseada em imagem do Elastic Algorithm Service (EAS), você inicia rapidamente services de inferência do TensorFlow Serving.
Pré-requisitos
Arquivos de modelo
Para implantar um service usando uma imagem do TensorFlow Serving, armazene os arquivos de modelo no OSS e garanta que a estrutura de diretórios atenda aos seguintes requisitos:
Diretórios de versão do modelo: Cada modelo deve ter pelo menos um diretório de versão. Os diretórios de versão devem ser nomeados com números inteiros, que funcionam como números de versão. Um número maior indica uma versão mais recente.
Arquivos de modelo: Cada diretório de versão do modelo deve conter os arquivos de modelo exportados no formato SavedModel. O service carrega automaticamente o modelo do diretório com o maior número de versão.
Procedimento:
Crie um diretório em um bucket do OSS para armazenar seus modelos, por exemplo,
oss://examplebucket/models/tf_serving/. Para obter mais informações, consulte Manage directories.-
Faça upload dos arquivos de modelo para o diretório criado na etapa anterior. Você pode baixar e usar os arquivos de modelo do TensorFlow Serving de exemplo deste artigo. A estrutura de diretórios deve seguir o formato abaixo:
tf_serving ├── modelA │ └── 1 │ ├── saved_model.pb │ └── variables │ ├── variables.data-00000-of-00001 │ └── variables.index │ ├── modelB │ ├── 1 │ │ └── ... │ └── 2 │ └── ... │ └── modelC ├── 1 │ └── ... ├── 2 │ └── ... └── 3 └── ...
Arquivo de configuração do modelo
Use um arquivo de configuração para executar vários modelos em um único service. Caso precise implantar apenas um service de modelo único, ignore esta seção.
Crie um arquivo de configuração conforme descrito abaixo e faça upload dele para o OSS. Os arquivos de exemplo na seção Arquivos de modelo incluem um arquivo de configuração de modelo chamado model_config.pbtxt, que pode ser usado diretamente ou modificado conforme necessário. Neste exemplo, o arquivo de configuração do modelo é carregado no diretório oss://examplebucket/models/tf_serving/.
O código a seguir mostra um exemplo do arquivo model_config.pbtxt:
model_config_list {
config {
name: 'modelA'
base_path: '/models/modelA/'
model_platform: 'tensorflow'
model_version_policy{
all: {}
}
}
config {
name: 'modelB'
base_path: '/models/modelB/'
model_platform: 'tensorflow'
model_version_policy{
specific {
versions: 1
versions: 2
}
}
version_labels {
key: 'stable'
value: 1
}
version_labels {
key: 'canary'
value: 2
}
}
config {
name: 'modelC'
base_path: '/models/modelC/'
model_platform: 'tensorflow'
model_version_policy{
latest {
num_versions: 2
}
}
}
}
A tabela a seguir descreve os principais parâmetros.
Parâmetro | Obrigatório | Descrição |
name | Não | Nome do modelo. Recomendamos definir este parâmetro. Sem um nome especificado, não é possível chamar o service de inferência. |
base_path | Sim | Caminho para o diretório de armazenamento do modelo na instância, utilizado para ler os arquivos de modelo durante a implantação do service. Por exemplo, se o diretório de montagem for |
model_version_policy | Não | Política para carregamento de versões do modelo.
|
version_labels | Não | Configure rótulos personalizados para uma versão do modelo. Se version_labels não estiver configurado, a distinção entre versões ocorre apenas pelos números de versão. O caminho da requisição é: Se Nota Por padrão, rótulos só podem ser atribuídos a versões de modelo que foram carregadas e iniciadas com sucesso como services. Para pré-atribuir rótulos a versões ainda não carregadas, defina o parâmetro de inicialização |
Implantar service
Existem duas formas de implantar uma imagem do TensorFlow Serving:
Implantação baseada em cenário: Ideal para cenários básicos de implantação. Permite implantar um service de inferência do TensorFlow Serving configurando apenas alguns parâmetros.
Implantação personalizada: Oferece flexibilidade para ajustar diversas opções de configuração, como modificar a porta ou definir o intervalo de verificação do arquivo de modelo.
Os services de inferência do TensorFlow Serving suportam as portas 8501 e 8500.
8501: Suporta requisições HTTP. Um service HTTP ou REST inicia nesta porta.
8500: Suporta requisições gRPC. Um service gRPC inicia nesta porta.
O método de implantação baseada em cenário usa a porta 8501 por padrão, sem possibilidade de alteração. Para utilizar a porta 8500, adote o método de implantação personalizada.
Scenario-based
Procedimento:
Faça login no PAI console. Selecione uma região no topo da página. Em seguida, escolha o workspace desejado e clique em Enter Elastic Algorithm Service (EAS).
Na página Elastic Algorithm Service (EAS), clique em Deploy Service. Na seção Scenario-based Model Deployment, clique em Tensorflow Serving Deployment.
-
Na página Tensorflow Serving Deployment, configure os parâmetros. A tabela abaixo detalha os principais parâmetros. Para informações sobre outros parâmetros, consulte custom deployment.
Parâmetro
Descrição
Deployment Method
Dois métodos de implantação são suportados:
Standard Model Deployment: Utilizado para implantar um service de modelo único.
Configuration File Deployment: Utilizado para implantar um service multimodelo.
Model Settings
Se selecionar Standard Model Deployment em Deployment Method, configure o caminho do OSS para o arquivo de modelo.
Ao optar por Configuration File Deployment em Deployment Method, configure os seguintes parâmetros:
OSS: Selecione o caminho do OSS onde os arquivos de modelo estão localizados.
Mount Path: Caminho na instância do service onde os arquivos de modelo serão montados.
Configuration File: Selecione o caminho do OSS onde o arquivo de configuração do modelo está localizado.
A tabela a seguir apresenta exemplos de configuração.
Parâmetro
Exemplo de modelo único
Exemplo multimodelo
Service Name
modela_scene
multi_scene
Deployment Method
Selecione Standard Model Deployment.
Selecione Configuration File Deployment.
Model Settings
OSS:
oss://examplebucket/models/tf_serving/modelA/.OSS:
oss://examplebucket/models/tf_serving/.Mount Path: /models
Configuration File:
oss://examplebucket/models/tf_serving/model_config.pbtxt
Após configurar os parâmetros, clique em Deploy.
Custom
Procedimento:
Faça login no PAI console. Selecione uma região no topo da página. Em seguida, escolha o workspace desejado e clique em Enter Elastic Algorithm Service (EAS).
Clique em Deploy Service. Na seção Inference Service, clique em Custom Deployment dentro da área Custom Model Deployment.
-
Na página Custom Deployment, configure os parâmetros. A tabela abaixo detalha os principais parâmetros. Para informações sobre outros parâmetros, consulte custom deployment.
Parâmetro
Descrição
Image Configuration
Na lista Alibaba Cloud Image, selecione tensorflow-serving e a versão correspondente da imagem. Recomendamos escolher a versão mais recente.
NotaSe o service exigir GPU, a versão da imagem deve terminar com -gpu, por exemplo, x.xx.x-gpu.
Model Settings
É possível configurar os arquivos de modelo de várias maneiras. Este exemplo utiliza o tipo OSS.
Uri: Selecione o caminho do OSS para os arquivos de modelo.
Mount Path: Caminho na instância do service onde os arquivos de modelo serão montados.
Command to Run
Ao selecionar a imagem tensorflow-serving, o comando
/usr/bin/tf_serving_entrypoint.shé carregado automaticamente. Abaixo estão os demais parâmetros de inicialização do tensorflow-serving que devem ser definidos.Parâmetros de inicialização para implantação de modelo único:
--model_name: Nome do modelo usado na URL para requisições ao service. Se não especificado, o nome padrão é 'model'.--model_base_path: Especifica o caminho do diretório de armazenamento do modelo na instância. Sem essa configuração, o caminho padrão será/models/model.
Parâmetros de inicialização para implantação multimodelo:
--model_config_file: Obrigatório. Especifica o arquivo de configuração do modelo.--model_config_file_poll_wait_seconds: Opcional. Para modificar o conteúdo do arquivo de configuração após o início do service, configure um intervalo de verificação em segundos. O service lerá o arquivo nesse intervalo. Por exemplo,--model_config_file_poll_wait_seconds=30faz com que o service leia o arquivo de configuração a cada 30 segundos.NotaQuando o service de inferência lê um novo arquivo de configuração, ele processa apenas o conteúdo atualizado. Por exemplo, se o arquivo antigo continha o modelo A e o novo remove o modelo A e adiciona o modelo B, o service descarrega o modelo A e carrega o modelo B.
--allow_version_labels_for_unavailable_models: Opcional. O valor padrão é false. Para atribuir rótulos antecipadamente a versões de modelo ainda indisponíveis, defina este parâmetro como true. Exemplo:--allow_version_labels_for_unavailable_models=true.
A tabela a seguir apresenta exemplos de configuração.
Parâmetro
Exemplo de modelo único
Exemplo multimodelo
Deployment Method
Selecione Image-based Deployment.
Image Configuration
Selecione Alibaba Cloud Image: tensorflow-serving > tensorflow-serving:2.14.1.
Model Settings
Defina o tipo de modelo como OSS.
Uri:
oss://examplebucket/models/tf_serving/.Mount Path: Defina como
/models.
Command to Run
/usr/bin/tf_serving_entrypoint.sh --model_name=modelA --model_base_path=/models/modelA/usr/bin/tf_serving_entrypoint.sh --model_config_file=/models/model_config.pbtxt --model_config_file_poll_wait_seconds=30 --allow_version_labels_for_unavailable_models=truePor padrão, o service escuta na porta 8501 para requisições HTTP/REST. Para habilitar requisições gRPC, siga as etapas abaixo:
Na seção Environment Information, altere o Port Number para 8500.
Ainda na seção Environment Information, ative a chave Enable gRPC.
-
Na seção Service Configurations, adicione a seguinte configuração:
"networking": { "path": "/" }
Clique em Deploy.
Enviar requisições ao service
Dependendo da porta configurada durante a implantação, o service suporta os protocolos de requisição HTTP e gRPC. Os exemplos abaixo utilizam o modelA.
-
Prepare os dados de teste
O modelA é um modelo de classificação de imagens treinado no conjunto de dados Fashion-MNIST, composto por imagens em escala de cinza de 28x28. O modelo gera a probabilidade de uma amostra pertencer a uma das 10 classes. Para testes, utilize
[[[[1.0]] * 28] * 28]como dados de entrada nas requisições ao modelA. -
Exemplos de requisição
HTTP requests
Com a porta configurada para 8501, o service aceita requisições HTTP. A tabela a seguir resume os caminhos de requisição HTTP para implantações de modelo único e multimodelo.
Modelo único
Multimodelo
Formato do caminho:
<service_url>/v1/models/<model_name>:predictOnde:
Na implantação baseada em cenário, <model_name> não pode ser personalizado e assume o valor padrão
model.Na implantação personalizada, <model_name> corresponde ao nome configurado no campo Command to Run. Sem configuração, o padrão é
model.
As requisições podem ser feitas com ou sem especificação da versão do modelo. Os formatos de caminho são:
Sem especificar versão (carrega a mais recente por padrão):
<service_url>/v1/models/<model_name>:predictEspecificando a versão do modelo:
/v1/models/ /versions/ :predict Se
version_labelsestiverem definidos:<service_url>/v1/models/<model_name>/labels/<version label>:predict
Aqui, <model_name> refere-se ao nome definido no arquivo de configuração do modelo.
No caminho, <service_url> representa o endpoint do service. Encontre o endpoint clicando em Invocation Information na coluna Service Type do service desejado na página Elastic Algorithm Service (EAS). Ao usar o recurso de depuração online no console, essa parte do caminho é preenchida automaticamente.
Para uma implantação baseada em cenário de um modelo único, como o modelA, o caminho da requisição HTTP é:
<service_url>/v1/models/model:predict.As seções a seguir detalham como enviar requisições usando o recurso de depuração online no console e via código Python.
Online debugging
Após a implantação do service, clique em Online Debugging na coluna Actions do service. Na seção Request Parameter Online Tuning, o <service_url> já estará preenchido. Adicione o caminho
/v1/models/model:predictà URL e configure os dados da requisição no Body:{"signature_name": "serving_default", "instances": [[[[1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0]], [[1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0]], [[1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0]], [[1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0]], [[1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0]], [[1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0]], [[1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0]], [[1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0]], [[1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0]], [[1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0]], [[1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0],-1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0],-1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0],-1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.e-01]]]}Após configurar os parâmetros, clique em Send Request. A saída será semelhante à seguinte.
Status Code: 200 Connection: Keep-Alive Content-Length: 158 Content-Type: application/json Date: Fri, 08 Nov 2024 02:28:08 GMT Body: { "predictions": [[-9.40927601, -5.41267443, -15.9157038, -15.7119455, -16.194952, -42.5621414, -7.23207045, -43.1042442, 4.25585461, -31.3991375] ] }Send an HTTP request using Python code
Segue um exemplo de código Python:
from urllib import request import json # Replace <service_url> and <test-token> with your service endpoint and token. # To obtain them, click Invocation Information for your inference service and then go to the Public Endpoint Invocation tab. service_url = '<service_url>' token = '<test-token>' # For a scenario-specific single-model deployment, set this to "model". For other cases, refer to the path description table above. model_name = "model" url = "{}/v1/models/{}:predict".format(service_url, model_name) # Create an HTTP request. req = request.Request(url, method="POST") req.add_header('authorization', token) data = { 'signature_name': 'serving_default', 'instances': [[[[1.0]] * 28] * 28] } # Send the request. response = request.urlopen(req, data=json.dumps(data).encode('utf-8')).read() # Check the response. response = json.loads(response) print(response)gRPC requests
Ao definir a porta como 8500 e adicionar as configurações gRPC, o service passa a aceitar requisições gRPC. Segue um exemplo de código Python:
import grpc import tensorflow as tf from tensorflow_serving.apis import predict_pb2 from tensorflow_serving.apis import prediction_service_pb2_grpc from tensorflow.core.framework import tensor_shape_pb2 # The service endpoint. For the format, see the description of the host parameter below. host = "tf-serving-multi-grpc-test.166233998075****.cn-hangzhou.pai-eas.aliyuncs.com:80" # Replace <test-token> with the service token. You can view the token on the Invocation Information page. token = "<test-token>" # The model name. See the description of the name parameter below. name = "<model_name>" signature_name = "serving_default" # The model version number. You can send requests to only one model version at a time. version = "<version_num>" # Create a gRPC request. request = predict_pb2.PredictRequest() request.model_spec.name = name request.model_spec.signature_name = signature_name request.model_spec.version.value = version request.inputs["keras_tensor"].CopyFrom(tf.make_tensor_proto([[[[1.0]] * 28] * 28])) # Request the service. channel = grpc.insecure_channel(host) stub = prediction_service_pb2_grpc.PredictionServiceStub(channel) metadata = (("authorization", token),) response, _ = stub.Predict.with_call(request, metadata=metadata) print(response)Os principais parâmetros são descritos abaixo:
Parâmetro
Descrição
host
Defina este parâmetro com o endpoint do service. Omita
http://do endpoint e adicione:80ao final. Na página Elastic Algorithm Service (EAS), clique em Invocation Information na coluna Service Type do service alvo para visualizar o endpoint.name
Para requisições gRPC a um modelo único:
Implantação baseada em cenário: Defina como
model.Implantação personalizada: Defina como o nome do modelo configurado em Command to Run. Sem configuração, o valor padrão é
model.
Para requisições gRPC a múltiplos modelos:
Defina como o nome do modelo configurado no arquivo de configuração do modelo.
version
Defina como o número da versão do modelo. É possível enviar requisições para apenas uma versão do modelo por vez.
metadata
Defina como o token do service. Visualize o token na página Invocation Information.
Documentos relacionados
Para implantar um service do Elastic Algorithm Service (EAS) usando o mecanismo Triton Inference Server, consulte Triton Inference Server image-based deployment.
Também é possível implantar um service EAS usando uma imagem personalizada. Para mais informações, consulte Custom images.