{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Code free Autogluon test\n", " \n", "### 사전 준비 (CloudFormation)\n", "\n", "NOTE : 본 노트북 코드의 실행에 앞서, 아래 블로그에서 CloudFormation 링크를 이용하여 리소스를 생성합니다. 작업시 버킷이름을 유니크하게 구성하고 해당 이름을 복사하여 클립보드에 저장합니다. \n", "- https://aws.amazon.com/ko/blogs/machine-learning/code-free-machine-learning-automl-with-autogluon-amazon-sagemaker-and-aws-lambda/\n", "\n", "또는 제공된 `CodeFreeAutoML.yaml`파일을 이용하여 CloudFormation 작업을 직접 실행할 수 있습니다.\n", "\n", "해당 CloudFormation은 S3 버킷과 람다, SageMaker Role 등을 생성합니다. \n", "\n", " \n", "\n", "CloudFormation 작업이 완료되면 [lambda 콘솔](https://console.aws.amazon.com/lambda/home?region=us-east-1#/functions)로 이동하여 생성된 람다 함수를 살펴봅니다. \n", "- boto3 SDK의 `create_training_job()`을 사용하여 MXNet 컨테이너를 기반으로 `autogluon-tab-with-test.py` 스크립트를 실행하는 SageMaker 작업을 생성하도록 되어있습니다. \n", "- `autogluon-tab-with-test.py`파일은 S3 버킷의 `source`폴더에서 가져오도록 구성되었습니다.\n", "- [autogluon-tab-with-test.py](autogluon-tab-with-test.py) 스크립트를 열어 코드 내용을 살펴봅니다.\n", "\n", "NOTE : CloudFormation을 생성할 때 사용한 버킷명을 변수에 저장합니다." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "BUCKET = 'code-free-automl-us-east-1-yournamehere' # please update the bucket name as yours\n", "assert (BUCKET != 'code-free-automl-us-east-1-yournamehere' ), \"Please update the bucket name as yours\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`autogluon-tab-with-test.py` 파일을 `sourcedir.tar.gz`로 압축한 후 해당 버킷의 `source`디렉토리로 복사합니다." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "!tar -zcvf sourcedir.tar.gz autogluon-tab-with-test.py\n", "!aws s3 cp sourcedir.tar.gz s3://{BUCKET}/source/\n", "!aws s3 ls s3://{BUCKET}/source/" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 데이터 준비\n", "\n", "Autogluon에서 제공되는 데이터를 이용하기 위해 autogloun을 설치합니다. \n", "또는 Pandas를 이용할 수도 있습니다." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# python3 -m pip install \"mxnet<2.0.0\"\n", "# python3 -m pip install \"gluoncv>=0.5.0,<0.9.0\"\n", "# python3 -m pip install autogluon" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import autogluon as ag\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "데이터셋을 다운로드합니다." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "train_data = pd.read_csv('https://autogluon.s3.amazonaws.com/datasets/Inc/train.csv')\n", "test_data = pd.read_csv('https://autogluon.s3.amazonaws.com/datasets/Inc/test.csv')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(train_data.shape)\n", "print(test_data.shape)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "목표변수의 컬럼명을 `target` 으로 수정하고 저장합니다." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "columns = list(train_data.columns[:-1])\n", "columns.append('target')\n", "train_data.columns = columns\n", "test_data.columns = columns" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "income 이 50K이상인지 이하인지 구별하는 데이터입니다." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "train_data.head(5)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "test_data.head(5)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "train_data.to_csv('income_train.csv')\n", "test_data.to_csv('income_test.csv')\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Training & test 실행 (file upload)\n", "CloudFormation에서 생성한 S3 경로에 파일을 복사합니다. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "!aws s3 ls s3://{BUCKET}/data/" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "!aws s3 cp income_train.csv s3://{BUCKET}/data/income_train.csv\n", "!aws s3 cp income_test.csv s3://{BUCKET}/data/income_test.csv" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 작업실행 모니터링\n", "Lambda와 SageMaker training 작업이 실행되었을 것입니다. 작업은 10분정도 걸립니다. SageMaker Training job이 completed 상태가 되는 것을 기다리면서 다음을 확인합니다. (콘솔 UI를 통해 확인해 봅니다.)\n", "- Lambda 콘솔에서 Lambda 로그를 확인합니다. \n", "- SageMaker 콘솔에서 Training Job 로그를 확인합니다.\n", "\n", "SageMaker SDK에서 제공하는 함수를 통해서도 작업을 모니터링할 수 있습니다. 다음 코드는 현재 실행상태인 작업을 표시합니다. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import boto3\n", "sm = boto3.client('sagemaker')\n", "\n", "sm.list_training_jobs(StatusEquals='InProgress', SortBy='CreationTime')['TrainingJobSummaries']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "가장 최근 제출된 작업명을 기억합니다. (해당 작업명으로 S3에 폴더가 생성됩니다.)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "last_sm_job_name = sm.list_training_jobs(SortBy='CreationTime')['TrainingJobSummaries'][0]['TrainingJobName']\n", "last_sm_job_name" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "아래 코드는 비동기로 제출된 작업을 노트북에서 동기모드로 모니터링하게 해 줍니다. 현재 실행중인 작업로그를 노트북에서 확인할 수 있습니다. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import sagemaker\n", "\n", "sagemaker.Session().logs_for_job(job_name=last_sm_job_name, wait=True)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 추론결과 확인\n", "SageMaker Training job이 completed 상태가 된 후 S3 results 경로를 확인하면 Training job 이름을 가지는 폴더가 생성되었을 것입니다." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "!aws s3 ls s3://{BUCKET}/results/{last_sm_job_name}/" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "해당 폴더의 파일을 복사하여 가져옵니다." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "!aws s3 cp s3://{BUCKET}/results/{last_sm_job_name}/income_leaderboard.csv income_leaderboard.csv\n", "!aws s3 cp s3://{BUCKET}/results/{last_sm_job_name}/income_test_predictions.csv income_test_predictions.csv\n", " " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "leaderboard = pd.read_csv('income_leaderboard.csv')\n", "test_predictions = pd.read_csv('income_test_predictions.csv')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "leaderboard 파일에 automl실행 결과가 저장되어 있습니다." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "leaderboard" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "test_predictions 파일에 테스트데이터에 대한 예측결과가 저장되어 있습니다." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "test_predictions.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "conda_mxnet_p36", "language": "python", "name": "conda_mxnet_p36" }, "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.6.13" } }, "nbformat": 4, "nbformat_minor": 4 }