내용으로 건너뛰기

SageMaker AI 처리 작업의 알고리즘 오류 문제를 해결하려면 어떻게 해야 합니까?

4분 분량
0

Amazon SageMaker AI 처리 작업을 실행할 때 발생하는 알고리즘 오류를 해결하려고 합니다.

간략한 설명

SageMaker AI 처리 작업을 실행할 때 다음과 같은 이유로 "Failure reason AlgorithmError: , exit code: 1" 오류 메시지가 표시될 수 있습니다.

  • Python 종속성 문제가 있습니다.
  • Python 런타임 오류가 발생하고 0 이외의 종료 코드를 받습니다.
  • 다른 CPU 아키텍처용으로 구축된 Docker 컨테이너를 사용하고 있습니다.

해결 방법

참고: AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류가 발생하면 AWS CLI의 오류 해결을 참조하십시오. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하십시오.

오류 원인 파악

오류의 원인을 파악하려면 Amazon CloudWatch Logs를 사용하여 스택 추적 로그를 검토합니다. 스택 추적 로그는 코드 실패의 원인과 언제 처리 스크립트에서 오류가 발생했는지 보여줍니다.

오류의 원인을 파악한 후 터미널에서 컨테이너를 수동으로 실행합니다. Docker가 설치되어 있지 않은 경우 SageMaker AI 노트북 인스턴스를 사용하여 컨테이너를 실행합니다. 적절한 인스턴스 유형을 사용해야 합니다.

로컬 환경으로 컨테이너 가져오기

Scikit-learn과 같은 SageMaker AI 사전 빌드 컨테이너를 사용하는 경우 레지스트리에 로그인하여 컨테이너를 가져옵니다. 로그인하려면 get-login-password AWS CLI 명령을 실행하십시오.

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

참고: region을 AWS 리전으로 바꾸십시오.

컨테이너를 가져오려면 다음 명령을 실행합니다.

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

참고: Random Cut Forest와 같은 SageMaker AI 알고리즘을 사용하는 경우에는 컨테이너를 로컬 환경으로 가져올 수 없습니다. 이러한 컨테이너의 경우 AWS Support에 문의하십시오.

컨테이너에 bash 쉘 만들기

코드 문제를 해결하려면 로컬 환경에서 컨테이너를 실행합니다. code라는 이름의 폴더를 만든 다음, 해당 폴더에 코드를 추가합니다. code 폴더가 포함된 디렉터리를 컨테이너에 볼륨으로 마운트합니다. 그런 다음, 다음 예와 같이 디렉터리 출력을 동일한 위치에 마운트합니다.

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

위의 명령은 컨테이너에 bash 쉘을 만듭니다. 알고리즘 오류 문제 해결 섹션에서 code 폴더의 코드를 업데이트한 다음, bash 쉘을 사용하여 처리 스크립트를 실행합니다.

알고리즘 오류 문제 해결

Python 종속성 문제

Python 패키지 버전을 지정하지 않은 경우 pip는 알고리즘 오류를 일으킬 수 있는 최신 패키지를 설치합니다. 이 문제를 해결하려면 패키지 버전을 확인한 다음, 처리 스크립트에서 패키지를 설치하십시오.

사전 빌드된 SageMaker 컨테이너를 사용하는 경우 소스 코드의 리포지토리를 찾으십시오. 컨테이너에서 사용하는 Python 패키지 및 버전을 검색합니다. 또는 bash 쉘에서 다음 명령을 실행하여 사용자 지정 컨테이너의 전체 패키지 목록을 확인합니다.

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

패키지 버전을 확인한 후 processing.py 스크립트와 동일한 디렉터리에 requirements.txt 파일을 생성합니다. 그런 다음, 필요한 패키지를 requirements.txt 파일에 추가합니다.

SageMaker AI Scikit-learn 리포지토리를 사용하는 requirements.txt 파일의 예:

# 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

필요한 패키지를 설치하려면 processing.py 스크립트에서 pip 명령을 실행합니다.

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

참고: example_code를 해당 코드로 바꾸십시오. 기존 패키지가 업데이트되지 않아야 합니다.

processing.py 스크립트에 올바른 패키지 버전을 추가했는지 테스트하려면 bash 쉘에서 다음 명령을 실행합니다.

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

스크립트가 실패할 경우 스크립트가 성공할 때까지 패키지 버전을 계속 업데이트하십시오.

Python 런타임 문제 해결

Python 런타임 문제를 해결하려면 code 폴더에서 코드를 수정하여 processing.py 스크립트를 업데이트합니다. processing.py 스크립트를 테스트하려면 bash 쉘에서 다음 명령을 실행합니다.

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

스택 추적 로그의 모든 문제를 해결하고 “0" 종료 코드를 수신할 때까지 코드를 수정하십시오.

CPU 아키텍처 문제 해결

특정 CPU용으로 빌드된 컨테이너 버전을 유지해야 합니다. 기존 이미지를 가져와서 컨테이너 이미지**(FROM IMAGE_URI)**만 포함하는 새 Dockerfile을 생성합니다. 그런 다음, 컨테이너를 기존 Amazon Elastic Container Registry(Amazon ECR)로 푸시합니다.

다음 예제에서는 x86_64용으로 빌드된 이미지를 가져와서 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}

참고: ALGORITHM_NAMESAGEMAKER_ACCOUNT_NUMBER를 해당 값으로 바꾸십시오.

처리 작업 테스트

업데이트된 처리 작업을 테스트하려면 다음 명령을 실행합니다.

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

참고: 작업을 테스트로 실행하려면 instance_typelocal 또는 local-gpu로 바꾸십시오.

AWS 공식업데이트됨 일 년 전