Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
APLICA-SE A:
Azure CLI ml extension v2 (current)
Python SDK azure-ai-ml v2 (current)
Os pontos de extremidade em lote permitem implantar modelos que executam inferência de longa duração em escala. Ao implementar modelos, deve criar e especificar um script de pontuação (também conhecido como script de driver batch) para indicar como usar o modelo em vez dos dados de entrada para criar previsões. Neste artigo, aprende a usar scripts de pontuação em implementações de modelos para diferentes cenários. Também aprendes as melhores práticas para endpoints em lote.
Gorjeta
Os modelos MLflow não exigem um script de pontuação. O serviço gera-a automaticamente para si. Para obter mais informações sobre como os pontos de extremidade em lote funcionam com modelos MLflow, visite o tutorial dedicado Usando modelos MLflow em implantações em lote.
Aviso
Para implementar um modelo de ML Automatizado num endpoint batch, note que o ML Automatizado fornece um script de pontuação que só funciona para endpoints online. Esse script de pontuação não foi feito para execução em lote. Para mais informações sobre como criar um script de pontuação personalizado para o que o seu modelo faz, consulte as seguintes orientações.
Entendendo o roteiro de pontuação
O script de pontuação é um ficheiro Python (.py) que especifica como executar o modelo e ler os dados de entrada que o executor de implantação em lote submete. Cada implantação de modelo fornece o script de pontuação (juntamente com todas as outras dependências necessárias) no momento da criação. O script de pontuação geralmente se parece com isto:
deployment.yml
code_configuration:
code: code
scoring_script: batch_driver.py
O script de pontuação deve conter dois métodos:
O init método
Use o método para qualquer preparação cara init() ou comum. Por exemplo, use-o para carregar o modelo na memória. O início de todo o trabalho em lote chama essa função uma vez. Os arquivos do seu modelo estão disponíveis em um caminho determinado pela variável AZUREML_MODEL_DIRde ambiente . Dependendo de como registaste o teu modelo, os ficheiros podem estar contidos numa pasta. No próximo exemplo, o modelo tem vários arquivos em uma pasta chamada model. Para obter mais informações, visite como você pode determinar a pasta que seu modelo usa.
def init():
global model
# AZUREML_MODEL_DIR is an environment variable created during deployment
# The path "model" is the name of the registered model's folder
model_path = os.path.join(os.environ["AZUREML_MODEL_DIR"], "model")
# load the model
model = load_model(model_path)
Neste exemplo, colocas o modelo na variável modelglobal . Para disponibilizar os ativos necessários para executar a inferência em sua função de pontuação, use variáveis globais.
O run método
Use o run(mini_batch: List[str]) -> Union[List[Any], pandas.DataFrame] método para manipular a pontuação de cada minilote gerado pela implantação do lote. Esse método é chamado uma vez para cada mini_batch dado de entrada gerado. As implementações em lote leem os dados em lotes de acordo com a forma como configuras a implementação.
import pandas as pd
from typing import List, Any, Union
def run(mini_batch: List[str]) -> Union[List[Any], pd.DataFrame]:
results = []
for file in mini_batch:
(...)
return pd.DataFrame(results)
O método recebe uma lista de caminhos de arquivo como um parâmetro (mini_batch). Você pode usar essa lista para iterar e processar individualmente cada arquivo, ou para ler todo o lote e processá-lo de uma só vez. A melhor opção depende da sua memória de computação e da taxa de transferência que você precisa alcançar. Para obter um exemplo que descreve como ler lotes inteiros de dados de uma só vez, visite Implantações de alta taxa de transferência.
Nota
Como é distribuído o trabalho?
As implantações em lote distribuem o trabalho no nível do arquivo, o que significa que uma pasta que contém 100 arquivos, com minilotes de 10 arquivos, gera 10 lotes de 10 arquivos cada. Observe que os tamanhos dos arquivos relevantes não têm relevância. Para ficheiros demasiado grandes para serem processados em mini-lotes grandes, divida-os em ficheiros mais pequenos para alcançar um nível mais elevado de paralelismo, ou diminui o número de ficheiros por mini-lote. No momento, a implantação em lote não pode levar em conta as distorções na distribuição de tamanho do arquivo.
O run() método deve retornar um Pandas DataFrame ou uma matriz/lista. Cada elemento de saída retornado indica uma execução bem-sucedida de um elemento de entrada na entrada mini_batch. Para ativos de dados de arquivo ou pasta, cada linha/elemento retornado representa um único arquivo processado. Para um ativo de dados tabulares, cada linha/elemento retornado representa uma linha em um arquivo processado.
Importante
Como escrever previsões?
Tudo o que a run() função devolve é acrescentado no ficheiro de previsões de saída que o trabalho em lote gera. É importante devolver o tipo de dados correto desta função. Retorne matrizes quando precisar gerar uma única previsão. Retorne pandas DataFrames quando precisar retornar várias informações. Por exemplo, para dados tabulares, convém acrescentar suas previsões ao registro original. Use um Pandas DataFrame para fazer isso. Embora um DataFrame pandas possa conter nomes de colunas, o ficheiro de saída não inclui esses nomes.
Para escrever previsões de uma forma diferente, pode personalizar os resultados em implementações em lote.
Aviso
Na função, não produza run tipos de dados complexos (ou listas de tipos de dados complexos) em vez de pandas.DataFrame. Essas saídas transformam-se em cadeias e tornam-se difíceis de ler.
O DataFrame ou matriz resultante é anexado ao arquivo de saída indicado. Não há exigência sobre a cardinalidade dos resultados. Um ficheiro pode gerar uma ou várias linhas/elementos na saída. Todos os elementos no DataFrame ou matriz de resultado são gravados no arquivo de saída como está (considerando o output_action não summary_onlyé).
Pacotes Python para pontuação
Você deve indicar qualquer biblioteca que seu script de pontuação exija para ser executado no ambiente em que a implantação em lote é executada. Para scripts de pontuação, indique ambientes por implementação. Normalmente, você indica seus requisitos usando um conda.yml arquivo de dependências, que pode ter esta aparência:
mnist/ambiente/conda.yaml
name: mnist-env
channels:
- conda-forge
dependencies:
- python=3.8.5
- pip<22.0
- pip:
- torch==1.13.0
- torchvision==0.14.0
- pytorch-lightning
- pandas
- azureml-core
- azureml-dataset-runtime[fuse]
Visite Criar uma implantação em lote para obter mais informações sobre como indicar o ambiente para seu modelo.
Escrever previsões de uma forma diferente
Por padrão, a implantação em lote grava as previsões do modelo em um único arquivo, conforme indicado na implantação. No entanto, em alguns casos, você deve escrever as previsões em vários arquivos. Por exemplo, para dados de entrada particionados, provavelmente também queres gerar saída particionada. Nesses casos, você pode Personalizar saídas em implantações em lote para indicar:
- O formato de arquivo (CSV, parquet, json, etc) usado para escrever previsões
- A forma como os dados são particionados na saída
Para mais informações, consulte Personalizar saídas em implantações em lote.
Controle do código-fonte de scripts de pontuação
Coloque os scripts de pontuação sob controlo de versão.
Práticas recomendadas para escrever scripts de pontuação
Ao escrever scripts de pontuação que lidam com grandes quantidades de dados, considere vários fatores, incluindo
- O tamanho de cada ficheiro
- A quantidade de dados em cada ficheiro
- A quantidade de memória necessária para ler cada ficheiro
- A quantidade de memória necessária para ler um lote inteiro de arquivos
- A pegada de memória do modelo
- O consumo de memória do modelo ao executar sobre os dados de entrada
- A memória disponível na sua computação
As implantações em lote distribuem o trabalho no nível do arquivo. Esta distribuição significa que uma pasta que contém 100 ficheiros, em mini-lotes de 10 ficheiros, gera 10 lotes de 10 ficheiros cada (independentemente do tamanho dos ficheiros envolvidos). Para ficheiros demasiado grandes para serem processados em mini-lotes grandes, divida-os em ficheiros mais pequenos para alcançar um nível mais elevado de paralelismo, ou diminui o número de ficheiros por mini-lote. Neste momento, a implantação em lote não consegue contabilizar desvios na distribuição do tamanho do ficheiro.
Relação entre o grau de paralelismo e o roteiro de pontuação
Sua configuração de implantação controla o tamanho de cada minilote e o número de trabalhadores em cada nó. Esta configuração é importante quando decide se lê todo o mini-lote para fazer inferência, executa ficheiro a ficheiro de inferência, ou executa a inferência linha a linha (para tabular). Para mais informações, consulte Inferência em execução ao nível de mini-batch, ficheiro ou linha.
Quando executas vários trabalhadores na mesma instância, lembra-te que todos os trabalhadores partilham memória. Se aumentar o número de trabalhadores por nó, deve geralmente diminuir o tamanho do mini-lote ou alterar a estratégia de pontuação se o tamanho dos dados e o SKU de cálculo se mantiverem iguais.
Execução de inferência ao nível de mini-batch, ficheiro ou linha
Os pontos de extremidade em lote chamam a run() função em um script de pontuação uma vez por minilote. No entanto, você pode decidir se deseja executar a inferência em todo o lote, em um arquivo de cada vez ou em uma linha de cada vez para dados tabulares.
Nível de minilote
Normalmente, você realiza inferência sobre todo o lote para alcançar um alto rendimento no processo de avaliação em lote. Esta abordagem funciona bem se executares inferência sobre uma GPU, onde queres saturar o dispositivo de inferência. Também podes confiar num carregador de dados que consiga gerir os lotes por si mesmo se os dados não couberem na memória, como carregadores de dados TensorFlow ou PyTorch. Nestes casos, faz-se inferência sobre todo o lote.
Aviso
A execução da inferência no nível de lote pode exigir um controle próximo sobre o tamanho dos dados de entrada, para considerar corretamente os requisitos de memória e evitar exceções de falta de memória. Se você pode ou não carregar o minilote inteiro na memória depende do tamanho do minilote, do tamanho das instâncias no cluster, do número de trabalhadores em cada nó e do tamanho do minilote.
Visite Implantações de alta taxa de transferência para saber como conseguir isso. Este exemplo processa um lote inteiro de arquivos de cada vez.
Nível de ficheiro
Uma das formas mais fáceis de fazer inferência é iterar sobre todos os ficheiros do mini-batch e depois aplicar o modelo a cada ficheiro. Em alguns casos, como no processamento de imagem, esta abordagem funciona bem. Para dados tabulares, é necessário estimar o número de linhas em cada ficheiro. Esta estimativa mostra se o seu modelo consegue lidar com os requisitos de memória para carregar todos os dados na memória e realizar inferências sobre eles. Alguns modelos (especialmente aqueles baseados em redes neurais recorrentes) se desdobram e apresentam uma pegada de memória com uma contagem de linhas potencialmente não linear. Para um modelo com alto custo de memória, considere executar a inferência no nível da linha.
Gorjeta
Considere dividir ficheiros demasiado grandes para serem lidos ao mesmo tempo em vários ficheiros mais pequenos, para melhorar a paralelização.
Visite Processamento de imagem com implantações em lote para saber como fazer isso. Esse exemplo processa um arquivo de cada vez.
Nível da linha (tabela)
Para modelos que apresentam desafios com seus tamanhos de entrada, convém executar a inferência no nível da linha. Sua implantação em lote ainda fornece seu script de pontuação com um minilote de arquivos. No entanto, lês um ficheiro, uma linha de cada vez. Esta abordagem pode parecer ineficiente, mas para alguns modelos de deep learning pode ser a única forma de fazer inferência sem escalar os recursos do hardware.
Visite Processamento de texto com implantações em lote para saber como fazer isso. Esse exemplo processa uma linha de cada vez.
Usando modelos que são pastas
A AZUREML_MODEL_DIR variável ambiente contém o caminho até à localização selecionada do modelo. A init() função normalmente utiliza-o para carregar o modelo na memória. No entanto, alguns modelos podem conter os seus ficheiros numa pasta, e pode ser necessário ter em conta essa estrutura ao carregá-los. Você pode identificar a estrutura de pastas do seu modelo como mostrado aqui:
Vá para o portal do Azure Machine Learning.
Vá para a seção Modelos .
Selecione o modelo que deseja implantar e selecione a guia Artefatos .
Observe a pasta exibida. Esta pasta é indicada quando o modelo está registado.
Use este caminho para carregar o modelo:
def init():
global model
# AZUREML_MODEL_DIR is an environment variable created during deployment
# The path "model" is the name of the registered model's folder
model_path = os.path.join(os.environ["AZUREML_MODEL_DIR"], "model")
model = load_model(model_path)