No EAS, você pode definir e implantar um service de inferência online usando um arquivo de configuração JSON.
Visualizar a configuração JSON de um service implantado
Caso já tenha implantado um service no console, inclusive via implantação com um clique no Model Gallery, você não precisa criar um arquivo de configuração JSON do zero. Todo service implantado pelo Model Gallery é um service do EAS e compartilha a mesma estrutura de configuração JSON das implantações via JSON. Assim, basta visualizar a configuração JSON completa do service implantado, copiá-la e utilizá-la como base para uma implantação personalizada.
Para visualizar a configuração JSON de um service implantado, siga as etapas abaixo:
Acesse a guia Inference Service no console do EAS.
Clique no nome do service de destino para acessar a página de detalhes do service.
Clique na guia Service Configuration. A configuração JSON completa do service será exibida. Visualize e copie essa configuração.
Ajuste a configuração JSON copiada conforme descrito em Appendix: JSON parameters e utilize-a no procedimento de implantação com JSON na seção Início rápido.
A imagem de runtime, o comando de ponto de entrada (command ou script) e o tipo de instância do service em execução constam nesta configuração JSON e podem ser visualizados na guia Service Configuration. Essa guia exibe a configuração completa, sem campos ocultos adicionais, eliminando a necessidade de obter esses parâmetros separadamente. Utilize a configuração JSON exportada para migrar para uma implantação personalizada e gerencie o service de forma granular.
Início rápido
1. Preparar um arquivo de configuração JSON
Para implantar um service, é necessário um arquivo JSON que defina as configurações obrigatórias. Para usuários iniciantes, acesse Custom Model Deployment > Custom Deployment e configure os parâmetros. O sistema gera a configuração JSON automaticamente, a qual pode ser usada como modelo.
O código abaixo apresenta um exemplo de arquivo service.json. Para a lista completa de parâmetros, consulte Appendix: JSON Parameter Reference.
{
"metadata": {
"name": "demo",
"instance": 1,
"workspace_id": "your-workspace-id"
},
"cloud": {
"computing": {
"instances": [
{
"type": "ecs.c7a.large"
}
]
}
},
"containers": [
{
"image": "eas-registry-vpc.cn-hangzhou.cr.aliyuncs.com/pai-eas/python-inference:py39-ubuntu2004",
"script": "python app.py",
"port": 8000
}
]
}
2. Implantar o service com JSON
Faça login no PAI console. Selecione uma região na parte superior da página. Em seguida, selecione o workspace desejado e clique em Enter Elastic Algorithm Service (EAS).
Na guia Inference Service, clique em Deploy Service. Depois, na seção Custom Model Deployment, selecione JSON Deployment.
Cole a sua configuração JSON e clique em Deploy. Um status do service como Running indica que a implantação foi bem-sucedida.
Apêndice: parâmetros JSON
Parâmetro | Obrigatório | Descrição |
metadata | Sim | Os metadados do service. Para mais informações, consulte metadata parameters. |
cloud | Não | As configurações de recurso de computação e VPC. Para mais informações, consulte cloud parameters. |
containers | Não | A configuração de imagem. Para mais informações, consulte containers parameters. |
dockerAuth | Não | Este parâmetro é obrigatório para acessar um repositório privado que exige autenticação. O valor é a string codificada em Base64 de |
networking | Não | A configuração de invocação do service. Para mais informações, consulte networking parameters. |
storage | Não | Monta dados de services de armazenamento, como OSS ou NAS, no contêiner. Para detalhes de configuração, consulte storage mount. |
token | Não | O token de acesso para autenticação do service. Se não for especificado, o sistema gera um automaticamente. |
aimaster | Não | Ativa o computing power check and fault tolerance para services de inferência distribuída em vários nós. |
model_path | Sim | Obrigatório ao implantar um service com um processador. Os parâmetros model_path e processor_path especificam os locais de source de dados de entrada para o modelo e o processador, respectivamente. Há suporte para os seguintes formatos:
|
oss_endpoint | Não | O endpoint do OSS, por exemplo, oss-cn-beijing.aliyuncs.com. Para outros valores válidos, consulte Regions and endpoints. Nota Por padrão, você não precisa especificar este parâmetro. O service usa o endpoint interno do OSS da região atual para baixar arquivos de modelo ou arquivos do Processor. Você deve especificar este parâmetro ao acessar o OSS entre regiões. Por exemplo, se você implantar um service na região de Hangzhou e especificar um endereço do OSS na região de Beijing para model_path, deverá usar este parâmetro para especificar o endpoint público do OSS da região de Beijing. |
model_entry | Não | O arquivo de entrada do modelo, que pode ser qualquer arquivo dentro do pacote do modelo. Se não for especificado, o padrão será o nome do arquivo de model_path. O caminho para este arquivo de entrada é passado para a função initialize() do processador. |
model_config | Não | A configuração do modelo, que pode ser qualquer texto. Este valor é passado como o segundo argumento para a função initialize() do processador. |
processor | Não |
|
processor_path | Não | O caminho para o pacote do processador. Para formatos de caminho suportados, consulte a descrição do parâmetro model_path. |
processor_entry | Não | O arquivo de entrada do processador, como libprocessor.so ou app.py. Este arquivo deve implementar as funções Este parâmetro é obrigatório se processor_type estiver definido como cpp ou python. |
processor_mainclass | Não | A classe principal do processador no pacote JAR. Por exemplo, com.aliyun.TestProcessor. Este parâmetro é obrigatório se processor_type estiver definido como java. |
processor_type | Não | A linguagem de implementação do processor. Os valores válidos são os seguintes:
|
warm_up_data_path | Não | O caminho para o arquivo de requisição usado para o aquecimento do modelo. Para mais informações sobre este recurso, consulte model warm-up. |
runtime.enable_crash_block | Não | Especifica se uma instância que falha devido a uma exceção de código do processador é reiniciada automaticamente. Valores válidos:
|
autoscaler | Não | A configuração para Auto Scaling horizontal. Para descrições detalhadas dos parâmetros, consulte horizontal auto scaling. |
labels | Não | Os rótulos a serem aplicados ao service. Use o formato |
unit.size | Não | O número de máquinas por instância em uma configuração de inferência distribuída. O valor padrão é 2. |
sinker | Não | Persiste todas as requisições e respostas do service no MaxCompute ou Log Service (SLS). Para descrições detalhadas dos parâmetros, consulte sinker parameters. |
confidential | Não | Configura o Trustee para garantir que informações como dados, modelos e código permaneçam criptografadas durante a implantação e a invocação do service. Isso permite um service de inferência seguro e criptografado. O formato é o seguinte: Nota O ambiente de criptografia segura protege principalmente os arquivos de armazenamento montados. Certifique-se de ter montado esses arquivos antes de ativar este recurso. .
|
Parâmetros de metadados
Parâmetros gerais
Parâmetros avançados
Parâmetros de cloud
Parâmetro | Obrigatório | Descrição | |
computing | instances | Não | Especifique uma lista de tipos de instância a serem usados na implantação do service em um grupo de recursos público. Caso a oferta por uma instância spot falhe ou o tipo de instância esteja indisponível, o sistema cria o service utilizando o próximo tipo de instância da lista.
|
disable_spot_protection_period | Não | Especifique se deseja desativar o período de proteção para uma instância spot. Este parâmetro se aplica apenas a instâncias spot. Valores válidos:
| |
networking | vpc_id | Não | O ID da VPC. |
vswitch_id | Não | O ID do vSwitch. | |
security_group_id | Não | O ID do grupo de segurança. | |
destination_cidrs | Não | Se o bloco CIDR do vSwitch configurado entrar em conflito com os blocos CIDR de gerenciamento do EAS (10.224.0.0/16 ou 10.240.0.0/12), defina explicitamente este parâmetro com o bloco CIDR do seu vSwitch. Substitua | |
Exemplo:
{
"cloud": {
"computing": {
"instances": [
{
"type": "ecs.c8i.2xlarge",
"spot_price_limit": 1
},
{
"type": "ecs.c8i.xlarge",
"capacity": "20%"
}
],
"disable_spot_protection_period": false
},
"networking": {
"vpc_id": "vpc-bp1oll7xawovg9*****",
"vswitch_id": "vsw-bp1jjgkw51nsca1e****",
"security_group_id": "sg-bp1ej061cnyfn0b*****"
}
}
}
Parâmetros de contêiner
Para implantar um service usando uma imagem personalizada, consulte Custom Images.
Parâmetro | Obrigatório | Descrição | |
image | Sim | O endereço da imagem para o service de modelo. Obrigatório ao implantar usando uma imagem. | |
env | name | Não | O nome da variável de ambiente. |
value | Não | O valor da variável de ambiente. | |
command | Especifique command ou script. | O comando de ponto de entrada para a imagem. Este parâmetro aceita apenas um único comando. Para scripts complexos, como | |
script | O script de ponto de entrada para a imagem. Você pode especificar scripts complexos com várias linhas. Separe os comandos com | ||
port | Não | A porta do contêiner. Importante
| |
prepare | pythonRequirements | Não | Uma lista de requisitos do Python a serem instalados antes do início da instância. A imagem deve ter os comandos python e pip disponíveis no PATH do sistema. Por exemplo: |
pythonRequirementsPath | Não | O caminho para um arquivo requirements.txt para instalar pacotes Python antes do início da instância. A imagem deve ter os comandos python e pip disponíveis no PATH do sistema. Este arquivo pode ser incluído na imagem ou montado a partir de um armazenamento externo. Por exemplo: | |
Parâmetros de rede
Parâmetro | Obrigatório | Descrição |
gateway | Não | Especifique o dedicated gateway para o service do EAS. |
gateway_policy | Não |
Exemplo de configuração: |
Parâmetros do Sinker
Parâmetro | Obrigatório | Descrição | |
type | Não | Especifique o service de armazenamento de destino. Valores suportados:
| |
config | maxcompute.project | Não | O nome do projeto MaxCompute. |
maxcompute.table | Não | O nome da tabela MaxCompute. | |
sls.project | Não | O nome do projeto do Log Service (SLS). | |
sls.logstore | Não | O nome do Logstore. | |
Exemplos de configuração:
Enviar para o MaxCompute
"sinker": {
"type": "maxcompute",
"config": {
"maxcompute": {
"project": "cl****",
"table": "te****"
}
}
}
Enviar para o SLS
"sinker": {
"type": "sls",
"config": {
"sls": {
"project": "k8s-log-****",
"logstore": "d****"
}
}
}
Exemplo de configuração JSON
O exemplo a seguir apresenta uma configuração JSON:
{
"token": "****M5Mjk0NDZhM2EwYzUzOGE0OGMx****",
"processor": "tensorflow_cpu_1.12",
"model_path": "oss://examplebucket/exampledir/",
"oss_endpoint": "oss-cn-beijing.aliyuncs.com",
"model_entry": "",
"model_config": "",
"processor_path": "",
"processor_entry": "",
"processor_mainclass": "",
"processor_type": "",
"warm_up_data_path": "",
"runtime": {
"enable_crash_block": false
},
"unit": {
"size": 2
},
"sinker": {
"type": "MaxCompute",
"config": {
"maxcompute": {
"project": "cl****",
"table": "te****"
}
}
},
"cloud": {
"computing": {
"instances": [
{
"capacity": 800,
"type": "dedicated_resource"
},
{
"capacity": 200,
"type": "ecs.c7.4xlarge",
"spot_price_limit": 3.6
}
],
"disable_spot_protection_period": true
},
"networking": {
"vpc_id": "vpc-bp1oll7xawovg9t8****",
"vswitch_id": "vsw-bp1jjgkw51nsca1e****",
"security_group_id": "sg-bp1ej061cnyfn0b****"
}
},
"autoscaler": {
"min": 2,
"max": 5,
"strategies": {
"qps": 10
}
},
"storage": [
{
"mount_path": "/data_oss",
"oss": {
"endpoint": "oss-cn-shanghai-internal.aliyuncs.com",
"path": "oss://bucket/path/"
}
}
],
"confidential": {
"trustee_endpoint": "xx",
"decryption_key": "xx"
},
"metadata": {
"name": "test_eascmd",
"resource": "eas-r-9lkbl2jvdm0puv****",
"instance": 1,
"workspace_id": "1405**",
"gpu": 0,
"cpu": 1,
"memory": 2000,
"gpu_memory": 10,
"gpu_core_percentage": 10,
"qos": "",
"cuda": "11.2",
"enable_grpc": false,
"enable_webservice": false,
"rdma": 1,
"rpc": {
"batching": false,
"keepalive": 5000,
"io_threads": 4,
"max_batch_size": 16,
"max_batch_timeout": 50,
"max_queue_size": 64,
"worker_threads": 5,
"rate_limit": 0,
"enable_sigterm": false
},
"rolling_strategy": {
"max_surge": 1,
"max_unavailable": 1
},
"eas.termination_grace_period": 30,
"scheduling": {
"spread": {
"policy": "host"
}
},
"resource_rebalancing": false,
"shm_size": 100
},
"features": {
"eas.aliyun.com/extra-ephemeral-storage": "100Gi",
"eas.aliyun.com/gpu-driver-version": "tesla=550.127.08"
},
"networking": {
"gateway": "gw-m2vkzbpixm7mo****"
},
"containers": [
{
"image": "registry-vpc.cn-shanghai.aliyuncs.com/xxx/yyy:zzz",
"prepare": {
"pythonRequirements": [
"numpy==1.16.4",
"absl-py==0.11.0"
]
},
"command": "python app.py",
"port": 8000
}
],
"dockerAuth": "dGVzdGNhbzoxM*******"
}