{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "a7QBk71UMifh" }, "source": [ "# Part 5: Meta-training with GradientLearner" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "MimfK6lp0vq9" }, "outputs": [], "source": [ "import numpy as np\n", "import jax.numpy as jnp\n", "import jax\n", "from matplotlib import pylab as plt\n", "\n", "from learned_optimization.outer_trainers import full_es\n", "from learned_optimization.outer_trainers import truncated_pes\n", "from learned_optimization.outer_trainers import gradient_learner\n", "from learned_optimization.outer_trainers import truncation_schedule\n", "from learned_optimization.outer_trainers import lopt_truncated_step\n", "\n", "from learned_optimization.tasks import quadratics\n", "from learned_optimization.tasks.fixed import image_mlp\n", "from learned_optimization.tasks import base as tasks_base\n", "\n", "from learned_optimization.learned_optimizers import base as lopt_base\n", "from learned_optimization.learned_optimizers import mlp_lopt\n", "from learned_optimization.optimizers import base as opt_base\n", "\n", "from learned_optimization import optimizers\n", "from learned_optimization import training\n", "from learned_optimization import eval_training\n", "\n", "import haiku as hk\n", "import tqdm" ] }, { "cell_type": "markdown", "metadata": { "id": "vlBAN6agtoXy" }, "source": [ "In this notebook we build upon the previous notebook which discussed `TruncationSchedule` and `GradientEstimator`. Here, we leverage these components to provide more complete training functionality.\n", "We do not provide a full fledged training program -- only the computations that would need to be performed each iteration of meta-training.\n", "\n", "This code is **not** the only way to use the previous abstractions but can be convenient to avoid writing the same code over and over again. We encourage readers to write their own meta-training loops before diving into these abstractions." ] }, { "cell_type": "markdown", "metadata": { "id": "a5iG2qpC8ttu" }, "source": [ "## Single machine meta-training: `SingleMachineGradientLearner`\n", "\n", "The `SingleMachineGradientLearner` provides the functionality to meta-train a learned optimizer with one or more gradient estimator. As an example, let's train a learned optimizer leveraging gradients from 2 different tasks: a quadratic task, and a fashion mnist mlp." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "txx2_SmH8NhL" }, "outputs": [], "source": [ "theta_opt = opt_base.Adam(1e-3)\n", "\n", "lopt = mlp_lopt.MLPLOpt()\n", "max_length = 300\n", "trunc_sched = truncation_schedule.LogUniformLengthSchedule(\n", " min_length=100, max_length=max_length)\n", "\n", "\n", "def grad_est_fn(task_family):\n", " truncated_step = lopt_truncated_step.VectorizedLOptTruncatedStep(\n", " task_family,\n", " lopt,\n", " trunc_sched,\n", " num_tasks=4,\n", " random_initial_iteration_offset=max_length)\n", " return truncated_pes.TruncatedPES(\n", " truncated_step=truncated_step, trunc_length=50)\n", "\n", "\n", "mlp_task_family = tasks_base.single_task_to_family(\n", " image_mlp.ImageMLP_FashionMnist8_Relu32())\n", "\n", "gradient_estimators = [\n", " grad_est_fn(quadratics.FixedDimQuadraticFamily(10)),\n", " grad_est_fn(mlp_task_family),\n", "]\n", "\n", "outer_trainer = gradient_learner.SingleMachineGradientLearner(\n", " lopt, gradient_estimators, theta_opt)" ] }, { "cell_type": "markdown", "metadata": { "id": "IKmWbqwhkxLp" }, "source": [ "To use this, we must first construct the initial state which contains a randomly initialized learned optimizer, as well as all the initial state of all the inner-problems (in this case, one set for the quadratics being trained, and the other from the MLP being trained)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "executionInfo": { "elapsed": 2924, "status": "ok", "timestamp": 1647562738598, "user": { "displayName": "", "photoUrl": "", "userId": "" }, "user_tz": 240 }, "id": "N78WoigVkmUb", "outputId": "9c275261-c03f-4de4-804f-b48efd1ea4ed" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [] }, { "data": { "text/plain": [ "SingleMachineState(gradient_learner_state=GradientLearnerState(theta_opt_state=OptaxState(params={'mlp/~/linear_0': {'b': (32,), 'w': (19, 32)}, 'mlp/~/linear_1': {'b': (32,), 'w': (32, 32)}, 'mlp/~/linear_2': {'b': (2,), 'w': (32, 2)}}, state=None, optax_opt_state=(ScaleByAdamState(count=(), mu={'mlp/~/linear_0': {'b': (32,), 'w': (19, 32)}, 'mlp/~/linear_1': {'b': (32,), 'w': (32, 32)}, 'mlp/~/linear_2': {'b': (2,), 'w': (32, 2)}}, nu={'mlp/~/linear_0': {'b': (32,), 'w': (19, 32)}, 'mlp/~/linear_1': {'b': (32,), 'w': (32, 32)}, 'mlp/~/linear_2': {'b': (2,), 'w': (32, 2)}}), EmptyState()), iteration=())), gradient_estimator_states=[PESWorkerState(pos_state=TruncatedUnrollState(inner_opt_state=MLPLOptState(params=(4, 10), rolling_features=MomAccumulator(m=(4, 10, 6), t=(4, 6)), iteration=(4,), state=None), inner_step=(4,), truncation_state=ConstantTruncationState(length=(4,)), task_param=(4, 10), is_done=(4,)), neg_state=TruncatedUnrollState(inner_opt_state=MLPLOptState(params=(4, 10), rolling_features=MomAccumulator(m=(4, 10, 6), t=(4, 6)), iteration=(4,), state=None), inner_step=(4,), truncation_state=ConstantTruncationState(length=(4,)), task_param=(4, 10), is_done=(4,)), accumulator={'mlp/~/linear_0': {'b': (4, 32), 'w': (4, 19, 32)}, 'mlp/~/linear_1': {'b': (4, 32), 'w': (4, 32, 32)}, 'mlp/~/linear_2': {'b': (4, 2), 'w': (4, 32, 2)}}), PESWorkerState(pos_state=TruncatedUnrollState(inner_opt_state=MLPLOptState(params={'mlp/~/linear_0': {'b': (4, 32), 'w': (4, 64, 32)}, 'mlp/~/linear_1': {'b': (4, 10), 'w': (4, 32, 10)}}, rolling_features=MomAccumulator(m={'mlp/~/linear_0': {'b': (4, 32, 6), 'w': (4, 64, 32, 6)}, 'mlp/~/linear_1': {'b': (4, 10, 6), 'w': (4, 32, 10, 6)}}, t=(4, 6)), iteration=(4,), state=None), inner_step=(4,), truncation_state=ConstantTruncationState(length=(4,)), task_param=(4,), is_done=(4,)), neg_state=TruncatedUnrollState(inner_opt_state=MLPLOptState(params={'mlp/~/linear_0': {'b': (4, 32), 'w': (4, 64, 32)}, 'mlp/~/linear_1': {'b': (4, 10), 'w': (4, 32, 10)}}, rolling_features=MomAccumulator(m={'mlp/~/linear_0': {'b': (4, 32, 6), 'w': (4, 64, 32, 6)}, 'mlp/~/linear_1': {'b': (4, 10, 6), 'w': (4, 32, 10, 6)}}, t=(4, 6)), iteration=(4,), state=None), inner_step=(4,), truncation_state=ConstantTruncationState(length=(4,)), task_param=(4,), is_done=(4,)), accumulator={'mlp/~/linear_0': {'b': (4, 32), 'w': (4, 19, 32)}, 'mlp/~/linear_1': {'b': (4, 32), 'w': (4, 32, 32)}, 'mlp/~/linear_2': {'b': (4, 2), 'w': (4, 32, 2)}})])" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "key = jax.random.PRNGKey(0)\n", "outer_trainer_state = outer_trainer.init(key)\n", "jax.tree_util.tree_map(lambda x: jnp.asarray(x).shape, outer_trainer_state)" ] }, { "cell_type": "markdown", "metadata": { "id": "bR6qSqckl6XG" }, "source": [ "This SingleMachineState contains the state of the `gradient_learner` (or the weights of the learned optimizer being trained as well as any variables needed to train these weights such as momentums (`theta_opt_state`).\n", "It also contains the `gradient_estimator_states` which is a list containing the states of each gradient estimator.\n", "\n", "We can train a single meta-step as follows. Note this could take a few minutes to compile." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "executionInfo": { "elapsed": 10757, "status": "ok", "timestamp": 1647562749465, "user": { "displayName": "", "photoUrl": "", "userId": "" }, "user_tz": 240 }, "id": "9lomKFrzkqkd", "outputId": "cbce9749-bf2e-4abd-d7bd-8822077d587d" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [] } ], "source": [ "next_state, loss, metrics = outer_trainer.update(\n", " outer_trainer_state, key, with_metrics=False)" ] }, { "cell_type": "markdown", "metadata": { "id": "PZNCltmgmfug" }, "source": [ "Now let's meta-train a few steps and watch the meta-loss go down." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "executionInfo": { "elapsed": 38491, "status": "ok", "timestamp": 1647562788069, "user": { "displayName": "", "photoUrl": "", "userId": "" }, "user_tz": 240 }, "id": "6q3_EN5qmle_", "outputId": "234b28a7-8d3d-4740-8275-1d75ad7e54bc" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 500/500 [00:38<00:00, 13.01it/s]\n" ] } ], "source": [ "losses = []\n", "import tqdm\n", "\n", "import os\n", "# Pulling this from an environment variable so this file can be run in automated tests faster.\n", "outer_train_steps = int(os.environ.get(\"LOPT_META_TRAIN_LENGTH\", 500))\n", "\n", "for i in tqdm.trange(outer_train_steps):\n", " outer_trainer_state, loss, metrics = outer_trainer.update(\n", " outer_trainer_state, key, with_metrics=False)\n", " losses.append(loss)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "height": 282 }, "executionInfo": { "elapsed": 257, "status": "ok", "timestamp": 1647562788441, "user": { "displayName": "", "photoUrl": "", "userId": "" }, "user_tz": 240 }, "id": "cT_iJUTHmfWt", "outputId": "436186c8-e7b5-4599-de10-aa7fc3200bc7" }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(losses)\n", "plt.xlabel(\"outer iteration\")\n", "plt.ylabel(\"outer loss\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "executionInfo": { "elapsed": 3, "status": "ok", "timestamp": 1647562788752, "user": { "displayName": "", "photoUrl": "", "userId": "" }, "user_tz": 240 }, "id": "akK_PYCIkwDx", "outputId": "c3ad2258-b9ca-458d-fc52-58423d5dd0cc" }, "outputs": [ { "data": { "text/plain": [ "{'none||best_of_mean_loss': array(5.550927, dtype=float32),\n", " 'none||mean_loss': array(5.550927, dtype=float32)}" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "metrics" ] }, { "cell_type": "markdown", "metadata": { "id": "kh27tduOwR3E" }, "source": [ "We see some oscillations in this loss value. This makes sense as we are meta-training with a truncated method. Depending on the location in the inner-problem the losses will be greater or smaller. With enough tasks this will average out, but often this is not required to obtain performant learned optimizers. This does mean, however, that evaluating a learned optimizer after the fact is important to obtain a realistic performance measurement." ] }, { "cell_type": "markdown", "metadata": { "id": "gKImCte3n5gF" }, "source": [ "## Manual meta-gradient aggregation with applications to distributed training\n", "\n", "Often when training a learned optimizer we seek to estimate meta-gradients over a wide variety of tasks spread across a number of different machines.\n", "To do this we need to be explicit about what data needs to be sent from the central learner to compute updates (usually just the weights of the learned optimizer) and what data needs to be sent back (aggregated gradients + metrics and **not** the state of the unrolls for each inner-problem.)\n", "\n", "To help manage this, we provide a class to manage the central learner's computation, and a function to compute updates which would run on each worker.\n", "\n", "\n", "As this demo is in a colab, we will do everything in one process.\n", "First, we will create the central learner. This is responsible for taking in gradients, updating the weights of the learned optimizer, and providing new data back to the workers." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "SbWqD3pbl3BW" }, "outputs": [], "source": [ "theta_opt = opt_base.Adam(1e-3)\n", "central_learner = gradient_learner.GradientLearner(lopt, theta_opt)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "executionInfo": { "elapsed": 60, "status": "ok", "timestamp": 1647562789178, "user": { "displayName": "", "photoUrl": "", "userId": "" }, "user_tz": 240 }, "id": "SuKABLjk3D9R", "outputId": "de50cad0-aabd-4f71-9a0b-85cb20a94487" }, "outputs": [ { "data": { "text/plain": [ "GradientLearnerState(theta_opt_state=OptaxState(params={'mlp/~/linear_0': {'b': (32,), 'w': (19, 32)}, 'mlp/~/linear_1': {'b': (32,), 'w': (32, 32)}, 'mlp/~/linear_2': {'b': (2,), 'w': (32, 2)}}, state=None, optax_opt_state=(ScaleByAdamState(count=(), mu={'mlp/~/linear_0': {'b': (32,), 'w': (19, 32)}, 'mlp/~/linear_1': {'b': (32,), 'w': (32, 32)}, 'mlp/~/linear_2': {'b': (2,), 'w': (32, 2)}}, nu={'mlp/~/linear_0': {'b': (32,), 'w': (19, 32)}, 'mlp/~/linear_1': {'b': (32,), 'w': (32, 32)}, 'mlp/~/linear_2': {'b': (2,), 'w': (32, 2)}}), EmptyState()), iteration=()))" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "key = jax.random.PRNGKey(0)\n", "central_state = central_learner.init(key)\n", "jax.tree_util.tree_map(lambda x: jnp.asarray(x).shape, central_state)" ] }, { "cell_type": "markdown", "metadata": { "id": "YmbKXLcL3zDB" }, "source": [ "We can see here that this just contains the weights of the learned optimizer, plus the extra accumulators used by adam.\n", "\n", "Next, we can compute gradient estimators, but first we must get the required state from the learner." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "1MunNqVl4TSH" }, "outputs": [], "source": [ "worker_weights = central_learner.get_state_for_worker(central_state)" ] }, { "cell_type": "markdown", "metadata": { "id": "GrBAGdre4bWI" }, "source": [ "Next, we can compute gradients on a given worker. As before we need to get a list of gradient estimators. We can use the same set we used before." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "D5EfexNg5H6p" }, "outputs": [], "source": [ "max_length = 300\n", "trunc_sched = truncation_schedule.LogUniformLengthSchedule(\n", " min_length=100, max_length=max_length)\n", "\n", "\n", "def grad_est_fn(task_family):\n", " trunc_step = lopt_truncated_step.VectorizedLOptTruncatedStep(\n", " task_family,\n", " lopt,\n", " trunc_sched,\n", " num_tasks=16,\n", " random_initial_iteration_offset=max_length)\n", " return truncated_pes.TruncatedPES(trunc_step, trunc_length=50)\n", "\n", "\n", "mlp_task_family = tasks_base.single_task_to_family(\n", " image_mlp.ImageMLP_FashionMnist8_Relu32())\n", "\n", "gradient_estimators = [\n", " grad_est_fn(quadratics.FixedDimQuadraticFamily(10)),\n", " grad_est_fn(mlp_task_family)\n", "]" ] }, { "cell_type": "markdown", "metadata": { "id": "tmJEzRjw5LSA" }, "source": [ "Next, we need to kick things off by first computing the initial states for each of the gradient estimators." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "executionInfo": { "elapsed": 1143, "status": "ok", "timestamp": 1647562879797, "user": { "displayName": "", "photoUrl": "", "userId": "" }, "user_tz": 240 }, "id": "gsPQvD4Y5RQd", "outputId": "ee93ac90-fed8-42d5-e376-2aa52b7da2df" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [] } ], "source": [ "unroll_states = [\n", " grad.init_worker_state(worker_weights, key=jax.random.fold_in(key, i))\n", " for (i, grad) in enumerate(gradient_estimators)\n", "]" ] }, { "cell_type": "markdown", "metadata": { "id": "gE4nf01r6AcB" }, "source": [ "Next we can use these states to estimate a meta-gradient!" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "executionInfo": { "elapsed": 10255, "status": "ok", "timestamp": 1647562891517, "user": { "displayName": "", "photoUrl": "", "userId": "" }, "user_tz": 240 }, "id": "sd_DuFzS3Gr8", "outputId": "b742898c-ecb0-4f43-c9e8-19ac8a484770" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [] } ], "source": [ "out = gradient_learner.gradient_worker_compute(\n", " worker_weights,\n", " gradient_estimators,\n", " unroll_states,\n", " key=key,\n", " with_metrics=False)" ] }, { "cell_type": "markdown", "metadata": { "id": "B01vLh7V5-zu" }, "source": [ "This produces a couple of different outputs bundled together in a dataclass." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "executionInfo": { "elapsed": 83, "status": "ok", "timestamp": 1647562891712, "user": { "displayName": "", "photoUrl": "", "userId": "" }, "user_tz": 240 }, "id": "Ax495URy6LSA", "outputId": "d66c3912-719a-4867-c7b4-35ccbf3697b7" }, "outputs": [ { "data": { "text/plain": [ "['event_info', 'metrics', 'to_put', 'unroll_states']" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[x for x in dir(out) if not x.startswith(\"__\") and x != \"replace\"]" ] }, { "cell_type": "markdown", "metadata": { "id": "HI-xgDib0c6d" }, "source": [ "Most importantly we have `to_put` which contains information that should be sent to the central learner, and `unroll_states` which contains the next unroll states." ] }, { "cell_type": "markdown", "metadata": { "id": "VAKMmIRt6e60" }, "source": [ "Now with more than one worker, we would pass back a list of these gradients. In this demo, we will just use a single one, and pass this directly into the central learner to get the next meta-iteration. With more workers, this would contain a different gradient estimator from each worker." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "pne3-Yy147tW" }, "outputs": [], "source": [ "key1, key = jax.random.split(key)\n", "grads_list = [out.to_put]\n", "central_state, metrics = central_learner.update(central_state, grads_list, key=key1)" ] }, { "cell_type": "markdown", "metadata": { "id": "i0H_re9cVW1b" }, "source": [ "And we can do this over and over again. This time let's do it with more than one gradient estimate." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "executionInfo": { "elapsed": 62457, "status": "ok", "timestamp": 1647562954574, "user": { "displayName": "", "photoUrl": "", "userId": "" }, "user_tz": 240 }, "id": "KNIUGUvKVwld", "outputId": "997ad5f5-e7a1-4b4c-bdc5-02f322178273" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 500/500 [01:02<00:00, 8.01it/s]\n" ] } ], "source": [ "losses = []\n", "\n", "outer_train_steps = int(os.environ.get(\"LOPT_META_TRAIN_LENGTH\", 500))\n", "\n", "for i in tqdm.trange(outer_train_steps):\n", " worker_weights = central_learner.get_state_for_worker(central_state)\n", "\n", " key1, key = jax.random.split(key)\n", " out = gradient_learner.gradient_worker_compute(\n", " worker_weights,\n", " gradient_estimators,\n", " unroll_states,\n", " key=key1,\n", " with_metrics=False)\n", " # extract the next unroll state output for the next iteration.\n", " unroll_states = out.unroll_states\n", "\n", " key1, key = jax.random.split(key)\n", " central_state, metrics = central_learner.update(\n", " central_state, [out.to_put], key=key1)\n", " losses.append(out.to_put.mean_loss)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "height": 296 }, "executionInfo": { "elapsed": 177, "status": "ok", "timestamp": 1647563002848, "user": { "displayName": "", "photoUrl": "", "userId": "" }, "user_tz": 240 }, "id": "WszEeLOBJw0x", "outputId": "d548cd42-aa08-407b-e65c-a2e3bacb7b91" }, "outputs": [ { "data": { "text/plain": [ "Text(0, 0.5, 'outer loss')" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\njP8PzsM04tgVOpUAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(losses)\n", "plt.xlabel(\"outer iteration\")\n", "plt.ylabel(\"outer loss\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "nyqYdAFIaFJh" }, "outputs": [], "source": [] } ], "metadata": { "colab": { "collapsed_sections": [], "last_runtime": { "build_target": "//learning/deepmind/public/tools/ml_python:ml_notebook", "kind": "private" }, "name": "Part 5: Meta-training with GradientLearner", "provenance": [ { "file_id": "1o5ysb_wGqcLhoZNg86OW_HuRI7S-XRvY", "timestamp": 1642477083281 } ] }, "jupytext": { "formats": "ipynb,md:myst,py", "main_language": "python" }, "kernelspec": { "display_name": "Python 3", "name": "python3" }, "language_info": { "name": "python" } }, "nbformat": 4, "nbformat_minor": 0 }