Estos contenidos se han traducido de forma automática para su comodidad, pero Huawei Cloud no garantiza la exactitud de estos. Para consultar los contenidos originales, acceda a la versión en inglés.
Actualización más reciente 2023-03-02 GMT+08:00

Especificaciones de imágenes personalizadas para crear aplicaciones de IA

Al crear una imagen personalizada utilizando un modelo desarrollado localmente, asegúrese de que la imagen cumple con las especificaciones de ModelArts.

  • No se permite ningún código malicioso.
  • El tamaño de una imagen personalizada no puede superar los 10 GB.
  • API externos

    El puerto de servicio externo para una imagen personalizada debe ser 8080. La API de inferencia debe ser la misma que el URL definida por apis en config.json. A continuación, se puede acceder directamente a la API de inferencia cuando se inicia la imagen. A continuación se muestra un ejemplo de acceso a una imagen MNIST. La imagen contiene un modelo entrenado usando un conjunto de datos MNIST y puede identificar los dígitos escritos a mano. En este ejemplo, Listening IP address es la dirección IP del contenedor.

    • Modelo de solicitud
      curl -X POST \ http://{Listening IP address}:8080/ \ -F images=@seven.jpg
    • Ejemplo de respuesta
      {"mnist_result": 7}
  • (Opcional) API de prueba de estado

    Si los servicios no se deben interrumpir durante una actualización sucesiva, la API de comprobación de estado debe configurarse en config.json para ModelArts. La API de la prueba de estado devuelve la situación de estado de un servicio cuando se está ejecutando correctamente, o un error cuando se vuelve defectuoso.

    La API de comprobación de estado debe configurarse para una actualización continua sin problemas.

    A continuación se muestra un ejemplo de API de comprobación de estado:

    • URI
      GET /health
    • Ejemplo de solicitud: curl -X GET \ http://{Listening IP address}:8080/health
    • Ejemplo de respuesta
      {"health": "true"}
    • Código de estado
      Tabla 1 Código de estado

      Código de estado

      Mensaje

      Descripción

      200

      OK

      Solicitud enviada

  • Salida del archivo de log

    Configure la salida estándar para que los logs se puedan mostrar correctamente.

  • Archivo de arranque de imagen

    Para implementar un servicio por lotes, establezca el archivo de inicio de una imagen en /home/run.sh y use CMD para establecer la ruta de inicio predeterminada. El siguiente es un ejemplo de Dockerfile:

    CMD ["sh", "/home/run.sh"]

  • Dependencias de imagen

    Para implementar un servicio por lotes, instale los paquetes de dependencias como Python, JRE/JDK y ZIP en la imagen.

  • (Opcional) Actualización continua sin hits

    Para asegurarse de que los servicios no se interrumpen durante una actualización sucesiva, establezca HTTP keep-alive en 200. Por ejemplo, Gunicorn no es compatible con Keep-alive de forma predeterminada. Para garantizar una actualización continua sin problemas, instale Gevent y configure --keep-alive 200 -k gevent en la imagen. La configuración de los parámetros varía en función del marco de servicio. Configure los parámetros según sea necesario.

  • (Opcional) Salida con gracia de un contenedor

    Para garantizar que los servicios no se interrumpan durante una mejora continua, el sistema debe capturar las señales SIGTERM en el contenedor y esperar 60 segundos antes de salir del contenedor con gracia. Si la duración es inferior a 60 segundos antes de la salida elegante, los servicios pueden interrumpirse durante la actualización continua. Para garantizar un funcionamiento no interrumpido del servicio, el sistema sale del contenedor después de que recibe las señales SIGTERM y procesa todas las solicitudes recibidas. La duración total no es superior a los 90 segundos. A continuación se muestra el ejemplo run.sh:

    #!/bin/bash
    gunicorn_pid=""
    
    handle_sigterm() {
      echo "Received SIGTERM, send SIGTERM to $gunicorn_pid"
      if [ $gunicorn_pid != "" ]; then
          sleep 60
          kill -15 $gunicorn_pid  # Transfer SIGTERM signals to the Gunicorn process.
          wait $gunicorn_pid           # Wait until the Gunicorn process stops.
      fi
    }
    
    trap handle_sigterm TERM