<commit_before>{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "wJcYs_ERTnnI"
      },
      "source": [
        "##### Copyright 2021 The TensorFlow Authors."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "cellView": "form",
        "id": "HMUDt0CiUJk9"
      },
      "outputs": [],
      "source": [
        "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n",
        "# you may not use this file except in compliance with the License.\n",
        "# You may obtain a copy of the License at\n",
        "#\n",
        "# https://www.apache.org/licenses/LICENSE-2.0\n",
        "#\n",
        "# Unless required by applicable law or agreed to in writing, software\n",
        "# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
        "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
        "# See the License for the specific language governing permissions and\n",
        "# limitations under the License."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "77z2OchJTk0l"
      },
      "source": [
        "# TPUEstimator에서 TPUStrategy로 마이그레이션\n",
        "\n",
        "<table class=\"tfo-notebook-buttons\" align=\"left\">\n",
        "  <td><a target=\"_blank\" href=\"https://www.tensorflow.org/guide/migrate/tpu_estimator\"><img src=\"https://www.tensorflow.org/images/tf_logo_32px.png\">TensorFlow.org에서 보기</a></td>\n",
        "  <td><a target=\"_blank\" href=\"https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/guide/migrate/tpu_estimator.ipynb\"><img src=\"https://www.tensorflow.org/images/colab_logo_32px.png\">Google Colab에서 실행</a></td>\n",
        "  <td><a target=\"_blank\" href=\"https://github.com/tensorflow/docs/blob/master/site/en/guide/migrate/tpu_estimator.ipynb\"><img src=\"https://www.tensorflow.org/images/GitHub-Mark-32px.png\">GitHub에서 소스 보기</a></td>\n",
        "  <td><a href=\"https://storage.googleapis.com/tensorflow_docs/docs/site/en/guide/migrate/tpu_estimator.ipynb\"><img src=\"https://www.tensorflow.org/images/download_logo_32px.png\">노트북 다운로드</a></td>\n",
        "</table>"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "meUTrR4I6m1C"
      },
      "source": [
        "[이 가이드는 TPU](../../guide/tpu.ipynb) 에서 실행되는 워크플로를 TensorFlow 1의 `TPUEstimator` API에서 TensorFlow 2의 `TPUStrategy` API로 마이그레이션하는 방법을 보여줍니다.\n",
        "\n",
        "- TensorFlow 1에서 `tf.compat.v1.estimator.tpu.TPUEstimator` API를 사용하면 모델을 훈련 및 평가할 수 있을 뿐만 아니라 추론을 수행하고 (클라우드) TPU에서 모델(제공용)을 저장할 수 있습니다.\n",
        "- In TensorFlow 2, to perform synchronous training on TPUs and TPU Pods (a collection of TPU devices connected by dedicated high-speed network interfaces), you need to use a TPU distribution strategy—`tf.distribute.TPUStrategy`. The strategy can work with the Keras APIs—including for model building (`tf.keras.Model`), optimizers (`tf.keras.optimizers.Optimizer`), and training (`Model.fit`)—as well as a custom training loop (with `tf.function` and `tf.GradientTape`).\n",
        "\n",
        "종단 간 TensorFlow 2 예제는 [TPU](../../guide/tpu.ipynb) 사용 가이드(즉, *TPU* 의 분류 섹션)와 [TPU의 BERT를 사용하여 GLUE 작업 해결](https://www.tensorflow.org/text/tutorials/bert_glue) 자습서를 확인하세요. `TPUStrategy` 포함한 모든 TensorFlow 배포 전략을 다루는 [Distributed 교육](../../guide/distributed_training.ipynb) 가이드가 유용할 수 있습니다."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "YdZSoIXEbhg-"
      },
      "source": [
        "## 설정\n",
        "\n",
        "데모용으로 가져오기 및 간단한 데이터세트로 시작합니다."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "iE0vSfMXumKI"
      },
      "outputs": [],
      "source": [
        "import tensorflow as tf\n",
        "import tensorflow.compat.v1 as tf1"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "m7rnGxsXtDkV"
      },
      "outputs": [],
      "source": [
        "features = [[1., 1.5]]\n",
        "labels = [[0.3]]\n",
        "eval_features = [[4., 4.5]]\n",
        "eval_labels = [[0.8]]"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "4uXff1BEssdE"
      },
      "source": [
        "## TensorFlow 1: TPUEstimator를 사용하여 TPU에서 모델 구동"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "BVWHEQj5a7rN"
      },
      "source": [
        "이 가이드 섹션에서는 TensorFlow 1에서 `tf.compat.v1.estimator.tpu.TPUEstimator` 를 사용하여 교육 및 평가를 수행하는 방법을 보여줍니다.\n",
        "\n",
        "`TPUEstimator` 를 사용하려면 먼저 몇 가지 함수를 정의합니다. 학습 데이터에 대한 입력 함수, 평가 데이터에 대한 평가 입력 함수, 학습 작업이 기능 및 레이블로 정의되는 방식을 `TPUEstimator`"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "lqe9obf7suIj"
      },
      "outputs": [],
      "source": [
        "def _input_fn(params):\n",
        "  dataset = tf1.data.Dataset.from_tensor_slices((features, labels))\n",
        "  dataset = dataset.repeat()\n",
        "  return dataset.batch(params['batch_size'], drop_remainder=True)\n",
        "\n",
        "def _eval_input_fn(params):\n",
        "  dataset = tf1.data.Dataset.from_tensor_slices((eval_features, eval_labels))\n",
        "  dataset = dataset.repeat()\n",
        "  return dataset.batch(params['batch_size'], drop_remainder=True)\n",
        "\n",
        "def _model_fn(features, labels, mode, params):\n",
        "  logits = tf1.layers.Dense(1)(features)\n",
        "  loss = tf1.losses.mean_squared_error(labels=labels, predictions=logits)\n",
        "  optimizer = tf1.train.AdagradOptimizer(0.05)\n",
        "  train_op = optimizer.minimize(loss, global_step=tf1.train.get_global_step())\n",
        "  return tf1.estimator.tpu.TPUEstimatorSpec(mode, loss=loss, train_op=train_op)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "QYnP3Dszc-2R"
      },
      "source": [
        "이러한 기능은 정의와 더불어, 생성 `tf.distribute.cluster_resolver.TPUClusterResolver` 클러스터 정보를 제공하며, `tf.compat.v1.estimator.tpu.RunConfig` 객체를. 정의한 모델 함수와 함께 이제 `TPUEstimator` 만들 수 있습니다. 여기에서는 체크포인트 절약을 건너뛰어 흐름을 단순화합니다. `TPUEstimator` 대한 훈련 및 평가 모두에 대한 배치 크기를 지정합니다."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "WAqyqawemlcl"
      },
      "outputs": [],
      "source": [
        "cluster_resolver = tf1.distribute.cluster_resolver.TPUClusterResolver(tpu='')\n",
        "print(\"All devices: \", tf1.config.list_logical_devices('TPU'))"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "HsOpjW5plH9Q"
      },
      "outputs": [],
      "source": [
        "tpu_config = tf1.estimator.tpu.TPUConfig(iterations_per_loop=10)\n",
        "config = tf1.estimator.tpu.RunConfig(\n",
        "    cluster=cluster_resolver,\n",
        "    save_checkpoints_steps=None,\n",
        "    tpu_config=tpu_config)\n",
        "estimator = tf1.estimator.tpu.TPUEstimator(\n",
        "    model_fn=_model_fn,\n",
        "    config=config,\n",
        "    train_batch_size=8,\n",
        "    eval_batch_size=8)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Uxw7tWrcepaZ"
      },
      "source": [
        "`TPUEstimator.train` 을 호출하여 모델 학습을 시작합니다."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "WZPKFOMAcyrP"
      },
      "outputs": [],
      "source": [
        "estimator.train(_input_fn, steps=1)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ev1vjIz9euIw"
      },
      "source": [
        "그런 다음 `TPUEstimator.evaluate` 를 호출하여 평가 데이터를 사용하여 모델을 평가합니다."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "bqiKRiwWc0cz"
      },
      "outputs": [],
      "source": [
        "estimator.evaluate(_eval_input_fn, steps=1)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "KEmzBjfnsxwT"
      },
      "source": [
        "## TensorFlow 2: Keras Model.fit 및 TPUStrategy를 사용하여 TPU에서 모델 구동"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "UesuXNbShrbi"
      },
      "source": [
        "TensorFlow 2에서 TPU 작업자를 교육하려면 모델 정의 및 교육/평가를 `tf.distribute.TPUStrategy` `Model.fit` 및 사용자 지정 훈련 루프( `tf.function` 및 `tf.GradientTape` )를 사용한 훈련에 대한 더 많은 예제는 [TPU](../../guide/tpu.ipynb) 사용 가이드를 참조하십시오.)\n",
        "\n",
        "원격 클러스터에 연결하고 TPU 작업자를 초기화하려면 일부 초기화 작업을 수행해야 하므로 먼저 `TPUClusterResolver` 를 생성하여 클러스터 정보를 제공하고 클러스터에 연결합니다. [(TPU 사용](../../guide/tpu.ipynb) *가이드의 TPU 초기화* 섹션에서 자세히 알아보세요.)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "_TgdPNgXoS63"
      },
      "outputs": [],
      "source": [
        "cluster_resolver = tf.distribute.cluster_resolver.TPUClusterResolver(tpu='')\n",
        "tf.config.experimental_connect_to_cluster(cluster_resolver)\n",
        "tf.tpu.experimental.initialize_tpu_system(cluster_resolver)\n",
        "print(\"All devices: \", tf.config.list_logical_devices('TPU'))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "R4EHXhN3CVmo"
      },
      "source": [
        "다음으로, 데이터가 준비되면 `TPUStrategy` 를 만들고 이 전략의 범위에서 모델, 메트릭 및 옵티마이저를 정의합니다.\n",
        "\n",
        "`TPUStrategy` 비슷한 훈련 속도를 얻으려면 `tf.function` 호출 중에 실행할 배치 수를 지정하고 성능에 중요하기 `steps_per_execution` 에서 `Model.compile` 대한 숫자를 선택해야 합니다. 이 인수는 `TPUEstimator` 에서 사용되는 `iterations_per_loop` 와 유사합니다. 사용자 지정 훈련 루프를 사용하는 경우 `tf.function` -ed 훈련 함수 내에서 여러 단계를 실행해야 합니다. [자세한 내용은 TPU](../../guide/tpu.ipynb) 사용 가이드의 tf.function 섹션에서 *여러 단계로 성능 향상* 을 참조하세요.\n",
        "\n",
        "`tf.distribute.TPUStrategy` 는 경계가 있는 동적 모양을 지원할 수 있으며, 이는 동적 모양 계산의 상한을 유추할 수 있는 경우입니다. 그러나 동적 모양은 정적 모양에 비해 약간의 성능 오버헤드를 유발할 수 있습니다. 따라서, 특히 훈련에서 가능하면 입력 모양을 정적으로 만드는 것이 일반적으로 권장됩니다. 스트림에 남아 있는 샘플 수가 배치 크기보다 작을 수 있으므로 동적 모양을 반환하는 일반적인 작업 중 하나는 `tf.data.Dataset.batch(batch_size)` 따라서 TPU에서 훈련할 때 최상의 훈련 성능을 위해 `tf.data.Dataset.batch(..., drop_remainder=True)`"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "atVciNgPs0fw"
      },
      "outputs": [],
      "source": [
        "dataset = tf.data.Dataset.from_tensor_slices(\n",
        "    (features, labels)).shuffle(10).repeat().batch(\n",
        "        8, drop_remainder=True).prefetch(2)\n",
        "eval_dataset = tf.data.Dataset.from_tensor_slices(\n",
        "    (eval_features, eval_labels)).batch(1, drop_remainder=True)\n",
        "\n",
        "strategy = tf.distribute.TPUStrategy(cluster_resolver)\n",
        "with strategy.scope():\n",
        "  model = tf.keras.models.Sequential([tf.keras.layers.Dense(1)])\n",
        "  optimizer = tf.keras.optimizers.Adagrad(learning_rate=0.05)\n",
        "  model.compile(optimizer, \"mse\", steps_per_execution=10)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "FkM2VZyni98F"
      },
      "source": [
        "이것으로 훈련 데이터 세트로 모델을 훈련할 준비가 되었습니다."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "Kip65sYBlKiu"
      },
      "outputs": [],
      "source": [
        "model.fit(dataset, epochs=5, steps_per_epoch=10)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "r0AEK8sNjLOj"
      },
      "source": [
        "마지막으로 평가 데이터 세트를 사용하여 모델을 평가합니다."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "6tMRkyfKhqSL"
      },
      "outputs": [],
      "source": [
        "model.evaluate(eval_dataset, return_dict=True)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "67ec4d3f35d6"
      },
      "source": [
        "## 다음 단계"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "gHx_RUL8xcJ3"
      },
      "source": [
        "`TPUStrategy` 에 대해 자세히 알아보려면 다음 리소스를 고려하세요.\n",
        "\n",
        "- 가이드 : [사용 TPU에](../../guide/tpu.ipynb) (Keras와 교육 커버 `Model.fit` /와 사용자 정의 교육 루프 `tf.distribute.TPUStrategy` 와 성능 개선뿐만 아니라 팁을 `tf.function` )\n",
        "- 가이드: [TensorFlow를 사용한 분산 교육](../../guide/distributed_training.ipynb)\n",
        "\n",
        "훈련 사용자 지정에 대한 자세한 내용은 다음을 참조하십시오.\n",
        "\n",
        "- 가이드: [Model.fit에서 발생하는 작업 사용자 지정](../..guide/keras/customizing_what_happens_in_fit.ipynb)\n",
        "- 가이드: [처음부터 훈련 루프 작성하기](https://www.tensorflow.org/guide/keras/writing_a_training_loop_from_scratch)\n",
        "\n",
        "기계 학습을 위한 Google의 특수 ASIC인 TPU는 [Google Colab](https://colab.research.google.com/) [, TPU Research Cloud](https://sites.research.google/trc/) 및 [Cloud TPU를](https://cloud.google.com/tpu) 통해 사용할 수 있습니다."
      ]
    }
  ],
  "metadata": {
    "accelerator": "TPU",
    "colab": {
      "collapsed_sections": [],
      "name": "tpu_estimator.ipynb",
      "toc_visible": true
    },
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}
<commit_msg>Translate tpu_estimator.ipynb via GitLocalize<commit_after>{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "wJcYs_ERTnnI"
      },
      "source": [
        "##### Copyright 2021 The TensorFlow Authors."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "cellView": "form",
        "id": "HMUDt0CiUJk9"
      },
      "outputs": [],
      "source": [
        "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n",
        "# you may not use this file except in compliance with the License.\n",
        "# You may obtain a copy of the License at\n",
        "#\n",
        "# https://www.apache.org/licenses/LICENSE-2.0\n",
        "#\n",
        "# Unless required by applicable law or agreed to in writing, software\n",
        "# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
        "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
        "# See the License for the specific language governing permissions and\n",
        "# limitations under the License."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "77z2OchJTk0l"
      },
      "source": [
        "# TPUEstimator에서 TPUStrategy로 마이그레이션\n",
        "\n",
        "<table class=\"tfo-notebook-buttons\" align=\"left\">\n",
        "  <td><a target=\"_blank\" href=\"https://www.tensorflow.org/guide/migrate/tpu_estimator\"><img src=\"https://www.tensorflow.org/images/tf_logo_32px.png\">TensorFlow.org에서 보기</a></td>\n",
        "  <td><a target=\"_blank\" href=\"https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/guide/migrate/tpu_estimator.ipynb\"><img src=\"https://www.tensorflow.org/images/colab_logo_32px.png\">Google Colab에서 실행</a></td>\n",
        "  <td><a target=\"_blank\" href=\"https://github.com/tensorflow/docs/blob/master/site/en/guide/migrate/tpu_estimator.ipynb\"><img src=\"https://www.tensorflow.org/images/GitHub-Mark-32px.png\">GitHub에서 소스 보기</a></td>\n",
        "  <td><a href=\"https://storage.googleapis.com/tensorflow_docs/docs/site/en/guide/migrate/tpu_estimator.ipynb\"><img src=\"https://www.tensorflow.org/images/download_logo_32px.png\">노트북 다운로드</a></td>\n",
        "</table>"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "meUTrR4I6m1C"
      },
      "source": [
        "[이 가이드는 TPU](../../guide/tpu.ipynb) 에서 실행되는 워크플로를 TensorFlow 1의 `TPUEstimator` API에서 TensorFlow 2의 `TPUStrategy` API로 마이그레이션하는 방법을 보여줍니다.\n",
        "\n",
        "- TensorFlow 1에서 `tf.compat.v1.estimator.tpu.TPUEstimator` API를 사용하면 모델을 훈련 및 평가할 수 있을 뿐만 아니라 추론을 수행하고 (클라우드) TPU에서 모델(제공용)을 저장할 수 있습니다.\n",
        "- Tensorflow 2에서, to perform synchronous training on TPUs and TPU Pods (a collection of TPU devices connected by dedicated high-speed network interfaces), you need to use a TPU distribution strategy—`tf.distribute.TPUStrategy`. The strategy can work with the Keras APIs—including for model building (`tf.keras.Model`), optimizers (`tf.keras.optimizers.Optimizer`), and training (`Model.fit`)—as well as a custom training loop (with `tf.function` and `tf.GradientTape`).\n",
        "\n",
        "종단 간 TensorFlow 2 예제는 [TPU](../../guide/tpu.ipynb) 사용 가이드(즉, *TPU* 의 분류 섹션)와 [TPU의 BERT를 사용하여 GLUE 작업 해결](https://www.tensorflow.org/text/tutorials/bert_glue) 자습서를 확인하세요. `TPUStrategy` 포함한 모든 TensorFlow 배포 전략을 다루는 [Distributed 교육](../../guide/distributed_training.ipynb) 가이드가 유용할 수 있습니다."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "YdZSoIXEbhg-"
      },
      "source": [
        "## 설정\n",
        "\n",
        "데모용으로 가져오기 및 간단한 데이터세트로 시작합니다."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "iE0vSfMXumKI"
      },
      "outputs": [],
      "source": [
        "import tensorflow as tf\n",
        "import tensorflow.compat.v1 as tf1"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "m7rnGxsXtDkV"
      },
      "outputs": [],
      "source": [
        "features = [[1., 1.5]]\n",
        "labels = [[0.3]]\n",
        "eval_features = [[4., 4.5]]\n",
        "eval_labels = [[0.8]]"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "4uXff1BEssdE"
      },
      "source": [
        "## TensorFlow 1: TPUEstimator를 사용하여 TPU에서 모델 구동"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "BVWHEQj5a7rN"
      },
      "source": [
        "이 가이드 섹션에서는 TensorFlow 1에서 `tf.compat.v1.estimator.tpu.TPUEstimator` 를 사용하여 교육 및 평가를 수행하는 방법을 보여줍니다.\n",
        "\n",
        "`TPUEstimator` 를 사용하려면 먼저 몇 가지 함수를 정의합니다. 학습 데이터에 대한 입력 함수, 평가 데이터에 대한 평가 입력 함수, 학습 작업이 기능 및 레이블로 정의되는 방식을 `TPUEstimator`"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "lqe9obf7suIj"
      },
      "outputs": [],
      "source": [
        "def _input_fn(params):\n",
        "  dataset = tf1.data.Dataset.from_tensor_slices((features, labels))\n",
        "  dataset = dataset.repeat()\n",
        "  return dataset.batch(params['batch_size'], drop_remainder=True)\n",
        "\n",
        "def _eval_input_fn(params):\n",
        "  dataset = tf1.data.Dataset.from_tensor_slices((eval_features, eval_labels))\n",
        "  dataset = dataset.repeat()\n",
        "  return dataset.batch(params['batch_size'], drop_remainder=True)\n",
        "\n",
        "def _model_fn(features, labels, mode, params):\n",
        "  logits = tf1.layers.Dense(1)(features)\n",
        "  loss = tf1.losses.mean_squared_error(labels=labels, predictions=logits)\n",
        "  optimizer = tf1.train.AdagradOptimizer(0.05)\n",
        "  train_op = optimizer.minimize(loss, global_step=tf1.train.get_global_step())\n",
        "  return tf1.estimator.tpu.TPUEstimatorSpec(mode, loss=loss, train_op=train_op)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "QYnP3Dszc-2R"
      },
      "source": [
        "이러한 기능은 정의와 더불어, 생성 `tf.distribute.cluster_resolver.TPUClusterResolver` 클러스터 정보를 제공하며, `tf.compat.v1.estimator.tpu.RunConfig` 객체를. 정의한 모델 함수와 함께 이제 `TPUEstimator` 만들 수 있습니다. 여기에서는 체크포인트 절약을 건너뛰어 흐름을 단순화합니다. `TPUEstimator` 대한 훈련 및 평가 모두에 대한 배치 크기를 지정합니다."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "WAqyqawemlcl"
      },
      "outputs": [],
      "source": [
        "cluster_resolver = tf1.distribute.cluster_resolver.TPUClusterResolver(tpu='')\n",
        "print(\"All devices: \", tf1.config.list_logical_devices('TPU'))"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "HsOpjW5plH9Q"
      },
      "outputs": [],
      "source": [
        "tpu_config = tf1.estimator.tpu.TPUConfig(iterations_per_loop=10)\n",
        "config = tf1.estimator.tpu.RunConfig(\n",
        "    cluster=cluster_resolver,\n",
        "    save_checkpoints_steps=None,\n",
        "    tpu_config=tpu_config)\n",
        "estimator = tf1.estimator.tpu.TPUEstimator(\n",
        "    model_fn=_model_fn,\n",
        "    config=config,\n",
        "    train_batch_size=8,\n",
        "    eval_batch_size=8)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Uxw7tWrcepaZ"
      },
      "source": [
        "`TPUEstimator.train` 을 호출하여 모델 학습을 시작합니다."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "WZPKFOMAcyrP"
      },
      "outputs": [],
      "source": [
        "estimator.train(_input_fn, steps=1)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ev1vjIz9euIw"
      },
      "source": [
        "그런 다음 `TPUEstimator.evaluate` 를 호출하여 평가 데이터를 사용하여 모델을 평가합니다."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "bqiKRiwWc0cz"
      },
      "outputs": [],
      "source": [
        "estimator.evaluate(_eval_input_fn, steps=1)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "KEmzBjfnsxwT"
      },
      "source": [
        "## TensorFlow 2: Keras Model.fit 및 TPUStrategy를 사용하여 TPU에서 모델 구동"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "UesuXNbShrbi"
      },
      "source": [
        "TensorFlow 2에서 TPU 작업자를 교육하려면 모델 정의 및 교육/평가를 `tf.distribute.TPUStrategy` `Model.fit` 및 사용자 지정 훈련 루프( `tf.function` 및 `tf.GradientTape` )를 사용한 훈련에 대한 더 많은 예제는 [TPU](../../guide/tpu.ipynb) 사용 가이드를 참조하십시오.)\n",
        "\n",
        "원격 클러스터에 연결하고 TPU 작업자를 초기화하려면 일부 초기화 작업을 수행해야 하므로 먼저 `TPUClusterResolver` 를 생성하여 클러스터 정보를 제공하고 클러스터에 연결합니다. [(TPU 사용](../../guide/tpu.ipynb) *가이드의 TPU 초기화* 섹션에서 자세히 알아보세요.)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "_TgdPNgXoS63"
      },
      "outputs": [],
      "source": [
        "cluster_resolver = tf.distribute.cluster_resolver.TPUClusterResolver(tpu='')\n",
        "tf.config.experimental_connect_to_cluster(cluster_resolver)\n",
        "tf.tpu.experimental.initialize_tpu_system(cluster_resolver)\n",
        "print(\"All devices: \", tf.config.list_logical_devices('TPU'))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "R4EHXhN3CVmo"
      },
      "source": [
        "다음으로, 데이터가 준비되면 `TPUStrategy` 를 만들고 이 전략의 범위에서 모델, 메트릭 및 옵티마이저를 정의합니다.\n",
        "\n",
        "`TPUStrategy` 비슷한 훈련 속도를 얻으려면 `tf.function` 호출 중에 실행할 배치 수를 지정하고 성능에 중요하기 `steps_per_execution` 에서 `Model.compile` 대한 숫자를 선택해야 합니다. 이 인수는 `TPUEstimator` 에서 사용되는 `iterations_per_loop` 와 유사합니다. 사용자 지정 훈련 루프를 사용하는 경우 `tf.function` -ed 훈련 함수 내에서 여러 단계를 실행해야 합니다. [자세한 내용은 TPU](../../guide/tpu.ipynb) 사용 가이드의 tf.function 섹션에서 *여러 단계로 성능 향상* 을 참조하세요.\n",
        "\n",
        "`tf.distribute.TPUStrategy` 는 경계가 있는 동적 모양을 지원할 수 있으며, 이는 동적 모양 계산의 상한을 유추할 수 있는 경우입니다. 그러나 동적 모양은 정적 모양에 비해 약간의 성능 오버헤드를 유발할 수 있습니다. 따라서, 특히 훈련에서 가능하면 입력 모양을 정적으로 만드는 것이 일반적으로 권장됩니다. 스트림에 남아 있는 샘플 수가 배치 크기보다 작을 수 있으므로 동적 모양을 반환하는 일반적인 작업 중 하나는 `tf.data.Dataset.batch(batch_size)` 따라서 TPU에서 훈련할 때 최상의 훈련 성능을 위해 `tf.data.Dataset.batch(..., drop_remainder=True)`"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "atVciNgPs0fw"
      },
      "outputs": [],
      "source": [
        "dataset = tf.data.Dataset.from_tensor_slices(\n",
        "    (features, labels)).shuffle(10).repeat().batch(\n",
        "        8, drop_remainder=True).prefetch(2)\n",
        "eval_dataset = tf.data.Dataset.from_tensor_slices(\n",
        "    (eval_features, eval_labels)).batch(1, drop_remainder=True)\n",
        "\n",
        "strategy = tf.distribute.TPUStrategy(cluster_resolver)\n",
        "with strategy.scope():\n",
        "  model = tf.keras.models.Sequential([tf.keras.layers.Dense(1)])\n",
        "  optimizer = tf.keras.optimizers.Adagrad(learning_rate=0.05)\n",
        "  model.compile(optimizer, \"mse\", steps_per_execution=10)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "FkM2VZyni98F"
      },
      "source": [
        "이것으로 훈련 데이터 세트로 모델을 훈련할 준비가 되었습니다."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "Kip65sYBlKiu"
      },
      "outputs": [],
      "source": [
        "model.fit(dataset, epochs=5, steps_per_epoch=10)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "r0AEK8sNjLOj"
      },
      "source": [
        "마지막으로 평가 데이터 세트를 사용하여 모델을 평가합니다."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "6tMRkyfKhqSL"
      },
      "outputs": [],
      "source": [
        "model.evaluate(eval_dataset, return_dict=True)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "67ec4d3f35d6"
      },
      "source": [
        "## 다음 단계"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "gHx_RUL8xcJ3"
      },
      "source": [
        "`TPUStrategy` 에 대해 자세히 알아보려면 다음 리소스를 고려하세요.\n",
        "\n",
        "- 가이드 : [사용 TPU에](../../guide/tpu.ipynb) (Keras와 교육 커버 `Model.fit` /와 사용자 정의 교육 루프 `tf.distribute.TPUStrategy` 와 성능 개선뿐만 아니라 팁을 `tf.function` )\n",
        "- 가이드: [TensorFlow를 사용한 분산 교육](../../guide/distributed_training.ipynb)\n",
        "\n",
        "훈련 사용자 지정에 대한 자세한 내용은 다음을 참조하십시오.\n",
        "\n",
        "- 가이드: [Model.fit에서 발생하는 작업 사용자 지정](../..guide/keras/customizing_what_happens_in_fit.ipynb)\n",
        "- 가이드: [처음부터 훈련 루프 작성하기](https://www.tensorflow.org/guide/keras/writing_a_training_loop_from_scratch)\n",
        "\n",
        "기계 학습을 위한 Google의 특수 ASIC인 TPU는 [Google Colab](https://colab.research.google.com/) [, TPU Research Cloud](https://sites.research.google/trc/) 및 [Cloud TPU를](https://cloud.google.com/tpu) 통해 사용할 수 있습니다."
      ]
    }
  ],
  "metadata": {
    "accelerator": "TPU",
    "colab": {
      "collapsed_sections": [],
      "name": "tpu_estimator.ipynb",
      "toc_visible": true
    },
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}

{'fraction_non_alphanumeric': 0.1674641148325359, 'fraction_numerical': 0.009421015540966582, 'mean_word_length': 2.189259522119707, 'pattern_counts': {'":': 298, '<': 47, '<?xml version=': 0, '>': 47, 'https://': 28, 'lorem ipsum': 0, 'www.': 16, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5819198', 'n_tokens_mistral': 12203, 'n_tokens_neox': 13252, 'n_words': 2004}