Wie behebe ich einen Algorithmusfehler in meinem SageMaker AI-Verarbeitungsjob?
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.
- Themen
- Machine Learning & AI
- Tags
- Amazon SageMaker
- Sprache
- Deutsch

Relevanter Inhalt
AWS OFFICIALAktualisiert vor 2 Jahren
AWS OFFICIALAktualisiert vor einem Jahr
AWS OFFICIALAktualisiert vor einem Monat