From 7a7c33a23bd081aa706a45489749ed144aaa23c3 Mon Sep 17 00:00:00 2001 From: Andrew Date: Wed, 17 Apr 2024 11:07:46 +0200 Subject: [PATCH] benchmark against ppo --- mjx/training_apg.ipynb | 145 +++++++++++++++++++++++++---------------- 1 file changed, 90 insertions(+), 55 deletions(-) diff --git a/mjx/training_apg.ipynb b/mjx/training_apg.ipynb index 3fecdb95..6f9f6a0e 100644 --- a/mjx/training_apg.ipynb +++ b/mjx/training_apg.ipynb @@ -50,7 +50,9 @@ "\n", "Additionally, discontinuous reward formulations are ubiquitious in RL, for instance, a large penalty when the robot falls. It can be significantly more [challenging](https://arxiv.org/abs/2403.14864) to design robust policies with FoPG's, since they cannot backprop through such penalties.\n", "\n", - "Last, despite the sample efficiency, FoPG methods can still struggle with wall-clock time. Because the gradients have low variance, they do not benefit significantly from massive parallelization of data collection - unlike [RL](https://arxiv.org/abs/2109.11978). Additionally, the policy gradient is typically calculated via autodifferentiation. This can be 3-5x slower than unrolling the simulation forward, and memory intensive, with memory requirements scaling with $O((m+n) \\cdot m \\cdot T)$, where m and n are the state and control dimensions, $(m+n) \\cdot m$ is the jacobian dimension, and T is the number of steps propogated through." + "Last, despite the sample efficiency, FoPG methods can still struggle with wall-clock time. Because the gradients have low variance, they do not benefit significantly from massive parallelization of data collection - unlike [RL](https://arxiv.org/abs/2109.11978). Additionally, the policy gradient is typically calculated via autodifferentiation. This can be 3-5x slower than unrolling the simulation forward, and memory intensive, with memory requirements scaling with $O((m+n) \\cdot m \\cdot T)$, where m and n are the state and control dimensions, $(m+n) \\cdot m$ is the jacobian dimension, and T is the number of steps propogated through.\n", + "\n", + "Note that with certain models, using autodifferentiation through mjx.step currently causes [nan gradients](https://github.com/google-deepmind/mujoco/issues/1517). For now, we address this issue by using double-precision floats, at the cost of doubling the memory requirements and training time." ] }, { @@ -71,16 +73,7 @@ }, { "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# !pip install git+https://github.com/Andrew-Luo1/brax_new_apg.git#egg=brax" - ] - }, - { - "cell_type": "code", - "execution_count": 2, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -95,8 +88,8 @@ "import jax\n", "from jax import config # Analytical gradients work much better with double precision.\n", "config.update(\"jax_debug_nans\", True)\n", - "jax.config.update(\"jax_enable_x64\", True)\n", - "jax.config.update('jax_default_matmul_precision', jax.lax.Precision.HIGH)\n", + "config.update(\"jax_enable_x64\", True)\n", + "config.update('jax_default_matmul_precision', jax.lax.Precision.HIGH)\n", "import matplotlib.pyplot as plt\n", "\n", "# Sim\n", @@ -121,7 +114,6 @@ "\n", "# Misc\n", "import mediapy as media\n", - "from etils import epath\n", "from ml_collections import config_dict\n", "from typing import Any, Dict\n" ] @@ -135,13 +127,13 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ - "
" + "
" ], "text/plain": [ "" @@ -171,7 +163,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -220,7 +212,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -274,13 +266,13 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ - "
" + "
" ], "text/plain": [ "" @@ -740,24 +732,38 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0, 0.5, 'reward per episode')" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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HdGwYUNcu3at1F9vnp6eOtUxYsQI7Nq1C3FxcThw4ABGjBih0/ZNmjSBmZkZjh49qm4rKirCyZMn0aJFC532pau2bdsiPT0dJiYmpY7Do3rdymJmZgalUvnE9UxMTPDcc89h7ty5OHPmDBITE7F///5H7qNt27aIi4uDh4dHqfo0A+bx48e1tjt+/DiaNm2qDrqP+7lE+nby5En4+fnBz88PABAaGgo/Pz+Eh4cDKJkIMmrUKEyaNAnNmzfHgAEDcOLECbi5uan3oVKpsGLFCowePbrUH2zlxZ4jojrI3d0d6enpuHnzJl588UUYGRkhPj4eAwcOhIuLyxO3nzlzJiZMmABbW1s8//zzKCgowMmTJ3H37l2EhoaWu46uXbvC0dERI0aMgIeHBwICAnR6H1ZWVnj33Xfx0UcfqS9BMHfuXOTl5VW4O728nnvuOQQGBuKll17Cl19+iebNmyM1NRU7d+7ESy+9pHX673E8PDxw4sQJJCYmwtraGvb29lqn8gBg+/btuHbtGrp06YJ69eph586dUKlUaN68+SP3MX78ePz8888YNmwYPvroI8jlcly5cgVr167Fzz//rP7SSElJQWhoKN5++22cOnUKCxcuxLx588r1c4n0LTg4WGu25MNMTU0RERGBiIiIR65jZGSElJSUp6qDPUdEddTBgwfRvn17mJub48SJE2jYsGG5ghEAjB07FkuWLMGKFSvg6+uLrl27YsWKFTr3HEkkEgwbNgynT5/WudfogS+++AKvvPIKRo4cibZt2+LKlSvYvXs36tWrV6H9lZdEIsHOnTvRpUsXvPnmm2jWrBmGDh2KxMREODo6lns/kydPhrGxMby9vVG/fv0yL8BpZ2eHTZs2oXv37mjRogUWL16M3377DS1btnzkPlxcXPDXX39BqVSid+/e8PHxwcSJEyGTybTC16hRo3D//n106NAB48ePx/vvv4+33nqrXD+XqLaSiMdFNCIiqrWCg4PRpk0bfPvtt4YuhahaYc8RERERkQaGIyIiIiINPK1GREREpIE9R0REREQaGI6IiIiINDAcEREREWlgOCIiIiLSwHBEREREpIHhiIiIiEgDwxERERGRBoYjIiIiIg3/D5omjKY8WL2OAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "train_fn = functools.partial(\n", " ppo.train, num_timesteps=10_000_000, num_evals=10, reward_scaling=0.1,\n", " episode_length=1000, normalize_observations=True, action_repeat=1,\n", " unroll_length=10, num_minibatches=32, num_updates_per_batch=8,\n", " discounting=0.97, learning_rate=3e-4, entropy_cost=1e-3, num_envs=1024,\n", - " batch_size=1024, seed=0)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ + " batch_size=1024, seed=0)\n", + "\n", "x_data = []\n", "y_data = []\n", "ydataerr = []\n", @@ -775,6 +781,13 @@ "plt.ylabel('reward per episode')" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We see that PPO takes around 9e6 simulator steps to catch up to APG!" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -797,7 +810,7 @@ "a_t = f(g(x_t; \\phi), x_t; \\theta) + g(x_t; \\phi)\n", "$$\n", "\n", - "We use the in-place trotting policy from last section as $\\phi$ and track a 1 m/s velocity target. Since locomotion is stabler at faster trots, you can experiment with $\\phi$ for faster velocity targets!\n", + "We use the in-place trotting policy from last section as $\\phi$ and track a 0.75 m/s velocity target. Since locomotion is stabler at faster trots, you can experiment with $\\phi$ for faster velocity targets!\n", "\n", "While a more natural way to \"hotstart\" the learning would be to simply initialize the parameters $\\theta$ as $\\phi$ and use the policy $a_t = f(x_t; \\theta)$, the residual method has been found train more stably in practice." ] @@ -811,11 +824,11 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ - "def axis_angle_to_quaternion(v: jp.ndarray, theta:jp.float32):\n", + "def axis_angle_to_quaternion(v: jp.ndarray, theta:jp.float_):\n", " \"\"\" \n", " axis angle representation: rotation of theta around v. \n", " \"\"\" \n", @@ -1176,7 +1189,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -1211,7 +1224,14 @@ " num_eval_envs=64,\n", " num_evals=10 + 1,\n", " normalize_observations=True,\n", - " network_factory=make_networks_factory)" + " network_factory=make_networks_factory)\n", + "\n", + "model_path = '/tmp/trotting_2hz_policy'\n", + "params = model.load_params(model_path)\n", + "baseline_inference_fn = make_inference_fn(params)\n", + "\n", + "env_kwargs = dict(target_vel=0.75, step_k=13, \n", + " baseline_inference_fn=baseline_inference_fn)" ] }, { @@ -1252,13 +1272,6 @@ " y_data.append(metrics['eval/episode_reward'])\n", " ydataerr.append(metrics['eval/episode_reward_std'])\n", "\n", - "model_path = '/tmp/trotting_2hz_policy'\n", - "params = model.load_params(model_path)\n", - "baseline_inference_fn = make_inference_fn(params)\n", - "\n", - "env_kwargs = dict(target_vel=0.75, step_k=13, \n", - " baseline_inference_fn=baseline_inference_fn)\n", - "\n", "env = envs.get_environment(\"anymal\", **env_kwargs)\n", "eval_env = envs.get_environment(\"anymal\", **env_kwargs)\n", "\n", @@ -1313,28 +1326,43 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0, 0.5, 'reward per episode')" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkcAAAGwCAYAAACjPMHLAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABUDElEQVR4nO3deVhUZf8G8HuAmWEfUJRNBHdFEBdc0BSoXNJX27RcUimzRU1/oWlarwullqnla5mWCy2avaa2qG9i5kahAoKKqLghKIw7DIsMMPP8/kCmGQFlcGBY7s91zdXMOc85850TDjfPec55JEIIASIiIiICAFiYuwAiIiKi2oThiIiIiEgPwxERERGRHoYjIiIiIj0MR0RERER6GI6IiIiI9DAcEREREemxMncBdZFWq0VGRgYcHBwgkUjMXQ4RERFVghACOTk58PDwgIVFxf1DDEdVkJGRAS8vL3OXQURERFWQnp6OZs2aVbie4agKHBwcAJQcXEdHRzNXQ0RERJWhUqng5eWl+z1eEYajKig9lebo6MhwREREVMc8bEgMB2QTERER6WE4IiIiItLDcERERESkh+GIiIiISA/DEREREZEehiMiIiIiPQxHRERERHoYjoiIiIj0MBwRERER6WE4IiIiItLDcERERESkh+GIiIiISA/DEREREZEehiMiIiIiPQxHREREVCvkFxbD592d8Hl3J/ILi81WB8MRERERkR6GIyIiMlpt+QufSvD/h2kxHBERERHpYTgiIiIi0sNwREREDRZPR1F5GI6IiIiI9DAcEREREelhOCIiqkE8jUNU+1mZuwAiIiJqGNTFGtzMLcR1VQFu5KhxPUdt8N9rqgJdWyGE2epkOCIiIqIqE0JAdbcY13NKAs+NXDWuq0r/W2DwOiu/qNL7zSkohp1cWo2VV4zhiIiIiMooLNbiVt69YGPQy2PY63MjV43CYm2l9yuztEATBzlcHORoYi9HU8d//utoLcVbPyQAAOzl5osoDEdEREQNhBACOepivcBzr7cnp2wAumNELw8AOFpboamjdZnA08RBjqYO1vf+K4fCRgqJRFLuPvTH4VlYlN+mJjAcERER1XHqIo3u+f6z16G6W1y2t+fe6S21Eb08VhYSNHGQ64JNyXNrg9dNHeRwsZfDWmpZHR/NLBiOiIiIapGCIg2y8otwO68Qd/LvPfIK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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "train_fn = functools.partial(\n", " ppo.train, num_timesteps=10_000_000, num_evals=10, reward_scaling=0.1,\n", " episode_length=1000, normalize_observations=True, action_repeat=1,\n", " unroll_length=10, num_minibatches=32, num_updates_per_batch=8,\n", " discounting=0.97, learning_rate=3e-4, entropy_cost=1e-3, num_envs=1024,\n", - " batch_size=1024, seed=0)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ + " batch_size=1024, seed=0)\n", + "\n", "x_data = []\n", "y_data = []\n", "ydataerr = []\n", - "env = envs.get_environment(\"trotting_anymal\", step_k = 13)\n", + "\n", + "env = envs.get_environment(\"anymal\", **env_kwargs)\n", "\n", "def progress(num_steps, metrics):\n", " x_data.append(num_steps)\n", @@ -1347,6 +1375,13 @@ "plt.xlabel('# environment steps')\n", "plt.ylabel('reward per episode')" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We see that PPO struggles to learn locomotion in this setup, even with 10x the number of simulator steps." + ] } ], "metadata": {