├── 0_Running_TensorFlow_In_SageMaker.ipynb
├── 0_Running_TensorFlow_In_SageMaker_tf2.ipynb
├── 1_Monitoring_your_TensorFlow_scripts.ipynb
├── 2_Using_Pipemode_input_for_big_datasets.ipynb
├── 3_Distributed_training_with_Horovod.ipynb
├── 4_Deploying_your_TensorFlow_model.ipynb
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── images
├── TFRecord.png
└── tensorboard.png
├── local_mode_setup.sh
└── training_script
├── cifar10_keras.py
├── cifar10_keras_dist_solution.py
├── cifar10_keras_pipe_solution.py
├── cifar10_keras_sm_solution.py
├── cifar10_keras_sm_tf2.py
├── cifar10_keras_sm_tf2_solution.py
├── cifar10_keras_tensorboard_solution.py
└── cifar10_keras_tf2.py
/0_Running_TensorFlow_In_SageMaker.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# [Module 1] Train a Keras Sequential Model\n",
8 | "\n",
9 | "본 노트북(notebook)은 SageMaker 상에서 Keras Sequential model을 학습하는 방법을 단계별로 설명합니다. 본 노트북에서 사용한 모델은 간단한 deep CNN(Convolutional Neural Network) 모델로 [the Keras examples](https://github.com/keras-team/keras/blob/master/examples/cifar10_cnn.py)에 소개된 모델과 동일합니다.\n",
10 | "- 참고로, 본 모델은 25 epoch 학습 후에 검증셋의 정확도(accuracy)가 약 75%이고 50 epoch 학습 후에 검증셋의 정확도가 약 79% 입니다.\n",
11 | "- 본 워크샵 과정에서는 시간 관계상 5 epoch까지만 학습합니다. (단, Horovod 기반 분산 학습은 10 epoch까지 학습합니다.)"
12 | ]
13 | },
14 | {
15 | "cell_type": "markdown",
16 | "metadata": {},
17 | "source": [
18 | "## The dataset\n",
19 | "\n",
20 | "[CIFAR-10 dataset](https://www.cs.toronto.edu/~kriz/cifar.html)은 머신 러닝에서 가장 유명한 데이터셋 중 하나입니다.\n",
21 | "이 데이터셋은 10개의 다른 클래스로 구성된(클래스당 6,000장) 60,000장의 32x32 픽셀 이미지들로 구성되어 있습니다.\n",
22 | "아래 그림은 클래스당 10장의 이미지들을 랜덤으로 추출한 결과입니다. \n",
23 | "\n",
24 | "\n",
25 | "\n",
26 | "본 실습에서 여러분들은 deep CNN을 학습하여 영상 분류(image classification) 작업을 수행합니다. 다음 노트북들에서\n",
27 | "여러분들은 File Mode, Pipe Mode와 Horovod 기반 분산 학습(distributed training) 결과를 비교할 것입니다."
28 | ]
29 | },
30 | {
31 | "cell_type": "markdown",
32 | "metadata": {},
33 | "source": [
34 | "## Getting the data\n",
35 | "아래 AWS CLI(Command Line Interface) 커맨드를 사용하여 S3(Amazon Simple Storage Service)에 저장된 TFRecord 데이터셋을 여러분의 로컬 노트북 인스턴스로 복사합니다.\n",
36 | "S3 경로는 `s3://floor28/data/cifar10` 입니다. \n",
37 | "\n",
38 | "### TFRecord는 무엇인가요?\n",
39 | "- Google에서 Tensorflow backend로 모델링 시에 공식적으로 권장하는 binary 포맷입니다.\n",
40 | "- Tensorflow의 protocol buffer 파일로 직렬화된 입력 데이터가 담겨 있습니다.\n",
41 | "- 대용량 데이터를 멀티스레딩으로 빠르게 스트리밍할 때 유용합니다. (모든 데이터는 메모리의 하나의 블록에 저장되므로, 입력 파일이 개별로 저장된 경우보다 데이터 로딩에 필요한 시간이 대폭 단축됩니다.)\n",
42 | "- Example 객체로 구성된 배열의 집합체입니다. (an array of Examples)\n",
43 | "- 아래 그림은 $m$차원 feautre가 $n$개의 샘플로 구성된 TFRecord 예시입니다.\n",
44 | ""
45 | ]
46 | },
47 | {
48 | "cell_type": "code",
49 | "execution_count": null,
50 | "metadata": {},
51 | "outputs": [],
52 | "source": [
53 | "!aws s3 cp --recursive s3://floor28/data/cifar10 ./data"
54 | ]
55 | },
56 | {
57 | "cell_type": "markdown",
58 | "metadata": {},
59 | "source": [
60 | "## Run the training locally"
61 | ]
62 | },
63 | {
64 | "cell_type": "markdown",
65 | "metadata": {},
66 | "source": [
67 | "본 스크립트는 모델 학습에 필요한 인자값(arguments)들을 사용합니다. 모델 학습에 필요한 인자값들은 아래와 같습니다.\n",
68 | "\n",
69 | "1. `model_dir` - 로그와 체크 포인트를 저장하는 경로\n",
70 | "2. `train, validation, eval` - TFRecord 데이터셋을 저장하는 경로\n",
71 | "3. `epochs` - epoch 횟수\n",
72 | "\n",
73 | "아래 명령어로 **SageMaker 관련 API 호출 없이** 로컬 노트북 인스턴스 환경에서 1 epoch만 학습해 봅니다. 참고로, MacBook Pro(15-inch, 2018) 2.6GHz Core i7 16GB 사양에서 2분 20초~2분 40초 소요됩니다."
74 | ]
75 | },
76 | {
77 | "cell_type": "code",
78 | "execution_count": null,
79 | "metadata": {},
80 | "outputs": [],
81 | "source": [
82 | "%%time\n",
83 | "!mkdir -p logs\n",
84 | "!python training_script/cifar10_keras.py --model_dir ./logs \\\n",
85 | " --train data/train \\\n",
86 | " --validation data/validation \\\n",
87 | " --eval data/eval \\\n",
88 | " --epochs 1\n",
89 | "!rm -rf logs"
90 | ]
91 | },
92 | {
93 | "cell_type": "markdown",
94 | "metadata": {},
95 | "source": [
96 | "**본 스크립트는 SageMaker상의 notebook에서 구동하고 있지만, 여러분의 로컬 컴퓨터에서도 python과 jupyter notebook이 정상적으로 인스톨되어 있다면 동일하게 수행 가능합니다.**"
97 | ]
98 | },
99 | {
100 | "cell_type": "markdown",
101 | "metadata": {
102 | "toc-hr-collapsed": false
103 | },
104 | "source": [
105 | "## Use TensorFlow Script Mode\n",
106 | "\n",
107 | "TensorFlow 버전 1.11 이상에서 Amazon SageMaker Python SDK는 **스크립트 모드(Script mode)**를 지원합니다. 스크립트 모드는 종래 레거시 모드(Legacy mode) 대비 아래 장점들이 있습니다.\n",
108 | "\n",
109 | "* 스크립트 모드의 학습 스크립트는 일반적으로 TensorFlow 용으로 작성하는 학습 스크립트와 더 유사하므로 TensorFlow 학습 스크립트를 최소한의 변경으로 실행할 수 있습니다. 따라서, 기존 레거시 모드보다 TensorFlow 학습 스크립트를 수정하는 것이 더 쉽습니다. \n",
110 | " - 레거시 모드는 Tensorflow Estimator API를 기반으로 한 아래의 함수들을 반드시 포함해야 합니다.\n",
111 | " - 아래 함수들에서 하나의 함수를 만드시 포함해야 합니다.\n",
112 | " - `model_fn`: 학습할 모델을 정의합니다,\n",
113 | " - `keras_model_fn`: 학습할 tf.keras 모델을 정의합니다.\n",
114 | " - `estimator_fn`: 학습할 tf.estimator.Estimator를 정의합니다.\n",
115 | " - `train_input_fn`: 학습 데이터 로딩과 전처리를 수행합니다. \n",
116 | " - `eval_input_fn`: 검증 데이터의 로딩과 전처리를 수행합니다.\n",
117 | " - (Optional) `serving_input_fn`: 예측(prediction) 중에 모델에 전달할 feautre를 정의합니다. 이 함수는 학습시에만 사용되지만, SageMaker 엔드포인트에서 모델을 배포할 때 필요합니다.\n",
118 | " - `if __name__ == “__main__”:` 블록을 정의할 수 없어 디버깅이 쉽지 않습니다.\n",
119 | " \n",
120 | "* 스크립트 모드는 Python 2.7-와 Python 3.6-을 지원합니다.\n",
121 | "\n",
122 | "* 스크립트 모드는 **Hovorod 기반 분산 학습(distributed training)도 지원**합니다.\n",
123 | "\n",
124 | "TensorFlow 스크립트 모드에서 학습 스크립트를 작성하는 방법 및 Tensorflow 스크립트 모드의 estimator와 model 사용법에 대한 자세한 내용은\n",
125 | "https://sagemaker.readthedocs.io/en/stable/using_tf.html 을 참조하세요."
126 | ]
127 | },
128 | {
129 | "cell_type": "markdown",
130 | "metadata": {},
131 | "source": [
132 | "### Preparing your script for training in SageMaker\n",
133 | "\n",
134 | "SageMaker 스크립트 모드의 학습 스크립트는 SageMaker 외부에서 실행할 수 있는 학습 스크립트와 매우 유사합니다.\n",
135 | "SageMaker는 하나의 인자값(argument), model_dir와 로그 및 모델 아티팩트(model artifacts)에 사용되는 S3 경로로 학습 스크립트를 실행합니다.\n",
136 | "\n",
137 | "SageMaker 학습 인스턴스에서는 학습의 컨테이너에 S3에 저장된 데이터를 다운로드하여 학습에 활용합니다. 그 때, S3 버킷의 데이터 경로와 컨테이너의 데이터 경로를 컨테이너 환경 변수를 통해 연결합니다.\n",
138 | "\n",
139 | "여러분은 다양한 환경 변수를 통해 학습 환경에 대한 유용한 속성들(properties)에 액세스할 수 있습니다.\n",
140 | "이 스크립트의 경우 `Train, Validation, Eval`이라는 3 개의 데이터 채널을 스크립트로 보냅니다.\n",
141 | "\n",
142 | "**`training_script/cifar10_keras.py`에서 스크립트 사본을 생성 후, `training_script/cifar10_keras_sm.py`로 저장하세요.**\n",
143 | "\n",
144 | "스크립트 사본을 생성하였다면 단계별로 아래의 작업들을 직접 시도합니다.\n",
145 | "\n",
146 | "----\n",
147 | "### TODO 1.\n",
148 | "`cifar10_keras_sm.py`파일에서 SageMaker API 환경 변수 SM_CHANNEL_TRAIN, SM_CHANNEL_VALIDATION, SM_CHANNEL_EVAL에서 디폴트 값을 가져오기 위해 train, validation, eval 인수를 수정해 주세요. \n",
149 | "\n",
150 | "`cifar10_keras_sm.py`의 `if __name__ == '__main__':` 블록 내에 아래 인자값을 수정해 주세요.\n",
151 | "\n",
152 | "```python\n",
153 | "parser.add_argument(\n",
154 | " '--train',\n",
155 | " type=str,\n",
156 | " required=False,\n",
157 | " default=os.environ.get('SM_CHANNEL_TRAIN'), # <-- 수정 부분\n",
158 | " help='The directory where the CIFAR-10 input data is stored.')\n",
159 | "parser.add_argument(\n",
160 | " '--validation',\n",
161 | " type=str,\n",
162 | " required=False,\n",
163 | " default=os.environ.get('SM_CHANNEL_VALIDATION'), # <-- 수정 부분\n",
164 | " help='The directory where the CIFAR-10 input data is stored.')\n",
165 | "parser.add_argument(\n",
166 | " '--eval',\n",
167 | " type=str,\n",
168 | " required=False,\n",
169 | " default=os.environ.get('SM_CHANNEL_EVAL'), # <-- 수정 부분\n",
170 | " help='The directory where the CIFAR-10 input data is stored.')\n",
171 | "```\n",
172 | "\n",
173 | "\n",
174 | "환경 변수에 따른 S3 경로와 컨테이너 경로는 아래 표와 같습니다.\n",
175 | "\n",
176 | "| S3 경로 | 환경 변수 | 컨테이너 경로 |\n",
177 | "| :---- | :---- | :----| \n",
178 | "| s3://bucket_name/prefix/train | `SM_CHANNEL_TRAIN` | `/opt/ml/input/data/train` |\n",
179 | "| s3://bucket_name/prefix/validation | `SM_CHANNEL_VALIDATION` | `/opt/ml/input/data/validation` |\n",
180 | "| s3://bucket_name/prefix/eval | `SM_CHANNEL_EVAL` | `/opt/ml/input/data/eval` |\n",
181 | "| s3://bucket_name/prefix/model.tar.gz | `SM_MODEL_DIR` | `/opt/ml/model` |\n",
182 | "| s3://bucket_name/prefix/output.tar.gz | `SM_OUTPUT_DATA_DIR` | `/opt/ml/output/data` |\n",
183 | "\n",
184 | "얘를 들어, `/opt/ml/input/data/train`은 학습 데이터가 다운로드되는 컨테이너 내부의 디렉토리입니다.\n",
185 | "\n",
186 | "자세한 내용은 아래의 SageMaker Python SDK 문서를 확인하시기 바랍니다.
\n",
187 | "(https://sagemaker.readthedocs.io/en/stable/using_tf.html#preparing-a-script-mode-training-script)\n",
188 | "\n",
189 | "\n",
190 | "SageMaker는 train, validation, eval 경로들을 직접 인자로 보내지 않고, 대신 스크립트에서 환경 변수를 사용하여 해당 인자를 필요하지 않은 것으로 표시합니다.\n",
191 | "\n",
192 | "SageMaker는 유용한 환경 변수를 여러분이 작성한 학습 스크립트로 보냅니다. 예시들은 아래와 같습니다.\n",
193 | "* `SM_MODEL_DIR`: 학습 작업이 모델 아티팩트(model artifacts)를 저장할 수 있는 로컬 경로를 나타내는 문자열입니다. 학습 완료 후, 해당 경로 내 모델 아티팩트는 모델 호스팅을 위해 S3에 업로드됩니다. 이는 S3 위치인 학습 스크립트에 전달 된 model_dir 인수와 다르다는 점을 주의해 주세요. SM_MODEL_DIR은 항상 `/opt/ml/model`로 설정됩니다.\n",
194 | "* `SM_NUM_GPUS`: 호스트(Host)에서 사용 가능한 GPU 수를 나타내는 정수(integer)입니다.\n",
195 | "* `SM_OUTPUT_DATA_DIR`: 출력 아티팩트를 저장할 디렉토리의 경로를 나타내는 문자열입니다. 출력 아티팩트에는 체크포인트, 그래프 및 다른 저장용 파일들이 포함될 수 있지만 모델 아티팩트는 포함되지 않습니다. 이 출력 아티팩트들은 압축되어 모델 아티팩트와 동일한 접두사가 있는 S3 버킷으로 S3에 업로드됩니다.\n",
196 | "\n",
197 | "이 샘플 코드는 네트워크 지연을 줄이기 위해 모델의 체크포인트(checkpoints)를 로컬 환경에 저장합니다. 이들은 학습 종료 후 S3에 업로드할 수 있습니다.\n",
198 | "\n",
199 | "----\n",
200 | "### TODO 2.\n",
201 | "\n",
202 | "`cifar10_keras_sm.py`의 `if __name__ == '__main__':` 블록 내에 아래 인자값을 추가해 주세요.\n",
203 | "\n",
204 | "```python\n",
205 | "parser.add_argument(\n",
206 | " '--model_output_dir',\n",
207 | " type=str,\n",
208 | " default=os.environ.get('SM_MODEL_DIR'))\n",
209 | "```\n",
210 | "\n",
211 | "----\n",
212 | "### TODO 3.\n",
213 | "`ModelCheckpoint` 함수의 저장 경로를 새 경로로 아래와 같이 수정해 주세요.\n",
214 | "\n",
215 | "From:\n",
216 | "```python\n",
217 | "callbacks.append(ModelCheckpoint(args.model_dir + '/checkpoint-{epoch}.h5'))\n",
218 | "```\n",
219 | "To:\n",
220 | "```python\n",
221 | "callbacks.append(ModelCheckpoint(args.model_output_dir + '/checkpoint-{epoch}.h5'))\n",
222 | "```\n",
223 | "\n",
224 | "----\n",
225 | "### TODO 4.\n",
226 | "`save_model` 함수의 인자값을 아래와 같이 수정해 주세요.\n",
227 | "\n",
228 | "From: \n",
229 | "```python\n",
230 | "return save_model(model, args.model_dir)\n",
231 | "```\n",
232 | "To: \n",
233 | "```python\n",
234 | "return save_model(model, args.model_output_dir)\n",
235 | "```\n",
236 | "\n",
237 | "**본 노트북 실습에 어려움이 있다면 솔루션 파일 `training_script/cifar10_keras_sm_solution.py`을 참조하시면 됩니다.**"
238 | ]
239 | },
240 | {
241 | "cell_type": "markdown",
242 | "metadata": {},
243 | "source": [
244 | "### Test your script locally (just like on your laptop)\n",
245 | "\n",
246 | "테스트를 위해 위와 동일한 명령(command)으로 새 스크립트를 실행하고, 예상대로 실행되는지 확인합니다.
\n",
247 | "SageMaker TensorFlow API 호출 시에 환경 변수들은 자동으로 넘겨기지만, 로컬 주피터 노트북에서 테스트 시에는 수동으로 환경 변수들을 지정해야 합니다. (아래 예제 코드를 참조해 주세요.)\n",
248 | "\n",
249 | "```python\n",
250 | "%env SM_MODEL_DIR=./logs\n",
251 | "```"
252 | ]
253 | },
254 | {
255 | "cell_type": "code",
256 | "execution_count": null,
257 | "metadata": {},
258 | "outputs": [],
259 | "source": [
260 | "%%time\n",
261 | "!mkdir -p logs \n",
262 | "\n",
263 | "# Number of GPUs on this machine\n",
264 | "%env SM_NUM_GPUS=1\n",
265 | "# Where to save the model\n",
266 | "%env SM_MODEL_DIR=./logs\n",
267 | "# Where the training data is\n",
268 | "%env SM_CHANNEL_TRAIN=data/train\n",
269 | "# Where the validation data is\n",
270 | "%env SM_CHANNEL_VALIDATION=data/validation\n",
271 | "# Where the evaluation data is\n",
272 | "%env SM_CHANNEL_EVAL=data/eval\n",
273 | "\n",
274 | "!python training_script/cifar10_keras_sm.py --model_dir ./logs --epochs 1\n",
275 | "!rm -rf logs"
276 | ]
277 | },
278 | {
279 | "cell_type": "markdown",
280 | "metadata": {},
281 | "source": [
282 | "### Use SageMaker local for local testing\n",
283 | "\n",
284 | "본격적으로 학습을 시작하기 전에 로컬 모드를 사용하여 디버깅을 먼저 수행합니다. 로컬 모드는 학습 인스턴스를 생성하는 과정이 없이 로컬 인스턴스로 컨테이너를 가져온 후 곧바로 학습을 수행하기 때문에 코드를 보다 신속히 검증할 수 있습니다.\n",
285 | "\n",
286 | "Amazon SageMaker Python SDK의 로컬 모드는 TensorFlow 또는 MXNet estimator서 단일 인자값을 변경하여 CPU (단일 및 다중 인스턴스) 및 GPU (단일 인스턴스) SageMaker 학습 작업을 에뮬레이션(enumlate)할 수 있습니다. 이를 위해 Docker compose와 NVIDIA Docker를 사용합니다.\n",
287 | "학습 작업을 시작하기 위해 `estimator.fit() ` 호출 시, Amazon ECS에서 Amazon SageMaker TensorFlow 컨테이너를 로컬 노트북 인스턴스로 다운로드합니다.\n",
288 | "\n",
289 | "로컬 모드의 학습을 통해 여러분의 코드가 현재 사용 중인 하드웨어를 적절히 활용하고 있는지 확인하기 위한 GPU 점유와 같은 지표(metric)를 쉽게 모니터링할 수 있습니다."
290 | ]
291 | },
292 | {
293 | "cell_type": "code",
294 | "execution_count": null,
295 | "metadata": {},
296 | "outputs": [],
297 | "source": [
298 | "import os\n",
299 | "import sagemaker\n",
300 | "from sagemaker import get_execution_role\n",
301 | "\n",
302 | "sagemaker_session = sagemaker.Session()\n",
303 | "\n",
304 | "role = get_execution_role()"
305 | ]
306 | },
307 | {
308 | "cell_type": "markdown",
309 | "metadata": {},
310 | "source": [
311 | "`sagemaker.tensorflow` 클래스를 사용하여 SageMaker Python SDK의 Tensorflow Estimator 인스턴스를 생성합니다.\n",
312 | "인자값으로 하이퍼파라메터와 다양한 설정들을 변경할 수 있습니다.\n",
313 | "\n",
314 | "자세한 내용은 [documentation](https://sagemaker.readthedocs.io/en/stable/using_tf.html#training-with-tensorflow-estimator)을 확인하시기 바랍니다."
315 | ]
316 | },
317 | {
318 | "cell_type": "code",
319 | "execution_count": null,
320 | "metadata": {},
321 | "outputs": [],
322 | "source": [
323 | "from sagemaker.tensorflow import TensorFlow\n",
324 | "estimator = TensorFlow(base_job_name='cifar10',\n",
325 | " entry_point='cifar10_keras_sm.py',\n",
326 | " source_dir='training_script',\n",
327 | " role=role,\n",
328 | " framework_version='1.14.0',\n",
329 | " py_version='py3',\n",
330 | " script_mode=True,\n",
331 | " hyperparameters={'epochs' : 1},\n",
332 | " train_instance_count=1, \n",
333 | " train_instance_type='local')"
334 | ]
335 | },
336 | {
337 | "cell_type": "markdown",
338 | "metadata": {},
339 | "source": [
340 | "학습을 수행할 3개의 채널과 데이터의 경로를 지정합니다. **로컬 모드로 수행하기 때문에 S3 경로 대신 노트북 인스턴스의 경로를 지정하시면 됩니다.**"
341 | ]
342 | },
343 | {
344 | "cell_type": "code",
345 | "execution_count": null,
346 | "metadata": {},
347 | "outputs": [],
348 | "source": [
349 | "%%time\n",
350 | "estimator.fit({'train': 'file://data/train',\n",
351 | " 'validation': 'file://data/validation',\n",
352 | " 'eval': 'file://data/eval'})"
353 | ]
354 | },
355 | {
356 | "cell_type": "markdown",
357 | "metadata": {},
358 | "source": [
359 | "Estimator가 처음 실행될 때 Amazon ECR 리포지토리(repository)에서 컨테이너 이미지를 다운로드해야 하지만 학습을 즉시 시작할 수 있습니다. 즉, 별도의 학습 클러스터가 프로비저닝 될 때까지 기다릴 필요가 없습니다. 또한 반복 및 테스트시 필요할 수 있는 후속 실행에서 MXNet 또는 TensorFlow 스크립트에 대한 수정 사항이 즉시 실행되기 시작합니다."
360 | ]
361 | },
362 | {
363 | "cell_type": "markdown",
364 | "metadata": {},
365 | "source": [
366 | "### Using SageMaker for faster training time\n",
367 | "\n",
368 | "이번에는 로컬 모드를 사용하지 않고 SageMaker 학습에 GPU 학습 인스턴스를 생성하여 학습 시간을 단축해 봅니다.
\n",
369 | "로컬 모드와 다른 점들은 (1) `train_instance_type`이 로컬 모드의 ‘local’ 대신 여러분이 원하는 특정 인스턴스 유형으로 설정해야 하고, (2) 학습 데이터를 Amazon S3에 업로드 후 학습 경로를 S3 경로로 설정해야 합니다. \n",
370 | "\n",
371 | "SageMaker SDK는 S3 업로드를 위한 간단한 함수(`Session.upload_data()`)를 제공합니다. 이 함수를 통해 리턴되는 값은 데이터가 저장된 S3 경로입니다.\n",
372 | "좀 더 자세한 설정이 필요하다면 SageMaker SDK 대신 boto3를 사용하시면 됩니다.\n",
373 | "\n",
374 | "*[Note]: 고성능 워크로드를 위해 Amazon EFS와 Amazon FSx for Lustre도 지원하고 있습니다. 자세한 정보는 아래의 AWS 블로그를 참조해 주세요.
\n",
375 | "https://aws.amazon.com/blogs/machine-learning/speed-up-training-on-amazon-sagemaker-using-amazon-efs-or-amazon-fsx-for-lustre-file-systems/*"
376 | ]
377 | },
378 | {
379 | "cell_type": "code",
380 | "execution_count": null,
381 | "metadata": {},
382 | "outputs": [],
383 | "source": [
384 | "dataset_location = sagemaker_session.upload_data(path='data', key_prefix='data/DEMO-cifar10')\n",
385 | "display(dataset_location)"
386 | ]
387 | },
388 | {
389 | "cell_type": "markdown",
390 | "metadata": {},
391 | "source": [
392 | "S3에 데이터 업로드를 완료했다면, Estimator를 새로 생성합니다.
\n",
393 | "아래 코드를 그대로 복사 후에 `train_instance_type='local'`을 `train_instance_type='ml.p2.xlarge'`로 수정하고\n",
394 | "`hyperparameters={'epochs': 1}`를 `hyperparameters={'epochs': 5}`로 수정합니다.\n",
395 | "\n",
396 | "```python\n",
397 | "from sagemaker.tensorflow import TensorFlow\n",
398 | "estimator = TensorFlow(base_job_name='cifar10',\n",
399 | " entry_point='cifar10_keras_sm.py',\n",
400 | " source_dir='training_script',\n",
401 | " role=role,\n",
402 | " framework_version='1.14.0',\n",
403 | " py_version='py3',\n",
404 | " script_mode=True, \n",
405 | " hyperparameters={'epochs': 1},\n",
406 | " train_instance_count=1, \n",
407 | " train_instance_type='local')\n",
408 | "```\n",
409 | "\n",
410 | "*[Note] \n",
411 | "2019년 8월부터 SageMaker에서도 학습 인스턴스에 EC2 spot instance를 사용하여 비용을 크게 절감할 수 있습니다. 자세한 정보는 아래의 AWS 블로그를 참조해 주세요.
\n",
412 | "https://aws.amazon.com/ko/blogs/korea/managed-spot-training-save-up-to-90-on-your-amazon-sagemaker-training-jobs/*\n",
413 | "\n",
414 | "만약 Managed Spot Instance로 학습하려면 다음 코드를 Estimator의 train_instance_type의 다음 행에 추가해 주세요.\n",
415 | "```python\n",
416 | "train_max_run = 3600,\n",
417 | "train_use_spot_instances = 'True',\n",
418 | "train_max_wait = 3600,\n",
419 | "```"
420 | ]
421 | },
422 | {
423 | "cell_type": "code",
424 | "execution_count": null,
425 | "metadata": {},
426 | "outputs": [],
427 | "source": [
428 | "from sagemaker.tensorflow import TensorFlow\n",
429 | "estimator = TensorFlow(base_job_name='cifar10',\n",
430 | " entry_point='cifar10_keras_sm.py',\n",
431 | " source_dir='training_script',\n",
432 | " role=role,\n",
433 | " framework_version='1.14.0',\n",
434 | " py_version='py3',\n",
435 | " script_mode=True, \n",
436 | " hyperparameters={'epochs': 5},\n",
437 | " train_instance_count=1, \n",
438 | " train_instance_type='ml.p2.xlarge')"
439 | ]
440 | },
441 | {
442 | "cell_type": "markdown",
443 | "metadata": {},
444 | "source": [
445 | "학습을 수행합니다. 이번에는 각각의 채널(`train, validation, eval`)에 S3의 데이터 저장 위치를 지정합니다.
\n",
446 | "학습 완료 후 Billable seconds도 확인해 보세요. Billable seconds는 실제로 학습 수행 시 과금되는 시간입니다.\n",
447 | "```\n",
448 | "Billable seconds: