Skip to content

Instantly share code, notes, and snippets.

@radekosmulski
Created May 26, 2024 05:35
Show Gist options
  • Save radekosmulski/273126977cc1f45bc74d0f93653522e7 to your computer and use it in GitHub Desktop.
Save radekosmulski/273126977cc1f45bc74d0f93653522e7 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "c6a07039-1109-49f7-a031-7b723ecfdffb",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/radek/miniforge3/envs/cleanrl/lib/python3.10/site-packages/aim/storage/structured/sql_engine/models.py:16: MovedIn20Warning: The ``declarative_base()`` function is now available as sqlalchemy.orm.declarative_base(). (deprecated since: 2.0) (Background on SQLAlchemy 2.0 at: https://sqlalche.me/e/b8d9)\n",
" Base = declarative_base()\n"
]
}
],
"source": [
"import os\n",
"\n",
"os.environ['CUDA_VISIBLE_DEVICES'] = '0'\n",
"\n",
"import os\n",
"import random\n",
"import time\n",
"from dataclasses import dataclass\n",
"from pathlib import Path\n",
"from pdb import set_trace\n",
"\n",
"import gymnasium as gym\n",
"import numpy as np\n",
"import torch\n",
"import torch.nn as nn\n",
"import torch.nn.functional as F\n",
"import torch.optim as optim\n",
"from torch.optim.lr_scheduler import LinearLR\n",
"import tyro\n",
"from stable_baselines3.common.atari_wrappers import (\n",
" ClipRewardEnv,\n",
" EpisodicLifeEnv,\n",
" FireResetEnv,\n",
" MaxAndSkipEnv,\n",
" NoopResetEnv,\n",
")\n",
"from stable_baselines3.common.buffers import ReplayBuffer\n",
"from torch.utils.tensorboard import SummaryWriter\n",
"\n",
"import stable_baselines3 as sb3\n",
"\n",
"from aim import Run\n",
"dry_run = False"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "c4357881-089d-4942-8f02-546c3f5e1f52",
"metadata": {},
"outputs": [],
"source": [
"@dataclass\n",
"class Args:\n",
" seed: int = 42\n",
" # Algorithm specific arguments\n",
" env_id: str = \"BreakoutNoFrameskip-v4\"\n",
" \"\"\"the id of the environment\"\"\"\n",
" total_timesteps: int = 10000000\n",
" \"\"\"total timesteps of the experiments\"\"\"\n",
" learning_rate: float = 1e-4\n",
" \"\"\"the learning rate of the optimizer\"\"\"\n",
" num_envs: int = 1\n",
" \"\"\"the number of parallel game environments\"\"\"\n",
" buffer_size: int = 1000000\n",
" \"\"\"the replay memory buffer size\"\"\"\n",
" gamma: float = 0.99\n",
" \"\"\"the discount factor gamma\"\"\"\n",
" tau: float = 1.0\n",
" \"\"\"the target network update rate\"\"\"\n",
" target_network_frequency: int = 1000\n",
" \"\"\"the timesteps it takes to update the target network\"\"\"\n",
" batch_size: int = 32\n",
" \"\"\"the batch size of sample from the reply memory\"\"\"\n",
" start_e: float = 1\n",
" \"\"\"the starting epsilon for exploration\"\"\"\n",
" end_e: float = 0.01\n",
" \"\"\"the ending epsilon for exploration\"\"\"\n",
" exploration_fraction: float = 0.10\n",
" \"\"\"the fraction of `total-timesteps` it takes from start-e to go end-e\"\"\"\n",
" learning_starts: int = 80000\n",
" \"\"\"timestep to start learning\"\"\"\n",
" train_frequency: int = 4\n",
" \"\"\"the frequency of training\"\"\""
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "de1282d6-8587-4b2f-9b90-964438900e1a",
"metadata": {},
"outputs": [],
"source": [
"args = Args()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "88c2ca1b-b893-450e-bb5e-70d2b1ca55dd",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"A.L.E: Arcade Learning Environment (version 0.8.1+53f58b7)\n",
"[Powered by Stella]\n"
]
}
],
"source": [
"def make_env():\n",
" env = gym.make(args.env_id, render_mode='rgb_array')\n",
" \n",
" env = gym.wrappers.RecordEpisodeStatistics(env)\n",
" env = NoopResetEnv(env, noop_max=30)\n",
" env = MaxAndSkipEnv(env, skip=4)\n",
" env = EpisodicLifeEnv(env)\n",
" if \"FIRE\" in env.unwrapped.get_action_meanings():\n",
" env = FireResetEnv(env)\n",
" env = ClipRewardEnv(env)\n",
" env = gym.wrappers.ResizeObservation(env, (84, 84))\n",
" env = gym.wrappers.GrayScaleObservation(env)\n",
" env = gym.wrappers.FrameStack(env, 4)\n",
" return env\n",
"\n",
"env = make_env()\n",
"obss = []\n",
"obs, info = env.reset()\n",
"obss.append(obs)\n",
"\n",
"for i in range(400):\n",
" obs, _, terminated, truncated, _ = env.step(env.action_space.sample())\n",
" obss.append(obs)"
]
},
{
"cell_type": "markdown",
"id": "fc66d23e-2603-467a-ab71-2fa7f21314b6",
"metadata": {},
"source": [
"Actions:\n",
"```\n",
"0: NOOP\n",
"1: FIRE\n",
"2: RIGHT\n",
"3: LEFT\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "17c24110-890d-4a35-8e39-f29873a199f1",
"metadata": {},
"outputs": [],
"source": [
"from matplotlib import pyplot as plt\n",
"from matplotlib import animation\n",
"from IPython.display import HTML\n",
"\n",
"def animate_list_of_of_images(video):\n",
" video = np.array(video)\n",
" \n",
" fig = plt.figure()\n",
" im = plt.imshow(video[0])\n",
" \n",
" plt.close() # this is required to not display the generated image\n",
" \n",
" def init():\n",
" im.set_data(video[0])\n",
" \n",
" def animate(i):\n",
" im.set_data(video[i])\n",
" return im\n",
" \n",
" anim = animation.FuncAnimation(fig, animate, init_func=init, frames=video.shape[0],\n",
" interval=50)\n",
" return HTML(anim.to_html5_video())"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "02408849-80e9-4b4e-8de1-0aec0ddf48a8",
"metadata": {},
"outputs": [],
"source": [
"def unstack(obss): return [obs[-1] for obs in obss]"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "02469459-4515-4597-9149-f0a42bd82c57",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/radek/miniforge3/envs/cleanrl/lib/python3.10/site-packages/IPython/core/pylabtools.py:77: DeprecationWarning: backend2gui is deprecated since IPython 8.24, backends are managed in matplotlib and can be externally registered.\n",
" warnings.warn(\n"
]
},
{
"data": {
"text/html": [
"<video width=\"640\" height=\"480\" controls autoplay loop>\n",
" <source type=\"video/mp4\" src=\"data:video/mp4;base64,AAAAIGZ0eXBNNFYgAAACAE00ViBpc29taXNvMmF2YzEAAAAIZnJlZQAAjs1tZGF0AAACrwYF//+r\n",
"3EXpvebZSLeWLNgg2SPu73gyNjQgLSBjb3JlIDE2MyByMzA2MCA1ZGI2YWE2IC0gSC4yNjQvTVBF\n",
"Ry00IEFWQyBjb2RlYyAtIENvcHlsZWZ0IDIwMDMtMjAyMSAtIGh0dHA6Ly93d3cudmlkZW9sYW4u\n",
"b3JnL3gyNjQuaHRtbCAtIG9wdGlvbnM6IGNhYmFjPTEgcmVmPTMgZGVibG9jaz0xOjA6MCBhbmFs\n",
"eXNlPTB4MzoweDExMyBtZT1oZXggc3VibWU9NyBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVk\n",
"X3JlZj0xIG1lX3JhbmdlPTE2IGNocm9tYV9tZT0xIHRyZWxsaXM9MSA4eDhkY3Q9MSBjcW09MCBk\n",
"ZWFkem9uZT0yMSwxMSBmYXN0X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0tMiB0aHJlYWRzPTE1\n",
"IGxvb2thaGVhZF90aHJlYWRzPTIgc2xpY2VkX3RocmVhZHM9MCBucj0wIGRlY2ltYXRlPTEgaW50\n",
"ZXJsYWNlZD0wIGJsdXJheV9jb21wYXQ9MCBjb25zdHJhaW5lZF9pbnRyYT0wIGJmcmFtZXM9MyBi\n",
"X3B5cmFtaWQ9MiBiX2FkYXB0PTEgYl9iaWFzPTAgZGlyZWN0PTEgd2VpZ2h0Yj0xIG9wZW5fZ29w\n",
"PTAgd2VpZ2h0cD0yIGtleWludD0yNTAga2V5aW50X21pbj0yMCBzY2VuZWN1dD00MCBpbnRyYV9y\n",
"ZWZyZXNoPTAgcmNfbG9va2FoZWFkPTQwIHJjPWNyZiBtYnRyZWU9MSBjcmY9MjMuMCBxY29tcD0w\n",
"LjYwIHFwbWluPTAgcXBtYXg9NjkgcXBzdGVwPTQgaXBfcmF0aW89MS40MCBhcT0xOjEuMDAAgAAA\n",
"FeNliIQAP//+92ifAptaQ3qA5JXFJdtPgf+rZ3B8j+kDAAADAAADAAAEMCOP9CT+H5qTAAADAEQA\n",
"C3V5/Bmn/MAzpqjH3HAscxx9eVb6tpqXSiivW6ftuyhYBF7Al8wekF/0oGbkpj9ryuraLPMW5G1P\n",
"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\n",
"AAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAAKAAAAB4AAAAAAAJGVkdHMA\n",
"AAAcZWxzdAAAAAAAAAABAABOUgAABAAAAQAAAAAUTG1kaWEAAAAgbWRoZAAAAAAAAAAAAAAAAAAA\n",
"KAAAAyIAVcQAAAAAAC1oZGxyAAAAAAAAAAB2aWRlAAAAAAAAAAAAAAAAVmlkZW9IYW5kbGVyAAAA\n",
"E/dtaW5mAAAAFHZtaGQAAAABAAAAAAAAAAAAAAAkZGluZgAAABxkcmVmAAAAAAAAAAEAAAAMdXJs\n",
"IAAAAAEAABO3c3RibAAAALdzdHNkAAAAAAAAAAEAAACnYXZjMQAAAAAAAAABAAAAAAAAAAAAAAAA\n",
"AAAAAAKAAeAASAAAAEgAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABj/\n",
"/wAAADVhdmNDAWQAHv/hABhnZAAerNlAoD2hAAADAAEAAAMAKA8WLZYBAAZo6+PLIsD9+PgAAAAA\n",
"HHV1aWRraEDyXyRPxbo5pRvPAyPzAAAAAAAAABhzdHRzAAAAAAAAAAEAAAGRAAACAAAAABhzdHNz\n",
"AAAAAAAAAAIAAAABAAAA+wAADEBjdHRzAAAAAAAAAYYAAAABAAAEAAAAAAEAAAoAAAAAAQAABAAA\n",
"AAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAA\n",
"AAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAgAAAAAAgAAAgAAAAABAAAIAAAAAAIAAAIAAAAA\n",
"AQAACAAAAAACAAACAAAAAAEAAAgAAAAAAgAAAgAAAAABAAAGAAAAAAEAAAIAAAAAAQAABAAAAAAB\n",
"AAAGAAAAAAEAAAIAAAAAAQAACAAAAAACAAACAAAAAAEAAAQAAAAAAQAACgAAAAABAAAEAAAAAAEA\n",
"AAAAAAAAAQAAAgAAAAABAAAEAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAA\n",
"CgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAAC\n",
"AAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAA\n",
"AAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAgAAAAAAgAAAgAA\n",
"AAABAAAIAAAAAAIAAAIAAAAAAQAABgAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAA\n",
"AAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAGAAAAAAEAAAIAAAAA\n",
"AQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAACAAAEAAAAAAEAAAoAAAAAAQAABAAAAAAB\n",
"AAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEA\n",
"AAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAA\n",
"CAAAAAACAAACAAAAAAEAAAYAAAAAAQAAAgAAAAABAAAGAAAAAAEAAAIAAAAAAQAABgAAAAABAAAC\n",
"AAAAAAEAAAgAAAAAAgAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoA\n",
"AAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAABgAAAAABAAACAAAAAAEAAAYAAAAAAQAAAgAA\n",
"AAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAA\n",
"AAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAA\n",
"AQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAAB\n",
"AAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEA\n",
"AAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAA\n",
"AgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAA\n",
"AAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQA\n",
"AAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAA\n",
"AAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAA\n",
"AAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAA\n",
"AQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAAB\n",
"AAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEA\n",
"AAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAA\n",
"CgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAAC\n",
"AAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAA\n",
"AAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAA\n",
"AAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAIAAAA\n",
"AAIAAAIAAAAAAQAABAAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAA\n",
"AQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAAB\n",
"AAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEA\n",
"AAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAA\n",
"AAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAE\n",
"AAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoA\n",
"AAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAA\n",
"AAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAA\n",
"AAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAA\n",
"AQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAAB\n",
"AAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEA\n",
"AAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAA\n",
"AgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAA\n",
"AAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQA\n",
"AAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAA\n",
"AAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAA\n",
"AAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAA\n",
"AQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAAB\n",
"AAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEA\n",
"AAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAA\n",
"CgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAAC\n",
"AAAAAAEAAAYAAAAAAQAAAgAAAAAcc3RzYwAAAAAAAAABAAAAAQAAAZEAAAABAAAGWHN0c3oAAAAA\n",
"AAAAAAAAAZEAABiaAAABqgAAAK8AAACKAAAAVgAAAHgAAACYAAAAjwAAAIEAAAEVAAAAogAAAHwA\n",
"AACBAAAAmwAAAJsAAABlAAAA0wAAAGEAAABjAAAAUgAAAGMAAAA9AAABLAAAADUAAAA8AAAA7QAA\n",
"AFcAAACCAAAAqAAAAGQAAACkAAAAegAAAHkAAACzAAAAkwAAAKAAAAB0AAAAdgAAAMIAAAEcAAAA\n",
"fgAAAKYAAABTAAAANgAAACsAAAA+AAAAHQAAAWwAAAAsAAAAHAAAACUAAAB/AAAAbQAAAE4AAABK\n",
"AAAAfwAAAEkAAABDAAAAYgAAAIUAAAB1AAAAYAAAAE4AAAB0AAAAXAAAAF8AAACeAAAAcwAAAFUA\n",
"AAERAAAAlgAAAHEAAACBAAAAMAAAACIAAAHHAAAAnAAAAFkAAABxAAAAmwAAAG0AAACFAAAAhQAA\n",
"AGMAAABxAAAAxgAAALUAAACyAAAAsAAAAG4AAACCAAAAgAAAAIcAAACJAAAAUAAAAF4AAAA5AAAA\n",
"LwAAABgAAAFzAAAAfgAAAE8AAAA+AAAAdgAAAF8AAABGAAAA1gAAAHoAAADqAAAAcwAAAOwAAABc\n",
"AAAAmgAAAHsAAAB6AAAA0wAAAKAAAACRAAAAbgAAAOoAAAB1AAAAWwAAAG8AAACbAAAAcQAAAOkA\n",
"AABQAAAAnQAAACgAAAAzAAAAHAAAACUAAAAjAAAAHAAAABoAAAAiAAAAIQAAABoAAAAaAAAAIgAA\n",
"ACEAAAAaAAAAGgAAACIAAAAhAAAAGgAAABoAAAAiAAAAIQAAABoAAAAaAAAAIgAAACEAAAAaAAAA\n",
"GgAAACIAAAAhAAAAGgAAABoAAAAiAAAAIQAAABoAAAAaAAAAIgAAACEAAAAaAAAAGgAAACIAAAAh\n",
"AAAAGgAAABoAAAAiAAAAIQAAABoAAAAaAAAAIgAAACEAAAAaAAAAGgAAACIAAAAhAAAAGgAAABoA\n",
"AAAiAAAAIQAAABoAAAAaAAAAIgAAACEAAAAaAAAAGgAAACIAAAAhAAAAGgAAABoAAAAiAAAAIQAA\n",
"ABoAAAAaAAAAIgAAACEAAAAaAAAAGgAAACIAAAAhAAAAGgAAABoAAAAiAAAAIQAAABoAAAAaAAAA\n",
"IgAAACEAAAAaAAAAGgAAACIAAAAhAAAAGgAAABoAAAAiAAAAIQAAABoAAAAaAAAAIgAAACEAAAAa\n",
"AAAAGgAAACIAAAAhAAAAGgAAABoAAAAiAAAAIQAAABoAAAAaAAAAIgAAACEAAAAaAAAAGgAAACIA\n",
"AAAhAAAAGgAAABoAAAAiAAAAIQAAABoAAAAaAAAAHAAAACAAAAAaAAAXuwAAAIkAAAAdAAAAHQAA\n",
"ABQAAAAdAAAAFgAAABQAAAAUAAAAHQAAABYAAAAUAAAAFAAAAB0AAAAWAAAAFAAAABQAAAAdAAAA\n",
"FgAAABQAAAAUAAAAHQAAABYAAAAUAAAAFAAAAB0AAAAWAAAAFAAAABQAAAAdAAAAFgAAABQAAAAU\n",
"AAAAHQAAABYAAAAUAAAAFAAAAB0AAAAWAAAAFAAAABQAAAAdAAAAFgAAABQAAAAUAAAAHQAAABYA\n",
"AAAUAAAAFAAAAB0AAAAWAAAAFAAAABQAAAAdAAAAFgAAABQAAAAUAAAAHQAAABYAAAAUAAAAFAAA\n",
"AB0AAAAWAAAAFAAAABQAAAAdAAAAFgAAABQAAAAUAAAAHQAAABYAAAAUAAAAFAAAAB0AAAAWAAAA\n",
"FAAAABQAAAAdAAAAFgAAABQAAAAUAAAAHQAAABYAAAAUAAAAFAAAAB0AAAAWAAAAFAAAABQAAAAd\n",
"AAAAFgAAABQAAAAUAAAAHQAAABYAAAAUAAAAFAAAAB0AAAAWAAAAFAAAABQAAAAdAAAAFgAAABQA\n",
"AAAUAAAAHQAAABYAAAAUAAAAFAAAAB0AAAAWAAAAFAAAABQAAAAdAAAAFgAAABQAAAAUAAAAHQAA\n",
"ABYAAAAUAAAAFAAAACMAAAAWAAAAFAAAABQAAAAjAAAAFgAAABQAAAAUAAAAHQAAABYAAAAUAAAA\n",
"FAAAAB0AAAAWAAAAFAAAABQAAAAdAAAAFgAAABQAAAAUAAAAHQAAABYAAAAUAAAAFAAAABwAAAAW\n",
"AAAAFAAAABQAAAAdAAAAFAAAABRzdGNvAAAAAAAAAAEAAAAwAAAAYnVkdGEAAABabWV0YQAAAAAA\n",
"AAAhaGRscgAAAAAAAAAAbWRpcmFwcGwAAAAAAAAAAAAAAAAtaWxzdAAAACWpdG9vAAAAHWRhdGEA\n",
"AAABAAAAAExhdmY1OC43Ni4xMDA=\n",
"\">\n",
" Your browser does not support the video tag.\n",
"</video>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"animate_list_of_of_images(unstack(obss))"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "2cdb5f91-fb40-446b-979b-f817829b2856",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/radek/miniforge3/envs/cleanrl/lib/python3.10/site-packages/pkg_resources/__init__.py:121: DeprecationWarning: pkg_resources is deprecated as an API\n",
" warnings.warn(\"pkg_resources is deprecated as an API\", DeprecationWarning)\n",
"/home/radek/miniforge3/envs/cleanrl/lib/python3.10/site-packages/pkg_resources/__init__.py:2870: DeprecationWarning: Deprecated call to `pkg_resources.declare_namespace('google')`.\n",
"Implementing implicit namespace packages (as specified in PEP 420) is preferred to `pkg_resources.declare_namespace`. See https://setuptools.pypa.io/en/latest/references/keywords.html#keyword-namespace-packages\n",
" declare_namespace(pkg)\n",
"/home/radek/miniforge3/envs/cleanrl/lib/python3.10/site-packages/pkg_resources/__init__.py:2870: DeprecationWarning: Deprecated call to `pkg_resources.declare_namespace('mpl_toolkits')`.\n",
"Implementing implicit namespace packages (as specified in PEP 420) is preferred to `pkg_resources.declare_namespace`. See https://setuptools.pypa.io/en/latest/references/keywords.html#keyword-namespace-packages\n",
" declare_namespace(pkg)\n",
"WARNING:imageio_ffmpeg:IMAGEIO FFMPEG_WRITER WARNING: input image is not divisible by macro_block_size=16, resizing from (84, 84) to (96, 96) to ensure video compatibility with most codecs and players. To prevent resizing, make your input image divisible by the macro_block_size or set the macro_block_size to 1 (risking incompatibility).\n",
"[swscaler @ 0x5842000] Warning: data is not aligned! This can lead to a speed loss\n"
]
},
{
"data": {
"text/html": [
"<video src=\"output.mp4\" controls width=\"256\" height=\"256\">\n",
" Your browser does not support the <code>video</code> element.\n",
" </video>"
],
"text/plain": [
"<IPython.core.display.Video object>"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"!rm -rf output.mp4\n",
"\n",
"import imageio\n",
"from IPython.display import Video\n",
"\n",
"imageio.mimsave('output.mp4', unstack(obss))\n",
"video = Video('output.mp4', width=256, height=256)\n",
"video"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "a58cde03-b092-46d3-92b8-0642041d4e90",
"metadata": {},
"outputs": [],
"source": [
"class QNetwork(nn.Module):\n",
" def __init__(self, num_outputs):\n",
" super().__init__()\n",
" self.network = nn.Sequential(\n",
" nn.Conv2d(4, 32, 8, stride=4),\n",
" nn.ReLU(),\n",
" nn.Conv2d(32, 64, 4, stride=2),\n",
" nn.ReLU(),\n",
" nn.Conv2d(64, 64, 3, stride=1),\n",
" nn.ReLU(),\n",
" nn.Flatten(),\n",
" nn.Linear(3136, 512),\n",
" nn.ReLU(),\n",
" nn.Linear(512, num_outputs),\n",
" )\n",
"\n",
" def forward(self, x):\n",
" return self.network(x / 255.0)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "140170a9-6d91-47a0-a610-a56b7ed8ee16",
"metadata": {},
"outputs": [],
"source": [
"def linear_schedule(start_e: float, end_e: float, duration: int, t: int):\n",
" slope = (end_e - start_e) / duration\n",
" return max(slope * t + start_e, end_e)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "85a566d8-a976-4b6d-9ef9-a4b3de075d6e",
"metadata": {},
"outputs": [],
"source": [
"def run_rollout_validation(save_recording=True, rec_name=None):\n",
" q_network.eval()\n",
" renders, rewards = [], []\n",
"\n",
" env = make_env()\n",
" obs, info = env.reset(seed=42)\n",
" renders.append(env.render())\n",
" while True:\n",
" with torch.inference_mode():\n",
" if np.random.rand() < 0.05:\n",
" action = env.action_space.sample()\n",
" else:\n",
" q_values = q_network(torch.Tensor(np.array(obs)).unsqueeze(0).to(device))\n",
" action = np.argmax(q_values.cpu().detach().numpy()[0])\n",
" \n",
" obs, reward, termination, _, info = env.step(action)\n",
" rewards.append(reward)\n",
" renders.append(env.render())\n",
" if info['lives'] == 0: break\n",
" if termination: obs, info = env.reset(seed=42)\n",
"\n",
" if save_recording:\n",
" if rec_name is None: rec_name = f'{run.hash}_{sum(rewards)}'\n",
" imageio.mimsave(f'videos/{rec_name}.gif', np.stack(renders))\n",
" \n",
" q_network.train()\n",
" return rewards"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "a7d2e8f2-67fd-43ce-9257-77112cc5dfca",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'5b88fc0f421c4f7fbd19650e'"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"args = Args()\n",
"\n",
"run = Run(experiment=\"dqn_breakout\", repo='dry_run' if dry_run else None)\n",
"run[\"hparams\"] = vars(args)\n",
"\n",
"!mkdir -p videos\n",
"model_path = Path(f\"models/{run.hash}\")\n",
"!mkdir {model_path} \n",
"\n",
"run.hash"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "960e218c-c376-45c5-a301-08a1f7172f18",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<All keys matched successfully>"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"device = torch.device(\"cuda\")\n",
"\n",
"q_network = QNetwork(num_outputs=4).to(device)\n",
"optimizer = optim.Adam(q_network.parameters(), lr=args.learning_rate)\n",
"scheduler = LinearLR(optimizer, start_factor=1, end_factor=0.01, total_iters=(args.total_timesteps-args.learning_starts))\n",
"\n",
"\n",
"target_network = QNetwork(num_outputs=4).to(device)\n",
"target_network.load_state_dict(q_network.state_dict())"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "b9e43f26-db4c-4b8a-a0f8-6ebc5a4bc051",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Num trainable params: 1.68618M\n"
]
}
],
"source": [
"print(f'Num trainable params: {sum(param.numel() for param in q_network.parameters()) / 10**6}M')"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "b4852dca-2121-43b2-ac09-889d00b114fd",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"1000000"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"args.buffer_size"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "2ed2ac93-cc4a-4074-a585-63cdd76bd899",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"4"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"args.train_frequency"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "19e0f9b2-bc26-4b0a-a1c1-3f847019fccb",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"10000000"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"args.total_timesteps"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "80b75d3f-18c0-4afd-bcaa-22da433ac308",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(1, 0.01, 0.1)"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"args.start_e, args.end_e, args.exploration_fraction"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "e9e6ca77-74a1-4f8f-9e49-2bebb940856d",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Step 80003:\tEMA Loss = 0.0000\tEMA qvalues = 0.0000\r"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/radek/miniforge3/envs/cleanrl/lib/python3.10/site-packages/torch/nn/modules/conv.py:456: UserWarning: Plan failed with a cudnnException: CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: cudnnFinalize Descriptor Failed cudnn_status: CUDNN_STATUS_NOT_SUPPORTED (Triggered internally at ../aten/src/ATen/native/cudnn/Conv_v8.cpp:919.)\n",
" return F.conv2d(input, weight, bias, self.stride,\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Step 99999:\tEMA Loss = 0.0086\tEMA qvalues = 0.2105\r"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/radek/miniforge3/envs/cleanrl/lib/python3.10/site-packages/gymnasium/utils/passive_env_checker.py:364: UserWarning: \u001b[33mWARN: No render fps was declared in the environment (env.metadata['render_fps'] is None or not defined), rendering may occur at inconsistent fps.\u001b[0m\n",
" logger.warn(\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 9h 49min 32s, sys: 24min 44s, total: 10h 14min 16s\n",
"Wall time: 5h 32min 22s\n"
]
}
],
"source": [
"%%time\n",
"\n",
"rb = ReplayBuffer(\n",
" args.buffer_size, # 1_000_000\n",
" env.observation_space,\n",
" env.action_space,\n",
" device,\n",
" optimize_memory_usage=True,\n",
" handle_timeout_termination=False,\n",
")\n",
"\n",
"alpha = 0.1 # Smoothing factor\n",
"ema_loss = 0.0 # Initialize the Exponential Moving Average loss\n",
"ema_qvalues = 0.0 # Same as above but for qvalues\n",
"\n",
"obs, _ = env.reset(seed=args.seed)\n",
"\n",
"for global_step in range(args.total_timesteps):\n",
" epsilon = linear_schedule(args.start_e, args.end_e, args.exploration_fraction * args.total_timesteps, global_step)\n",
" if random.random() < epsilon:\n",
" action = env.action_space.sample()\n",
" else:\n",
" q_values = q_network(torch.Tensor(np.array(obs)).unsqueeze(0).to(device))\n",
" action = np.argmax(q_values.cpu().detach().numpy()[0])\n",
"\n",
" next_obs, reward, termination, _, info = env.step(action)\n",
" ####\n",
" # obs: observation at t\n",
" # next_obs: observation at t+1\n",
" # action: action taken at t, either randomly sampled or on policy\n",
" # reward: reward for action\n",
" # termination: whether next_obs is the final observation\n",
" rb.add(obs, next_obs, action, reward, termination, info)\n",
" if termination: obs, _ = env.reset()\n",
"\n",
" # TRY NOT TO MODIFY: CRUCIAL step easy to overlook\n",
" obs = next_obs\n",
"\n",
" if global_step > args.learning_starts:\n",
" if global_step % args.train_frequency == 0:\n",
" data = rb.sample(args.batch_size)\n",
" with torch.no_grad():\n",
" target_max, _ = target_network(data.next_observations).max(dim=1)\n",
" td_target = data.rewards.flatten() + args.gamma * target_max * (1 - data.dones.flatten())\n",
" old_val = q_network(data.observations).gather(1, data.actions).squeeze()\n",
" loss = F.mse_loss(td_target, old_val)\n",
"\n",
" # optimize the model\n",
" optimizer.zero_grad()\n",
" loss.backward()\n",
" optimizer.step()\n",
" scheduler.step()\n",
"\n",
" ema_loss = alpha * loss.item() + (1 - alpha) * ema_loss\n",
" ema_qvalues = alpha * old_val.mean().item() + (1 - alpha) * ema_qvalues # maybe best to track just the max value?\n",
" # also, this takes the sum across all exmaples\n",
" # in a batch!!! that is not right\n",
" run.track(loss.item(), name='train loss', step=global_step)\n",
" run.track(old_val.mean().item(), name='qvalues (mean)', step=global_step)\n",
" run.track(old_val.max().item(), name='qvalues (max)', step=global_step)\n",
" run.track(ema_loss, name='ema loss', step=global_step)\n",
" run.track(ema_qvalues, name='ema qvalues (mean)', step=global_step)\n",
"\n",
" if global_step % 100_000 == 0 or global_step-1 == args.total_timesteps:\n",
" rewards = run_rollout_validation(save_recording=True, rec_name=None)\n",
" run.track(sum(rewards), step=global_step, name='rollout reward')\n",
" torch.save(q_network.state_dict(), model_path / f'{global_step}_{sum(rewards)}')\n",
" # print(f'Rollout reward at step {global_step}: {sum(rewards)}')\n",
" \n",
" # update target network\n",
" if global_step % args.target_network_frequency == 0:\n",
" for target_network_param, q_network_param in zip(target_network.parameters(), q_network.parameters()):\n",
" target_network_param.data.copy_(\n",
" args.tau * q_network_param.data + (1.0 - args.tau) * target_network_param.data\n",
" )\n",
" print(f\"Step {global_step}:\\tEMA Loss = {ema_loss:.4f}\\tEMA qvalues = {ema_qvalues:.4f}\", end='\\r')\n",
"\n",
"run.close()"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "731e044d-c562-4d34-92ef-1db894202e6c",
"metadata": {},
"outputs": [],
"source": [
"# q_network.load_state_dict(torch.load('models/b94d16616faa40a7b667a04f'))\n",
"# q_network.eval()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "417c821f-f27a-4d51-ad64-ebd0f28d58d2",
"metadata": {},
"outputs": [],
"source": [
"from IPython.display import Image\n",
"\n",
"Image('videos/b94d16616faa40a7b667a04f_91.0.gif')"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.14"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment