Passer au contenu

Comment résoudre une erreur d'algorithme dans ma tâche de traitement SageMaker AI ?

Lecture de 6 minute(s)
0

Je souhaite résoudre une erreur d'algorithme qui s'affiche lorsque j'exécute une tâche de traitement Amazon SageMaker AI.

Brève description

Lorsque vous exécutez une tâche de traitement SageMaker AI, vous pouvez recevoir l’erreur « Failure reason AlgorithmError: , exit code: 1 » (Motif de l’erreur AlgorithmError : , code de sortie : 1) pour les raisons suivantes :

  • Un problème de dépendance Python a été détecté.
  • Une erreur d'exécution Python se produit et vous recevez un code de sortie différent de zéro.
  • Vous utilisez un conteneur Docker conçu pour une architecture de processeur différente.

Résolution

Remarque : Si des erreurs surviennent lorsque vous exécutez des commandes de l'interface de la ligne de commande AWS (AWS CLI), consultez la section Résoudre des erreurs liées à l’AWS CLI. Vérifiez également que vous utilisez bien la version la plus récente de l'interface.

Identifier la cause de l’erreur

Pour identifier la cause de l'erreur, utilisez Amazon CloudWatch Logs pour consulter le journal de suivi de la pile. Le journal de suivi de la pile indique la cause de l'échec de votre code et la date à laquelle l'échec s'est produit dans votre script de traitement.

Après avoir identifié la cause de l'erreur, exécutez manuellement le conteneur à partir d'un terminal. Si Docker n'est pas installé, utilisez les instances de bloc-notes SageMaker AI pour exécuter le conteneur. Assurez-vous d'utiliser le type d'instance approprié.

Transférer le conteneur vers votre environnement local

Si vous utilisez un conteneur prédéfini SageMaker AI, tel que Scikit-learn, connectez-vous au registre et extrayez le conteneur. Pour vous connecter, exécutez la commande get-login-password de l'AWS CLI :

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

Remarque : Remplacez region par votre région AWS.

Pour extraire le conteneur, exécutez la commande suivante :

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

Remarque : Si vous utilisez les algorithmes SageMaker AI, tels que Random Cut Forest, vous ne pouvez pas transférer le conteneur vers votre environnement local. Pour ces conteneurs, contactez AWS Support.

Créer un shell bash dans votre conteneur

Pour résoudre les problèmes liés à votre code, exécutez le conteneur dans votre environnement local. Créez un dossier nommé code, puis ajoutez-y votre code. Montez le répertoire contenant votre dossier de code sur votre conteneur en tant que volume. Montez ensuite la sortie du répertoire au même emplacement, comme indiqué dans l'exemple suivant :

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

La commande précédente crée un shell bash dans votre conteneur. Dans la section Résoudre les erreurs d'algorithme, mettez à jour votre code dans le dossier de code, puis utilisez le shell bash pour exécuter votre script de traitement.

Résoudre les erreurs d'algorithme

Problème de dépendance Python

Si vous ne spécifiez pas de version de package Python, pip installe le dernier package susceptible de provoquer une erreur d'algorithme. Pour résoudre ce problème, identifiez la version de votre package, puis installez les packages dans votre script de traitement.

Si vous utilisez un conteneur SageMaker prédéfini, recherchez le référentiel du code source. Récupérez les packages Python et les versions que vous utilisez dans le conteneur. Vous pouvez également exécuter la commande suivante dans le shell bash pour afficher la liste complète des packages d'un conteneur personnalisé :

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

Après avoir identifié la version de votre package, créez un fichier requirements.txt dans le même répertoire que votre script processing.py. Ajoutez ensuite les packages requis au fichier requirements.txt.

Exemple de fichier requirements.txt qui utilise le référentiel Scikit-learn 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

Pour installer les packages requis, exécutez la commande pip dans votre 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()

Remarque : Remplacez example_code par votre code. Assurez-vous que les packages existants ne sont pas mis à jour.

Pour vérifier si vous avez ajouté les versions de package correctes au script processing.py, exécutez la commande suivante dans le shell bash :

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

Si le script échoue, continuez à mettre à jour les versions du package jusqu'à ce que le script s’exécute correctement.

Résoudre les problèmes d'exécution de Python

Pour résoudre un problème d'exécution de Python, modifiez votre code dans le dossier de code pour mettre à jour votre script processing.py. Pour tester votre script processing.py, exécutez les commandes suivantes dans le shell bash :

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

Modifiez votre code jusqu'à ce que tous les problèmes du journal de suivi de la pile soient résolus et que vous receviez le code de sortie « 0 ».

Résoudre les problèmes d'architecture du processeur

Vous devez conserver une version de conteneur conçue pour le processeur spécifique. Extrayez l'image existante et créez un nouveau Dockerfile qui inclut uniquement l'image de votre conteneur (FROM IMAGE_URI). Puis, transférez le conteneur vers votre Amazon Elastic Container Registry (Amazon ECR) existant.

L'exemple suivant prend une image créée pour x86_64 et reconstruit l'image pour une architecture 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}

Remarque : Remplacez ALGORITHM_NAME et SAGEMAKER_ACCOUNT_NUMBER par vos valeurs.

Tester votre tâche de traitement

Pour tester votre tâche de traitement mise à jour, exécutez la commande suivante :

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/')]
                     )

Remarque : Remplacez instance_type par local ou local-gpu pour exécuter la tâche en tant que test.

AWS OFFICIELA mis à jour il y a un an