Soluciona problemas

Encontrar la causa de los errores que surgen cuando entrenas tu modelo o cuando obtienes predicciones en la nube puede ser un desafío. En esta página, se describe cómo encontrar y depurar problemas en AI Platform. Si encuentras problemas con el marco de trabajo de aprendizaje automático que estás usando, lee la documentación del marco de trabajo de aprendizaje automático.

Herramienta de línea de comandos

ERROR: (gcloud) opción no válida: 'ai-platform'.

Este error significa que debes actualizar gcloud. Para actualizar gcloud, ejecuta el comando siguiente:

gcloud components update
ERROR: (gcloud) argumentos no reconocidos: --framework=SCIKIT_LEARN.

Este error significa que debes actualizar gcloud. Para actualizar gcloud, ejecuta el comando siguiente:

gcloud components update
ERROR: (gcloud) argumentos no reconocidos: --framework=XGBOOST.

Este error significa que debes actualizar gcloud. Para actualizar gcloud, ejecuta el comando siguiente:

gcloud components update
ERROR: (gcloud) error durante la carga del modelo: Cloud no pudo cargar el modelo: /tmp/model/0001/model.pkl. '\x03'. (Código de error: 0).

Este error significa que no se usó la biblioteca correcta para exportar el modelo. Para solucionarlo, vuelve a exportar el modelo con la biblioteca correcta. Por ejemplo, exporta los modelos del formulario model.pkl con la biblioteca pickle y los modelos del formulario model.joblib con la biblioteca joblib.

ERROR: argumento (gcloud.ai-platform.jobs.submit.prediction) - formato de datos: opción no válida: 'json'.

Este error significa que especificaste json como el valor de la marca --data-format cuando enviaste un trabajo de predicción por lotes. Para usar el formato de datos JSON, debes proporcionar text como el valor de la marca --data-format.

Versiones de Python

ERROR: se detectó un modelo incorrecto con el error: “Falla en la carga del modelo: no se puede cargar el
modelo: /tmp/model/0001/model.pkl. Protocolo pickle no compatible: 3. Asegúrate
de que el modelo se exportó con Python 2. De lo contrario, especifica
el parámetro“python_version” correcto durante la implementación del modelo. Actualmente,
“python_version” acepta 2.7 y 3.5. (Código de error: 0)”.
Este error significa que un archivo de modelo exportado con Python 3 se implementó en recurso de versión del modelo de AI Platform con una configuración de Python 2.7.

Para solucionar este problema, sigue estos pasos:

  • Crea un recurso de versión de modelo nuevo y establece “python_version” en 3.5.
  • Implementa el mismo archivo de modelo al recurso de versión de modelo nuevo.

No se encuentra el comando virtualenv

Si obtuviste este error cuando intentaste activar virtualenv, una solución posible es agregar el directorio que contiene a tu variable de entorno $PATH. Si modificas esta variable, podrás usar los comandos virtualenv sin necesidad que escribir la ruta de archivo completa.

Primero, instala virtualenv mediante la ejecución del comando siguiente:

pip install --user --upgrade virtualenv

El instalador te pide que modifiques tu variable de entorno $PATH y te proporcionará la ruta a la secuencia de comandos virtualenv. En macOS, es similar al ejemplo /Users/[YOUR-USERNAME]/Library/Python/[YOUR-PYTHON-VERSION]/bin.

Abre el archivo en el que tu shell carga las variables de entorno. Por lo general, es ~/.bashrc o ~/.bash_profile en macOS.

Agrega la línea siguiente y reemplaza [VALUES-IN-BRACKETS] por los valores adecuados:

export PATH=$PATH:/Users/[YOUR-USERNAME]/Library/Python/[YOUR-PYTHON-VERSION]/bin

Por último, ejecuta el comando siguiente a fin de cargar tu archivo .bashrc (o .bash_profile) actualizado:

source ~/.bashrc

Usa registros de trabajo

