From 5d8c7a3edf12d9f5961fb257e2f14fd0d7ebde33 Mon Sep 17 00:00:00 2001 From: Fabian Pedregosa Date: Mon, 25 Mar 2024 03:34:05 -0700 Subject: [PATCH] [DOC] Add to the gallery an example on a small language model This example demonstrates how to train a small-scale transformer-based language model (inspired by NanoGPT) on the Tiny Shakespeare dataset. The core idea is to train a model that can predict the next character in a sequence of text based on the characters that came before it. PiperOrigin-RevId: 618788255 --- docs/conf.py | 2 + docs/gallery.rst | 17 + docs/images/examples/tiny_shakespeare.png | Bin 0 -> 113530 bytes examples/nanolm.ipynb | 733 ++++++++++++++++++++++ 4 files changed, 752 insertions(+) create mode 100644 docs/images/examples/tiny_shakespeare.png create mode 100644 examples/nanolm.ipynb diff --git a/docs/conf.py b/docs/conf.py index 49599bfd..7dc4bd3c 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -227,6 +227,7 @@ def new_process_docstring(app, what, name, obj, options, lines): nb_execution_allow_errors = False nb_execution_excludepatterns = [ # slow examples + 'nanolm.ipynb', 'cifar10_resnet.ipynb', 'adversarial_training.ipynb', 'reduce_on_plateau.ipynb', @@ -296,6 +297,7 @@ def linkcode_resolve(domain, info): intersphinx_mapping = { 'jax': ('https://jax.readthedocs.io/en/latest/', None), + 'flax': ('https://flax.readthedocs.io/en/latest/', None), } source_suffix = ['.rst', '.md', '.ipynb'] diff --git a/docs/gallery.rst b/docs/gallery.rst index c99dc1e6..85cc08b2 100644 --- a/docs/gallery.rst +++ b/docs/gallery.rst @@ -150,6 +150,23 @@
Adversarial training of CNN on MNIST.
+ +.. raw:: html + +
+ +.. only:: html + + .. image:: /images/examples/tiny_shakespeare.png + :alt: Character-level Transformer on Tiny Shakespeare + + :doc:`_collections/examples/nanolm` + +.. raw:: html + +
Character-level Transformer on Tiny Shakespeare.
+
+ .. raw:: html diff --git a/docs/images/examples/tiny_shakespeare.png b/docs/images/examples/tiny_shakespeare.png new file mode 100644 index 0000000000000000000000000000000000000000..62e9571bac2363cc6b5bd363e9f99838459f265b GIT binary patch literal 113530 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 Ve%eE)X)^G4MP2W5@g-E?{{Tqh7}Nj& literal 0 HcmV?d00001 diff --git a/examples/nanolm.ipynb b/examples/nanolm.ipynb new file mode 100644 index 00000000..90d22d4d --- /dev/null +++ b/examples/nanolm.ipynb @@ -0,0 +1,733 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "xpfwcMJHTtfw" + }, + "source": [ + "\n", + "# Character-level Transformer on Tiny Shakespeare\n", + "\n", + "[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.sandbox.google.com/github/google-deepmind/optax/blob/main/examples/nanolm.ipynb)\n", + "\n", + "This example demonstrates how to train a small-scale transformer-based language model (inspired by NanoGPT) on the Tiny Shakespeare dataset. The core idea is to train a model that can predict the next character in a sequence of text based on the characters that came before it.\n", + "\n", + "**Why the Tiny Shakespeare Dataset?**\n", + "\n", + "* **Manageable Size:** Since we're building a small-scale model, the Tiny Shakespeare dataset provides a suitable training corpus without overwhelming computational resources.\n", + "* **Linguistic Complexity:** Shakespeare's works offer a rich vocabulary and interesting grammatical patterns, making the dataset a good testbed for our model's language learning abilities.\n", + "* **Accessibility:** Easily accessible through [TensorFlow Datasets](https://www.tensorflow.org/datasets).\n", + "\n", + "**Libraries Used**\n", + "\n", + "* **JAX:** Provides the foundation for numerical computations and automatic differentiation.\n", + "* **Tensorflow Datasets (`tfds`)** Offers easy access to the Tiny Shakespeare dataset.\n", + "* **Flax's Linen Module:** Provides building blocks for defining our neural network architecture.\n", + "* **Optax:** Contains a library of optimization algorithms for training the model's parameters. In this example we'll use the {py:func}`optax.adamw` solver." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "jIabArrRWFw0", + "outputId": "75c89cb3-35ca-4217-a8e0-4b45f9efe31f", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "JAX running on GPU\n" + ] + } + ], + "source": [ + "import functools\n", + "\n", + "import flax.linen as nn\n", + "import jax\n", + "import jax.numpy as jnp\n", + "from matplotlib import pyplot as plt\n", + "import optax\n", + "import tensorflow_datasets as tfds\n", + "\n", + "# platform check\n", + "print(\"JAX running on\", jax.devices()[0].platform.upper())" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "UhFD-uojcAI6" + }, + "source": [ + "# Hyperparameters and dataset download\n", + "\n", + "Next, we set some important hyperparameters. This includes hyperparameters for the training process such as the learning rate `LEARNING_RATE` and the batch size `BATCH_SIZE`, as well as model parameters such as the context window size `BLOCK_SIZE` and the number of layers `NUM_LAYERS`.\n", + "\n", + "\n", + "After setting these, we load the Tiny Shakespeare dataset and print the length of the training set, which is around one million characters, and that of the validation set (around 50k characters). Finally, we print a small snippet of the train set." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "34pKN_bIXt8O" + }, + "outputs": [], + "source": [ + "# @markdown Random seed:\n", + "SEED = 42 # @param{type:\"integer\"}\n", + "# @markdown Learning rate passed to the optimizer:\n", + "LEARNING_RATE = 5e-3 # @param{type:\"number\"}\n", + "# @markdown Batch size:\n", + "BATCH_SIZE = 128 # @param{type:\"integer\"}\n", + "# @markdown Numer of training iterations:\n", + "N_ITERATIONS = 50_000 # @param{type:\"integer\"}\n", + "# @markdown Number of training iterations between two consecutive evaluations:\n", + "N_FREQ_EVAL = 2_000 # @param{type:\"integer\"}\n", + "# @markdown Batch size\n", + "BATCH_SIZE = 512 # @param{type:\"integer\"}\n", + "# @markdown Rate for dropout in the transformer model\n", + "DROPOUT_RATE = 0.2 # @param{type:\"number\"}\n", + "# @markdown Context window for the transformer model\n", + "BLOCK_SIZE = 64 # @param{type:\"integer\"}\n", + "# @markdown Number of layer for the transformer model\n", + "NUM_LAYERS = 6 # @param{type:\"integer\"}\n", + "# @markdown Size of the embedding for the transformer model\n", + "EMBED_SIZE = 256 # @param{type:\"integer\"}\n", + "# @markdown Number of heads for the transformer model\n", + "NUM_HEADS = 8 # @param{type:\"integer\"}\n", + "# @markdown Size of the heads for the transformer model\n", + "HEAD_SIZE = 32 # @param{type:\"integer\"}\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "mghpbB9653Gw" + }, + "outputs": [], + "source": [ + "ds = tfds.load(\"tiny_shakespeare\")\n", + "\n", + "# combine train and test examples into a single string\n", + "text_train = \"\"\n", + "for example in ds[\"train\"].concatenate(ds[\"test\"]).as_numpy_iterator():\n", + " text_train += example[\"text\"].decode(\"utf-8\")\n", + "\n", + "# similarly, create a single string for validation\n", + "text_validation = \"\"\n", + "for example in ds[\"validation\"].as_numpy_iterator():\n", + " text_validation += example[\"text\"].decode(\"utf-8\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "USiJ0GjWSPu_", + "outputId": "bd033bb3-1c6a-4dc4-a1e3-b38a04dd43c0", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Length of text for training: 1_059_624 characters\n", + "Length of text for validation: 55_770 characters\n" + ] + } + ], + "source": [ + "print(f\"Length of text for training: {len(text_train):_} characters\")\n", + "print(f\"Length of text for validation: {len(text_validation):_} characters\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "wOq-djQ9cueI", + "outputId": "8d639dad-b1df-4536-8f74-bed86a869201", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "First Citizen:\n", + "Before we proceed any further, hear me speak.\n", + "\n", + "All:\n", + "Speak, speak.\n", + "\n", + "First Citizen:\n", + "You are all resolved rather to die than to famish?\n", + "\n", + "All:\n", + "Resolved. resolved.\n", + "\n", + "First Citizen:\n", + "First, you know Caius Marcius is chief enemy to the people.\n", + "\n", + "All:\n", + "We know't, we know't.\n", + "\n", + "First Citizen:\n", + "Let us kill him, and we'll have corn at our own price.\n", + "Is't a verdict?\n", + "\n", + "All:\n", + "No more talking on't; let it be done: away, away!\n", + "\n", + "Second Citizen:\n", + "One word, good citizens.\n", + "\n", + "First Citizen:\n", + "We are accounted poor citizens, the patricians good.\n", + "What authority surfeits on would relieve us: if they\n", + "would yield us but the superfluity, while it were\n", + "wholesome, we might guess they relieved us humanely;\n", + "but they think we are too dear: the leanness that\n", + "afflicts us, the object of our misery, is as an\n", + "inventory to particularise their abundance; our\n", + "sufferance is a gain to them Let us revenge this with\n", + "our pikes, ere we become rakes: for the gods know I\n", + "speak this in hunger for bread, not in thirst for revenge.\n", + "\n", + "\n" + ] + } + ], + "source": [ + "# small sample of the train set\n", + "print(text_train[:1000])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "FguiERfTcEPa" + }, + "source": [ + "# Data preparation\n", + "\n", + "To prepare the data for the model, we first create a vocabulary consisting of all the unique characters in the dataset. We print that vocabulary and its size.\n", + "\n", + "We then define encoding and decoding functions to convert text into sequences of integers (representing our characters) and vice versa.\n", + "\n", + "Finally, we define a function `get_batch` that returns random mini-batches of data. This function uses JAX's {py:func}`jax.lax.dynamic_slice` function to efficiently handle sequences of varying lengths within batches. The `@jax.jit` decorator compiles this function for faster execution. The function randomly samples a batch from the data and prepares input sequences (`x`) and target sequences (`y`). The target sequence is simply the input sequence shifted by one position, as the goal of the language model is to predict the next character given the previous ones.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "rESkNoDXFE-4", + "outputId": "42579042-716c-4101-cf08-14ebefa6c984", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Vocabulary:, \n", + " !$\u0026',-.3:;?ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\n", + "Length of vocabulary: 65\n" + ] + } + ], + "source": [ + "vocab = sorted(list(set(text_train)))\n", + "print(\"Vocabulary:, \", \"\".join(vocab))\n", + "print(\"Length of vocabulary: \", len(vocab))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "F-LSTr86bXrV" + }, + "outputs": [], + "source": [ + "# create a mapping from characters to integers\n", + "stoi = {ch: i for i, ch in enumerate(vocab)}\n", + "itos = {i: ch for i, ch in enumerate(vocab)}\n", + "encode = lambda s: [\n", + " stoi[c] for c in s\n", + "] # encoder: take a string, output a list of integers\n", + "decode = lambda l: \"\".join(\n", + " [itos[i] for i in l]\n", + ") # decoder: take a list of integers, output a string\n", + "\n", + "# encode train and validation data\n", + "train_data = jnp.array(encode(text_train))\n", + "eval_data = jnp.array(encode(text_validation))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "tZLP1asmb8WY" + }, + "outputs": [], + "source": [ + "dynamic_slice_vmap = jax.vmap(jax.lax.dynamic_slice, in_axes=(None, 0, None))\n", + "\n", + "\n", + "@jax.jit\n", + "def get_batch(random_key, data):\n", + " \"\"\"Prepares a random batch of training data.\n", + "\n", + " Args:\n", + " random_key: A random seed for sampling a batch.\n", + " data: The complete training dataset.\n", + "\n", + " Returns:\n", + " x: Input sequences.\n", + " y: Target sequences (shifted inputs).\n", + " \"\"\"\n", + " ix = jax.random.randint(\n", + " random_key, shape=(BATCH_SIZE, 1), minval=0, maxval=len(data) - BLOCK_SIZE\n", + " )\n", + " x = dynamic_slice_vmap(data, ix, (BLOCK_SIZE,))\n", + " y = dynamic_slice_vmap(data, ix + 1, (BLOCK_SIZE,))\n", + " return x, y" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "PQfTaf2UcTSc" + }, + "source": [ + "# NanoLM Model Definition\n", + "\n", + "The NanoLM model itself is defined as a Flax Linen module. The core of the model is a Transformer architecture, designed for sequence-to-sequence tasks like language modeling. Key parameters of the model, such as the number of layers, attention heads, and embedding size, are specified here.\n", + "\n", + "Inside the model's `__call__` method, we first embed our input characters into vector representations. Positional embeddings are added to provide the model with a sense of order in the sequence. The core of the Transformer consists of multiple layers. Each layer has two main components:\n", + "\n", + " * **Multi-Head Attention**: This mechanism allows the model to \"attend\" to different parts of the input sequence, improving its understanding of context and relationships within the text. In the code this is implemented through the {py:class}`flax.linen.MultiHeadDotProductAttention` class.\n", + "\n", + " * **Feedforward Network**: This network processes the output of the attention layer, applying non-linear transformations to further learn complex patterns in the data. This is implemented through the {py:class}`flax.linen.Sequential` class.\n", + "\n", + "Normalization and dropout (for regularization) are used within the layers to improve training stability. Finally, a dense layer maps the model's output to the vocabulary size, producing probabilities for each character as the next potential character.\n", + "\n", + "The generate function enables the model to create new text sequences. It iteratively generates one character at a time, conditioned on the previously generated text.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "-c7M35UaYMyD" + }, + "outputs": [], + "source": [ + "class NanoLM(nn.Module):\n", + " \"\"\"NanoLM model.\"\"\"\n", + " vocab_size: int\n", + " num_layers: int = 6\n", + " num_heads: int = 8\n", + " head_size: int = 32\n", + " dropout_rate: float = 0.2\n", + " embed_size: int = 256\n", + " block_size: int = 64\n", + "\n", + " @nn.compact\n", + " def __call__(self, x, training: bool):\n", + " seq_len = x.shape[1]\n", + "\n", + " x = nn.Embed(self.vocab_size, self.embed_size)(x) + nn.Embed(\n", + " self.block_size, self.embed_size\n", + " )(jnp.arange(seq_len))\n", + " for _ in range(self.num_layers):\n", + " x_norm = nn.LayerNorm()(x)\n", + " x = x + nn.MultiHeadDotProductAttention(\n", + " num_heads=self.num_heads,\n", + " qkv_features=self.head_size,\n", + " out_features=self.head_size * self.num_heads,\n", + " dropout_rate=self.dropout_rate,\n", + " )(\n", + " x_norm,\n", + " x_norm,\n", + " mask=jnp.tril(jnp.ones((x.shape[-2], x.shape[-2]))),\n", + " deterministic=not training,\n", + " )\n", + "\n", + " x = x + nn.Sequential([\n", + " nn.Dense(4 * self.embed_size),\n", + " nn.relu,\n", + " nn.Dropout(self.dropout_rate, deterministic=not training),\n", + " nn.Dense(self.embed_size),\n", + " ])(nn.LayerNorm()(x))\n", + "\n", + " x = nn.LayerNorm()(x)\n", + " return nn.Dense(self.vocab_size)(x)\n", + "\n", + " @functools.partial(jax.jit, static_argnames=(\"self\", \"length\"))\n", + " def generate(self, rng, params, length):\n", + " def _scan_generate(carry, _):\n", + " random_key, context = carry\n", + " logits = self.apply(params, context, training=False)\n", + " rng, rng_subkey = jax.random.split(random_key)\n", + " new_token = jax.random.categorical(\n", + " rng_subkey, logits[:, -1, :], axis=-1, shape=(1, 1)\n", + " )\n", + " context = jnp.concatenate([context[:, 1:], new_token], axis=1)\n", + " return (rng, context), new_token\n", + "\n", + " _, new_tokens = jax.lax.scan(\n", + " _scan_generate,\n", + " (rng, jnp.zeros((1, self.block_size), dtype=jnp.int32)),\n", + " (),\n", + " length=length,\n", + " )\n", + " return new_tokens" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ylVNKEhscy9d" + }, + "source": [ + "# State, Optimizer, and Loss Definition\n", + "\n", + "This section initializes the model's parameters, defines the loss function used for language modeling, and sets up the training and evaluation processes.\n", + "\n", + "In this case the loss function `loss_fun` is the cross-entropy. It uses dropout for regularization, introduced via the `rngs={\"dropout\": dropout_key}` argument. We also define a function for evaluating the model's performance on unseen data (`eval_step`)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "sjSnK3yDYIus" + }, + "outputs": [], + "source": [ + "model = NanoLM(\n", + " vocab_size=len(vocab),\n", + " num_layers=NUM_LAYERS,\n", + " num_heads=NUM_HEADS,\n", + " head_size=HEAD_SIZE,\n", + " dropout_rate=DROPOUT_RATE,\n", + " embed_size=EMBED_SIZE,\n", + " block_size=BLOCK_SIZE,\n", + ")\n", + "\n", + "def loss_fun(params, x, y, dropout_key):\n", + " logits = model.apply(params, x, training=True, rngs={\"dropout\": dropout_key})\n", + " return optax.softmax_cross_entropy_with_integer_labels(\n", + " logits=logits, labels=y\n", + " ).mean()\n", + "\n", + "\n", + "@jax.jit\n", + "def eval_step(params, x, y):\n", + " logits = model.apply(params, x, training=False)\n", + " return optax.softmax_cross_entropy_with_integer_labels(\n", + " logits=logits, labels=y\n", + " ).mean()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "ejU1Yt8XIH80" + }, + "outputs": [], + "source": [ + "key = jax.random.PRNGKey(SEED)\n", + "key, subkey = jax.random.split(key)\n", + "\n", + "var_params = model.init(\n", + " key,\n", + " jnp.ones((BATCH_SIZE, BLOCK_SIZE), dtype=jnp.int32),\n", + " training=False,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "kgSjWONs4eFp" + }, + "source": [ + "We've now instatiated a NanoLM model with the following number of parameters" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "9Ckqdkd6QVsl", + "outputId": "2c202753-b938-4148-992c-cc63077be607", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Total number of parameters: 3_408_513\n" + ] + } + ], + "source": [ + "n_params = sum(p.size for p in jax.tree_util.tree_leaves(var_params))\n", + "\n", + "print(f\"Total number of parameters: {n_params:_}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "vreyB_oo4Zch" + }, + "source": [ + "# Model training\n", + "\n", + "We start by creating an optimizer and instantiating its state. In this case we'll use {py:func}`optax.adamw` but it's possible to replace this with other optax optimizers.\n", + "\n", + "\n", + "We then proceeded to the training loop. For maximum efficiency we extracted the most computationally intensive tasks inside the `step` function and just-in-time compile this function using `@jax.jit`. This allows JAX to perform some optimizations in our code and generally achieve a much higher efficiency than without.\n", + "\n", + "Inside the training loop, we call the aforementioned `step` functions, as well as computing accuracy on a validation set every `N_FREQ_EVAL` iterations." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "1xwLpjDxccMi" + }, + "outputs": [], + "source": [ + "# To run with SGD instead of adam, replace `adam` with `sgd`\n", + "opt = optax.adamw(learning_rate=LEARNING_RATE)\n", + "\n", + "opt_state = opt.init(var_params)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "DhnK0G7AQUCA", + "outputId": "37b5a3bd-c0bc-47c2-a828-62356ab4cbe5" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Step: 0\t train loss: 4.586461067199707\t eval loss: 6.037547588348389\n", + "Step: 2000\t train loss: 1.3876519203186035\t eval loss: 1.4252502918243408\n", + "Step: 4000\t train loss: 1.280821442604065\t eval loss: 1.4000993967056274\n", + "Step: 6000\t train loss: 1.1978516578674316\t eval loss: 1.4045076370239258\n", + "Step: 8000\t train loss: 1.177159070968628\t eval loss: 1.387284278869629\n", + "Step: 10000\t train loss: 1.1472305059432983\t eval loss: 1.423332929611206\n", + "Step: 12000\t train loss: 1.107376217842102\t eval loss: 1.4390857219696045\n", + "Step: 14000\t train loss: 1.096900224685669\t eval loss: 1.474606990814209\n", + "Step: 16000\t train loss: 1.0772775411605835\t eval loss: 1.4595460891723633\n", + "Step: 18000\t train loss: 1.050074577331543\t eval loss: 1.4540534019470215\n", + "Step: 20000\t train loss: 1.0540519952774048\t eval loss: 1.4794009923934937\n", + "Step: 22000\t train loss: 1.035787582397461\t eval loss: 1.5094046592712402\n", + "Step: 24000\t train loss: 1.0402700901031494\t eval loss: 1.5403311252593994\n", + "Step: 26000\t train loss: 1.0363699197769165\t eval loss: 1.5168808698654175\n", + "Step: 28000\t train loss: 1.0000224113464355\t eval loss: 1.5624736547470093\n", + "Step: 30000\t train loss: 0.9905486106872559\t eval loss: 1.5720288753509521\n", + "Step: 32000\t train loss: 0.9986284971237183\t eval loss: 1.526949167251587\n", + "Step: 34000\t train loss: 0.9822986125946045\t eval loss: 1.5732147693634033\n", + "Step: 36000\t train loss: 0.9837050437927246\t eval loss: 1.6341228485107422\n", + "Step: 38000\t train loss: 0.9723658561706543\t eval loss: 1.542256474494934\n", + "Step: 40000\t train loss: 0.9632444977760315\t eval loss: 1.5658419132232666\n", + "Step: 42000\t train loss: 0.9664344787597656\t eval loss: 1.6112396717071533\n", + "Step: 44000\t train loss: 0.9476494789123535\t eval loss: 1.6128767728805542\n", + "Step: 46000\t train loss: 0.9473679065704346\t eval loss: 1.5689520835876465\n", + "Step: 48000\t train loss: 0.9642226696014404\t eval loss: 1.5935924053192139\n", + "CPU times: user 15min 19s, sys: 9min 8s, total: 24min 27s\n", + "Wall time: 22min 48s\n" + ] + } + ], + "source": [ + "%%time\n", + "\n", + "all_train_losses = []\n", + "all_eval_losses = []\n", + "\n", + "# we define one iteration of the optimizer and JIT this function\n", + "@jax.jit\n", + "def step(key, params, opt_state):\n", + " key, subkey = jax.random.split(key)\n", + " batch = get_batch(key, train_data)\n", + " loss, grad = jax.value_and_grad(loss_fun)(params, *batch, subkey)\n", + " updates, opt_state = opt.update(grad, opt_state, params)\n", + " params = optax.apply_updates(params, updates)\n", + " return params, key, opt_state, loss\n", + "\n", + "\n", + "for i in range(N_ITERATIONS):\n", + " var_params, key, opt_state, loss = step(key, var_params, opt_state)\n", + " all_train_losses.append(loss)\n", + "\n", + " # once every N_FREQ_EVAL we compute loss on the validation set\n", + " if i % N_FREQ_EVAL == 0:\n", + " key, subkey = jax.random.split(key)\n", + " eval_loss = eval_step(var_params, *get_batch(subkey, eval_data))\n", + " all_eval_losses.append(eval_loss)\n", + " print(f\"Step: {i}\\t train loss: {loss}\\t eval loss: {eval_loss}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 472 + }, + "id": "Gc-V4kAKAA9q", + "outputId": "68b59bf2-9621-4c2e-e0e0-be665d19630e" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u003cFigure size 640x480 with 1 Axes\u003e" + ], + "image/png": "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\n" + }, + "metadata": {} + } + ], + "source": [ + "plt.title(f\"Convergence of adamw (train loss)\")\n", + "plt.plot(all_train_losses, label=\"train\", lw=3)\n", + "plt.plot(\n", + " jnp.arange(0, len(all_eval_losses) * N_FREQ_EVAL, N_FREQ_EVAL),\n", + " all_eval_losses,\n", + " label=\"test\",\n", + " lw=3,\n", + ")\n", + "plt.xlabel(\"steps\")\n", + "plt.ylabel(\"loss\")\n", + "plt.grid()\n", + "plt.legend(frameon=False)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "E6-aaLDL7RbI" + }, + "source": [ + "# Text generation\n", + "\n", + "Finally, after training, we use the generate function to let the NanoGPT model demonstrate its ability to create text that resembles Shakespeare, albeit in a miniature form." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "6AejKtZnFmhK", + "outputId": "78e7b13f-28ff-4786-e206-bcd104e3c507" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "GREMIO:\n", + "So called, officer:\n", + "Peace, for me would be a mighty heart, and I'll do\n", + "any good.\n", + "\n", + "MERCUTIO:\n", + "Ay, look'd dead made.\n", + "\n", + "VALERIA:\n", + "Rather is in the present book of love\n", + "Than piece thy thoughts to shame, but yet book known\n", + "Where my Edward, whom I so could do it to him;\n", + "And see how the government of your blood,\n", + "Congeal'd your kingdom then we resign your highness;\n", + "Unless you scarcely know how I came, his wife;\n", + "And I may contain a little of England's heart\n", + "After a king of disdain! supect, tribunes,\n", + "The sun under thine is too large:\n", + "The senators do add to their trenches stretch'd,\n", + "With such as a toy, or be it known, I would\n", + "See my shame home, sweet friends, we are too dear:\n", + "Tell me consul, what's become the soldiers?\n", + "\n", + "SOMERSET:\n", + "So fled; alas! much is possess'd by this means?\n", + "Away with the nightingale. He hast he wounded his sceptre\n", + "And hide his heir: go hence, to have his hearts\n", + "To close our bloods, for the climate to be\n", + "Ere one would be so often been seen, a greater stranger\n", + "Can have you \n" + ] + } + ], + "source": [ + "# Let's now generate some text\n", + "key, subkey = jax.random.split(key)\n", + "text = model.generate(key, var_params, 1000)[:, 0, 0].tolist()\n", + "print(decode(text))" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "gpuType": "A100", + "machine_shape": "hm", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +}