{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# [모듈 3.6] 전체 모델 빌딩 파이프라인 개발 (SageMaker Model Building Pipeline 모든 스텝)\n", "\n", "이 노트북은 아래와 같은 목차로 진행 됩니다. 전체를 모두 실행시에 완료 시간은 **약 20분** 소요 됩니다.\n", "\n", "- 1. SageMaker 모델 빌드 파이프라인을 이용한 모델 빌드 오케스트레이션\n", "- 2. 파이프라인 개발자 가이드\n", "- 3. 기본 라이브러리 로딩\n", "- 4. 모델 빌딩 파이프라인 의 스텝(Step) 생성\n", " - 4.1. 모델 빌딩 파이프라인 변수 생성\n", " - 4.2. 전처리 스텝 단계 정의\n", " - 4.3. 모델 학습을 위한 학습단계 정의\n", " - 4.4. 세이지 메이커 모델 생성 스탭 생성\n", " - 4.5. 실시간 엔드 포인트 배포 스텝 생성\n", "- 5. 파리마터, 단계, 조건을 조합하여 최종 파이프라인 정의 및 실행\n", "- 6. 세이지 메이커 스튜디오에서 실행 확인 하기\n", "- 7. 아티펙트 경로 추출\n", " \n", "---\n", "### 노트북 커널\n", "- 이 워크샵은 노트북 커널이 `conda_python3` 를 사용합니다. 다른 커널일 경우 변경 해주세요.\n", "---\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 1. SageMaker 모델 빌드 파이프라인을 이용한 모델 빌드 오케스트레이션\n", "\n", "Amazon SageMaker 모델 구축 파이프라인은 직접 SageMaker 통합을 활용하는 머신 러닝 파이프라인을 구축하기 위한 도구입니다. \n", "\n", "- 상세 사항은 개발자 가이드 참조 하세요. --> [Amazon SageMaker 모델 구축 파이프라인](https://docs.aws.amazon.com/ko_kr/sagemaker/latest/dg/pipelines.html)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 2. 파이프라인 개발자 가이드\n", "- 상세 사항은 개발자 가이드 참조 하세요. --> [Amazon SageMaker 모델 구축 파이프라인](https://docs.aws.amazon.com/ko_kr/sagemaker/latest/dg/pipelines.html)\n", "\n", "![mdp_how_it_works.png](img/mdp_how_it_works.png)\n", "\n", "SageMaker 파이프라인은 다음 기능을 지원하며 본 노트북에서 하나씩 다루게 됩니다. \n", "\n", "* Processing job steps - 데이터처러 워크로드를 실행하기 위한 SageMaker의 관리형 기능. Feature engineering, 데이터 검증, 모델 평가, 모델 해석 등에 주로 사용됨 \n", "* Training job steps - 학습작업. 모델에게 학습데이터셋을 이용하여 모델에게 예측을 하도록 학습시키는 반복적인 작업 \n", "* Create model steps - 추론 엔드포인트 또는 배치 추론을 위한 모델의 생성 \n", "* Pipelines - Workflow DAG. SageMaker 작업과 리소스 생성을 조율하는 단계와 조건을 가진다. \n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 3. 기본 라이브러리 로딩 \n", "\n", "- [중요] Sagemaker python sdk 를 `2.72.1` 로 다운 그레이드 합니다. 현재는 2.77.x 버전이지만 CreateModel 단계의 오류로 인해서 다운 그레이드 합니다.\n", "- 세이지 메이커 관련 라이브러리를 로딩 합니다." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# import sys, IPython\n", "\n", "# sm_sdk_version = \"2.72.1\"\n", "\n", "# import sagemaker\n", "# current_sm_version = sagemaker.__version__\n", "# if sm_sdk_version == current_sm_version:\n", "# print(\"current_sm_version: \", current_sm_version)\n", "# else:\n", "# !{sys.executable} -m pip install sagemaker=={sm_sdk_version} --upgrade \n", "# IPython.Application.instance().kernel.do_shutdown(True) \n", "\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import boto3\n", "import sagemaker\n", "import pandas as pd\n", "\n", "region = boto3.Session().region_name\n", "sagemaker_session = sagemaker.session.Session()\n", "role = sagemaker.get_execution_role()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3.1 노트북 변수 로딩\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "기존 노트북에서 저장한 변수를 로딩 합니다." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "%store -r" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 4. 모델 빌딩 파이프라인 의 스텝(Step) 생성\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4.1. 모델 빌딩 파이프라인 변수 생성\n", "\n", "파이프라인에 인자로 넘길 변수는 아래 크게 3가지 종류가 있습니다.\n", "- 프로세싱 스텝을 위한 인스턴스 타입 및 인스턴스 수\n", " - 데이터 전처리 스텝 및 실시간 앤드 포인트 스텝에 사용 됨.\n", "- 훈련 스텝을 위한 인스턴스 타입 및 인스턴스 수 \n", "- 엔트 포인트의 인스턴스 타입\n", "- 원본 데이터 세트에 대한 S3 주소\n", " - 데이터 전처리 스텝에서 사용 됩니다.\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "from sagemaker.workflow.parameters import (\n", " ParameterInteger,\n", " ParameterString,\n", ")\n", "\n", "processing_instance_count = ParameterInteger(\n", " name=\"ProcessingInstanceCount\",\n", " default_value=1\n", ")\n", "processing_instance_type = ParameterString(\n", " name=\"ProcessingInstanceType\",\n", " default_value=\"ml.m5.xlarge\"\n", ")\n", "\n", "training_instance_type = ParameterString(\n", " name=\"TrainingInstanceType\",\n", " default_value=\"ml.m5.xlarge\"\n", ")\n", "\n", "training_instance_count = ParameterInteger(\n", " name=\"TrainingInstanceCount\",\n", " default_value=1\n", ")\n", "\n", "endpoint_instance_type = ParameterString(\n", " name=\"EndpointInstanceType\",\n", " default_value=\"ml.m5.xlarge\"\n", ")\n", "\n", "input_data = ParameterString(\n", " name=\"InputData\",\n", " default_value=input_data_uri\n", ")\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4.2. 전처리 스텝 단계 정의\n", "\n", "크게 아래와 같은 순서로 정의 합니다.\n", "- 프로세싱 오브젝트 정의 (SKLearnProcessor)\n", "- 프로세싱 스텝 정의\n", " - 일력 데이터 세트\n", " - source: S3 경로 (input_data_uri)\n", " - destination: 도커 컨테이너의 내부 폴더 위치\n", " - 출력 위치\n", " - 훈련 전처리 데이터 결과 위치\n", " - 테스트 전처리 데이터 결과 위치\n", " - 프로세싱 코드\n", " - 프로세싱 코드에 넘길 인자 \n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "The input argument instance_type of function (sagemaker.image_uris.retrieve) is a pipeline variable (), which is not allowed. The default_value of this Parameter object will be used to override it. Please make sure the default_value is valid.\n" ] } ], "source": [ "from sagemaker.sklearn.processing import SKLearnProcessor\n", "\n", "split_rate = 0.2\n", "framework_version = \"1.0-1\"\n", "\n", "sklearn_processor = SKLearnProcessor(\n", " framework_version=framework_version,\n", " instance_type=processing_instance_type,\n", " instance_count=processing_instance_count,\n", " base_job_name=\"sklearn-fraud-process\",\n", " role=role,\n", ")\n", "# print(\"input_data: \\n\", input_data)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "from sagemaker.processing import ProcessingInput, ProcessingOutput\n", "from sagemaker.workflow.steps import ProcessingStep\n", " \n", "step_process = ProcessingStep(\n", " name=\"Fraud-Basic-Preprocess\",\n", " processor=sklearn_processor,\n", " inputs=[\n", " ProcessingInput(source=input_data, destination='/opt/ml/processing/input'), \n", " ],\n", " outputs=[ProcessingOutput(output_name=\"train\",\n", " source='/opt/ml/processing/output/train'),\n", " ProcessingOutput(output_name=\"test\",\n", " source='/opt/ml/processing/output/test')],\n", " job_arguments=[\"--split_rate\", f\"{split_rate}\"], \n", " code= 'src/preprocessing.py',\n", ")\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4.3. 모델 학습을 위한 학습단계 정의 \n", "\n", "학습 스텝을 정의하기 위해서는 크게 아래와 같은 과정이 있습니다.\n", "- XGBoost Estimator 정의\n", "- 학습 스텝 정의\n", " - 아래와 같은 중요한 인자가 필요 합니다.\n", " - Estimator (위에서 정의한 것 사용)\n", " - 훈련을 위한 입력 데이터 위치\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 기본 훈련 변수 및 하이퍼파라미터 설정" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "from sagemaker.xgboost.estimator import XGBoost\n", "\n", "estimator_output_path = f's3://{bucket}/{project_prefix}/training-jobs'\n", "XGB_FRAMEWORK_VERSION = '1.3-1'\n", "\n", "\n", "hyperparameters = {\n", " \"scale_pos_weight\" : \"29\", \n", " \"max_depth\": \"3\",\n", " \"eta\": \"0.2\",\n", " \"objective\": \"binary:logistic\",\n", " \"num_round\": \"100\",\n", "}" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "The input argument instance_type of function (sagemaker.image_uris.retrieve) is a pipeline variable (), which is not allowed. The default_value of this Parameter object will be used to override it. Please make sure the default_value is valid.\n" ] } ], "source": [ "xgb_train = XGBoost(\n", " entry_point = \"xgboost_starter_script.py\",\n", " source_dir = \"src\",\n", " output_path = estimator_output_path,\n", " code_location = estimator_output_path,\n", " hyperparameters = hyperparameters,\n", " role = role,\n", " instance_count = training_instance_count,\n", " instance_type = training_instance_type,\n", " framework_version=XGB_FRAMEWORK_VERSION \n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "훈련의 입력이 이전 전처리의 결과가 제공됩니다.\n", "- `step_process.properties.ProcessingOutputConfig.Outputs[\"train\"].S3Output.S3Uri`" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "from sagemaker.inputs import TrainingInput\n", "from sagemaker.workflow.steps import TrainingStep\n", "\n", "\n", "step_train = TrainingStep(\n", " name=\"Fraud-Basic-Train\",\n", " estimator=xgb_train,\n", " inputs={\n", " \"train\": TrainingInput(\n", " s3_data=step_process.properties.ProcessingOutputConfig.Outputs[\n", " \"train\"\n", " ].S3Output.S3Uri,\n", " content_type=\"text/csv\"\n", " ),\n", " },\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4.4. 세이지 메이커 모델 생성 스탭 생성\n", "- 스텝 생성시에 위에서 생성한 Estimator 입력 및 입력 데이타로서 이전에 생성한 S3 경로를 제공합니다." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "from sagemaker.model import Model\n", "\n", "model = Model(\n", " image_uri= step_train.properties.AlgorithmSpecification.TrainingImage,\n", " model_data= step_train.properties.ModelArtifacts.S3ModelArtifacts,\n", " sagemaker_session=sagemaker_session,\n", " role=role,\n", ")" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "from sagemaker.inputs import CreateModelInput\n", "from sagemaker.workflow.steps import CreateModelStep\n", "\n", "\n", "inputs = CreateModelInput(\n", " instance_type=\"ml.m5.large\",\n", ")\n", "step_create_model = CreateModelStep(\n", " name=\"Fraud-Basic-CreateModel\",\n", " model=model,\n", " inputs=inputs,\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4.5. 실시간 엔드 포인트 배포 스텝 생성\n", "\n", "앤드포인트를 생성하기 위해서는 프로세싱 스텝을 통해서 합니다. 프레세싱 스텝에 앤드포인트 생성에 필요한 코드(스크립트)를 작성하여 프로세싱 스텝에서 실행하여 생성하게 합니다. 크게 아래와 같은 과정으로 합니다.\n", "\n", "- 앤드포인트 생성 코드를 S3 에 업로드\n", "- SKLearnProcessor 오브젝트 생성\n", "- ProcessingStep 정의 (중요한 인자는 아래와 같습니다.)\n", " - processor (SKLearnProcessor 오브젝트 제공)\n", " - 코드에 전달할 커맨드 인자\n", " - endpoint config 생성시에, 이전 단계의 모델 결과를 제공합니다.\n", " - \"--model_name\", step_create_model.properties.ModelName, \n", " - 앤드포인트 생성 코드\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 엔드포인트 생성 스크립트 코드를 S3에 업로딩" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "from datetime import datetime\n", "suffix = datetime.now().microsecond" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "s3_deploy_code_uri: s3://sagemaker-us-east-1-585843180719/sagemaker-webinar-pipeline-base/code/deploy_model.py\n" ] } ], "source": [ "\n", "local_deploy_code_path = 'src/deploy_model.py'\n", "s3_deploy_code_path = f\"s3://{bucket}/{project_prefix}/code\"\n", "s3_deploy_code_uri = sagemaker.s3.S3Uploader.upload(\n", " local_path=local_deploy_code_path, \n", " desired_s3_uri=s3_deploy_code_path,\n", ")\n", "print(\"s3_deploy_code_uri: \", s3_deploy_code_uri)\n", "\n", "all_pipeline_endpoint_name = 'all-pipeline-endpoint-' + str(suffix)\n", "endpoint_instance_type = \"ml.m5.xlarge\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 프로세서 정의 및 스텝 정의" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "The input argument instance_type of function (sagemaker.image_uris.retrieve) is a pipeline variable (), which is not allowed. The default_value of this Parameter object will be used to override it. Please make sure the default_value is valid.\n" ] } ], "source": [ "from sagemaker.sklearn.processing import SKLearnProcessor\n", "from sagemaker.workflow.steps import ProcessingStep\n", "\n", "deploy_model_processor = SKLearnProcessor(\n", " framework_version=\"1.0-1\",\n", " role= role,\n", " instance_type=processing_instance_type,\n", " instance_count=processing_instance_count,\n", " base_job_name='Fraud-Basic-Endpoint',\n", " sagemaker_session=sagemaker_session)\n", "\n", "\n", "step_deploy = ProcessingStep(\n", " name='Fraud-Basic-Endpoint',\n", " processor=deploy_model_processor,\n", " job_arguments=[\n", " \"--model_name\", step_create_model.properties.ModelName, \n", " \"--region\", region,\n", " \"--endpoint_instance_type\", endpoint_instance_type,\n", " \"--endpoint_name\", all_pipeline_endpoint_name\n", " ],\n", " code=s3_deploy_code_uri)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 5. 파리마터, 단계, 조건을 조합하여 최종 파이프라인 정의 및 실행\n", "\n", "\n", "이제 지금까지 생성한 단계들을 하나의 파이프라인으로 조합하고 실행하도록 하겠습니다.\n", "\n", "파이프라인은 name, parameters, steps 속성이 필수적으로 필요합니다. \n", "여기서 파이프라인의 이름은 (account, region) 조합에 대하여 유일(unique))해야 합니다.\n", "우리는 또한 여기서 Experiment 설정을 추가 하여, 실험에 등록 합니다.\n", "\n", "주의:\n", "\n", "- 정의에 사용한 모든 파라미터가 존재해야 합니다.\n", "- 파이프라인으로 전달된 단계(step)들은 실행순서와는 무관합니다. SageMaker Pipeline은 단계가 실행되고 완료될 수 있도록 의존관계를를 해석합니다." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 5.1 파이프라인 정의\n", "- 위에서 정의한 파라미터를 제공\n", "- 실행할 스텝 기술\n", " - steps=[step_process, step_train, step_create_model, step_deploy],\n", "- 아래는 약 20분 정도 소요 됩니다." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "from sagemaker.workflow.pipeline import Pipeline\n", "\n", "\n", "pipeline_name = project_prefix\n", "pipeline = Pipeline(\n", " name=pipeline_name,\n", " parameters=[\n", " processing_instance_type, \n", " processing_instance_count,\n", " training_instance_type, \n", " training_instance_count, \n", " #endpoint_instance_type, \n", " input_data,\n", " ],\n", " steps=[step_process, step_train, step_create_model, step_deploy],\n", "\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 5.2 파이프라인 정의 확인\n", "위에서 정의한 파이프라인 정의는 Json 형식으로 정의 되어 있습니다." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'Version': '2020-12-01',\n", " 'Metadata': {},\n", " 'Parameters': [{'Name': 'ProcessingInstanceType',\n", " 'Type': 'String',\n", " 'DefaultValue': 'ml.m5.xlarge'},\n", " {'Name': 'ProcessingInstanceCount', 'Type': 'Integer', 'DefaultValue': 1},\n", " {'Name': 'TrainingInstanceType',\n", " 'Type': 'String',\n", " 'DefaultValue': 'ml.m5.xlarge'},\n", " {'Name': 'TrainingInstanceCount', 'Type': 'Integer', 'DefaultValue': 1},\n", " {'Name': 'InputData',\n", " 'Type': 'String',\n", " 'DefaultValue': 's3://sagemaker-us-east-1-585843180719/sagemaker-webinar-pipeline-base/input'}],\n", " 'PipelineExperimentConfig': {'ExperimentName': {'Get': 'Execution.PipelineName'},\n", " 'TrialName': {'Get': 'Execution.PipelineExecutionId'}},\n", " 'Steps': [{'Name': 'Fraud-Basic-Preprocess',\n", " 'Type': 'Processing',\n", " 'Arguments': {'ProcessingResources': {'ClusterConfig': {'InstanceType': {'Get': 'Parameters.ProcessingInstanceType'},\n", " 'InstanceCount': {'Get': 'Parameters.ProcessingInstanceCount'},\n", " 'VolumeSizeInGB': 30}},\n", " 'AppSpecification': {'ImageUri': '683313688378.dkr.ecr.us-east-1.amazonaws.com/sagemaker-scikit-learn:1.0-1-cpu-py3',\n", " 'ContainerArguments': ['--split_rate', '0.2'],\n", " 'ContainerEntrypoint': ['python3',\n", " '/opt/ml/processing/input/code/preprocessing.py']},\n", " 'RoleArn': 'arn:aws:iam::585843180719:role/TeamRole',\n", " 'ProcessingInputs': [{'InputName': 'input-1',\n", " 'AppManaged': False,\n", " 'S3Input': {'S3Uri': {'Get': 'Parameters.InputData'},\n", " 'LocalPath': '/opt/ml/processing/input',\n", " 'S3DataType': 'S3Prefix',\n", " 'S3InputMode': 'File',\n", " 'S3DataDistributionType': 'FullyReplicated',\n", " 'S3CompressionType': 'None'}},\n", " {'InputName': 'code',\n", " 'AppManaged': False,\n", " 'S3Input': {'S3Uri': 's3://sagemaker-us-east-1-585843180719/Fraud-Basic-Preprocess-572c86dd1149a85da325ac4f7701e85d/input/code/preprocessing.py',\n", " 'LocalPath': '/opt/ml/processing/input/code',\n", " 'S3DataType': 'S3Prefix',\n", " 'S3InputMode': 'File',\n", " 'S3DataDistributionType': 'FullyReplicated',\n", " 'S3CompressionType': 'None'}}],\n", " 'ProcessingOutputConfig': {'Outputs': [{'OutputName': 'train',\n", " 'AppManaged': False,\n", " 'S3Output': {'S3Uri': {'Std:Join': {'On': '/',\n", " 'Values': ['s3:/',\n", " 'sagemaker-us-east-1-585843180719',\n", " 'sagemaker-webinar-pipeline-base',\n", " {'Get': 'Execution.PipelineExecutionId'},\n", " 'Fraud-Basic-Preprocess',\n", " 'output',\n", " 'train']}},\n", " 'LocalPath': '/opt/ml/processing/output/train',\n", " 'S3UploadMode': 'EndOfJob'}},\n", " {'OutputName': 'test',\n", " 'AppManaged': False,\n", " 'S3Output': {'S3Uri': {'Std:Join': {'On': '/',\n", " 'Values': ['s3:/',\n", " 'sagemaker-us-east-1-585843180719',\n", " 'sagemaker-webinar-pipeline-base',\n", " {'Get': 'Execution.PipelineExecutionId'},\n", " 'Fraud-Basic-Preprocess',\n", " 'output',\n", " 'test']}},\n", " 'LocalPath': '/opt/ml/processing/output/test',\n", " 'S3UploadMode': 'EndOfJob'}}]}}},\n", " {'Name': 'Fraud-Basic-Train',\n", " 'Type': 'Training',\n", " 'Arguments': {'AlgorithmSpecification': {'TrainingInputMode': 'File',\n", " 'TrainingImage': '683313688378.dkr.ecr.us-east-1.amazonaws.com/sagemaker-xgboost:1.3-1'},\n", " 'OutputDataConfig': {'S3OutputPath': 's3://sagemaker-us-east-1-585843180719/sagemaker-webinar-pipeline-base/training-jobs'},\n", " 'StoppingCondition': {'MaxRuntimeInSeconds': 86400},\n", " 'ResourceConfig': {'VolumeSizeInGB': 30,\n", " 'InstanceCount': {'Get': 'Parameters.TrainingInstanceCount'},\n", " 'InstanceType': {'Get': 'Parameters.TrainingInstanceType'}},\n", " 'RoleArn': 'arn:aws:iam::585843180719:role/TeamRole',\n", " 'InputDataConfig': [{'DataSource': {'S3DataSource': {'S3DataType': 'S3Prefix',\n", " 'S3Uri': {'Get': \"Steps.Fraud-Basic-Preprocess.ProcessingOutputConfig.Outputs['train'].S3Output.S3Uri\"},\n", " 'S3DataDistributionType': 'FullyReplicated'}},\n", " 'ContentType': 'text/csv',\n", " 'ChannelName': 'train'}],\n", " 'HyperParameters': {'scale_pos_weight': '\"29\"',\n", " 'max_depth': '\"3\"',\n", " 'eta': '\"0.2\"',\n", " 'objective': '\"binary:logistic\"',\n", " 'num_round': '\"100\"',\n", " 'sagemaker_submit_directory': '\"s3://sagemaker-us-east-1-585843180719/sagemaker-webinar-pipeline-base/training-jobs/Fraud-Basic-Train-c852f661f638c3d8f66e1fe5ed1713b6/source/sourcedir.tar.gz\"',\n", " 'sagemaker_program': '\"xgboost_starter_script.py\"',\n", " 'sagemaker_container_log_level': '20',\n", " 'sagemaker_region': '\"us-east-1\"'},\n", " 'DebugHookConfig': {'S3OutputPath': 's3://sagemaker-us-east-1-585843180719/sagemaker-webinar-pipeline-base/training-jobs',\n", " 'CollectionConfigurations': []},\n", " 'ProfilerConfig': {'S3OutputPath': 's3://sagemaker-us-east-1-585843180719/sagemaker-webinar-pipeline-base/training-jobs',\n", " 'DisableProfiler': False}}},\n", " {'Name': 'Fraud-Basic-CreateModel',\n", " 'Type': 'Model',\n", " 'Arguments': {'ExecutionRoleArn': 'arn:aws:iam::585843180719:role/TeamRole',\n", " 'PrimaryContainer': {'Image': {'Get': 'Steps.Fraud-Basic-Train.AlgorithmSpecification.TrainingImage'},\n", " 'Environment': {},\n", " 'ModelDataUrl': {'Get': 'Steps.Fraud-Basic-Train.ModelArtifacts.S3ModelArtifacts'}}}},\n", " {'Name': 'Fraud-Basic-Endpoint',\n", " 'Type': 'Processing',\n", " 'Arguments': {'ProcessingResources': {'ClusterConfig': {'InstanceType': {'Get': 'Parameters.ProcessingInstanceType'},\n", " 'InstanceCount': {'Get': 'Parameters.ProcessingInstanceCount'},\n", " 'VolumeSizeInGB': 30}},\n", " 'AppSpecification': {'ImageUri': '683313688378.dkr.ecr.us-east-1.amazonaws.com/sagemaker-scikit-learn:1.0-1-cpu-py3',\n", " 'ContainerArguments': ['--model_name',\n", " {'Get': 'Steps.Fraud-Basic-CreateModel.ModelName'},\n", " '--region',\n", " 'us-east-1',\n", " '--endpoint_instance_type',\n", " 'ml.m5.xlarge',\n", " '--endpoint_name',\n", " 'all-pipeline-endpoint-59191'],\n", " 'ContainerEntrypoint': ['python3',\n", " '/opt/ml/processing/input/code/deploy_model.py']},\n", " 'RoleArn': 'arn:aws:iam::585843180719:role/TeamRole',\n", " 'ProcessingInputs': [{'InputName': 'code',\n", " 'AppManaged': False,\n", " 'S3Input': {'S3Uri': 's3://sagemaker-us-east-1-585843180719/sagemaker-webinar-pipeline-base/code/deploy_model.py',\n", " 'LocalPath': '/opt/ml/processing/input/code',\n", " 'S3DataType': 'S3Prefix',\n", " 'S3InputMode': 'File',\n", " 'S3DataDistributionType': 'FullyReplicated',\n", " 'S3CompressionType': 'None'}}]}}]}" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import json\n", "\n", "definition = json.loads(pipeline.definition())\n", "definition" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 5.3 파이프라인 정의를 제출하고 실행하기 \n", "\n", "파이프라인 정의를 파이프라인 서비스에 제출합니다. 함께 전달되는 역할(role)을 이용하여 AWS에서 파이프라인을 생성하고 작업의 각 단계를 실행할 것입니다. " ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "pipeline.upsert(role_arn=role)\n", "execution = pipeline.start()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "디폴트값을 이용하여 파이프라인을 샐행합니다. " ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'PipelineArn': 'arn:aws:sagemaker:us-east-1:585843180719:pipeline/sagemaker-webinar-pipeline-base',\n", " 'PipelineExecutionArn': 'arn:aws:sagemaker:us-east-1:585843180719:pipeline/sagemaker-webinar-pipeline-base/execution/viplpsvcvd5r',\n", " 'PipelineExecutionDisplayName': 'execution-1678716891012',\n", " 'PipelineExecutionStatus': 'Executing',\n", " 'CreationTime': datetime.datetime(2023, 3, 13, 14, 14, 50, 915000, tzinfo=tzlocal()),\n", " 'LastModifiedTime': datetime.datetime(2023, 3, 13, 14, 14, 50, 915000, tzinfo=tzlocal()),\n", " 'CreatedBy': {},\n", " 'LastModifiedBy': {},\n", " 'ResponseMetadata': {'RequestId': '3aa7b135-e8e0-458c-b80c-b47f331809fc',\n", " 'HTTPStatusCode': 200,\n", " 'HTTPHeaders': {'x-amzn-requestid': '3aa7b135-e8e0-458c-b80c-b47f331809fc',\n", " 'content-type': 'application/x-amz-json-1.1',\n", " 'content-length': '427',\n", " 'date': 'Mon, 13 Mar 2023 14:14:50 GMT'},\n", " 'RetryAttempts': 0}}" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "execution.describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 5.4 파이프라인 실행 기다리기" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "execution.wait()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "실행이 완료될 때까지 기다립니다." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 5.5 파이프라인 실행 단계 기록 보기" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "실행된 단계들을 리스트업합니다. 파이프라인의 단계실행 서비스에 의해 시작되거나 완료된 단계를 보여줍니다." ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[{'StepName': 'Fraud-Basic-Endpoint',\n", " 'StartTime': datetime.datetime(2023, 3, 13, 14, 21, 34, 71000, tzinfo=tzlocal()),\n", " 'EndTime': datetime.datetime(2023, 3, 13, 14, 28, 11, 210000, tzinfo=tzlocal()),\n", " 'StepStatus': 'Succeeded',\n", " 'AttemptCount': 0,\n", " 'Metadata': {'ProcessingJob': {'Arn': 'arn:aws:sagemaker:us-east-1:585843180719:processing-job/pipelines-viplpsvcvd5r-fraud-basic-endpoint-xry0s9fdg4'}}},\n", " {'StepName': 'Fraud-Basic-CreateModel',\n", " 'StartTime': datetime.datetime(2023, 3, 13, 14, 21, 31, 555000, tzinfo=tzlocal()),\n", " 'EndTime': datetime.datetime(2023, 3, 13, 14, 21, 33, 36000, tzinfo=tzlocal()),\n", " 'StepStatus': 'Succeeded',\n", " 'AttemptCount': 0,\n", " 'Metadata': {'Model': {'Arn': 'arn:aws:sagemaker:us-east-1:585843180719:model/pipelines-viplpsvcvd5r-fraud-basic-createmo-xgsruophrv'}}},\n", " {'StepName': 'Fraud-Basic-Train',\n", " 'StartTime': datetime.datetime(2023, 3, 13, 14, 19, 13, 251000, tzinfo=tzlocal()),\n", " 'EndTime': datetime.datetime(2023, 3, 13, 14, 21, 31, 178000, tzinfo=tzlocal()),\n", " 'StepStatus': 'Succeeded',\n", " 'AttemptCount': 0,\n", " 'Metadata': {'TrainingJob': {'Arn': 'arn:aws:sagemaker:us-east-1:585843180719:training-job/pipelines-viplpsvcvd5r-Fraud-Basic-Train-Sn2kdskXHM'}}},\n", " {'StepName': 'Fraud-Basic-Preprocess',\n", " 'StartTime': datetime.datetime(2023, 3, 13, 14, 14, 52, 655000, tzinfo=tzlocal()),\n", " 'EndTime': datetime.datetime(2023, 3, 13, 14, 19, 12, 751000, tzinfo=tzlocal()),\n", " 'StepStatus': 'Succeeded',\n", " 'AttemptCount': 0,\n", " 'Metadata': {'ProcessingJob': {'Arn': 'arn:aws:sagemaker:us-east-1:585843180719:processing-job/pipelines-viplpsvcvd5r-fraud-basic-preproce-4m9jxfsddb'}}}]" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "execution.list_steps()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 6. 세이지 메이커 스튜디오에서 실행 확인 하기\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "- 아래의 그림 처럼 SageMaker Studio에 로긴후에 따라하시면, SageMaker Studio 에서도 실행 내역을 확인할 수 있습니다.\n", "- SageMaker Studio 개발자 가이드 --> [SageMaker Studio](https://docs.aws.amazon.com/ko_kr/sagemaker/latest/dg/studio.html)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![sm_pipeline_all.png](img/sm_pipeline_all.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 7. 아티펙트 경로 추출\n", "실제 추론시에 필요한 아래 두가지를 추출 합니다.\n", "- 전처리된 테스트 데이터의 경로\n", "- endpoint 이름을 추출" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "test_preproc__dir_artifact: s3://sagemaker-us-east-1-585843180719/sagemaker-webinar-pipeline-base/viplpsvcvd5r/Fraud-Basic-Preprocess/output/test\n" ] } ], "source": [ "from src.p_utils import get_proc_artifact\n", "\n", "import boto3\n", "client = boto3.client(\"sagemaker\")\n", "\n", "test_preproc_dir_artifact = get_proc_artifact(execution, client, kind=1 )\n", "\n", "print(\"test_preproc__dir_artifact: \", test_preproc_dir_artifact)\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 변수 저장" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Stored 'test_preproc_dir_artifact' (str)\n", "Stored 'all_pipeline_endpoint_name' (str)\n" ] } ], "source": [ "%store test_preproc_dir_artifact\n", "%store all_pipeline_endpoint_name" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "instance_type": "ml.t3.medium", "kernelspec": { "display_name": "conda_python3", "language": "python", "name": "conda_python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.8" } }, "nbformat": 4, "nbformat_minor": 4 }