Un buen primer lugar para comenzar a solucionar problemas son los registros de trabajo capturados por Stackdriver Logging.

Registros para diferentes tipos de operación

Tu experiencia de registro varía según el tipo de operación, como se muestra en las secciones a continuación.

Registros de entrenamiento

Todos tus trabajos de entrenamiento se registran. Los registros incluyen eventos del servicio de entrenamiento y de tu aplicación de entrenamiento. Puedes colocar los eventos de registro en tu aplicación con bibliotecas de Python estándar (logging, por ejemplo). AI Platform captura todos los mensajes de registro desde tu aplicación. Todos los mensajes enviados a stderr se capturan de forma automática en tu entrada de trabajo en Stackdriver Logging.

Registros de predicción por lotes

Se registran todos tus trabajos de predicción por lotes.

Registros de predicción en línea

Tus solicitudes de predicción en línea no generan registros de manera predeterminada. Puedes habilitar Stackdriver Logging cuando creas tu recurso de modelo:

gcloud

Incluye la marca --enable-logging cuando ejecutes gcloud ai-platform models create.

Python

Establece onlinePredictionLogging en True en el recurso Model que usas para llamar a projects.models.create.

Busca los registros

Tus registros de los trabajos contienen todos los eventos para tu operación, incluidos los eventos de todos los procesos en tu clúster cuando estás usando el entrenamiento distribuido. Si ejecutas un trabajo de entrenamiento distribuido, tus registros a nivel del trabajo se informan para el proceso de trabajador principal. El primer paso para solucionar problemas de un error es, generalmente, examinar los registros para ese proceso y filtrar los eventos registrados para otros procesos en tu clúster. Los ejemplos en esta sección muestran ese filtro.

Puedes filtrar los registros desde la línea de comandos o en la sección de Stackdriver Logging de tu Google Cloud Platform Console. En cualquier caso, debes usar estos valores de metadatos en tu filtro según sea necesario:

Elemento de metadatos Filtro para mostrar elementos donde es…
resource.type Igual a "cloud_ml_job".
resource.labels.job_id Igual al nombre de tu trabajo
resource.labels.task_name Igual a "master-replica-0" para leer solo las entradas de registro de tu trabajador principal.
gravedad Mayor o igual que ERROR para leer solo las entradas de registro que corresponden a las condiciones de error.

Línea de comandos

Usa la lectura de registros Beta de gcloud para crear una consulta que satisfaga tus necesidades. A continuación, se incluyen algunos ejemplos:

Cada ejemplo se basa en estas variables de entorno:

PROJECT="my-project-name"
JOB="my_job_name"

Si lo prefieres, puedes ingresar el literal de string en su lugar.

Para imprimir tus registros de trabajos en la pantalla, sigue estos pasos:
gcloud ai-platform jobs stream-logs $JOB

Consulta todas las opciones para gcloud ai-platform jobs stream-logs.

Para imprimir el registro para tu trabajador principal en la pantalla:
gcloud beta logging read --project=${PROJECT} "resource.type=\"ml_job\" and resource.labels.job_id=${JOB} and resource.labels.task_name=\"master-replica-0\""
A fin de imprimir solo errores registrados para tu trabajador principal en la pantalla, sigue estos pasos:
gcloud beta logging read --project=${PROJECT} "resource.type=\"ml_job\" and resource.labels.job_id=${JOB} and resource.labels.task_name=\"master-replica-0\" and severity>=ERROR"

Los ejemplos anteriores representan los casos más comunes de filtrado para los registros de tu trabajo de entrenamiento de AI Platform. Stackdriver Logging ofrece muchas opciones potentes para los filtros que te permiten definir mejor tus búsquedas. La documentación de filtros avanzados describe esas opciones en detalle.

Console

  1. Abre la página Trabajos de AI Platform en GCP Console.

    Abrir trabajos en GCP Console

  2. Selecciona el trabajo que falló de la lista en la página Trabajos para ver los detalles.

