No EAS, defina e implante um serviço de inferência online usando um arquivo de configuração JSON.
Início rápido
1. Preparar um arquivo de configuração JSON
A implantação de um serviço exige um arquivo JSON com as configurações obrigatórias. Para usuários iniciantes, recomendamos acessar Custom Model Deployment > Custom Deployment para configurar os parâmetros. O sistema gera automaticamente a configuração JSON, que serve como modelo.
O código a seguir é um exemplo de arquivo service.json. Para obter a lista completa de parâmetros, consulte Apêndice: Referência de parâmetros JSON.
{
"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 serviço 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 Elastic Algorithm Service (EAS).
Na aba Inference Service, clique em Deploy Service. Depois, na seção Custom Model Deployment, selecione JSON Deployment.
Cole sua configuração JSON e clique em Deploy. O status Running indica que a implantação foi bem-sucedida.
Apêndice: Parâmetros JSON
Parâmetro | Obrigatório | Descrição |
metadata | Sim | Metadados do serviço. Para mais informações, consulte parâmetros de metadata. |
cloud | Não | Configurações de recursos de computação e VPC. Para mais informações, consulte parâmetros de cloud. |
containers | Não | Configuração da imagem. Para mais informações, consulte parâmetros de containers. |
dockerAuth | Não | Necessário para acessar um repositório privado que exige autenticação. O valor é a string codificada em Base64 de |
networking | Não | Configuração de invocação do serviço. Para mais informações, consulte parâmetros de networking. |
storage | Não | Monta dados de serviços de armazenamento, como OSS ou NAS, no contêiner. Para detalhes de configuração, consulte montagem de storage. |
token | Não | Token de acesso para autenticação do serviço. Se não especificado, o sistema gera um automaticamente. |
aimaster | Não | Ativa a verificação de poder de computação e tolerância a falhas para serviços de inferência distribuída multi-nó. |
model_path | Sim | Obrigatório ao implantar um serviço com um processor. Os parâmetros model_path e processor_path especificam os locais de origem dos dados de entrada para o modelo e o processor, respectivamente. Formatos suportados:
|
oss_endpoint | Não | Endpoint do OSS, por exemplo, oss-cn-beijing.aliyuncs.com. Para outros valores válidos, consulte Regiões e endpoints. Nota Por padrão, não é necessário especificar este parâmetro. O serviço usa o endpoint interno do OSS da região atual para baixar arquivos de modelo ou do Processor. Especifique este parâmetro ao acessar o OSS entre regiões. Por exemplo, se você implantar um serviço na região de Hangzhou e especificar um endereço do OSS na região de Pequim para model_path, use este parâmetro para definir o endpoint público do OSS da região de Pequim. |
model_entry | Não | Arquivo de entrada do modelo. Pode ser qualquer arquivo dentro do pacote do modelo. Se não especificado, o padrão é o nome do arquivo de model_path. O caminho para este arquivo de entrada é passado para a função initialize() do processor. |
model_config | Não | Configuração do modelo. Pode ser qualquer texto. Este valor é passado como segundo argumento para a função initialize() do processor. |
processor | Não |
|
processor_path | Não | Caminho para o pacote do processor. Para formatos de caminho suportados, consulte a descrição do parâmetro model_path. |
processor_entry | Não | Arquivo de entrada do processor, 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 | Classe principal do processor no pacote JAR. Por exemplo, com.aliyun.TestProcessor. Este parâmetro é obrigatório se processor_type estiver definido como java. |
processor_type | Não | Linguagem de implementação do processor. Valores válidos:
|
warm_up_data_path | Não | Caminho para o arquivo de requisição usado no aquecimento do modelo. Para mais informações sobre este recurso, consulte aquecimento de modelo. |
runtime.enable_crash_block | Não | Define se uma instância que falha devido a uma exceção no código do processor reinicia automaticamente. Valores válidos:
|
autoscaler | Não | Configuração para dimensionamento automático horizontal. Para descrições detalhadas dos parâmetros, consulte dimensionamento automático horizontal. |
labels | Não | Rótulos a serem aplicados ao serviço. Use o formato |
unit.size | Nã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 serviço no MaxCompute ou Log Service (SLS). Para descrições detalhadas dos parâmetros, consulte parâmetros de sinker. |
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 invocação do serviço. Isso habilita um serviço de inferência seguro e criptografado. Formato: Nota O ambiente de criptografia segura protege principalmente arquivos de armazenamento montados. Certifique-se de ter montado esses arquivos antes de ativar este recurso. .
|
Parâmetros de Metadata
Parâmetros gerais
Parâmetros avançados
Parâmetros de Cloud
Parâmetro | Obrigatório | Descrição | |
computing | instances | Não | Especifica uma lista de tipos de instância a serem usados ao implantar o serviço em um grupo de recursos público. Se um lance para uma instância spot falhar ou se um tipo de instância estiver esgotado, o sistema cria o serviço usando o próximo tipo de instância na lista.
|
disable_spot_protection_period | Não | Define se o período de proteção para uma instância spot deve ser desativado. Este parâmetro aplica-se apenas a instâncias spot. Valores válidos:
| |
networking | vpc_id | Não | ID da VPC. |
vswitch_id | Não | ID do vSwitch. | |
security_group_id | Nã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 como 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 Container
Para implantar um serviço usando uma imagem personalizada, consulte Imagens Personalizadas.
Parâmetro | Obrigatório | Descrição | |
image | Sim | Endereço da imagem para o serviço de modelo. Obrigatório ao implantar usando uma imagem. | |
env | name | Não | Nome da variável de ambiente. |
value | Não | Valor da variável de ambiente. | |
command | Especifique command ou script. | Comando de ponto de entrada para a imagem. Este parâmetro suporta apenas um único comando. Para scripts complexos, como | |
script | Script de ponto de entrada para a imagem. É possível especificar scripts complexos com várias linhas. Separe comandos com | ||
port | Não | Porta do contêiner. Importante
| |
prepare | pythonRequirements | Não | Lista de requisitos 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 | Caminho para um arquivo requirements.txt para instalação de 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 armazenamento externo. Por exemplo: | |
Parâmetros de recursos
Parâmetros de Networking
Parâmetro | Obrigatório | Descrição |
gateway | Não | Especifica o gateway dedicado para o serviço EAS. |
gateway_policy | Não |
Exemplo de configuração: |
Parâmetros de Sinker
Parâmetro | Obrigatório | Descrição | |
type | Não | Especifica o serviço de armazenamento de destino. Valores suportados:
| |
config | maxcompute.project | Não | Nome do projeto MaxCompute. |
maxcompute.table | Não | Nome da tabela MaxCompute. | |
sls.project | Não | Nome do projeto Log Service (SLS). | |
sls.logstore | Não | Nome do Logstore. | |
Exemplos de configurações:
Enviar para MaxCompute
"sinker": {
"type": "maxcompute",
"config": {
"maxcompute": {
"project": "cl****",
"table": "te****"
}
}
}
Enviar para SLS
"sinker": {
"type": "sls",
"config": {
"sls": {
"project": "k8s-log-****",
"logstore": "d****"
}
}
}
Exemplo de configuração JSON
A seguir, um exemplo de 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*******"
}