Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
APLICA-SE A:
SDK do Azure Machine Learning v1 para Python
Importante
Este artigo fornece informações sobre como usar o SDK do Azure Machine Learning v1. O SDK v1 foi preterido a partir de 31 de março de 2025. O apoio terminará em 30 de junho de 2026. Você pode instalar e usar o SDK v1 até essa data. Seus fluxos de trabalho existentes usando o SDK v1 continuarão a operar após a data de fim do suporte. No entanto, eles podem estar expostos a riscos de segurança ou alterações disruptivas no caso de alterações arquitetônicas no produto.
Recomendamos a transição para o SDK v2 antes de 30 de junho de 2026. Para obter mais informações sobre o SDK v2, consulte O que é a CLI do Azure Machine Learning e o SDK do Python v2? e a referência do SDK v2.
Observação
Pacotes retirados: Os seguintes pacotes SDK v1 são retirados: azureml-pipeline, azureml-pipeline-core, azureml-pipeline-internal, azureml-pipeline-steps e azureml-train-core.
Neste artigo, aprende como diagnosticar erros que ocorrem ao executar um pipeline de machine learning no Azure Machine Learning SDK e no designer Azure Machine Learning.
Sugestões de resolução de problemas
A tabela seguinte apresenta problemas comuns durante o desenvolvimento de pipelines, com soluções possíveis.
| Problema | Solução possível |
|---|---|
Não é possível transmitir dados para o diretório PipelineData |
Certifique-se de criar um diretório no script que corresponda ao local onde o seu pipeline espera os dados de saída das etapas. Na maioria dos casos, um argumento de entrada define o diretório de saída e, em seguida, você cria o diretório explicitamente. Utilize os.makedirs(args.output_dir, exist_ok=True) para criar o diretório de saída. Veja o tutorial para obter um exemplo de script de classificação que mostra este padrão de design. |
| Erros de dependência | Se você vir erros de dependência em seu pipeline remoto que não ocorreram durante o teste local, confirme se as dependências e versões do ambiente remoto correspondem às do seu ambiente de teste. (Ver Construção do ambiente, cache e reutilização. |
| Erros ambíguos com alvos de computação | Tente eliminar e recriar os alvos de computação. Recriar alvos de computação é rápido e pode resolver alguns problemas transitórios. |
| O pipeline não está a reutilizar os passos | A reutilização de etapas está ativada por defeito, mas certifica-te de que não a desativaste numa etapa de pipeline. Se desativar a reutilização, defina o parâmetro allow_reuse na etapa para False. |
| O pipeline está a voltar a ser executado desnecessariamente | Para garantir que os passos só voltam a ser executados quando os dados ou scripts subjacentes forem alterados, desassocie os diretórios de código de origem de cada passo. Se usares o mesmo diretório de origem para vários passos, podes experienciar repetições desnecessárias. Use o source_directory parâmetro em um objeto de etapa de pipeline para apontar para o diretório isolado para essa etapa e verifique se você não está usando o mesmo source_directory caminho para várias etapas. |
| Passo a desacelerar ao longo das épocas de treino ou outro comportamento cíclico | Tente mudar as operações de escrita de ficheiros, incluindo o registo, de as_mount() para as_upload(). O modo de montagem utiliza um sistema de ficheiros virtualizado remoto e carrega todo o ficheiro sempre que este é anexado. |
| O alvo de computação demora muito tempo a iniciar | As imagens do Docker para destinos de computação são carregadas do Azure Container Registry (ACR). Por padrão, o Aprendizado de Máquina do Azure cria uma ACR que usa a camada de serviço básica . Mudar o ACR do seu espaço de trabalho para nível standard ou premium pode reduzir o tempo que demora a construir e carregar imagens. Para obter mais informações, veja Escalões de serviço do Azure Container Registry (ACR). |
Erros de autenticação
Se você executar uma operação de gerenciamento em um destino de computação a partir de um trabalho remoto, receberá um dos seguintes erros:
{"code":"Unauthorized","statusCode":401,"message":"Unauthorized","details":[{"code":"InvalidOrExpiredToken","message":"The request token was either invalid or expired. Please try again with a valid token."}]}
{"error":{"code":"AuthenticationFailed","message":"Authentication failed."}}
Por exemplo, recebe um erro se tentar criar ou anexar um destino de computação a um pipeline de ML que submete para ser executado remotamente.
Solução de problemas ParallelRunStep
Observação
ParallelRunStep faz parte do pacote azureml-pipeline-steps descontinuado. Estou a planear migrar para alternativas ao SDK v2. Para mais informações, consulte Construir e executar pipelines de aprendizagem automática com Azure Machine Learning CLI/SDK v2 e Executar inferência em lote usando endpoints em lote.
O script para um ParallelRunStepdeve conter duas funções:
-
init(): Use esta função para qualquer preparação dispendiosa ou comum para inferência posterior. Por exemplo, use-o para carregar o modelo em um objeto global. Esta função é chamada apenas uma vez no início do processo. -
run(mini_batch): A função é executada para cadamini_batchinstância.-
mini_batch:ParallelRunStepinvoca o método run e passa uma lista ou pandasDataFramecomo argumento ao método. Cada entrada emmini_batché um caminho de ficheiro se a entrada for umFileDatasetou um pandasDataFramese a entrada for umTabularDataset. -
response: Orun()método deve devolver um pandasDataFrameou um array. Paraappend_rowoutput_action, estes elementos devolvidos são anexados ao ficheiro de saída comum. Parasummary_only, o conteúdo dos elementos é ignorado. Para todas as ações de saída, cada elemento de saída retornado indica uma execução bem-sucedida do elemento de entrada no minilote de entrada. Certifique-se de que sejam incluídos dados suficientes no resultado da execução para mapear a entrada ao resultado de execução. A saída de execução é escrita no ficheiro de saída e não é garantido que esteja em ordem; deve usar uma chave na saída para associá-la à entrada.
-
Observação
Este exemplo de código utiliza APIs TensorFlow 1.x (tf.Session, tf.reset_default_graph). Estas APIs foram removidas no TensorFlow 2.x. Se estiveres a usar o TensorFlow 2.x, usa tf.compat.v1 o modo de compatibilidade ou reescreve com eager execution. Para mais informações, consulte Migrar o seu código TensorFlow 1 para TensorFlow 2.
%%writefile digit_identification.py
# Snippets from a sample script.
# Refer to the accompanying digit_identification.py
# (https://github.com/Azure/MachineLearningNotebooks/tree/master/how-to-use-azureml/machine-learning-pipelines/parallel-run)
# for the implementation script.
import os
import numpy as np
import tensorflow as tf
from PIL import Image
from azureml.core import Model
def init():
global g_tf_sess
# Pull down the model from the workspace
model_path = Model.get_model_path("mnist")
# Construct a graph to execute
tf.reset_default_graph()
saver = tf.train.import_meta_graph(os.path.join(model_path, 'mnist-tf.model.meta'))
g_tf_sess = tf.Session()
saver.restore(g_tf_sess, os.path.join(model_path, 'mnist-tf.model'))
def run(mini_batch):
print(f'run method start: {__file__}, run({mini_batch})')
resultList = []
in_tensor = g_tf_sess.graph.get_tensor_by_name("network/X:0")
output = g_tf_sess.graph.get_tensor_by_name("network/output/MatMul:0")
for image in mini_batch:
# Prepare each image
data = Image.open(image)
np_im = np.array(data).reshape((1, 784))
# Perform inference
inference_result = output.eval(feed_dict={in_tensor: np_im}, session=g_tf_sess)
# Find the best probability, and add it to the result list
best_result = np.argmax(inference_result)
resultList.append("{}: {}".format(os.path.basename(image), best_result))
return resultList
Se você tiver outro arquivo ou pasta no mesmo diretório do script de inferência, poderá fazer referência a ele localizando o diretório de trabalho atual.
script_dir = os.path.realpath(os.path.join(__file__, '..',))
file_path = os.path.join(script_dir, "<file_name>")
Parâmetros para ParallelRunConfig
ParallelRunConfig é a configuração principal para uma ParallelRunStep instância dentro do pipeline Azure Machine Learning. Use-o para encapsular o seu script e configurar os parâmetros necessários, incluindo todas as seguintes entradas:
-
entry_script: Um script de utilizador como um caminho de ficheiro local que corre em paralelo em múltiplos nós. Sesource_directoryestiver presente, use um caminho relativo. Caso contrário, use qualquer caminho acessível na máquina. -
mini_batch_size: O tamanho do mini-batch passado para uma chamada únicarun(). (opcional; o valor padrão é10ficheiros paraFileDatasete1MBparaTabularDataset.)- Para
FileDataset, é o número de arquivos com um valor mínimo de1. Você pode combinar vários arquivos em um minilote. - Para
TabularDataset, é o tamanho dos dados. Os valores de exemplo são1024,1024KB,10MBe1GB. O valor recomendado é1MB. O mini-lote deTabularDatasetnunca ultrapassa os limites dos ficheiros. Por exemplo, se você tiver .csv arquivos com vários tamanhos, o menor arquivo é de 100 KB e o maior é de 10 MB. Se definirmini_batch_size = 1MB, os arquivos com tamanho menor que 1 MB serão tratados como um mini-lote. Os ficheiros com um tamanho superior a 1 MB são divididos em vários mini-lotes.
- Para
-
error_threshold: O número de falhas de registo paraTabularDatasete falhas de ficheiro paraFileDatasetque o processo ignora. Se a contagem de erros para toda a entrada ultrapassar esse valor, o trabalho será abortado. O limiar de erro aplica-se a toda a entrada e não a mini-lotes individuais enviados para orun()método. O intervalo é[-1, int.max]. O-1valor indica ignorar todas as falhas durante o processamento. -
output_action: Um dos seguintes valores indica como a saída é organizada:-
summary_only: O script de usuário armazena a saída.ParallelRunStepusa a saída apenas para o cálculo do limite de erro. -
append_row: Para todas as entradas, apenas um arquivo é criado na pasta de saída para acrescentar todas as saídas separadas por linha.
-
-
append_row_file_name: Para personalizar o nome do ficheiro de saída paraappend_rowoutput_action(opcional; valor padrão éparallel_run_step.txt). -
source_directory: Caminhos para pastas que contêm todos os arquivos a serem executados no destino de computação (opcional). -
compute_target: SomenteAmlComputeé suportado. -
node_count: O número de nós de computação a usar para executar o script de utilizador. -
process_count_per_node: O número de processos por nó. Defina este valor para o número de GPU ou CPU que está disponível em um nó (opcional; o valor por defeito é1). -
environment: A definição do ambiente Python. Você pode configurá-lo para usar um ambiente Python existente ou para configurar um ambiente temporário. A definição também é responsável por definir as dependências de aplicativo necessárias (opcional). -
logging_level: Verbosidade de log. Os valores no aumento da verbosidade são:WARNING,INFO, eDEBUG. (opcional; o valor padrão éINFO) -
run_invocation_timeout: Orun()tempo limite de invocação do método em segundos. (opcional; o valor padrão é60) -
run_max_try: Contagem máxima de tentativas derun()para um minilote. Arun()falha se uma exceção for lançada, ou se não devolver nada quandorun_invocation_timeouté atingida (opcional; o valor padrão é3).
Pode especificar mini_batch_size, node_count, process_count_per_node, logging_level, run_invocation_timeout, e run_max_try como PipelineParameter valores. Quando reenvia uma execução de pipeline, pode afinar estes valores de parâmetros. Neste exemplo, usa-se PipelineParameter para mini_batch_size e process_count_per_node, e altera-se esses valores quando se reenvia uma execução mais tarde.
Parâmetros para criar o ParallelRunStep
Crie o ParallelRunStep usando o script, configuração do ambiente e parâmetros. Especifique o destino de computação que você já anexou ao seu espaço de trabalho como o destino de execução para seu script de inferência. Use ParallelRunStep para criar a etapa de pipeline de inferência em lote, que aceita todos os seguintes parâmetros:
-
name: O nome da etapa. O nome deve ser único, de 3 a 32 caracteres, e corresponder à regex^[a-z]([-a-z0-9]*[a-z0-9])?$. -
parallel_run_config: UmParallelRunConfigobjeto, conforme definido anteriormente. -
inputs: Um ou mais conjuntos de dados Azure Machine Learning de tipo único para particionar para processamento paralelo. -
side_inputs: Um ou mais dados de referência ou conjuntos de dados usados como entradas secundárias sem necessidade de ser particionados. -
output: UmOutputFileDatasetConfigobjeto que corresponde ao diretório de saída. -
arguments: Uma lista de argumentos passados para o script de usuário. Useunknown_argspara os recuperar no seu script de entrada (opcional). -
allow_reuse: Se o passo deve reutilizar resultados anteriores quando executado com as mesmas definições e entradas. Se definir este parâmetro paraFalse, o pipeline gera uma nova execução para este passo durante a execução do pipeline. (opcional; o valor padrão éTrue.)
from azureml.pipeline.steps import ParallelRunStep
parallelrun_step = ParallelRunStep(
name="predict-digits-mnist",
parallel_run_config=parallel_run_config,
inputs=[input_mnist_ds_consumption],
output=output_dir,
allow_reuse=True
)
Técnicas de depuração
Existem três técnicas principais para depurar pipelines:
- Depure etapas individuais do pipeline no seu computador local.
- Use o registo e o Application Insights para isolar e diagnosticar a origem do problema.
- Anexe um depurador remoto a um pipeline em execução no Azure.
Depurar scripts localmente
Uma das falhas mais comuns em um pipeline é que o script de domínio não é executado como pretendido ou contém erros de tempo de execução no contexto de computação remota que são difíceis de depurar.
As pipelines em si não podem ser executadas localmente. Mas executar os scripts isoladamente no seu computador local permite-lhe depurar mais rapidamente porque não precisa esperar pelo processo de configuração do ambiente computacional. Algum trabalho de desenvolvimento é necessário para fazer isso:
- Se os dados estiverem em um armazenamento de dados na nuvem, você precisará baixar os dados e disponibilizá-los para o script. Usar uma pequena amostra de seus dados é uma boa maneira de reduzir o tempo de execução e obter rapidamente feedback sobre o comportamento do script
- Se você estiver tentando simular uma etapa de pipeline intermediária, talvez seja necessário criar manualmente os tipos de objeto que o script específico está esperando da etapa anterior
- Você precisa definir seu próprio ambiente e replicar as dependências definidas em seu ambiente de computação remota
Depois de ter uma configuração de script para ser executada em seu ambiente local, é mais fácil fazer tarefas de depuração como:
- Anexando uma configuração de depuração personalizada
- Pausando a execução e inspecionando o estado do objeto
- Detetando erros lógicos ou de tipo que não serão expostos até ao momento de execução
Gorjeta
Depois de verificar se o script está sendo executado conforme o esperado, uma boa próxima etapa é executar o script em um pipeline de uma única etapa antes de tentar executá-lo em um pipeline com várias etapas.
Configurar, gravar e revisar logs de pipeline
Testar scripts localmente é uma ótima maneira de depurar os principais fragmentos de código e a lógica complexa antes de começar a criar um pipeline. Em algum momento, você precisa depurar scripts durante a própria execução do pipeline, especialmente ao diagnosticar o comportamento que ocorre durante a interação entre as etapas do pipeline. Use instruções liberais print() nos seus scripts de passo para que possa ver o estado do objeto e os valores esperados durante a execução remota, semelhante a quando depura código JavaScript.
Opções e comportamento de registos
A tabela seguinte fornece informações sobre diversas opções de depuração para pipelines. Não é uma lista exaustiva, pois existem outras opções além apenas das do Azure Machine Learning e Python mostradas aqui.
| Biblioteca | Tipo | Exemplo | Destino | Recursos |
|---|---|---|---|---|
| Azure Machine Learning SDK | Métrico | run.log(name, val) |
IU do Portal do Azure Machine Learning |
Como monitorizar as experimentações azureml.core.Run classe |
| Registo/impressão em Python | Registo | print(val)logging.info(message) |
Registos do controlador, estruturador do Azure Machine Learning |
Como monitorizar as experimentações Logging Python |
Exemplo de opções de registo
import logging
from azureml.core.run import Run
run = Run.get_context()
# Azure Machine Learning Scalar value logging
run.log("scalar_value", 0.95)
# Python print statement
print("I am a python print statement, I will be sent to the driver logs.")
# Initialize Python logger
logger = logging.getLogger(__name__)
logger.setLevel(args.log_level)
# Plain Python logging statements
logger.debug("I am a plain debug statement, I will be sent to the driver logs.")
logger.info("I am a plain info statement, I will be sent to the driver logs.")
handler = AzureLogHandler(connection_string='<connection string>')
logger.addHandler(handler)
Observação
AzureLogHandler está obsoleto no pacote opencensus-ext-azure. Para projetos novos, usa o azure-monitor-opentelemetry pacote em vez disso.
Designer do Azure Machine Learning
Para pipelines que crias no designer, podes encontrar o ficheiro 70_driver_log na página de autoria ou na página de detalhes de execução do pipeline.
Habilite o registro em log para pontos de extremidade em tempo real
Para diagnosticar e depurar endpoints em tempo real no designer, use o SDK para ativar o registo do Application Insights. Ao utilizar registos, pode resolver e depurar problemas de implementação e utilização do modelo. Para obter mais informações, consulte Registo para modelos implantados.
Obter logs da página de criação
Quando se submete uma execução de pipeline e se permanece na página de edição, é possível encontrar os arquivos de log gerados para cada componente à medida que este termina de ser executado.
Selecione um componente que conclua a execução na área de autoria.
No painel direito do componente, vá para o separador Saídas + logs.
Expanda o painel direito e selecione o ficheiro70_driver_log.txt para o visualizar no navegador. Você também pode baixar registos localmente.
Obter logs de execuções de pipeline
Também pode encontrar os arquivos de log para execuções específicas na página de detalhes da execução do pipeline. Pode encontrar esta página na secção Pipelines ou Experiências do estúdio.
Selecione uma execução de pipeline criada no designer.
Selecione um componente no painel de visualização.
No painel direito do componente, vá para o separador Saídas + logs.
Expanda o painel direito para ver o ficheiro std_log.txt no navegador ou selecione o ficheiro para transferir os logs localmente.
Importante
Para atualizar um pipeline a partir da página de detalhes da execução do pipeline, você deve clonar o pipeline executado para um novo rascunho do pipeline. Uma execução de pipeline é um instantâneo do pipeline. É semelhante a um ficheiro de registo, e não se pode alterar.
Depuração interativa com o Visual Studio Code
Em alguns casos, talvez seja necessário depurar interativamente o código Python usado no pipeline de ML. Ao utilizar o Visual Studio Code (VS Code) e o debugpy, pode anexar ao código tal como é executado no ambiente de treino. Para mais informações, consulte o guia de depuração interativa no VS Code.
HyperdriveStep e AutoMLStep falham com isolamento de rede
Depois de usar o HyperdriveStep e o AutoMLStep, ao tentar registar o modelo, pode receber um erro.
Você está usando o SDK do Azure Machine Learning v1.
Seu espaço de trabalho do Azure Machine Learning está configurado para isolamento de rede (VNet).
O seu pipeline tenta registar o modelo gerado pelo passo anterior. Por exemplo, no exemplo seguinte, o parâmetro
inputsé o saved_model de um HyperdriveStep.register_model_step = PythonScriptStep(script_name='register_model.py', name="register_model_step01", inputs=[saved_model], compute_target=cpu_cluster, arguments=["--saved-model", saved_model], allow_reuse=True, runconfig=rcfg)
Solução
Importante
Este comportamento não ocorre ao usar o Azure Machine Learning SDK v2.
Para contornar esse erro, use a classe Run para obter o modelo criado a partir do HyperdriveStep ou AutoMLStep. O seguinte script de exemplo obtém o modelo de saída de um HyperdriveStep:
%%writefile $script_folder/model_download9.py
import argparse
from azureml.core import Run
from azureml.pipeline.core import PipelineRun
from azureml.core.experiment import Experiment
from azureml.train.hyperdrive import HyperDriveRun
from azureml.pipeline.steps import HyperDriveStepRun
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument(
'--hd_step_name',
type=str, dest='hd_step_name',
help='The name of the step that runs AutoML training within this pipeline')
args = parser.parse_args()
current_run = Run.get_context()
pipeline_run = PipelineRun(current_run.experiment, current_run.experiment.name)
hd_step_run = HyperDriveStepRun((pipeline_run.find_step_run(args.hd_step_name))[0])
hd_best_run = hd_step_run.get_best_run_by_primary_metric()
print(hd_best_run)
hd_best_run.download_file("outputs/model/saved_model.pb", "saved_model.pb")
print("Successfully downloaded model")
Pode usar o ficheiro de um PythonScriptStep:
from azureml.pipeline.steps import PythonScriptStep
conda_dep = CondaDependencies()
conda_dep.add_pip_package("azureml-sdk")
conda_dep.add_pip_package("azureml-pipeline")
rcfg = RunConfiguration(conda_dependencies=conda_dep)
model_download_step = PythonScriptStep(
name="Download Model 9",
script_name="model_download9.py",
arguments=["--hd_step_name", hd_step_name],
compute_target=compute_target,
source_directory=script_folder,
allow_reuse=False,
runconfig=rcfg
)
Próximos passos
Observação
As referências azureml-pipeline-core e azureml-pipeline-steps na secção seguinte aplicam-se aos pacotes descontinuados do SDK v1 a partir de 30 de junho de 2026. Para o caminho recomendado, consulte Construir e executar pipelines de machine learning com Azure Machine Learning CLI/SDK v2.
Para obter um tutorial completo usando
ParallelRunStep, consulte o Tutorial: Criar um pipeline do Azure Machine Learning para pontuação em lote.Para obter um exemplo completo mostrando o aprendizado de máquina automatizado em pipelines de ML, consulte Usar ML automatizado em um pipeline do Azure Machine Learning em Python.
Consulte a referência do SDK para obter ajuda com o pacote azureml-pipelines-core e o pacote azureml-pipelines-steps .
Consulte a lista de exceções do designer e códigos de erro.