기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
SageMaker 구성 요소 사용
이 자습서에서는 Kubeflow 파이프라인용 SageMaker 구성 요소를 사용하여 파이프라인을 실행하여 의 MNIST 데이터 세트와 함께 Kmeans를 사용하여 분류 모델을 훈련합니다 SageMaker. 워크플로는 Kubeflow 파이프라인을 오케스트레이터로 사용하고 워크플로의 각 단계를 SageMaker 실행합니다. 이 예제는 기존 SageMaker 예제
를 사용하여 Python에서 파이프라인을 정의 AWS SDK for Python (Boto3) 한 다음 KFP 대시보드, CLI또는 Boto3를 사용하여 워크플로를 KFP 컴파일, 배포 및 실행할 수 있습니다. MNIST 분류 파이프라인 예제의 전체 코드는 Kubeflow Github 리포지토리
추가 SageMaker Kubeflow 파이프라인 예제
분류 파이프라인 예제를 실행하려면 훈련 작업에 AWS 리소스에 액세스할 수 있는 권한을 부여하는 실행 역할을 생성한 SageMaker IAM 다음 배포 옵션에 해당하는 단계를 계속합니다.
SageMaker 실행 역할 생성
kfp-example-sagemaker-execution-role
IAM 역할은 AWS 리소스에 액세스하기 위해 SageMaker 작업에서 맡는 런타임 역할입니다. 다음 명령에서는 라는 IAM 실행 역할을 생성하고kfp-example-sagemaker-execution-role
, 두 개의 관리형 정책(AmazonSageMakerFullAccess, AmazonS3FullAccess)을 연결하고, 와 신뢰 관계를 생성 SageMaker 하여 SageMaker 작업에 해당 AWS 리소스에 대한 액세스 권한을 부여합니다.
파이프라인을 실행할 때 이 역할을 입력 파라미터로 제공합니다.
다음 명령을 실행해 역할을 생성합니다. 출력에 반환ARN되는 에 유의하세요.
SAGEMAKER_EXECUTION_ROLE_NAME=kfp-example-sagemaker-execution-role TRUST="{ \"Version\": \"2012-10-17\", \"Statement\": [ { \"Effect\": \"Allow\", \"Principal\": { \"Service\": \"sagemaker.amazonaws.com\" }, \"Action\": \"sts:AssumeRole\" } ] }" aws iam create-role --role-name ${SAGEMAKER_EXECUTION_ROLE_NAME} --assume-role-policy-document "$TRUST" aws iam attach-role-policy --role-name ${SAGEMAKER_EXECUTION_ROLE_NAME} --policy-arn arn:aws:iam::aws:policy/AmazonSageMakerFullAccess aws iam attach-role-policy --role-name ${SAGEMAKER_EXECUTION_ROLE_NAME} --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess aws iam get-role --role-name ${SAGEMAKER_EXECUTION_ROLE_NAME} --output text --query 'Role.Arn'
SageMaker K-Means 를 사용한 MNIST 분류에 대한 훈련 파이프라인 자습
데이터 세트 준비
파이프라인을 실행하려면 Amazon S3 버킷에 데이터 추출 사전 처리 스크립트를 업로드해야 합니다. 이 버킷과 이 예시의 모든 리소스는 us-east-1
리전에 있어야 합니다. 버킷 생성에 대한 자세한 내용은 버킷 생성을 참조하세요.
게이트웨이 노드에 복재한 Kubeflow 리포지토리의 mnist-kmeans-sagemaker
폴더에서 다음 명령을 실행하여 Amazon S3 버킷에 kmeans_preprocessing.py
파일을 업로드합니다. <bucket-name>
을 S3 버킷의 이름으로 변경합니다.
aws s3 cp mnist-kmeans-sagemaker/kmeans_preprocessing.py s3://
<bucket-name>
/mnist_kmeans_example/processing_code/kmeans_preprocessing.py
파이프라인 컴파일 및 배포
파이프라인을 정의한 후에는 클러스터의 Kubeflow 파이프라인 서비스에 제출하기 전에 중간 표시로 컴파일해야 합니다. 중간 표현은 tar.gz YAML 파일로 압축된 파일 형식의 워크플로 사양입니다. 파이프라인을 컴파일KFPSDK하려면 이 필요합니다.
설치 KFP SDK
게이트웨이 노드의 명령줄에서 다음을 실행합니다.
-
Kubeflow 파이프라인 설명서
에 KFP SDK 다음 지침을 설치합니다. -
KFP SDK 가 다음 명령으로 설치되어 있는지 확인합니다.
pip show kfp
-
다음과 같이
dsl-compile
이 올바르게 설치되었는지 확인합니다.which dsl-compile
파이프라인 컴파일
Kubeflow 파이프라인과 상호 작용할 수 있는 세 가지 옵션, 즉 KFP UI, KFP CLI또는 KFP 가 있습니다SDK. 다음 섹션에서는 KFP UI 및 를 사용하는 워크플로를 보여줍니다CLI.
게이트웨이 노드에서 다음 단계를 완료합니다.
-
Amazon S3 버킷 이름 및 IAM 역할 로 Python 파일을 수정합니다ARN.
-
명령줄의
dsl-compile
명령을 사용하여 다음과 같이 파이프라인을 컴파일합니다.<path-to-python-file>
을 파이프라인 경로로,<path-to-output>
을 tar.gz 파일을 배치할 위치로 바꿉니다.dsl-compile --py
<path-to-python-file>
--output<path-to-output>
를 사용하여 파이프라인 업로드 및 실행 KFP CLI
게이트웨이 노드의 명령줄에서 다음 단계를 완료합니다. KFP 는 파이프라인의 실행을 실험으로 구성합니다. 실험 이름을 지정할 수 있습니다. 지정하지 않으면 해당 실행이 기본 실험에 나열됩니다.
-
다음과 같이 파이프라인을 업로드합니다.
kfp pipeline upload --pipeline-name
<pipeline-name>
<path-to-output-tar.gz>
출력은 다음과 같아야 합니다. 파이프라인
ID
를 기록해 둡니다.Pipeline 29c3ff21-49f5-4dfe-94f6-618c0e2420fe has been submitted Pipeline Details ------------------ ID 29c3ff21-49f5-4dfe-94f6-618c0e2420fe Name sm-pipeline Description Uploaded at 2020-04-30T20:22:39+00:00 ... ...
-
다음 명령을 사용하여 실행을 생성합니다. KFP CLI 실행 명령은 현재 실행을 생성하는 동안 입력 파라미터 지정을 지원하지 않습니다. 컴파일하기 전에 AWS SDK for Python (Boto3) 파이프라인 파일에서 파라미터를 업데이트해야 합니다.
<experiment-name>
및<job-name>
을 원하는 이름으로 바꿉니다.<pipeline-id>
를 제출한 파이프라인의 ID로 바꿉니다. 를 ARN 의<your-role-arn>
로 바꿉니다kfp-example-pod-role
.<your-bucket-name>
을 생성한 Amazon S3 버킷 이름으로 바꿉니다.kfp run submit --experiment-name
<experiment-name>
--run-name<job-name>
--pipeline-id<pipeline-id>
role_arn="<your-role-arn>
" bucket_name="<your-bucket-name>
"dsl-compile
명령의 출력으로 생성된 컴파일된 파이프라인 패키지를 사용하여 실행을 직접 제출할 수도 있습니다.kfp run submit --experiment-name
<experiment-name>
--run-name<job-name>
--package-file<path-to-output>
role_arn="<your-role-arn>
" bucket_name="<your-bucket-name>
"출력은 다음과 같아야 합니다.
Creating experiment aws. Run 95084a2c-f18d-4b77-a9da-eba00bf01e63 is submitted +--------------------------------------+--------+----------+---------------------------+ | run id | name | status | created at | +======================================+========+==========+===========================+ | 95084a2c-f18d-4b77-a9da-eba00bf01e63 | sm-job | | 2020-04-30T20:36:41+00:00 | +--------------------------------------+--------+----------+---------------------------+
-
UI로 이동하여 작업 진행 상황을 확인합니다.
KFP UI를 사용하여 파이프라인 업로드 및 실행
-
왼쪽 패널에서 파이프라인 탭을 선택합니다.
-
오른쪽 상단 모서리에서 +UploadPipeline를 선택합니다.
-
파이프라인 이름 및 설명을 입력합니다.
-
파일 업로드를 선택하고 CLI 또는 를 사용하여 생성한 tar.gz 파일의 경로를 입력합니다 AWS SDK for Python (Boto3).
-
왼쪽 패널에서 파이프라인 탭을 선택합니다.
-
생성한 파이프라인을 찾습니다.
-
+CreateRun를 선택합니다.
-
입력 파라미터를 입력합니다.
-
Run(실행)을 선택합니다.
예측 실행
분류 파이프라인이 배포되면 배포 구성 요소에서 생성된 엔드포인트에 대해 분류 예측을 실행할 수 있습니다. UI를 사용하여 KFP 의 출력 아티팩트를 확인합니다sagemaker-deploy-model-endpoint_name
. .tgz 파일을 다운로드하여 엔드포인트 이름을 추출하거나 사용한 리전의 SageMaker 콘솔을 확인합니다.
예측을 실행할 수 있는 권한을 구성합니다.
게이트웨이 노드에서 예측을 실행하려면 이 섹션을 건너뜁니다.
다른 시스템을 사용하여 예측을 실행하려면 클라이언트 시스템에서 사용하는 IAM 역할에 sagemaker:InvokeEndpoint
권한을 할당합니다.
-
게이트웨이 노드에서 다음을 실행하여 IAM 정책 파일을 생성합니다.
cat <<EoF > ./sagemaker-invoke.json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "sagemaker:InvokeEndpoint" ], "Resource": "*" } ] } EoF
-
클라이언트 노드의 IAM 역할에 정책을 연결합니다.
다음 명령을 실행합니다.
<your-instance-IAM-role>
를 IAM 역할 이름으로 바꿉니다.<path-to-sagemaker-invoke-json>
을 생성한 정책 파일의 경로로 바꿉니다.aws iam put-role-policy --role-name
<your-instance-IAM-role>
--policy-name sagemaker-invoke-for-worker --policy-document file://<path-to-sagemaker-invoke-json>
예측 실행
-
클라이언트 시스템에서 다음 콘텐츠
mnist-predictions.py
로 라는 AWS SDK for Python (Boto3) 파일을 생성합니다.ENDPOINT_NAME
변수를 바꿉니다. 스크립트는 MNIST 데이터 세트를 로드하고 해당 숫자CSV에서 를 생성한 다음 예측CSV을 위해 엔드포인트로 를 전송하고 결과를 인쇄합니다.import boto3 import gzip import io import json import numpy import pickle ENDPOINT_NAME='
<endpoint-name>
' region = boto3.Session().region_name # S3 bucket where the original mnist data is downloaded and stored downloaded_data_bucket = f"jumpstart-cache-prod-{region}" downloaded_data_prefix = "1p-notebooks-datasets/mnist" # Download the dataset s3 = boto3.client("s3") s3.download_file(downloaded_data_bucket, f"{downloaded_data_prefix}/mnist.pkl.gz", "mnist.pkl.gz") # Load the dataset with gzip.open('mnist.pkl.gz', 'rb') as f: train_set, valid_set, test_set = pickle.load(f, encoding='latin1') # Simple function to create a csv from our numpy array def np2csv(arr): csv = io.BytesIO() numpy.savetxt(csv, arr, delimiter=',', fmt='%g') return csv.getvalue().decode().rstrip() runtime = boto3.Session(region).client('sagemaker-runtime') payload = np2csv(train_set[0][30:31]) response = runtime.invoke_endpoint(EndpointName=ENDPOINT_NAME, ContentType='text/csv', Body=payload) result = json.loads(response['Body'].read().decode()) print(result) -
다음과 같이 AWS SDK for Python (Boto3) 파일을 실행합니다.
python mnist-predictions.py
결과 및 로그 보기
파이프라인이 실행 중일 때 구성 요소를 선택하여 입력 및 출력과 같은 실행 세부 정보를 확인할 수 있습니다. 여기에는 생성된 리소스의 이름이 나열됩니다.
KFP 요청이 성공적으로 처리되고 SageMaker 작업이 생성된 경우 구성 요소는 KFP UI에 로그하여 에서 생성된 작업에 대한 링크를 제공합니다 SageMaker. 작업이 성공적으로 생성된 경우에도 CloudWatch 로그가 제공됩니다.
동일한 클러스터에서 너무 많은 파이프라인 작업을 실행하면 사용 가능한 포드가 충분하지 않다는 오류 메시지가 표시될 수 있습니다. 이 문제를 해결하려면 게이트웨이 노드에 로그인하고 사용하지 않는 파이프라인에서 생성된 파드를 삭제합니다.
kubectl get pods -n kubeflow kubectl delete pods -n kubeflow
<name-of-pipeline-pod>
정리
파이프라인 사용을 마치면 리소스를 정리해야 합니다.
-
KFP 대시보드에서 종료를 선택하여 파이프라인 실행이 제대로 종료되지 않으면 파이프라인 실행을 종료합니다.
-
종료 옵션이 작동하지 않는 경우, 게이트웨이 노드에 로그인하고 다음과 같이 파이프라인 실행으로 생성된 모든 포드를 수동으로 종료합니다.
kubectl get pods -n kubeflow kubectl delete pods -n kubeflow
<name-of-pipeline-pod>
-
AWS 계정을 사용하여 SageMaker 서비스에 로그인합니다. 모든 훈련, 배치 변환 및 HPO 작업을 수동으로 중지합니다. 모델, 데이터 버킷, 엔드포인트를 삭제하여 추가 비용이 발생하지 않도록 합니다. 파이프라인 실행을 종료해도 에서 작업이 중지되지 않습니다 SageMaker.