Solución de problemas de puntos de conexión por lotes

SE APLICA A:Extensión ML de la CLI de Azure v2 (actual)SDK de Python azure-ai-ml v2 (actual)

Obtenga información sobre cómo solucionar problemas y errores comunes que se le pueden presentar al usar puntos de conexión por lotes para la puntuación por lotes. En este artículo, aprenderá lo siguiente:

Descripción de los registros de un trabajo de puntuación por lotes

Obtención de registros

Después de invocar un punto de conexión por lotes mediante la CLI de Azure o REST, el trabajo de puntuación por lotes se ejecutará de forma asincrónica. Existen dos opciones para obtener los registros para un trabajo de puntuación por lotes.

Opción 1: Transmisión de registros a la consola local

Puede ejecutar el siguiente comando para transmitir los registros generados por el sistema a la consola. Solo se transmitirán los registros de la carpeta azureml-logs.

az ml job stream --name <job_name>

Opción 2: Visualización de registros en Studio

Para obtener el vínculo a la ejecución en Studio, ejecute:

az ml job show --name <job_name> --query services.Studio.endpoint -o tsv
  1. Abra el trabajo en Studio con el valor devuelto por el comando anterior.
  2. Seleccione batchscoring (puntuación por lotes).
  3. Abra la pestaña Outputs + logs (Resultados y registros).
  4. Elija uno más registros que quiera revisar

Descripción de la estructura de los registros

Existen dos carpetas de registro de nivel superior: azureml-logs y logs.

El archivo ~/azureml-logs/70_driver_log.txt contiene información del controlador que inicia el script de puntuación.

Debido a la naturaleza distribuida de los trabajos de puntuación por lotes, hay registros de distintos orígenes. No obstante, se crean dos archivos combinados que proporcionan información de alto nivel:

  • ~/logs/job_progress_overview.txt: este archivo proporciona información de alto nivel sobre el número de minilotes (también conocidos como tareas) que se han creado hasta el momento y el número de minilotes que se han procesado hasta ahora. Cuando finalizan los mini lotes, el registro registra los resultados del trabajo. Si se produjo un error en el trabajo, muestra el mensaje de error y dónde iniciar la solución de problemas.

  • ~/logs/sys/master_role.txt: Este archivo proporciona la vista del nodo principal (también conocido como orquestador) del trabajo en ejecución. Este registro proporciona información sobre la creación de tareas, la supervisión del progreso y el resultado del trabajo.

Para obtener una descripción concisa de los errores del script, hay lo siguiente:

  • ~/logs/user/error.txt: este archivo intentará resumir los errores del script.

Para obtener más información sobre los errores del script, hay lo siguiente:

  • ~/logs/user/error/: este archivo contiene seguimientos de pila completos de las excepciones producidas al cargar y ejecutar el script de entrada.

Cuando necesite comprender en detalle cómo ejecuta cada nodo el script de puntuación, examine los registros de proceso individuales para cada nodo. Los registros de proceso se pueden encontrar en la carpeta sys/node, agrupados por nodos de trabajo:

  • ~/logs/sys/node/<ip_address>/<process_name>.txt: este archivo proporciona información detallada sobre cada uno de los minilotes a medida que un trabajo lo elige o lo completa. Para cada minilote, este archivo incluye:

    • La dirección IP y el PID del proceso de trabajo.
    • El número total de elementos, el número de elementos procesados correctamente y el número de elementos con errores.
    • Hora de inicio, duración, tiempo de proceso y tiempo del método de ejecución.

También puede ver los resultados de las comprobaciones periódicas del uso de recursos de cada nodo. Los archivos de registro y los archivos de configuración se encuentran en esta carpeta:

  • ~/logs/perf: establezca --resource_monitor_interval para cambiar el intervalo de comprobación en segundos. El intervalo predeterminado es 600, que son aproximadamente 10 minutos. Para detener la supervisión, establezca el valor en 0. Cada carpeta <ip_address> incluye:

    • os/: información acerca de todos los procesos en ejecución en el nodo. Una comprobación ejecuta un comando del sistema operativo y guarda el resultado en un archivo. En Linux, el comando es ps.
      • %Y%m%d%H: el nombre de la subcarpeta es la fecha y hora.
        • processes_%M: el archivo finaliza con el minuto de la hora de la comprobación.
    • node_disk_usage.csv: detalles de uso del disco del nodo.
    • node_resource_usage.csv: información general sobre el uso de recursos del nodo.
    • processes_resource_usage.csv: información general sobre el uso de recursos de cada proceso.

