Saltar al contenido

¿Cómo soluciono un error de algoritmo en mi trabajo de procesamiento de SageMaker AI?

6 minutos de lectura
0

Quiero solucionar un error de algoritmo que recibo al ejecutar un trabajo de procesamiento de Amazon SageMaker AI.

Descripción corta

Al ejecutar un trabajo de procesamiento de SageMaker AI, es posible que recibas el mensaje de error «Failure reason AlgorithmError: , exit code: 1» por los siguientes motivos:

  • Hay un problema de dependencia de Python.
  • Se produce un error de versión ejecutable de Python y recibes un código de salida distinto de cero.
  • Estás usando un contenedor de Docker creado para otra arquitectura de CPU.

Resolución

Nota: Si se muestran errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), consulta Solución de problemas de AWS CLI. Además, asegúrate de utilizar la versión más reciente de la AWS CLI.

Identificación de la causa del error

Para identificar la causa del error, utiliza Registros de Amazon CloudWatch para revisar el registro de seguimiento de la pila. El registro de seguimiento de la pila muestra qué causó el error del código y cuándo se produjo el error en el script de procesamiento.

Tras identificar la causa del error, ejecuta manualmente el contenedor desde una terminal. Si no tienes Docker instalado, utiliza las instancias del cuaderno de SageMaker AI para ejecutar el contenedor. Asegúrate de usar el tipo de instancia apropiado.

Extracción del contenedor al entorno local

Si utilizas un contenedor prediseñado de SageMaker AI, como Scikit-learn, inicia sesión en el registro y extrae el contenedor. Para iniciar sesión, ejecuta el comando get-login-password de la AWS CLI:

aws ecr get-login-password --region $REGION | docker login -u AWS --password-stdin 683313688378.dkr.ecr.${REGION}.amazonaws.com

Nota: Sustituye region por tu región de AWS.

Para extraer el contenedor, ejecuta el siguiente comando:

docker pull 683313688378.dkr.ecr.${REGION}.amazonaws.com/sagemaker-scikit-learn:1.2-1-cpu-py3

Nota: Si utilizas algoritmos de SageMaker AI, como Random Cut Forest, no podrás extraer el contenedor al entorno local. Para estos contenedores, ponte en contacto con AWS Support.

Creación de un shell de bash en el contenedor

Para solucionar problemas de código, ejecuta el contenedor en el entorno local. Crea una carpeta denominada código y, a continuación, agrega el código a la carpeta. Monta el directorio que incluye la carpeta de códigos en el contenedor como un volumen. A continuación, monta la salida del directorio en la misma ubicación que se muestra en el siguiente ejemplo:

docker run \
    -v ./code:/opt/ml/processing/input/code \
    -v ./output:/opt/ml/processing/output \
    --entrypoint '/bin/bash' \
    683313688378.dkr.ecr.us-east-1.amazonaws.com/sagemaker-scikit-learn:1.2-1-cpu-py3

El comando anterior crea un shell de bash en el contenedor. En la sección Solución de errores de algoritmos, actualiza el código en la carpeta de códigos y, a continuación, usa el shell de bash para ejecutar el script de procesamiento.

Solución de errores de algoritmos

Problema de dependencia de Python

Si no especificas una versión del paquete de Python, pip instala el paquete más reciente que puede provocar un error de algoritmo. Para solucionar este problema, identifica la versión del paquete y, a continuación, instala los paquetes en el script de procesamiento.

Si utilizas un contenedor de SageMaker prediseñado, busca el repositorio del código fuente. Recupera los paquetes y las versiones de Python que usas en el contenedor. O bien, ejecuta el siguiente comando en el shell de bash para ver la lista completa de paquetes de un contenedor personalizado:

pip freeze | grep '==' > /opt/ml/processing/input/code/requirements.txt

Tras identificar la versión del paquete, crea un archivo requirements.txt en el mismo directorio que el script processing.py. A continuación, agrega los paquetes necesarios al archivo requirements.txt.

Ejemplo de archivo requirements.txt que usa el repositorio Scikit-learn de SageMaker AI:

# Scikit-learn 1.2-1 packages
boto3==1.28.57
botocore>=1.31.57,<1.32.0
cryptography
Flask==1.1.1
itsdangerous==2.0.1
gunicorn==20.0.4
model-archiver==1.0.3
multi-model-server==1.1.1
pandas==1.1.3
protobuf==3.20.2
psutil==5.7.2
python-dateutil==2.8.1
retrying==1.3.3
sagemaker-containers==2.8.6.post2
sagemaker-inference==1.2.0
sagemaker-training==4.8.0
scikit-learn==1.2.1
scipy==1.8.0
urllib3==1.26.17
six==1.15.0
jinja2==3.0.3
MarkupSafe==2.1.1
numpy==1.24.1
gevent==23.9.1
Werkzeug==2.0.3
setuptools
wheel
certifi

