{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# CloudML\n", "- [구글 Cloud ML](https://cloud.google.com/ml-engine/)\n", "- 확장 가능한 관리형 기계학습 : 데이터의 유형과 크기와 관계없이 기계학습 모델을 손쉽게 제작할 수 있는 서비스\n", "- TensorFlow 프레임워크를 사용\n", "- 학습된 모델을 즉시 사용 가능\n", "- 사전 처리를 위해 [Google Data Flow](https://cloud.google.com/dataflow/)에 통합되어 있음\n", "- 온라인 / 일괄 예측 서비스가 존재\n", "- Hypter Tune 기능을 사용해 자동으로 모델 학습을 조정해 나은 결과를 얻을 수 있음\n", "- Datalab을 사용해 모델을 쉽게 제작할 수 있음\n", "- GPU 가속이 포함된 확장 가능한 분산 학습 인프라\n", "\n", "\n", "### 정리\n", "- Google Dataflow, Cloud Storage, Datalab과 함께 작동\n", "- HyperTune : 모델에 맞는 값을 직접 찾지 않고 HypterTune 기능으로 자동으로 튜닝\n", "- 관리형 서비스 : 인프라에 대한 걱정 없이 모델 개발과 예측에 집중\n", "- 확장 가능한 서비스 : CPU / GPU를 지원하는 관리형 분산 학습 인프라\n", "- 노트형 개발자 환경 : jupyter 노트북과 같은 Datalab을 사용\n", "- 이식 가능한 모델 : TensorFlow SDK를 이용해 샘플 데이터세트에서 로컬로 모델을 학습시키고 규모에 맞게 학습에 사용 가능. Cloud Machine Learning Engine으로 학습시킨 모델은 로컬 실행이나 모바일 통합을 위해 다운로드할 수 있음\n", "- [가격 계산 문서](https://cloud.google.com/products/calculator/)를 통해 가격 예측 가능\n", "- python2만 지원" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "### 가격\n", "- [ML Engine 가격 문서](https://cloud.google.com/ml-engine/pricing)\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 1-1. Quick start using Command-Line\n", "### Cloud Shell 이용시\n", "- 구글 클라우드 플랫폼의 클라우드 쉘 클릭\n", "- 쉘에서 아래와 같은 명령어 입력\n", "~~~\n", "gcloud config set project project_id\n", "~~~\n", "- 설치가 되었는지 확인하기\n", "~~~\n", "gcloud ml-engine models list\n", "~~~\n", "- Listed 0 items가 나오면 성공\n", "\n", "### mac 이용시\n", "- virtualenv로 가상환경 설정\n", "~~~\n", "pip install virtualenv\n", "virtualenv -p python2 env_name\n", "source env_name/bin/activate\n", "~~~\n", "- [gcloud sdk 설치](https://cloud.google.com/sdk/docs/quickstart-mac-os-x#before-you-begin)\n", "~~~\n", "gcloud init\n", "pip install -U pip\n", "pip install --upgrade tensorflow\n", "gcloud auth application-default login\n", "~~~\n", "- 설치가 되었는지 확인하기\n", "~~~\n", "gcloud ml-engine models list\n", "~~~\n", "- Listed 0 items가 나오면 성공" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 1-2. Quick start using datalab\n", "- [Datalab Quick Start](https://cloud.google.com/datalab/docs/quickstarts) 를 진행하고 와주세요\n", "- datalab connect instance명으로 datalab에 접속합니다\n", "- [BigQuery with datalab](https://github.com/zzsza/bigquery-tutorial/blob/master/tutorials/02-Utils/02.%20Connect%20Datalab.ipynb) 문서도 참고하시면 좋습니다" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 2. Get Start\n", "- 터미널에서 아래와 같이 입력해서 데이터를 받습니다\n", "~~~\n", "wget https://github.com/GoogleCloudPlatform/cloudml-samples/archive/master.zip\n", "unzip master.zip\n", "cd cloudml-samples-master/census/estimator\n", "~~~\n", "\n", "- Cloud Machine Learning Engine : Training / Prediction\n", "- Cloud Storage : Input data 저장, trainer package 스테이징, training 구조 작성, 배치 예측을 위한 input 데이터 파일 저장\n", "\n", "\n", "\n", "## 2-1 Local에서 검증 작업\n", "- 클라우드에 올리기 전에, Local에서 테스트해봅니다. (테스트를 꼭 해봐야 필요없는 비용이 부과 안되요..! )\n", "\n", "### 가상환경 구축하기\n", "- cloudml-samples-master/census 위치에서 진행해주세요! ( 터미널 입력 )\n", "- virtualenv 가 깔려있지 않다면 pip install virtualenv로 설치!\n", "~~~\n", "virtualenv --python=python env\n", "~~~" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "### Data 받아오기\n", "- 터미널에서 census/estimator 폴더에 진입한 후, 아래와 같은 명령어를 입력해주세요 ( 터미널!! )\n", "\n", "~~~\n", "mkdir data\n", "gsutil cp gs://cloudml-public/census/data/* ./data/\n", "\n", "혹시 no matches found: gs://cloudml-public/census/data/* 오류가 나오면 아래 코드를 입력해주세요\n", "gsutil cp 'gs://cloudml-public/census/data/*' ./data/\n", "~~~" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### TRAIN_DATA, EVAL_DATA 경로 설정\n", "- 위와 마찬가지로 cloudml-samples-master/census/estimator에 진입하신 후 데이터의 경로를 설정해주세요\n", "~~~\n", "TRAIN_DATA=$(pwd)/data/adult.data.csv\n", "EVAL_DATA=$(pwd)/data/adult.test.csv\n", "~~~\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "#### 환경 설정 불러오기\n", "- 위에서 virtualenv로 구축한 환경 설정을 불러와주세요\n", "- (cloudml-samples-master/census 위치에서)\n", "\n", "~~~\n", "source env/bin/activate\n", "~~~\n", "\n", "#### requirements.txt 의 라이브러리 설치\n", "\n", "~~~\n", "sudo pip install -r ../requirements.txt\n", "~~~\n", "\n", "- six 관련 오류가 발생시 아래와 같이 입력해주세요\n", "\n", "~~~\n", "sudo pip install haxor-news --upgrade --ignore-installed six\n", "~~~\n", "\n", "- macos일 경우 맥 기본 내장 python이 아닌, homebrew로 python를 설치하신 후 환경설정해주셔야 정상적으로 설치가 됩니다\n", "\n", "#### output 디렉토리 설정\n", "\n", "~~~\n", "mkdir output\n", "MODEL_DIR=output\n", "~~~\n", "\n", "- 이전 학습 결과가 남아있을 수 있으므로 아래와 같은 명령어로 폴더 내부 파일을 삭제해줍니다\n", "\n", "~~~\n", "rm -rf $MODEL_DIR/*\n", "~~~\n" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "## train 시작!\n", "~~~\n", "gcloud ml-engine local train \\\n", " --module-name trainer.task \\\n", " --package-path trainer/ \\\n", " -- \\\n", " --train-files $TRAIN_DATA \\\n", " --eval-files $EVAL_DATA \\\n", " --train-steps 1000 \\\n", " --job-dir $MODEL_DIR \\\n", " --eval-steps 100 \\\n", " --verbosity DEBUG\n", "~~~\n", "\n", "- module-name : 학습시킬 모델 ( 위 코드에선 trainer 폴더 내의 task.py )\n", "- package-path : python 모듈로 지정할 경로\n", "- -- \\ 라고 되어있는 것 밑부분은 task.py에서( module ) 사용할 파라미터들\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "### tensorboard 실행\n", "~~~\n", "python -m tensorflow.tensorboard --logdir=output\n", "~~~\n", "\n", "- 종료는 control + c" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### local run in distributed mode ( 분산 모드 )\n", "\n", "~~~\n", "gcloud ml-engine local train \\\n", " --module-name trainer.task \\\n", " --package-path trainer/ \\\n", " --distributed \\\n", " -- \\\n", " --train-files $TRAIN_DATA \\\n", " --eval-files $EVAL_DATA \\\n", " --train-steps 1000 \\\n", " --job-dir $MODEL_DIR\n", "~~~\n", "\n", "- 결과 확인\n", "\n", "~~~\n", "ls -R output-dist/\n", "~~~\n", "\n", "- 텐서보드\n", "\n", "~~~\n", "python -m tensorflow.tensorboard --logdir=$MODEL_DIR\n", "~~~" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2-2 Cloud ML에 올리기\n", "#### Cloud Bucket 생성\n", "- [Bucket 생성](https://cloud.google.com/ml-engine/docs/working-with-data#using_a_cloud_storage_bucket_from_a_different_project)\n", "\n", "### 기본 bucket 설정\n", "~~~\n", "PROJECT_ID=$(gcloud config list project --format \"value(core.project)\")\n", "AUTH_TOKEN=$(gcloud auth print-access-token)\n", "SVC_ACCOUNT=$(curl -X GET -H \"Content-Type: application/json\" \\\n", " -H \"Authorization: Bearer $AUTH_TOKEN\" \\\n", " https://ml.googleapis.com/v1/projects/${PROJECT_ID}:getConfig \\\n", " | python -c \"import json; import sys; response = json.load(sys.stdin); \\\n", " print response['serviceAccount']\")\n", "~~~\n", "\n", "\n", "~~~\n", "BUCKET_NAME=\"your_bucket_name\"\n", "gsutil -m defacl ch -u $SVC_ACCOUNT:R gs://$BUCKET_NAME\n", "gsutil -m acl ch -u $SVC_ACCOUNT:R -r gs://$BUCKET_NAME\n", "gsutil -m acl ch -u $SVC_ACCOUNT:W gs://$BUCKET_NAME\n", "\n", "REGION=asia-east1\n", "~~~" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 위에서 설정한 bucket_name 확인\n", "~~~\n", "echo $BUCKET_NAME\n", "~~~\n", "\n", "### 로컬의 파일을 gs로 올리기\n", "~~~\n", "gsutil cp -r data gs://$BUCKET_NAME/data\n", "TRAIN_DATA=gs://$BUCKET_NAME/data/adult.data.csv\n", "EVAL_DATA=gs://$BUCKET_NAME/data/adult.test.csv\n", "gsutil cp ../test.json gs://$BUCKET_NAME/data/test.json\n", "TEST_JSON=gs://$BUCKET_NAME/data/test.json\n", "~~~\n", "\n", "### job 이름과 output 경로 설정\n", "\n", "~~~\n", "JOB_NAME=census_single_1\n", "OUTPUT_PATH=gs://$BUCKET_NAME/$JOB_NAME\n", "~~~\n", "\n", "### run!\n", "\n", "~~~\n", "gcloud ml-engine jobs submit training $JOB_NAME \\\n", "--job-dir $OUTPUT_PATH \\\n", "--runtime-version 1.2 \\\n", "--module-name trainer.task \\\n", "--package-path trainer/ \\\n", "--region $REGION \\\n", "-- \\\n", "--train-files $TRAIN_DATA \\\n", "--eval-files $EVAL_DATA \\\n", "--train-steps 1000 \\\n", "--verbosity DEBUG\n", "~~~\n", "\n", "- --runtime-version 1.2라고 tensorflow 버전을 꼭 명시하는 습관을 가지는 것이 좋습니다" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 결과 보기\n", "- [콘솔](https://console.cloud.google.com)에서 ML Engine -> Jobs -> View logs" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 분산으로 Cloud ML에서 진행하고 싶다면\n", "- --scale-tier 옵션을 추가하면 됩니다! [공식 문서](https://cloud.google.com/ml-engine/reference/rest/v1/projects.jobs#scaletier)\n", "\n", "~~~\n", "gcloud ml-engine jobs submit training $JOB_NAME \\\n", " --job-dir $OUTPUT_PATH \\\n", " --runtime-version 1.2 \\\n", " --module-name trainer.task \\\n", " --package-path trainer/ \\\n", " --region $REGION \\\n", " --scale-tier STANDARD_1 \\\n", " -- \\\n", " --train-files $TRAIN_DATA \\\n", " --eval-files $EVAL_DATA \\\n", " --train-steps 1000 \\\n", " --verbosity DEBUG \\\n", " --eval-steps 100\n", "~~~" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3. 하이퍼 파라미터 튜닝\n", "- [공식 문서](https://cloud.google.com/ml-engine/docs/hyperparameter-tuning-overview)\n", "- 하이퍼 파라미터 설정 파일 (yaml 파일)이 존재해야 합니다\n", "\n", "- census의 예시 파일\n", "\n", "~~~\n", "trainingInput:\n", " hyperparameters:\n", " goal: MAXIMIZE\n", " hyperparameterMetricTag: accuracy\n", " maxTrials: 4\n", " maxParallelTrials: 2\n", " params:\n", " - parameterName: first-layer-size\n", " type: INTEGER\n", " minValue: 50\n", " maxValue: 500\n", " scaleType: UNIT_LINEAR_SCALE\n", " - parameterName: num-layers\n", " type: INTEGER\n", " minValue: 1\n", " maxValue: 15\n", " scaleType: UNIT_LINEAR_SCALE\n", " - parameterName: scale-factor\n", " type: DOUBLE\n", " minValue: 0.1\n", " maxValue: 1.0\n", " scaleType: UNIT_REVERSE_LOG_SCALE\n", "\n", "~~~" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 기본 설정\n", "\n", "~~~\n", "HPTUNING_CONFIG=../hptuning_config.yaml\n", "JOB_NAME=census_core_hptune_1\n", "TRAIN_DATA=gs://$BUCKET_NAME/data/adult.data.csv\n", "EVAL_DATA=gs://$BUCKET_NAME/data/adult.test.csv\n", "OUTPUT_PATH=gs://$BUCKET_NAME/$JOB_NAME\n", "~~~\n", "\n", "### Run\n", "\n", "~~~\n", "gcloud ml-engine jobs submit training $JOB_NAME \\\n", " --stream-logs \\\n", " --job-dir $OUTPUT_PATH \\\n", " --runtime-version 1.2 \\\n", " --config $HPTUNING_CONFIG \\\n", " --module-name trainer.task \\\n", " --package-path trainer/ \\\n", " --region $REGION \\\n", " --scale-tier STANDARD_1 \\\n", " -- \\\n", " --train-files $TRAIN_DATA \\\n", " --eval-files $EVAL_DATA \\\n", " --train-steps 1000 \\\n", " --verbosity DEBUG \\\n", " --eval-steps 100\n", "~~~" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "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.6.1" }, "latex_envs": { "LaTeX_envs_menu_present": true, "autocomplete": true, "bibliofile": "biblio.bib", "cite_by": "apalike", "current_citInitial": 1, "eqLabelWithNumbers": true, "eqNumInitial": 1, "hotkeys": { "equation": "Ctrl-E", "itemize": "Ctrl-I" }, "labels_anchors": false, "latex_user_defs": false, "report_style_numbering": false, "user_envs_cfg": false }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false } }, "nbformat": 4, "nbformat_minor": 2 }