Desenvolva e depure um processador Python personalizado e envie-o com o arquivo do modelo para o OSS para implantar o serviço.
Fluxo de trabalho
Desenvolva um processador Python personalizado seguindo estas etapas:
-
Etapa 1: Configurar o ambiente de desenvolvimento
O SDK Python do EAS oferece suporte a diversos frameworks de machine learning em Python e integra-se a frameworks de processamento de dados, como o Pandas. Configure um ambiente Python local, desenvolva processadores personalizados e, em seguida, empacote e envie o ambiente.
-
Etapa 2: Escrever a lógica de previsão
O SDK Python do EAS fornece um framework RPC de alto desempenho e interfaces internas para interação com o cluster do EAS. Escreva a lógica de previsão e implemente uma interface simples para implantar seu serviço de modelo no EAS.
-
Etapa 3: Testar o serviço localmente
Teste o serviço localmente para verificar se a lógica de previsão está correta e se o serviço funciona conforme o esperado após a implantação.
-
Etapa 4: Empacotar o código e o ambiente Python
Empacote o código e o ambiente para implantar o serviço.
-
Etapa 5: Enviar o pacote do processador e o arquivo do modelo
Envie o pacote e os arquivos do modelo separadamente para o Object Storage Service (OSS).
-
Etapa 6: Implantar e testar o serviço
Implante seu processador personalizado como um serviço de modelo e verifique se ele funciona corretamente.
Separe o arquivo do modelo do processador para reutilizar o pacote do processador ao ajustar e reimplantar o modelo. Na lógica de previsão, use o método
get_model_path()para obter o caminho de armazenamento do modelo e permitir que a lógica o carregue.Se o processador personalizado tiver muitas dependências ou um pacote grande, use uma imagem para implantar o serviço. Para comparar os dois métodos de implantação, consulte Como funciona (Implantação por imagem).
Pré-requisitos
Prepare um arquivo de modelo.
Desenvolva o arquivo do modelo e o processador personalizado separadamente. Envie-os para o OSS de forma independente para que possam ser montados durante a implantação do serviço.
Etapa 1: Configurar o ambiente de desenvolvimento
Use ferramentas de gerenciamento de pacotes Python, como o Pyenv, para configurar um ambiente de desenvolvimento. O EAS fornece a ferramenta cliente EASCMD, que encapsula o processo de inicialização do SDK Python. Após baixar a ferramenta, execute um único comando para inicializar o ambiente do SDK Python e gerar modelos de arquivos. O EASCMD oferece suporte apenas ao Linux. Exemplo:
# Install and initialize EASCMD. This example shows how to install the EASCMD client for Linux.
$ wget https://eas-data.oss-cn-shanghai.aliyuncs.com/tools/eascmd/v2/eascmd64
# After the download is complete, modify the access permissions and configure your Alibaba Cloud AccessKey pair.
$ chmod +x eascmd64
$ ./eascmd64 config -i <access_id> -k <access_key>
# Initialize the environment.
$ ./eascmd64 pysdk init ./pysdk_demo
Quando solicitado, insira uma versão do Python (padrão: 3,6). O sistema cria então um diretório de ambiente Python chamado ENV, um modelo de código de serviço de previsão chamado app.py e um modelo de implantação de serviço chamado app.json no diretório ./pysdk_demo.
Etapa 2: Escrever a lógica de previsão
No mesmo diretório do ENV, crie o arquivo principal para o serviço de previsão, denominado app.py. Exemplo:
Se você usar o EASCMD para inicializar o ambiente Python, o arquivo app.py será gerado automaticamente. Modifique o conteúdo do arquivo conforme necessário.
# -*- coding: utf-8 -*-
import allspark
class MyProcessor(allspark.BaseProcessor):
""" MyProcessor is an example
you can send mesage like this to predict
curl -v http://127.0.0.1:8080/api/predict/service_name -d '2 105'
"""
def initialize(self):
""" load module, executed once at the start of the service
do service initialization and load models in this function.
"""
self.module = {'w0': 100, 'w1': 2}
# model_dir = self.get_model_path().decode()
# You must implement the load_model function yourself. For example, to load a model.pt file, you can implement it as torch.load(model_dir + "/model.pt").
# self.model = load_model(model_dir)
def pre_process(self, data):
""" data format pre process
"""
x, y = data.split(b' ')
return int(x), int(y)
def post_process(self, data):
""" process after process
"""
return bytes(data, encoding='utf8')
def process(self, data):
""" process the request data
"""
x, y = self.pre_process(data)
w0 = self.module['w0']
w1 = self.module['w1']
y1 = w1 * x + w0
if y1 >= y:
return self.post_process("True"), 200
else:
return self.post_process("False"), 400
if __name__ == '__main__':
# allspark.default_properties().put('rpc.keepalive', '10000')
# Set the service timeout to 10s. The default is 5s.
# The worker_threads parameter indicates the processing concurrency.
runner = MyProcessor(worker_threads=10)
runner.run()
Este exemplo herda a classe base BaseProcessor fornecida pelo EAS e implementa as funções initialize() e process().
|
Método |
Descrição |
Uso |
|
initialize() |
Método de inicialização do processador. Executa tarefas de inicialização, como carregar o modelo quando o serviço é iniciado. |
Adicione o seguinte código a
|
|
get_model_path() |
Retorna o diretório de armazenamento do arquivo do modelo como um objeto bytes. |
Quando o parâmetro |
|
process(data) |
Método de tratamento de requisições. Para cada requisição, o corpo da requisição é passado para process(). O valor retornado é enviado ao cliente. |
data: Corpo da requisição, tipo BYTES. Os valores de retorno são BYTES e INT, correspondendo a response_data e status_code. Para uma requisição normal, status_code pode ser 0 ou 200. |
|
_init_(worker_threads=5, worker_processes=1,endpoint=None) |
Construtor do processador. |
|
|
run() |
Inicia o serviço. |
Nenhum. |
Etapa 3: Testar o serviço localmente
-
No diretório que contém o arquivo app.py, execute o seguinte comando para iniciar a aplicação.
./ENV/bin/python app.pySaída esperada em caso de sucesso:
[INFO] waiting for service initialization to complete... [INFO] service initialization complete [INFO] create service [INFO] rpc binds to predefined port 8080 [INFO] install builtin handler call to /api/builtin/call [INFO] install builtin handler eastool to /api/builtin/eastool [INFO] install builtin handler monitor to /api/builtin/monitor [INFO] install builtin handler ping to /api/builtin/ping [INFO] install builtin handler prop to /api/builtin/prop [INFO] install builtin handler realtime_metrics to /api/builtin/realtime_metrics [INFO] install builtin handler tell to /api/builtin/tell [INFO] install builtin handler term to /api/builtin/term [INFO] Service start successfully -
Abra um novo terminal e execute o seguinte comando para testar a aplicação.
Com base no código de exemplo na Etapa 2, envie dados de requisição para a aplicação. O resultado retornado reflete a lógica do código.
curl http://127.0.0.1:8080/test -d '10 20'
Etapa 4: Empacotar o código e o ambiente
O EASCMD fornece um comando de empacotamento em uma única etapa. Se você não estiver usando o EASCMD, empacote o ambiente manualmente. Ambos os métodos estão descritos abaixo.
-
Comando de empacotamento do EASCMD (apenas Linux):
$ ./eascmd64 pysdk pack ./pysdk_demoSaída esperada em caso de sucesso:
[PYSDK] Creating package: /home/xi****.lwp/code/test/pysdk_demo.tar.gz -
Empacotamento manual
Requisito
Detalhes
Formato do pacote
O pacote deve ser um arquivo compactado no formato .zip ou .tar.gz.
Conteúdo do pacote
-
O diretório raiz deve ser /ENV e deve conter o arquivo app.py.
-
Exemplo de pacote: Exemplo de pacote .tar.gz.
-
Etapa 5: Enviar o pacote e os arquivos do modelo
Envie o arquivo do pacote (.zip ou .tar.gz) e o arquivo do modelo para o OSS separadamente para montagem durante a implantação do serviço. Para mais informações, consulte Início rápido para ossutil.
Etapa 6: Implantar e testar o serviço
Implante o serviço de modelo usando o PAI console ou o EASCMD.
-
Implante o serviço.
PAI console
Faça logon no PAI console. Selecione uma região na parte superior da página. Em seguida, selecione o workspace desejado e clique em Elastic Algorithm Service (EAS).
Clique em Deploy Service. Na seção Custom Model Deployment, clique em Custom Deployment.
-
Na página Custom Deployment, configure os seguintes parâmetros. Para outros parâmetros, consulte Implantação personalizada.
Parâmetro
Descrição
Deployment Method
Selecione Processor-based Deployment.
Model Settings
Para Type, selecione OSS e escolha o caminho do OSS onde está o arquivo do modelo.
Processor Type
Selecione Custom Processor.
Processor Language
Selecione python.
Processor Package
Para Type, selecione OSS e escolha o caminho do OSS do arquivo de pacote da etapa anterior.
Processor Main File
Insira
./app.py. -
(Opcional) Na seção Service Configurations, adicione o parâmetro data_image e defina-o como o caminho da imagem configurado durante o empacotamento.
NotaEste parâmetro é necessário apenas se você usou uma imagem para empacotar o ambiente na Etapa 4.
Clique em Deploy.
EASCMD
Implante o serviço no Linux:
Baixe e autentique o EASCMD. Para mais informações, consulte Baixar e autenticar o cliente.
-
No diretório do EASCMD, crie um arquivo JSON chamado app.json. Exemplo:
{ "name": "pysdk_demo", "processor_entry": "./app.py", "processor_type": "python", "processor_path": "oss://examplebucket/exampledirectory/pysdk_demo.tar.gz", "model_path": "oss://examplebucket/exampledirectory/model", "cloud": { "computing": { "instance_type": "ecs.c7.large" } }, "metadata": { "instance": 1, } } -
No diretório que contém o arquivo app.json, execute o seguinte comando para implantar o serviço.
$ ./eascmd64 create app.jsonSaída esperada em caso de sucesso:
[RequestId]: 1202D427-8187-4BCB-8D32-D7096E95B5CA +-------------------+-------------------------------------------------------------------+ | Intranet Endpoint | http://182848887922****.vpc.cn-beijing.pai-eas.aliyuncs.com/api/predict/pysdk_demo | | Token | ZTBhZTY3ZjgwMmMyMTQ5OTgyMTQ5YmM0NjdiMmNiNmJkY2M5ODI0**** | +-------------------+-------------------------------------------------------------------+ [OK] Waiting task server to be ready [OK] Fetching processor from [oss://eas-model-beijing/195557026392****/pysdk_demo.tar.gz] [OK] Building image [registry-vpc.cn-beijing.aliyuncs.com/eas/pysdk_demo_cn-beijing:v0.0.1-20190806082810] [OK] Pushing image [registry-vpc.cn-beijing.aliyuncs.com/eas/pysdk_demo_cn-beijing:v0.0.1-20190806082810] [OK] Waiting [Total: 1, Pending: 1, Running: 0] [OK] Service is running
-
Teste o serviço.
Faça logon no PAI console. Selecione uma região na parte superior da página. Em seguida, selecione o workspace desejado e clique em Elastic Algorithm Service (EAS).
Localize o serviço de destino e clique em Invocation Information na coluna Service Type para obter o endpoint público e o Token.
-
Execute o seguinte comando para chamar o serviço com o endpoint e o token obtidos na etapa anterior.
$ curl <service_url> -H 'Authorization: <token>' -d '10 20'Parâmetros:
<service_url>: Endpoint público da etapa anterior. Exemplo:
http://182848887922****.vpc.cn-beijing.pai-eas.aliyuncs.com/api/predict/pysdk_demo.<token>: Token da etapa anterior. Exemplo:
ZTBhZTY3ZjgwMmMyMTQ5OTgyMTQ5YmM0NjdiMmNiNmJkY2M5ODI0****.-d: Dados de entrada para o serviço.
Referências
Problemas comuns de desenvolvimento: FAQ
Desenvolvimento de processador personalizado em Java: Desenvolver um processador personalizado usando Java