Direkt zum Inhalt

Wie behebe ich einen Algorithmusfehler in meinem SageMaker AI-Verarbeitungsjob?

Lesedauer: 5 Minute
0

Ich möchte einen Algorithmusfehler beheben, der bei der Ausführung eines Amazon SageMaker AI-Verarbeitungsjobs angezeigt wird.

Kurzbeschreibung

Wenn du einen SageMaker AI-Verarbeitungsjob ausführst, erhältst du möglicherweise die Fehlermeldung „Failure reason AlgorithmError: , exit code: 1“ aus den folgenden Gründen:

  • Es gibt ein Python-Abhängigkeitsproblem.
  • Ein Python-Laufzeitfehler tritt auf und du erhältst einen Beendigungscode ungleich Null.
  • Du verwendest einen Docker-Container, der für eine andere CPU-Architektur entwickelt wurde.

Lösung

Hinweis: Wenn du beim Ausführen von AWS Command Line Interface (AWS CLI)-Befehlen Fehlermeldungen erhältst, findest du weitere Informationen dazu unter Problembehandlung bei der AWS CLI. Stelle außerdem sicher, dass du die neueste Version der AWS CLI verwendest.

Identifizieren der Ursache des Fehlers

Um die Ursache des Fehlers zu ermitteln, verwende Amazon CloudWatch Logs, um das Stack-Trace-Protokoll zu überprüfen. Das Stack-Trace-Protokoll zeigt, warum der Code fehlgeschlagen ist und wann der Fehler im Verarbeitungsskript aufgetreten ist.

Nachdem du die Fehlerursache identifiziert hast, führe den Container manuell von einem Terminal aus aus. Wenn du Docker nicht installiert hast, verwendeSageMaker AI-Notebook-Instances, um den Container auszuführen. Stelle sicher, dass du den entsprechenden Instance-Typ verwendest.

Den Container in die lokale Umgebung ziehen

Wenn du einen vorgefertigten SageMaker AI-Container wie Scikit-Learn verwendest, melde dich bei der Registrierung an und rufe den Container ab. Um sich anzumelden, führe den AWS-CLI-Befehl get-login-password aus:

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

Hinweis: Ersetze die Region durch deine AWS-Region.

Führe den folgenden Befehl aus, um den Container abzurufen:

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

Hinweis: Wenn du SageMaker AI-Algorithmen wie Random Cut Forest verwendest, kannst du den Container nicht in die lokale Umgebung ziehen. Wende dich für diese Container an den AWS Support.

Eine Bash-Shell im Container erstellen

Führe den Container in der lokalen Umgebung aus, um Probleme mit dem Code zu beheben. Erstelle einen Ordner mit dem Namen Code und füge dann den Code dem Ordner hinzu. Hänge das Verzeichnis, das den Ordner Code enthält, als Volume in den Container ein. Hänge dann die Verzeichnisausgabe an demselben Ort ein, wie im folgenden Beispiel gezeigt:

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

Der vorhergehende Befehl erstellt eine Bash-Shell im Container. Aktualisiere im Abschnitt Problembehandlung bei Algorithmusfehlern den Code im Ordner Code und verwende dann die Bash-Shell, um das Verarbeitungsskript auszuführen.

Algorithmusfehler beheben

Python-Abhängigkeitsproblem

Wenn du keine Python-Paketversion angibst, installiert pip das neueste Paket, das einen Algorithmusfehler verursachen kann. Um dieses Problem zu beheben, identifiziere die Paketversion und installiere dann die Pakete im Verarbeitungsskript.

Wenn du einen vorgefertigten SageMaker-Container verwendest, suche das Repository für den Quellcode. Rufe die Python-Pakete und Versionen ab, die du im Container verwendest. Oder führe den folgenden Befehl in der Bash-Shell aus, um die vollständige Liste der Pakete für einen benutzerdefinierten Container anzuzeigen:

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

Nachdem du die Paketversion identifiziert hast, erstelle eine Datei requirements.txt im selben Verzeichnis wie das Skript processing.py. Füge dann die erforderlichen Pakete zur Datei requirements.txt hinzu.

Beispieldatei requirements.txt, die das Scikit-Learn-Repository von SageMaker AI verwendet:

# 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

Um die erforderlichen Pakete zu installieren, führe den Befehl pip in dem Skript ** processing.py ** aus:

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()

Hinweis: Ersetze example_code durch den Code. Stelle sicher, dass bestehende Pakete nicht aktualisiert werden.

Um zu testen, ob du dem Skript processing.py die richtigen Paketversionen hinzugefügt hast, führe den folgenden Befehl in der Bash-Shell aus:

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

Wenn das Skript fehlschlägt, fahre mit der Aktualisierung der Paketversionen fort, bis das Skript erfolgreich ist.

Python-Laufzeitproblem begeben

Um ein Python-Laufzeitproblem zu beheben, ändere den Code im Ordner Code, um das Skript processing.py zu aktualisieren. Um das Skript processing.py zu testen, führe die folgenden Befehle in der Bash-Shell aus:

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

Ändere den Code, bis du alle Probleme im Stack-Trace-Protokoll gelöst hast und du den Beendigungscode „0" erhältst.

Problem mit der CPU-Architektur beheben

Du musst eine Container-Version verwalten, die für die spezifische CPU erstellt wurde. Rufe das vorhandene Bild ab und erstelle ein neues Dockerfile, das nur das Container-Bild enthält (FROM IMAGE_URI). Verschiebe den Container dann in die bestehende Amazon Elastic Container Registry (Amazon ECR).

Das folgende Beispiel nimmt ein Bild, das für x86_64 erstellt wurde und erstellt das Bild für eine ARM-Architektur neu:

#!/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}

Hinweis: Ersetze ALGORITHM_NAME und SAGEMAKER_ACCOUNT_NUMBER durch deine Werte.

Den Verarbeitungsjob testen

Führe den folgenden Befehl aus, um den aktualisierten Verarbeitungsjob zu testen:

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

Hinweis: Ersetze instance_type durch local oder local-gpu, um den Job als Test auszuführen.

AWS OFFICIALAktualisiert vor einem Jahr