La lista de trabajos de AI Platform que muestra un trabajo con errores

  1. Haz clic en Ver registros para abrir Stackdriver Logging.

La páginas de detalles de trabajo para un trabajo con errores

También puedes ir directo a Stackdriver Logging, pero tienes un paso adicional, que es buscar tu trabajo:

  1. Expande el selector de recursos.
  2. Expande Trabajo de AI Platform (AI Platform Job) en la lista de recursos.
  3. Busca el nombre de tu trabajo en la lista job_id (puedes ingresar las primeras letras del nombre del trabajo en el cuadro de búsqueda para reducir los trabajos que se muestran).
  4. Expande la entrada del trabajo y selecciona master-replica-0 de la lista de tareas.

Los selectores de filtro de registro expandidos en su totalidad

Cómo obtener información de los registros

Luego de que hayas encontrado el registro correcto y lo hayas filtrado con base en master-replica-0, puede examinar los eventos registrados para buscar el origen del problema. Esto implica un procedimiento estándar de depuración de Python, pero vale la pena recordar lo siguiente:

  • Los eventos tienen varios niveles de gravedad. Puedes filtrar para ver solo los eventos de un nivel en particular, como errores, o errores y advertencias.
  • Un problema que causa que tu entrenador se cierre con una condición de error irrecuperable (código de retorno > 0) se registra como una excepción precedida por un seguimiento de pila:

Una entrada de registro sin secciones expandidas

  • Puedes obtener más información si expandes los objetos del mensaje JSON registrado (que se denota con una flecha hacia la derecha y cuyo contenido aparece como {…}). Por ejemplo, puedes expandir jsonPayload si quieres ver el seguimiento de pila en un formato más legible que el que aparece en la descripción del error principal:

Una entrada de registro con su sección de carga útil JSON expandida

  • Algunos errores muestran instancias de errores que se pueden intentar de nuevo. Por regla general, estos no incluyen un seguimiento de pila y pueden ser más difícil de diagnosticar.

Aprovecha el registro al máximo

El servicio de entrenamiento de AI Platform registra de forma automática estos eventos:

  • Información de estado interno del servicio
  • Mensajes que tu aplicación de entrenador envía a stderr.
  • Texto de salida que envía tu aplicación de entrenador a stdout.

Puedes simplificar los errores de solución de problemas de tu aplicación de entrenador si sigues las prácticas recomendadas de programación:

  • Envía mensajes significativos a stderr (con logging, por ejemplo).
  • Plantea la excepción más lógica y descriptiva cuando algo sale mal.
  • Agrega strings descriptivas a tus objetos de excepción.

En la documentación de Python, se proporciona más información sobre las excepciones.

Soluciona problemas de entrenamiento

En esta sección se describen conceptos y condiciones de error que se aplican a los trabajos de entrenamiento.

Cómo entender los códigos de retorno de la aplicación de entrenamiento

Tu trabajo de entrenamiento en la nube está controlado por el programa principal que se ejecuta en el proceso del trabajador principal de tu clúster de entrenamiento:

  • Si estás entrenando en un solo proceso (no distribuido), solo tienes un único trabajador, que es el principal.
  • Tu programa principal es la función __main__ de tu aplicación de entrenamiento de TensorFlow.
  • El servicio de entrenamiento de AI Platform ejecuta tu aplicación de entrenador hasta que se completa con éxito o encuentra un error irrecuperable. Esto significa que puede reiniciar los procesos si surgen errores que se pueden intentar de nuevo.

El servicio de entrenamiento administra tus procesos. Controla un cierre del programa según el código de retorno de tu proceso de trabajador principal:

Código de retorno Significado Respuesta de AI Platform
0 Realización exitosa Cierra y libera los recursos de trabajo.
1 - 128 Error irrecuperable Finaliza el trabajo y registra el error.

No necesitas hacer nada en particular con respecto al código de retorno de tu función __main__. Python muestra de forma automática cero si tiene éxito y un código positivo cuando encuentra una excepción no controlada. Si estás acostumbrado a configurar códigos de retorno específicos para tus objetos de excepción (una práctica válida, pero poco común), no interferirá en tu trabajo de AI Platform, siempre que sigas el patrón en la tabla anterior. Aun así, el código de cliente normalmente no indica errores que se pueden intentar nuevamente, sino que provienen del entorno operativo.

Cómo controlar condiciones de error específicas

En esta sección se proporciona orientación sobre algunas condiciones de error que se sabe afectan a algunos usuarios.

Se agotó el recurso.

La demanda es alta para las GPU y los recursos de procesamiento en la región us-central1. Es posible que obtengas un mensaje de error en tus registros de trabajo que diga: Resources are insufficient in region: <region>. Please try a different region..

Para resolver esto, prueba usar una región diferente o vuelve a intentar más tarde.

El entrenador se ejecuta constantemente sin lograr ningún progreso

Algunas situaciones pueden provocar que tu aplicación de entrenador se ejecute continuamente mientras no se logra ningún progreso en la tarea de entrenamiento. Esto puede deberse a una llamada de bloqueo que espera por un recurso que nunca está disponible. Puedes mitigar este problema si configuras un intervalo de tiempo de espera en tu entrenador.

Configura un intervalo de tiempo de espera para tu entrenador

Puedes configurar un tiempo de espera, en milisegundos, cuando creas tu sesión o cuando ejecutas un paso de tu grafo:

  • Configura el intervalo de tiempo de espera deseado con el parámetro config cuando crees tu objeto de Session:

    sess = tf.Session(config=tf.ConfigProto(operation_timeout_in_ms=500))
    
  • Configura el intervalo de tiempo de espera deseado para una llamada a Session.run con el parámetro options:

    v = session.run(fetches, options=tf.RunOptions(timeout_in_ms=500))
    

Consulta la documentación de Sesión de TensorFlow para obtener más información.

El programa se cierra con un código de -9.

Si obtienes el código de salida -9 continuamente, tu aplicación de entrenador podría estar usando más memoria de la que está asignada para su proceso. Para solucionar este error, reduce el uso de memoria, usa tipos de máquinas con más memoria, o ambas opciones.

  • Revisa tu aplicación de entrenador y el grafo para conocer las operaciones que usan más memoria de lo que se había previsto. El uso de memoria se ve afectado por la complejidad de tus datos y la de las operaciones en tu grafo de cómputo.
  • El aumento de la memoria que se asigna a tu trabajo puede necesitar cierta delicadeza:
    • Si usas un nivel de escala definido, no puedes aumentar tu asignación de memoria por máquina sin agregar más máquinas a la combinación. Tendrás que cambiar al nivel CUSTOM y definir los tipos de máquina en el clúster tú mismo.
    • La configuración precisa de cada tipo de máquina definido está sujeta a cambios, pero puedes hacer algunas comparaciones aproximadas. Encontrarás una tabla comparativa de los tipos de máquina en la página de conceptos de entrenamiento.
    • Cuando pruebas los tipos de máquina para la asignación de memoria adecuada, es posible que debas usar una sola máquina, o un clúster de tamaño reducido, para minimizar los cargos producidos.

El programa se cierra con un código de -15

Normalmente, un código de salida de -15 indica el mantenimiento por parte del sistema. Es un error que permite reintentar la operación, por lo que tu proceso debería reiniciarse automáticamente.

Trabajo en cola durante mucho tiempo

Si el Estado de un trabajo de entrenamiento es QUEUED por un período prolongado, es posible que hayas excedido tu cuota de solicitudes de trabajo.