Cómo registrar en el script de puntuación

Puede usar el registro de Python en el script de puntuación. Los registros se almacenan en logs/user/stdout/<node_id>/processNNN.stdout.txt.

import argparse
import logging

# Get logging_level
arg_parser = argparse.ArgumentParser(description="Argument parser.")
arg_parser.add_argument("--logging_level", type=str, help="logging level")
args, unknown_args = arg_parser.parse_known_args()
print(args.logging_level)

# Initialize Python logger
logger = logging.getLogger(__name__)
logger.setLevel(args.logging_level.upper())
logger.info("Info log statement")
logger.debug("Debug log statement")

Problemas comunes

La sección siguiente contiene problemas comunes y soluciones que pueden observarse durante el desarrollo y el consumo de puntos de conexión por lotes.

No hay ningún módulo denominado "azureml"

Mensaje registrado: No module named 'azureml'.

Motivo: las implementaciones por lotes de Azure Machine Learning requieren que se instale el paquete azureml-core.

Solución: agregue azureml-core al archivo de dependencias de Conda.

La salida ya existe

Motivo: la implementación por lotes de Azure Machine Learning no puede sobrescribir el archivo predictions.csv que genera la salida.

Solución: si se le indica una ubicación de salida para las predicciones, asegúrese de que la ruta de acceso conduce a un archivo no existente.

La función run() del script de entrada ha tenido tiempo de espera [número] veces

Mensaje registrado: No progress update in [number] seconds. No progress update in this check. Wait [number] seconds since last update..

Motivo: las implementaciones por lotes se pueden configurar con un valor timeout que indica la cantidad de tiempo que la implementación esperará a que se procese un único lote. Si la ejecución del lote toma un valor más alto que este, se anula la tarea. También se puede configurar el máximo de veces que se puede reintentar una tarea que se anula. Si se produce timeout en cada reintento, se produce un error en el trabajo de implementación. Estas propiedades se pueden configurar para cada implementación.

Solución: aumente el valor timemout de la implementación actualizándola. Estas propiedades se configuran en el parámetro retry_settings. De manera predeterminada, se configura un elemento timeout=30 y otro retries=3. Al decidir el valor de timeout, tenga en cuenta el número de archivos que se procesa en cada lote y el tamaño de cada uno de esos archivos. También puede reducirlos para obtener más minilotes de tamaño más pequeño y, por lo tanto, más rápidos de ejecutar.

ScriptExecution.StreamAccess.Authentication

Mensaje registrado: ScriptExecutionException fue causado por StreamAccessException. StreamAccessException fue causado por AuthenticationException.

Motivo: el clúster de proceso donde se ejecuta la implementación no puede montar el almacenamiento donde se encuentra el recurso de datos. La identidad administrada del proceso no tiene permisos para realizar el montaje.

Soluciones: asegúrese de que la identidad asociada al clúster de proceso en el que se ejecuta la implementación tenga al menos acceso de Lector de datos de Storage Blob a la cuenta de almacenamiento. Solo los propietarios de la cuenta de almacenamiento pueden cambiar el nivel de acceso mediante Azure Portal.

Error al inicializar el conjunto de datos

Mensaje registrado: error de inicialización del conjunto de datos: UserErrorException: Mensaje: No se puede montar Dataset(id='xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx', name='None', version=None). El origen del conjunto de datos no es accesible o no contiene datos.

Motivo: el clúster de proceso donde se ejecuta la implementación no puede montar el almacenamiento donde se encuentra el recurso de datos. La identidad administrada del proceso no tiene permisos para realizar el montaje.

Soluciones: asegúrese de que la identidad asociada al clúster de proceso en el que se ejecuta la implementación tenga al menos acceso de Lector de datos de Storage Blob a la cuenta de almacenamiento. Solo los propietarios de la cuenta de almacenamiento pueden cambiar el nivel de acceso mediante Azure Portal.

El [código] del nodo del conjunto de datos hace referencia al parámetro dataset_param, que no tiene un valor especificado o predeterminado

Mensaje registrado: el [código] del nodo del conjunto de datos hace referencia al parámetro dataset_param, que no tiene un valor especificado o predeterminado.

Motivo: no se admite el recurso de datos de entrada proporcionado al punto de conexión por lotes.

Solución: asegúrese de proporcionar una entrada de datos compatible con los puntos de conexión por lotes.