# Your packages and their versions
sagemaker==2.232.1
boto3==1.34.142
botocore>=1.34.142,<1.35.0

Para instalar los paquetes necesarios, ejecuta el comando pip en tu script processing.py:

import sys
import subprocess


def install(requirements: str) -> None:
    subprocess.check_call([sys.executable, "-q", "-m", "pip", "install", "-r", requirements])


def install_requirements() -> None:
    install("/opt/ml/processing/input/code/requirements.txt")


def main() -> None:
    import sagemaker
    import pandas
    example_code


if __name__ == "__main__":
    install_requirements()
    main()

Nota: Sustituye example_code por tu código. Asegúrate de que los paquetes existentes no se actualicen.

Para comprobar si has agregado las versiones correctas del paquete al script processing.py, ejecuta el siguiente comando en el shell de bash:

cd /opt/ml/processing/input/code
python3 process.py

Si el script falla, continúa actualizando las versiones del paquete hasta que el script sea correcto.

Solución de problemas de versión ejecutable de Python

Para solucionar un problema de versión ejecutable de Python, modifica el código en la carpeta de códigos para actualizar el script processing.py. Para probar el script processing.py, ejecuta los siguientes comandos en el shell de bash:

cd /opt/ml/processing/input/code
python3 processing.py

Modifica el código hasta que resuelvas todos los problemas del registro de seguimiento de la pila y recibas el código de salida «0».

Solución de problemas de arquitectura de CPU

Debes mantener una versión de contenedor creada para la CPU específica. Extrae la imagen existente y crea un nuevo Dockerfile que incluya solo tu imagen de contenedor (FROM IMAGE_URI). A continuación, inserta el contenedor en tu Amazon Elastic Container Registry (Amazon ECR) existente.

El siguiente ejemplo toma una imagen creada para x86_64 y la reconstruye para una arquitectura de ARM:

#!/usr/bin/env bash
algorithm_name=ALGORITHM_NAME
sagemaker_account=SAGEMAKER_ACCOUNT_NUMBER
your_account=$(aws sts get-caller-identity --query Account --output text)
region=$(aws configure get region)
fullname="${your_account}.dkr.ecr.${region}.amazonaws.com/${algorithm_name}:graviton-latest"

aws ecr get-login-password --region ${region} | docker login -u AWS --password-stdin ${sagemaker_account}.dkr.ecr.${region}.amazonaws.com
docker build -t ${algorithm_name} --platform=linux/arm64 .
docker tag ${algorithm_name} ${fullname}


aws ecr describe-repositories --repository-names "${algorithm_name}" > /dev/null 2>&1

if [ $? -ne 0 ]
then
    aws ecr create-repository --repository-name "${algorithm_name}" > /dev/null
fi


aws ecr get-login-password --region ${region} | docker login --username AWS --password-stdin ${fullname}
docker push ${fullname}

Nota: Sustituye ALGORITHM_NAME y SAGEMAKER_ACCOUNT_NUMBER por tus valore.

Probar el trabajo de procesamiento

Para probar el trabajo de procesamiento actualizado, ejecuta el siguiente comando:

import boto3
import sagemaker
from sagemaker import get_execution_role
from sagemaker.sklearn.processing import SKLearnProcessor
from sagemaker.processing import ProcessingInput, ProcessingOutput


role = get_execution_role()

local_mode = True

if local_mode:
    sklearn_processor = SKLearnProcessor(
        framework_version="1.2-1", role=role, instance_type="local", instance_count=1
    )
else:
    sklearn_processor = SKLearnProcessor(
        framework_version="1.2-1", role=role, instance_type="ml.m5.xlarge", instance_count=1
    )

sklearn_processor.run(code='code/processing.py',
                      inputs=[ProcessingInput(
                          source='./code/',
                          destination='/opt/ml/processing/input/code/')],
                      outputs=[ProcessingOutput(
                          output_name='output',
                          source='/opt/ml/processing/output/')]
                     )

Nota: Sustituye instance_type por local o local-gpu para ejecutar el trabajo como una prueba.

OFICIAL DE AWSActualizada hace un año