AI Platform inicia los trabajos de entrenamiento en función de la hora de creación del trabajo, mediante el uso de la regla primero en entrar, primero en salir. Si tu trabajo está en cola, generalmente quiere decir que toda la cuota del proyecto es consumida por otros trabajos que se enviaron antes de que tu trabajo o el primer trabajo en la cola solicitó más unidades del AA/GPU que la cuota disponible.

La razón por la que un trabajo ha sido puesto en cola se registra en los registros de entrenamiento. Busca en el registro mensajes similares a:

This job is number 2 in the queue and requires
4.000000 ML units and 0 GPUs. The project is using 4.000000 ML units out of 4
allowed and 0 GPUs out of 10 allowed.

El mensaje explica la posición actual de tu trabajo en la cola y la cuota, y el uso actual del proyecto.

Ten en cuenta que la razón se registrará solo para los primeros diez trabajos en cola ordenados por la hora de creación del trabajo.

Si necesitas con regularidad más que el número asignado de solicitudes, puedes solicitar un aumento de la cuota. Comunícate con el equipo de asistencia si tienes un paquete de asistencia premium. De lo contrario, puedes enviar tu solicitud por correo electrónico a los comentarios de AI Platform.

Se superó la cuota.

Si recibes un error con un mensaje como "Fallo de cuota para project_number…", es posible que hayas excedido una de tus cuotas de recursos. Puedes supervisar tu consumo de recursos y solicitar un aumento en la página de cuotas de AI Platform en el Administrador de API de tu consola.

Ruta de acceso de guardado no válida

Si tu trabajo finaliza con un mensaje de error que incluye "Restablecer con una ruta de guardado no válida gs://…", es posible que estés usando un depósito de Google Cloud Storage configurado de manera incorrecta.

  1. Abre la página del Navegador de Google Cloud Storage en GCP Console.

    Abrir el Navegador en GCP Console

  2. Marca la clase de almacenamiento predeterminado para el depósito que usas:

Dos depósitos de Google Cloud Platform, uno asignado a una multirregión no compatible y el otro asignado a una región

  • Debe ser Regional. Si lo es, entonces algo más salió mal. Vuelve a ejecutar tu trabajo.
  • Si es Multirregional, necesitas cambiarlo a Regional, o trasladar tus materiales de entrenamiento a un depósito diferente. En relación con lo primero, encontrarás las instrucciones para cambiar la clase de almacenamiento de un depósito en la documentación de Cloud Storage.

El entrenador se cierra con AbortedError.

Este error puede suceder si ejecutas un entrenador que usa TensorFlow Supervisor para administrar los trabajos distribuidos. En ocasiones, TensorFlow lanza excepciones AbortedError en situaciones en las que no debes detener todo el trabajo. Puedes detectar esa excepción en tu entrenador y responder según corresponda. Ten en cuenta que TensorFlow Supervisor no es compatible con los entrenadores que ejecutas con AI Platform.

Solución de problemas de predicción

Esta sección reúne algunos problemas comunes que se encuentran cuando se obtienen predicciones.

Cómo controlar condiciones específicas para la predicción en línea

En esta sección, se proporciona orientación sobre algunas condiciones de error de la predicción en línea que se sabe afectan a algunos usuarios.

Predicciones que tardan demasiado en completarse (30-180 segundos)

La causa más común de una predicción en línea lenta es escalar los nodos de procesamiento desde cero. Si tu modelo tiene solicitudes de predicción regulares hechas contra él, el sistema mantiene uno o más nodos listos para entregar predicciones. Si tu modelo no ha entregado ninguna predicción en mucho tiempo, el servicio "reduce" a cero los nodos listos. La próxima solicitud de predicción luego de esta reducción llevará mucho más tiempo en mostrarse de lo habitual porque el servicio tiene que aprovisionar nodos para controlarla.

Códigos de estado de HTTP

Cuando ocurre un error con una solicitud de predicción en línea, generalmente obtienes un código de estado HTTP del servicio. Estos son algunos códigos que se suelen encontrar y su significado en el contexto de la predicción en línea:

429 - No hay memoria suficiente.

El nodo de procesamiento se quedó sin memoria mientras ejecutaba tu modelo. No hay manera de aumentar la memoria asignada a los nodos de predicción en este momento. Puedes probar esto para que tu modelo se ejecute:

  • Puedes reducir el tamaño de tu modelo si haces lo siguiente:
    • Usa variables menos precisas.
    • Cuantizas tus datos continuos.
    • Reduces el tamaño de otros atributos de entrada (por ejemplo, mediante el uso de tamaños de vocabulario más pequeños).
    • Vuelve a enviar la solicitud con un lote de instancias más pequeño.
429 - Demasiadas solicitudes pendientes

Tu modelo está recibiendo más solicitudes de las que puede controlar. Si usas el ajuste de escala automático, está recibiendo solicitudes más rápido de lo que el sistema puede escalar.

Con el ajuste de escala automático, puedes tratar de volver a enviar solicitudes con un retirada exponencial. Si lo hace, le puede dar al sistema tiempo para ajustarse.

429 - Cuota

Tu proyecto de Google Cloud Platform está limitado a 10,000 solicitudes cada 100 segundos (alrededor de 100 por segundo). Si recibes este error en picos temporales, a menudo puedes intentar nuevamente con la retirada exponencial para procesar todas tus solicitudes a tiempo. Si obtienes este código sistemáticamente, puedes solicitar un aumento de cuota. Consulta la página de cuotas para obtener más detalles.

503 - Nuestros sistemas detectaron tráfico inusual de tu red de computadoras

La tasa de solicitudes que recibió tu modelo de una sola IP es tan alta que el sistema sospecha que haya un ataque de denegación del servicio. Deja de enviar solicitudes durante un minuto y, luego, vuelve a enviarlas a una tasa más baja.

500 - No se pudo cargar el modelo.

El sistema tuvo problemas para cargar tu modelo. Sigue estos pasos:

  • Asegúrate de que tu entrenador esté exportando el modelo correcto.
  • Intenta una predicción de prueba con el comando gcloud ai-platform local predict.
  • Exporta tu modelo de nuevo y vuelve a intentar.

Errores de formato para solicitudes de predicción

Todos estos mensajes tienen que ver con tu entrada de predicción.

"JSON vacío o con formato incorrecto/no válido en el cuerpo de la solicitud"
Este servicio no pudo analizar el JSON en tu solicitud o tu solicitud está vacía. Revisa tu mensaje para ver si hay omisiones o errores que invaliden JSON.
"Campo de 'instancias' faltantes en el cuerpo de la solicitud"
El cuerpo de tu solicitud no sigue el formato correcto. Debe ser un objeto JSON con una sola clave llamada "instances" que contenga una lista con todas sus instancias de entrada.
Error de codificación JSON cuando se crea una solicitud

Tu solicitud incluye datos codificados en base64, pero no en el formato JSON adecuado. Cada string codificada en base64 debe estar representada por un objeto con una sola clave llamada "b64". Por ejemplo:

  {"b64": "an_encoded_string"}

Ocurre otro error de base64 cuando tienes datos binarios que no están codificados en base64. Codifica tus datos y formatéalos de la manera siguiente:

  {"b64": base64.b64encode(binary_data)}

Consulta más información sobre el formato y la codificación de datos binarios.

La predicción en la nube tarda más tiempo que en la computadora de escritorio

La predicción en línea está diseñada para ser un servicio escalable que entrega rápidamente una tasa alta de solicitudes de predicción. El servicio está optimizado para un rendimiento agregado en todas las solicitudes de servicio. El énfasis en la escalabilidad da lugar a características de rendimiento diferentes que generar un número pequeño de predicciones en tu máquina local.

Próximos pasos

¿Te sirvió esta página? Envíanos tu opinión:

Enviar comentarios sobre…

¿Necesitas ayuda? Visita nuestra página de asistencia.