Error del programa de usuario con excepción: error en la ejecución; compruebe los registros para obtener más información

Mensaje registrado: error del programa de usuario con excepción: error en la ejecución; compruebe los registros para obtener más información. Puede comprobar los registros o el archivo readme.txt para ver el diseño de los registros.

Motivo: se ha producido un error al ejecutar la función init() o run() del script de puntuación.

Solución: vaya a Resultados y registros y abra el archivo en logs > user > error > 10.0.0.X > process000.txt. Ve el mensaje de error que genera el método init() o run().

ValueError: sin objetos para concatenar

Mensaje registrado: ValueError: sin objetos para concatenar.

Motivo: todos los archivos del miniproceso generado están dañados o no son compatibles. Tenga en cuenta que los modelos MLflow admiten un subconjunto de tipos de archivo como se documenta en Consideraciones para la implementación con fines de inferencia por lotes.

Solución: vaya al archivo logs/usr/stdout/<process-number>/process000.stdout.txt y busque entradas como ERROR:azureml:Error processing input file. Si no se admite el tipo de archivo, revise la lista de archivos admitidos. Posiblemente tenga que cambiar el tipo de archivo de los datos de entrada o personalizar la implementación proporcionando un script de puntuación como se indica en Uso de modelos de MLflow con un script de puntuación.

run() no ha devuelto ningún elemento correcto del minilote

Mensaje registrado: run() no ha devuelto ningún elemento correcto del minilote. Compruebe "respuesta: run()" en https://aka.ms/batch-inference-documentation.

Motivo: el punto de conexión por lotes no ha podido proporcionar datos en el formato esperado al método run(). Esto puede deberse a que se leen archivos dañados o a incompatibilidad de los datos de entrada con la firma del modelo (MLflow).

Solución: para comprender lo que puede que esté ocurriendo, vaya a Resultados y registros y abra el archivo en logs > user > stdout > 10.0.0.X > process000.stdout.txt. Busque entradas de error como Error processing input file. Debería encontrar detalles sobre el motivo por el que el archivo de entrada no se puede leer correctamente.

No se permiten audiencias en JWT

Contexto: Al invocar un punto de conexión por lotes mediante sus API REST.

Motivo: El token de acceso que se usa para invocar la API REST para el punto de conexión o la implementación indica un token emitido para una audiencia o servicio diferente. Los tokens de Microsoft Entra se emiten para acciones específicas.

Solución: Al generar un token de autenticación que se va a usar con la API REST Batch Endpoint, asegúrese de que el parámetro resource esté establecido en https://ml.azure.com. Tenga en cuenta que este recurso es distinto del que debe indicar para administrar el punto de conexión mediante la API de REST. Todos los recursos de Azure (incluidos los puntos de conexión por lotes) usan el recurso https://management.azure.com para administrarlos. Asegúrese de usar el URI de recurso correcto en cada caso. Tenga en cuenta que si quiere usar la API de administración y la API de invocación de trabajos al mismo tiempo, necesitará dos tokens. Para obtener más detalles, consulte Autenticación en puntos de conexión por lotes (REST).

No hay implementaciones válidas a las que enrutar. Compruebe que el punto de conexión tiene al menos una implementación con valores de peso positivos o use un encabezado específico de implementación para enrutar.

Motivo: la implementación por lotes predeterminada no se ha configurado correctamente.

Solución: asegúrese de que la implementación por lotes predeterminada esté configurada correctamente. Es posible que tenga que actualizar la implementación por lotes predeterminada. Para obtener más información, consulte: Actualización de la implementación por lotes predeterminada.

Limitaciones y escenarios no admitidos

Al diseñar soluciones de aprendizaje automático que se basan en puntos de conexión por lotes, puede que no se admitan algunas configuraciones y escenarios.

Las configuraciones siguientes del área de trabajo no se admiten:

  • Áreas de trabajo configuradas con una característica de Azure Container Registries con la característica Cuarentena habilitada.
  • Áreas de trabajo con claves administradas por el cliente (CMK).

Las configuraciones siguientes de procesono se admiten:

  • Clústeres de Kubernetes de ARC.
  • Solicitud de recursos pormenorizada (memoria, vCPU, GPU) para los clústeres de Azure Kubernetes. Solo se puede solicitar el recuento de instancias.

Los tipos de disco siguientes no se admiten:

  • Conjuntos de datos tabulares (V1).
  • Carpetas y conjuntos de datos de archivos (V1).
  • MLtable (V2).

Pasos siguientes