{ "cells": [ { "cell_type": "markdown", "id": "224caa2a", "metadata": {}, "source": [ "# 1.2 SageMaker Training with Experiments" ] }, { "cell_type": "markdown", "id": "f534d367", "metadata": {}, "source": [ "## 학습 작업의 실행 노트북 개요\n", "\n", "- SageMaker Training에 SageMaker 실험을 추가하여 여러 실험의 결과를 비교할 수 있습니다.\n", " - [작업 실행 시 필요 라이브러리 import](#작업-실행-시-필요-라이브러리-import)\n", " - [SageMaker 세션과 Role, 사용 버킷 정의](#SageMaker-세션과-Role,-사용-버킷-정의)\n", " - [하이퍼파라미터 정의](#하이퍼파라미터-정의)\n", " - [학습 실행 작업 정의](#학습-실행-작업-정의)\n", " - 학습 코드 명\n", " - 학습 코드 폴더 명\n", " - 학습 코드가 사용한 Framework 종류, 버전 등\n", " - 학습 인스턴스 타입과 개수\n", " - SageMaker 세션\n", " - 학습 작업 하이퍼파라미터 정의\n", " - 학습 작업 산출물 관련 S3 버킷 설정 등\n", " - [학습 데이터셋 지정](#학습-데이터셋-지정)\n", " - 학습에 사용하는 데이터셋의 S3 URI 지정\n", " - [SageMaker 실험 설정](#SageMaker-실험-설정)\n", " - [학습 실행](#학습-실행)\n", " - [데이터 세트 설명](#데이터-세트-설명)\n", " - [실험 결과 보기](#실험-결과-보기)" ] }, { "cell_type": "markdown", "id": "335970c7", "metadata": {}, "source": [ "### 작업 실행 시 필요 라이브러리 import" ] }, { "cell_type": "code", "execution_count": null, "id": "30833fde", "metadata": {}, "outputs": [], "source": [ "import boto3\n", "import sagemaker" ] }, { "cell_type": "markdown", "id": "92e1dddb", "metadata": {}, "source": [ "### SageMaker 세션과 Role, 사용 버킷 정의" ] }, { "cell_type": "code", "execution_count": null, "id": "85d2c6ab", "metadata": {}, "outputs": [], "source": [ "sagemaker_session = sagemaker.session.Session()\n", "role = sagemaker.get_execution_role()" ] }, { "cell_type": "code", "execution_count": null, "id": "0440d37e", "metadata": {}, "outputs": [], "source": [ "bucket = sagemaker_session.default_bucket()\n", "code_location = f's3://{bucket}/xgboost/code'\n", "output_path = f's3://{bucket}/xgboost/output'" ] }, { "cell_type": "markdown", "id": "07452af4", "metadata": {}, "source": [ "### 하이퍼파라미터 정의" ] }, { "cell_type": "code", "execution_count": null, "id": "3d9629bd", "metadata": {}, "outputs": [], "source": [ "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": "markdown", "id": "f4e8d389", "metadata": {}, "source": [ "### 학습 실행 작업 정의" ] }, { "cell_type": "code", "execution_count": null, "id": "b98d8748", "metadata": {}, "outputs": [], "source": [ "instance_count = 1\n", "instance_type = \"ml.m5.large\"\n", "# instance_type = \"local\"\n", "max_run = 1*60*60\n", "\n", "use_spot_instances = False\n", "if use_spot_instances:\n", " max_wait = 1*60*60\n", "else:\n", " max_wait = None" ] }, { "cell_type": "code", "execution_count": null, "id": "3d39c96a-bde6-40e5-9e5a-1988e11dc296", "metadata": {}, "outputs": [], "source": [ "if instance_type in ['local', 'local_gpu']:\n", " from sagemaker.local import LocalSession\n", " sagemaker_session = LocalSession()\n", " sagemaker_session.config = {'local': {'local_code': True}}\n", "else:\n", " sagemaker_session = sagemaker.session.Session()" ] }, { "cell_type": "code", "execution_count": null, "id": "80c28855", "metadata": {}, "outputs": [], "source": [ "from sagemaker.xgboost.estimator import XGBoost\n", "\n", "estimator = XGBoost(\n", " entry_point=\"xgboost_starter_script.py\",\n", " source_dir=\"src\",\n", " output_path=output_path,\n", " code_location=code_location,\n", " hyperparameters=hyperparameters,\n", " role=role,\n", " sagemaker_session=sagemaker_session,\n", " instance_count=instance_count,\n", " instance_type=instance_type,\n", " framework_version=\"1.3-1\",\n", " max_run=max_run,\n", " use_spot_instances=use_spot_instances, # spot instance 활용\n", " max_wait=max_wait,\n", ")" ] }, { "cell_type": "markdown", "id": "b2b36eeb", "metadata": {}, "source": [ "### 학습 데이터셋 지정" ] }, { "cell_type": "code", "execution_count": null, "id": "b79339f1", "metadata": {}, "outputs": [], "source": [ "data_path=f's3://{bucket}/xgboost/dataset'\n", "!aws s3 sync ../data/dataset/ $data_path" ] }, { "cell_type": "code", "execution_count": null, "id": "9045fd50-05a5-4dce-a635-a4679792d513", "metadata": {}, "outputs": [], "source": [ "if instance_type in ['local', 'local_gpu']:\n", " from pathlib import Path\n", " file_path = f'file://{Path.cwd()}'\n", " inputs = file_path.split('lab_1_training')[0] + 'data/dataset/'\n", " \n", "else:\n", " inputs = data_path\n", "inputs" ] }, { "cell_type": "markdown", "id": "a8c501c8", "metadata": { "tags": [] }, "source": [ "### SageMaker 실험 설정" ] }, { "cell_type": "code", "execution_count": null, "id": "8c0930f0", "metadata": {}, "outputs": [], "source": [ "!pip install -U sagemaker-experiments" ] }, { "cell_type": "code", "execution_count": null, "id": "12cc82a4", "metadata": {}, "outputs": [], "source": [ "experiment_name='xgboost-poc-1'" ] }, { "cell_type": "code", "execution_count": null, "id": "52d2399e", "metadata": {}, "outputs": [], "source": [ "from smexperiments.experiment import Experiment\n", "from smexperiments.trial import Trial\n", "from time import strftime" ] }, { "cell_type": "code", "execution_count": null, "id": "b66add92", "metadata": {}, "outputs": [], "source": [ "def create_experiment(experiment_name):\n", " try:\n", " sm_experiment = Experiment.load(experiment_name)\n", " except:\n", " sm_experiment = Experiment.create(experiment_name=experiment_name)" ] }, { "cell_type": "code", "execution_count": null, "id": "905828b4", "metadata": {}, "outputs": [], "source": [ "def create_trial(experiment_name):\n", " create_date = strftime(\"%m%d-%H%M%s\") \n", " sm_trial = Trial.create(trial_name=f'{experiment_name}-{create_date}',\n", " experiment_name=experiment_name)\n", "\n", " job_name = f'{sm_trial.trial_name}'\n", " return job_name" ] }, { "cell_type": "markdown", "id": "603d8baf", "metadata": {}, "source": [ "### 학습 실행" ] }, { "cell_type": "code", "execution_count": null, "id": "dc7d345d", "metadata": {}, "outputs": [], "source": [ "create_experiment(experiment_name)\n", "job_name = create_trial(experiment_name)\n", "\n", "estimator.fit(inputs = {'inputdata': inputs},\n", " job_name = job_name,\n", " experiment_config={\n", " 'TrialName': job_name,\n", " 'TrialComponentDisplayName': job_name,\n", " },\n", " wait=False)" ] }, { "cell_type": "code", "execution_count": null, "id": "e56e83d8", "metadata": {}, "outputs": [], "source": [ "estimator.logs()" ] }, { "cell_type": "markdown", "id": "eabae27b", "metadata": {}, "source": [ "### 실험 결과 보기\n", "위의 실험한 결과를 확인 합니다.\n", "- 각각의 훈련잡의 시도에 대한 훈련 사용 데이터, 모델 입력 하이퍼 파라미터, 모델 평가 지표, 모델 아티펙트 결과 위치 등의 확인이 가능합니다.\n", "- **아래의 모든 내용은 SageMaker Studio 를 통해서 직관적으로 확인이 가능합니다.**" ] }, { "cell_type": "code", "execution_count": null, "id": "86dd2f1d", "metadata": {}, "outputs": [], "source": [ "from sagemaker.analytics import ExperimentAnalytics\n", "import pandas as pd\n", "pd.options.display.max_columns = 50\n", "pd.options.display.max_rows = 10\n", "pd.options.display.max_colwidth = 100" ] }, { "cell_type": "code", "execution_count": null, "id": "af4181d7", "metadata": {}, "outputs": [], "source": [ "trial_component_training_analytics = ExperimentAnalytics(\n", " sagemaker_session= sagemaker_session,\n", " experiment_name= experiment_name,\n", " sort_by=\"metrics.validation:auc.max\", \n", " sort_order=\"Descending\",\n", " metric_names=[\"validation:auc\"]\n", ")\n", "\n", "trial_component_training_analytics.dataframe()[['Experiments', 'Trials', 'validation:auc - Min', 'validation:auc - Max',\n", " 'validation:auc - Avg', 'validation:auc - StdDev', 'validation:auc - Last', \n", " 'eta', 'max_depth', 'num_round', 'scale_pos_weight']]" ] }, { "cell_type": "code", "execution_count": null, "id": "e4541484", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "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.8.12" } }, "nbformat": 4, "nbformat_minor": 5 }