{"cells": [{"cell_type": "markdown", "id": "017408fb", "metadata": {"papermill": {"duration": 0.003265, "end_time": "2023-10-12T02:32:22.601006", "exception": false, "start_time": "2023-10-12T02:32:22.597741", "status": "completed"}, "tags": []}, "source": ["\n", "# How to train a Deep Q Network\n", "\n", "* **Author:** Lightning.ai\n", "* **License:** CC BY-SA\n", "* **Generated:** 2023-10-12T02:31:55.130696\n", "\n", "Main takeaways:\n", "\n", "1. RL has the same flow as previous models we have seen, with a few additions\n", "2. Handle unsupervised learning by using an IterableDataset where the dataset itself is constantly updated during training\n", "3. Each training step carries has the agent taking an action in the environment and storing the experience in the IterableDataset\n", "\n", "\n", "---\n", "Open in [![Open In Colab](data:image/png;base64,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){height=\"20px\" width=\"117px\"}](https://colab.research.google.com/github/PytorchLightning/lightning-tutorials/blob/publication/.notebooks/lightning_examples/reinforce-learning-DQN.ipynb)\n", "\n", "Give us a \u2b50 [on Github](https://www.github.com/Lightning-AI/lightning/)\n", "| Check out [the documentation](https://pytorch-lightning.readthedocs.io/en/stable/)\n", "| Join us [on Slack](https://www.pytorchlightning.ai/community)"]}, {"cell_type": "markdown", "id": "022f9a20", "metadata": {"papermill": {"duration": 0.002439, "end_time": "2023-10-12T02:32:22.606166", "exception": false, "start_time": "2023-10-12T02:32:22.603727", "status": "completed"}, "tags": []}, "source": ["## Setup\n", "This notebook requires some packages besides pytorch-lightning."]}, {"cell_type": "code", "execution_count": 1, "id": "af6ab99e", "metadata": {"colab": {}, "colab_type": "code", "execution": {"iopub.execute_input": "2023-10-12T02:32:22.612363Z", "iopub.status.busy": "2023-10-12T02:32:22.612193Z", "iopub.status.idle": "2023-10-12T02:32:26.226744Z", "shell.execute_reply": "2023-10-12T02:32:26.225392Z"}, "id": "LfrJLKPFyhsK", "lines_to_next_cell": 0, "papermill": {"duration": 3.620149, "end_time": "2023-10-12T02:32:26.228791", "exception": false, "start_time": "2023-10-12T02:32:22.608642", "status": "completed"}, "tags": []}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\r\n", "\u001b[0m"]}], "source": ["! pip install --quiet \"torchmetrics>=0.7, <1.3\" \"torch>=1.8.1, <2.1.0\" \"seaborn\" \"ipython[notebook]>=8.0.0, <8.17.0\" \"urllib3\" \"setuptools>=68.0.0, <68.3.0\" \"pygame\" \"pandas\" \"matplotlib>=3.0.0, <3.9.0\" \"pytorch-lightning>=1.4, <2.1.0\" \"lightning>=2.0.0\" \"gym <0.24\""]}, {"cell_type": "code", "execution_count": 2, "id": "39abd144", "metadata": {"execution": {"iopub.execute_input": "2023-10-12T02:32:26.236161Z", "iopub.status.busy": "2023-10-12T02:32:26.235792Z", "iopub.status.idle": "2023-10-12T02:32:29.015454Z", "shell.execute_reply": "2023-10-12T02:32:29.014202Z"}, "papermill": {"duration": 2.785715, "end_time": "2023-10-12T02:32:29.017517", "exception": false, "start_time": "2023-10-12T02:32:26.231802", "status": "completed"}, "tags": []}, "outputs": [{"name": "stderr", "output_type": "stream", "text": ["/tmp/ipykernel_598/94481177.py:10: DeprecationWarning: Importing display from IPython.core.display is deprecated since IPython 7.14, please import from IPython display\n", " from IPython.core.display import display\n", "/usr/local/lib/python3.10/dist-packages/lightning_utilities/core/imports.py:13: DeprecationWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html\n", " import pkg_resources\n", "/usr/local/lib/python3.10/dist-packages/lightning_fabric/__init__.py:36: DeprecationWarning: Deprecated call to `pkg_resources.declare_namespace('lightning_fabric')`.\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", " __import__(\"pkg_resources\").declare_namespace(__name__)\n", "/usr/local/lib/python3.10/dist-packages/torchmetrics/utilities/imports.py:24: DeprecationWarning: distutils Version classes are deprecated. Use packaging.version instead.\n", " _PYTHON_LOWER_3_8 = LooseVersion(_PYTHON_VERSION) < LooseVersion(\"3.8\")\n"]}, {"name": "stderr", "output_type": "stream", "text": ["/usr/local/lib/python3.10/dist-packages/pytorch_lightning/__init__.py:36: DeprecationWarning: Deprecated call to `pkg_resources.declare_namespace('pytorch_lightning')`.\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", " __import__(\"pkg_resources\").declare_namespace(__name__)\n"]}], "source": ["import os\n", "from collections import OrderedDict, deque, namedtuple\n", "from typing import Iterator, List, Tuple\n", "\n", "import gym\n", "import numpy as np\n", "import pandas as pd\n", "import seaborn as sn\n", "import torch\n", "from IPython.core.display import display\n", "from pytorch_lightning import LightningModule, Trainer\n", "from pytorch_lightning.loggers import CSVLogger\n", "from torch import Tensor, nn\n", "from torch.optim import Adam, Optimizer\n", "from torch.utils.data import DataLoader\n", "from torch.utils.data.dataset import IterableDataset\n", "\n", "PATH_DATASETS = os.environ.get(\"PATH_DATASETS\", \".\")"]}, {"cell_type": "code", "execution_count": 3, "id": "43d268bf", "metadata": {"execution": {"iopub.execute_input": "2023-10-12T02:32:29.024808Z", "iopub.status.busy": "2023-10-12T02:32:29.024435Z", "iopub.status.idle": "2023-10-12T02:32:29.030483Z", "shell.execute_reply": "2023-10-12T02:32:29.029496Z"}, "papermill": {"duration": 0.012004, "end_time": "2023-10-12T02:32:29.032470", "exception": false, "start_time": "2023-10-12T02:32:29.020466", "status": "completed"}, "tags": []}, "outputs": [], "source": ["class DQN(nn.Module):\n", " def __init__(self, obs_size: int, n_actions: int, hidden_size: int = 128):\n", " \"\"\"Simple MLP network.\n", "\n", " Args:\n", " obs_size: observation/state size of the environment\n", " n_actions: number of discrete actions available in the environment\n", " hidden_size: size of hidden layers\n", " \"\"\"\n", " super().__init__()\n", " self.net = nn.Sequential(\n", " nn.Linear(obs_size, hidden_size),\n", " nn.ReLU(),\n", " nn.Linear(hidden_size, n_actions),\n", " )\n", "\n", " def forward(self, x):\n", " return self.net(x.float())"]}, {"cell_type": "markdown", "id": "b54c1545", "metadata": {"papermill": {"duration": 0.003517, "end_time": "2023-10-12T02:32:29.038793", "exception": false, "start_time": "2023-10-12T02:32:29.035276", "status": "completed"}, "tags": []}, "source": ["### Memory"]}, {"cell_type": "code", "execution_count": 4, "id": "52218c62", "metadata": {"execution": {"iopub.execute_input": "2023-10-12T02:32:29.045488Z", "iopub.status.busy": "2023-10-12T02:32:29.045304Z", "iopub.status.idle": "2023-10-12T02:32:29.049602Z", "shell.execute_reply": "2023-10-12T02:32:29.048617Z"}, "papermill": {"duration": 0.009457, "end_time": "2023-10-12T02:32:29.051006", "exception": false, "start_time": "2023-10-12T02:32:29.041549", "status": "completed"}, "tags": []}, "outputs": [], "source": ["\n", "# Named tuple for storing experience steps gathered in training\n", "Experience = namedtuple(\n", " \"Experience\",\n", " field_names=[\"state\", \"action\", \"reward\", \"done\", \"new_state\"],\n", ")"]}, {"cell_type": "code", "execution_count": 5, "id": "ea2c7d65", "metadata": {"execution": {"iopub.execute_input": "2023-10-12T02:32:29.057722Z", "iopub.status.busy": "2023-10-12T02:32:29.057486Z", "iopub.status.idle": "2023-10-12T02:32:29.065309Z", "shell.execute_reply": "2023-10-12T02:32:29.064253Z"}, "papermill": {"duration": 0.012862, "end_time": "2023-10-12T02:32:29.066667", "exception": false, "start_time": "2023-10-12T02:32:29.053805", "status": "completed"}, "tags": []}, "outputs": [], "source": ["class ReplayBuffer:\n", " \"\"\"Replay Buffer for storing past experiences allowing the agent to learn from them.\n", "\n", " Args:\n", " capacity: size of the buffer\n", " \"\"\"\n", "\n", " def __init__(self, capacity: int) -> None:\n", " self.buffer = deque(maxlen=capacity)\n", "\n", " def __len__(self) -> None:\n", " return len(self.buffer)\n", "\n", " def append(self, experience: Experience) -> None:\n", " \"\"\"Add experience to the buffer.\n", "\n", " Args:\n", " experience: tuple (state, action, reward, done, new_state)\n", " \"\"\"\n", " self.buffer.append(experience)\n", "\n", " def sample(self, batch_size: int) -> Tuple:\n", " indices = np.random.choice(len(self.buffer), batch_size, replace=False)\n", " states, actions, rewards, dones, next_states = zip(*(self.buffer[idx] for idx in indices))\n", "\n", " return (\n", " np.array(states),\n", " np.array(actions),\n", " np.array(rewards, dtype=np.float32),\n", " np.array(dones, dtype=bool),\n", " np.array(next_states),\n", " )"]}, {"cell_type": "code", "execution_count": 6, "id": "1bf45d19", "metadata": {"execution": {"iopub.execute_input": "2023-10-12T02:32:29.073593Z", "iopub.status.busy": "2023-10-12T02:32:29.073354Z", "iopub.status.idle": "2023-10-12T02:32:29.079728Z", "shell.execute_reply": "2023-10-12T02:32:29.078683Z"}, "lines_to_next_cell": 2, "papermill": {"duration": 0.011456, "end_time": "2023-10-12T02:32:29.081004", "exception": false, "start_time": "2023-10-12T02:32:29.069548", "status": "completed"}, "tags": []}, "outputs": [], "source": ["class RLDataset(IterableDataset):\n", " \"\"\"Iterable Dataset containing the ExperienceBuffer which will be updated with new experiences during training.\n", "\n", " Args:\n", " buffer: replay buffer\n", " sample_size: number of experiences to sample at a time\n", " \"\"\"\n", "\n", " def __init__(self, buffer: ReplayBuffer, sample_size: int = 200) -> None:\n", " self.buffer = buffer\n", " self.sample_size = sample_size\n", "\n", " def __iter__(self) -> Iterator[Tuple]:\n", " states, actions, rewards, dones, new_states = self.buffer.sample(self.sample_size)\n", " for i in range(len(dones)):\n", " yield states[i], actions[i], rewards[i], dones[i], new_states[i]"]}, {"cell_type": "markdown", "id": "4590f93f", "metadata": {"lines_to_next_cell": 2, "papermill": {"duration": 0.002819, "end_time": "2023-10-12T02:32:29.086659", "exception": false, "start_time": "2023-10-12T02:32:29.083840", "status": "completed"}, "tags": []}, "source": ["### Agent"]}, {"cell_type": "code", "execution_count": 7, "id": "5fed98cf", "metadata": {"execution": {"iopub.execute_input": "2023-10-12T02:32:29.093635Z", "iopub.status.busy": "2023-10-12T02:32:29.093396Z", "iopub.status.idle": "2023-10-12T02:32:29.104106Z", "shell.execute_reply": "2023-10-12T02:32:29.103165Z"}, "lines_to_next_cell": 2, "papermill": {"duration": 0.016019, "end_time": "2023-10-12T02:32:29.105495", "exception": false, "start_time": "2023-10-12T02:32:29.089476", "status": "completed"}, "tags": []}, "outputs": [], "source": ["class Agent:\n", " def __init__(self, env: gym.Env, replay_buffer: ReplayBuffer) -> None:\n", " \"\"\"Base Agent class handling the interaction with the environment.\n", "\n", " Args:\n", " env: training environment\n", " replay_buffer: replay buffer storing experiences\n", " \"\"\"\n", " self.env = env\n", " self.replay_buffer = replay_buffer\n", " self.reset()\n", " self.state = self.env.reset()\n", "\n", " def reset(self) -> None:\n", " \"\"\"Resents the environment and updates the state.\"\"\"\n", " self.state = self.env.reset()\n", "\n", " def get_action(self, net: nn.Module, epsilon: float, device: str) -> int:\n", " \"\"\"Using the given network, decide what action to carry out using an epsilon-greedy policy.\n", "\n", " Args:\n", " net: DQN network\n", " epsilon: value to determine likelihood of taking a random action\n", " device: current device\n", "\n", " Returns:\n", " action\n", " \"\"\"\n", " if np.random.random() < epsilon:\n", " action = self.env.action_space.sample()\n", " else:\n", " state = torch.tensor([self.state])\n", "\n", " if device not in [\"cpu\"]:\n", " state = state.cuda(device)\n", "\n", " q_values = net(state)\n", " _, action = torch.max(q_values, dim=1)\n", " action = int(action.item())\n", "\n", " return action\n", "\n", " @torch.no_grad()\n", " def play_step(\n", " self,\n", " net: nn.Module,\n", " epsilon: float = 0.0,\n", " device: str = \"cpu\",\n", " ) -> Tuple[float, bool]:\n", " \"\"\"Carries out a single interaction step between the agent and the environment.\n", "\n", " Args:\n", " net: DQN network\n", " epsilon: value to determine likelihood of taking a random action\n", " device: current device\n", "\n", " Returns:\n", " reward, done\n", " \"\"\"\n", " action = self.get_action(net, epsilon, device)\n", "\n", " # do step in the environment\n", " # So, in the deprecated version of gym, the env.step() has 4 values unpacked which is\n", " # obs, reward, done, info = env.step(action)\n", " # In the latest version of gym, the step() function returns back an additional variable which is truncated.\n", " # obs, reward, terminated, truncated, info = env.step(action)\n", " new_state, reward, done, _ = self.env.step(action)\n", "\n", " exp = Experience(self.state, action, reward, done, new_state)\n", "\n", " self.replay_buffer.append(exp)\n", "\n", " self.state = new_state\n", " if done:\n", " self.reset()\n", " return reward, done"]}, {"cell_type": "markdown", "id": "efabc3b9", "metadata": {"lines_to_next_cell": 2, "papermill": {"duration": 0.002849, "end_time": "2023-10-12T02:32:29.111214", "exception": false, "start_time": "2023-10-12T02:32:29.108365", "status": "completed"}, "tags": []}, "source": ["### DQN Lightning Module"]}, {"cell_type": "code", "execution_count": 8, "id": "01661227", "metadata": {"execution": {"iopub.execute_input": "2023-10-12T02:32:29.118119Z", "iopub.status.busy": "2023-10-12T02:32:29.117874Z", "iopub.status.idle": "2023-10-12T02:32:29.146533Z", "shell.execute_reply": "2023-10-12T02:32:29.145595Z"}, "papermill": {"duration": 0.033675, "end_time": "2023-10-12T02:32:29.147749", "exception": false, "start_time": "2023-10-12T02:32:29.114074", "status": "completed"}, "tags": []}, "outputs": [], "source": ["class DQNLightning(LightningModule):\n", " def __init__(\n", " self,\n", " batch_size: int = 16,\n", " lr: float = 1e-2,\n", " env: str = \"CartPole-v0\",\n", " gamma: float = 0.99,\n", " sync_rate: int = 10,\n", " replay_size: int = 1000,\n", " warm_start_size: int = 1000,\n", " eps_last_frame: int = 1000,\n", " eps_start: float = 1.0,\n", " eps_end: float = 0.01,\n", " episode_length: int = 200,\n", " warm_start_steps: int = 1000,\n", " ) -> None:\n", " \"\"\"Basic DQN Model.\n", "\n", " Args:\n", " batch_size: size of the batches\")\n", " lr: learning rate\n", " env: gym environment tag\n", " gamma: discount factor\n", " sync_rate: how many frames do we update the target network\n", " replay_size: capacity of the replay buffer\n", " warm_start_size: how many samples do we use to fill our buffer at the start of training\n", " eps_last_frame: what frame should epsilon stop decaying\n", " eps_start: starting value of epsilon\n", " eps_end: final value of epsilon\n", " episode_length: max length of an episode\n", " warm_start_steps: max episode reward in the environment\n", " \"\"\"\n", " super().__init__()\n", " self.save_hyperparameters()\n", "\n", " self.env = gym.make(self.hparams.env)\n", " obs_size = self.env.observation_space.shape[0]\n", " n_actions = self.env.action_space.n\n", "\n", " self.net = DQN(obs_size, n_actions)\n", " self.target_net = DQN(obs_size, n_actions)\n", "\n", " self.buffer = ReplayBuffer(self.hparams.replay_size)\n", " self.agent = Agent(self.env, self.buffer)\n", " self.total_reward = 0\n", " self.episode_reward = 0\n", " self.populate(self.hparams.warm_start_steps)\n", "\n", " def populate(self, steps: int = 1000) -> None:\n", " \"\"\"Carries out several random steps through the environment to initially fill up the replay buffer with\n", " experiences.\n", "\n", " Args:\n", " steps: number of random steps to populate the buffer with\n", " \"\"\"\n", " for _ in range(steps):\n", " self.agent.play_step(self.net, epsilon=1.0)\n", "\n", " def forward(self, x: Tensor) -> Tensor:\n", " \"\"\"Passes in a state x through the network and gets the q_values of each action as an output.\n", "\n", " Args:\n", " x: environment state\n", "\n", " Returns:\n", " q values\n", " \"\"\"\n", " output = self.net(x)\n", " return output\n", "\n", " def dqn_mse_loss(self, batch: Tuple[Tensor, Tensor]) -> Tensor:\n", " \"\"\"Calculates the mse loss using a mini batch from the replay buffer.\n", "\n", " Args:\n", " batch: current mini batch of replay data\n", "\n", " Returns:\n", " loss\n", " \"\"\"\n", " states, actions, rewards, dones, next_states = batch\n", "\n", " state_action_values = self.net(states).gather(1, actions.long().unsqueeze(-1)).squeeze(-1)\n", "\n", " with torch.no_grad():\n", " next_state_values = self.target_net(next_states).max(1)[0]\n", " next_state_values[dones] = 0.0\n", " next_state_values = next_state_values.detach()\n", "\n", " expected_state_action_values = next_state_values * self.hparams.gamma + rewards\n", "\n", " return nn.MSELoss()(state_action_values, expected_state_action_values)\n", "\n", " def get_epsilon(self, start: int, end: int, frames: int) -> float:\n", " if self.global_step > frames:\n", " return end\n", " return start - (self.global_step / frames) * (start - end)\n", "\n", " def training_step(self, batch: Tuple[Tensor, Tensor], nb_batch) -> OrderedDict:\n", " \"\"\"Carries out a single step through the environment to update the replay buffer. Then calculates loss based on\n", " the minibatch received.\n", "\n", " Args:\n", " batch: current mini batch of replay data\n", " nb_batch: batch number\n", "\n", " Returns:\n", " Training loss and log metrics\n", " \"\"\"\n", " device = self.get_device(batch)\n", " epsilon = self.get_epsilon(self.hparams.eps_start, self.hparams.eps_end, self.hparams.eps_last_frame)\n", " self.log(\"epsilon\", epsilon)\n", "\n", " # step through environment with agent\n", " reward, done = self.agent.play_step(self.net, epsilon, device)\n", " self.episode_reward += reward\n", " self.log(\"episode reward\", self.episode_reward)\n", "\n", " # calculates training loss\n", " loss = self.dqn_mse_loss(batch)\n", "\n", " if done:\n", " self.total_reward = self.episode_reward\n", " self.episode_reward = 0\n", "\n", " # Soft update of target network\n", " if self.global_step % self.hparams.sync_rate == 0:\n", " self.target_net.load_state_dict(self.net.state_dict())\n", "\n", " self.log_dict(\n", " {\n", " \"reward\": reward,\n", " \"train_loss\": loss,\n", " }\n", " )\n", " self.log(\"total_reward\", self.total_reward, prog_bar=True)\n", " self.log(\"steps\", self.global_step, logger=False, prog_bar=True)\n", "\n", " return loss\n", "\n", " def configure_optimizers(self) -> List[Optimizer]:\n", " \"\"\"Initialize Adam optimizer.\"\"\"\n", " optimizer = Adam(self.net.parameters(), lr=self.hparams.lr)\n", " return optimizer\n", "\n", " def __dataloader(self) -> DataLoader:\n", " \"\"\"Initialize the Replay Buffer dataset used for retrieving experiences.\"\"\"\n", " dataset = RLDataset(self.buffer, self.hparams.episode_length)\n", " dataloader = DataLoader(\n", " dataset=dataset,\n", " batch_size=self.hparams.batch_size,\n", " )\n", " return dataloader\n", "\n", " def train_dataloader(self) -> DataLoader:\n", " \"\"\"Get train loader.\"\"\"\n", " return self.__dataloader()\n", "\n", " def get_device(self, batch) -> str:\n", " \"\"\"Retrieve device currently being used by minibatch.\"\"\"\n", " return batch[0].device.index if self.on_gpu else \"cpu\""]}, {"cell_type": "markdown", "id": "ddff04fb", "metadata": {"papermill": {"duration": 0.002878, "end_time": "2023-10-12T02:32:29.153668", "exception": false, "start_time": "2023-10-12T02:32:29.150790", "status": "completed"}, "tags": []}, "source": ["### Trainer"]}, {"cell_type": "code", "execution_count": 9, "id": "a7a082fe", "metadata": {"execution": {"iopub.execute_input": "2023-10-12T02:32:29.160921Z", "iopub.status.busy": "2023-10-12T02:32:29.160560Z", "iopub.status.idle": "2023-10-12T02:32:39.231606Z", "shell.execute_reply": "2023-10-12T02:32:39.230728Z"}, "papermill": {"duration": 10.077523, "end_time": "2023-10-12T02:32:39.234065", "exception": false, "start_time": "2023-10-12T02:32:29.156542", "status": "completed"}, "tags": []}, "outputs": [{"name": "stderr", "output_type": "stream", "text": ["/usr/local/lib/python3.10/dist-packages/gym/envs/registration.py:505: UserWarning: \u001b[33mWARN: The environment CartPole-v0 is out of date. You should consider upgrading to version `v1` with the environment ID `CartPole-v1`.\u001b[0m\n", " logger.warn(\n"]}, {"name": "stderr", "output_type": "stream", "text": ["GPU available: True (cuda), used: True\n"]}, {"name": "stderr", "output_type": "stream", "text": ["TPU available: False, using: 0 TPU cores\n"]}, {"name": "stderr", "output_type": "stream", "text": ["IPU available: False, using: 0 IPUs\n"]}, {"name": "stderr", "output_type": "stream", "text": ["HPU available: False, using: 0 HPUs\n"]}, {"name": "stderr", "output_type": "stream", "text": ["You are using a CUDA device ('NVIDIA GeForce RTX 3090') that has Tensor Cores. To properly utilize them, you should set `torch.set_float32_matmul_precision('medium' | 'high')` which will trade-off precision for performance. For more details, read https://pytorch.org/docs/stable/generated/torch.set_float32_matmul_precision.html#torch.set_float32_matmul_precision\n"]}, {"name": "stderr", "output_type": "stream", "text": ["LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0,1]\n"]}, {"name": "stderr", "output_type": "stream", "text": ["\n", " | Name | Type | Params\n", "------------------------------------\n", "0 | net | DQN | 898 \n", "1 | target_net | DQN | 898 \n", "------------------------------------\n", "1.8 K Trainable params\n", "0 Non-trainable params\n", "1.8 K Total params\n", "0.007 Total estimated model params size (MB)\n"]}, {"name": "stderr", "output_type": "stream", "text": ["/usr/local/lib/python3.10/dist-packages/pytorch_lightning/trainer/connectors/data_connector.py:442: PossibleUserWarning: The dataloader, train_dataloader, does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` (try 64 which is the number of cpus on this machine) in the `DataLoader` init to improve performance.\n", " rank_zero_warn(\n"]}, {"data": {"application/vnd.jupyter.widget-view+json": {"model_id": "92023abcd7774a91896fc743d933e5c5", "version_major": 2, "version_minor": 0}, "text/plain": ["Training: 0it [00:00, ?it/s]"]}, "metadata": {}, "output_type": "display_data"}, {"name": "stderr", "output_type": "stream", "text": ["/usr/local/lib/python3.10/dist-packages/torch/utils/data/_utils/collate.py:175: DeprecationWarning: In future, it will be an error for 'np.bool_' scalars to be interpreted as an index\n", " return torch.as_tensor(batch)\n"]}, {"name": "stderr", "output_type": "stream", "text": ["/usr/local/lib/python3.10/dist-packages/pytorch_lightning/trainer/connectors/logger_connector/result.py:212: UserWarning: You called `self.log('total_reward', ...)` in your `training_step` but the value needs to be floating point. Converting it to torch.float32.\n", " warning_cache.warn(\n", "/usr/local/lib/python3.10/dist-packages/pytorch_lightning/trainer/connectors/logger_connector/result.py:212: UserWarning: You called `self.log('steps', ...)` in your `training_step` but the value needs to be floating point. Converting it to torch.float32.\n", " warning_cache.warn(\n"]}, {"name": "stderr", "output_type": "stream", "text": ["/tmp/ipykernel_598/1958637465.py:32: UserWarning: Creating a tensor from a list of numpy.ndarrays is extremely slow. Please consider converting the list to a single numpy.ndarray with numpy.array() before converting to a tensor. (Triggered internally at ../torch/csrc/utils/tensor_new.cpp:245.)\n", " state = torch.tensor([self.state])\n"]}, {"name": "stderr", "output_type": "stream", "text": ["`Trainer.fit` stopped: `max_epochs=150` reached.\n"]}], "source": ["\n", "model = DQNLightning()\n", "\n", "trainer = Trainer(\n", " accelerator=\"auto\",\n", " devices=1 if torch.cuda.is_available() else None, # limiting got iPython runs\n", " max_epochs=150,\n", " val_check_interval=50,\n", " logger=CSVLogger(save_dir=\"logs/\"),\n", ")\n", "\n", "trainer.fit(model)"]}, {"cell_type": "code", "execution_count": 10, "id": "2b2a4ec6", "metadata": {"execution": {"iopub.execute_input": "2023-10-12T02:32:39.253630Z", "iopub.status.busy": "2023-10-12T02:32:39.253435Z", "iopub.status.idle": "2023-10-12T02:32:39.593819Z", "shell.execute_reply": "2023-10-12T02:32:39.592879Z"}, "papermill": {"duration": 0.35152, "end_time": "2023-10-12T02:32:39.595230", "exception": false, "start_time": "2023-10-12T02:32:39.243710", "status": "completed"}, "tags": []}, "outputs": [{"data": {"text/html": ["
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
epsilonepisode rewardrewardtrain_losstotal_reward
epoch
30.9514922.01.00.2638459.0
70.9019918.01.01.85231918.0
110.8524911.01.00.13076025.0
150.8029917.01.025.50997515.0
190.7534922.01.055.59996819.0
\n", "
"], "text/plain": [" epsilon episode reward reward train_loss total_reward\n", "epoch \n", "3 0.95149 22.0 1.0 0.263845 9.0\n", "7 0.90199 18.0 1.0 1.852319 18.0\n", "11 0.85249 11.0 1.0 0.130760 25.0\n", "15 0.80299 17.0 1.0 25.509975 15.0\n", "19 0.75349 22.0 1.0 55.599968 19.0"]}, "metadata": {}, "output_type": "display_data"}, {"data": {"text/plain": [""]}, "execution_count": 10, "metadata": {}, "output_type": "execute_result"}, {"data": {"image/png": "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hdFi6o10+mWlTxswRC2VFlT9YbeVX2srrfpaa1H5tarq+Ro/ORwO5s2bR7t27QgODqZPnz58UmFae8WKFSiKwtKlS+nduzdBQUEMGTKELVu2uK45efpy06ZNjBw5kvDwcCIiIhgwYADr1693nf/000/p0aMHZrOZtm3bsmDBAreY0tPTmTBhAsHBwbRr147333+/UtzZ2dnccMMNxMbGEhERwahRo9i0aZPX97l//34UReF///sfw4cPJygoyPXc//73v3Tr1o2goCC6du3Kyy+/7Lrv4osvZvr06a6vZ8yYgaIo/PPPPwCUlpYSGhrK8uXLAfjuu+8YNmwYkZGRxMTEcN5557Fnz55q47Db7cycOdN137///e9adVJoHr9SCiHqTNrjc8n9+mvi7r6bmOum+HSPcwemLYC1yuLvuZvY6dPQhYVVeZ01PZ2sd9/F1L49LW65pYGi85+zGTk6XbWJpqgHc6tZc3jJW9DjIu3zn+bAmhe8X5vUD6au0D4vzICnOlS+5mH/ii/PmzeP9957j0WLFtGpUyd++eUXrrrqKmJjYxk+fLjrutmzZ/Pcc8+RkJDAfffdx4QJE9i5c6fHEZ4rr7ySfv368corr6DX69m4caPrug0bNnDppZfy8MMPc9lll7FmzRpuvfVWYmJimDJlCqCtpTpy5Ag///wzRqOR22+/nfT0dLfXuOSSSwgODubbb7/FYrHw6quvMnr0aHbu3El0dLTX93vPPfewYMEC+vXr50qIHnzwQV588UX69evHX3/9xY033khoaCjXXnstw4cP59VXX3Xdv3LlSlq0aMGKFSvo2rUrf/zxB1arldNPPx2AgoICZs6cSe/evcnPz+fBBx/koosuYuPGjeh0Oq9xLFiwgLfeeos33niDbt26sWDBAj7//HNGjRrl19+nkyRlQgg3zmbXSjX1vioyJCZgSEoM2M5LAL3F4tPUqa6JtFlSiwoBrRyG88+1aOtW8n/6GVPbNlgmTAhkeCKASkpKmDt3LsuXLyclJQWA9u3bs2rVKl599VW3pOyhhx7irLPOAuDtt9+mVatWfP7551x66aWVnpuamsrs2bPp2rUrAJ06dXKde+aZZxg9ejQPPPAAAJ07d2bbtm089dRTTJkyhZ07d/Ltt9/y+++/c9pppwHw+uuv061bN9czVq1axe+//056ejrmstHfp59+mi+++IJPPvmEqVOnen3PM2bMYOLEiW7va8GCBa5j7dq1Y9u2bbz66qtce+21jBgxgjvuuIPjx49jMBjYtm0bDzzwACtWrODmm29mxYoVnHbaaYSEhAAwadIkt9d74403iI2NZdu2bfTs2dNrHAsXLuTee+91HVu0aBHff/+91/dRHUnKhBBuHK7el0E+39Ny/vz6CsdnRX//jT03D3PnThjj4rxe11R6XzqKtJEyJaR8zU/JP/9w4qWXCBs+XJKy+nbfkarP6yvsTh71IIy41/u1SoWVQiEx1T+7Grt376awsNCVbDmVlpbSr18/t2POpA0gOjqaLl26sH37do/PnTlzJjfccAPvvvsuY8aM4ZJLLqFDB21Ub/v27VxQ1oPVaejQoSxcuBC73c727dsxGAwMGDDAdb5r166Vpkfz8/OJiYlxe05RUZHbVKEnAwcOdH1eUFDAnj17uP7667nxxhtdx202G5ayX8x69uxJdHQ0K1euxGQy0a9fP8477zxeeuklQBs5GzFihOveXbt28eCDD7Ju3TpOnDiBo2wnd2pqqltSVjGOnJwcjh49yuDBg13HDAYDAwcOrPEUpiRlQgg3zp19io8NyRuL9GefpXDtbyTNfxLL+ed7vU4pm45RrdaGCq1GHEVlyXFwiOuYUlamxCG9L+ufyY/eqAYT4OPIsqL492wP8vPzAVi6dCktT9olba7Fv9uHH36YK664gqVLl/Ltt9/y0EMP8eGHH3LRRRfVKl6n/Px8EhMTWbFiRaVz1ZXmCK3Qq9b5/l977TW3hAhAr9cDoCgKZ555JitWrMBsNjNixAh69+5NSUkJW7ZsYc2aNcyaNct134QJE2jTpg2vvfYaSUlJOBwOevbsSelJv7yF1nPPXEnKhBBu1OKyZCDI92/uRVu3krd8OaZWyUROmlj9DfVALdWSLKWa+mpNZaTM1K4trV56EcVQ/m1aSmIIgO7du2M2m0lNTXWbqvTkt99+o3VrrctFVlYWO3fudJtSPFnnzp3p3Lkzd955J5MnT+bNN9/koosuolu3bqxevdrt2tWrV9O5c2f0ej1du3bFZrOxYcMG1/Tljh07yK7Q6aN///6kpaVhMBho27Ztzd48EB8fT1JSEnv37uXKK6/0et3w4cN57bXXMJvNPP744+h0Os4880yeeuopSkpKGDp0KAAZGRns2LGD1157jTPOOAPQplqrY7FYSExMZN26dZx55pkArj+D/v371+i9SVImhHDjHIXxZ6SsZMdOMl5ZROiwYQFMynzbfakLDyds9Gh0ISFVXhdohqgowkePdjumK/s7UaUh+SktPDycWbNmceedd+JwOBg2bBg5OTmsXr2aiIgIrr32Wte1c+bMISYmhvj4eP7zn//QokULj4VNi4qKmD17NhdffDHt2rXj0KFD/PHHH661VnfddRennXYajz76KJdddhlr167lxRdfdO147NKlC+PHj+emm27ilVdewWAwMGPGDLeSG2PGjCElJYULL7yQ+fPn07lzZ44cOcLSpUu56KKL3KYGq/PII49w++23Y7FYGD9+PCUlJaxfv56srCxmzpwJwIgRI7jzzjsxmUwMGzbMdWzWrFmcdtpprlGvqKgoYmJi+L//+z8SExNJTU3lnnvu8SmOO+64gyeeeIJOnTrRtWtXnnnmGbdE1G9qE5STk6MCak5OTqBDEaLZKT10SC3asUO15eX7fE/ujz+p27p0VfdOurgeI6vanvMvULd16arm/boqYDHUJXtBgWo9cUK1FxW5juWvXatu69JV3XPeeQGMTDQGDodDXbhwodqlSxfVaDSqsbGx6rhx49SVK1eqqqqqP//8swqoX3/9tdqjRw/VZDKpgwYNUjdt2uR6xptvvqlaLBZVVVW1pKREvfzyy9Xk5GTVZDKpSUlJ6vTp09WiCv//ffLJJ2r37t1Vo9Gotm7dWn3qqafcYjp69Kh67rnnqmazWW3durX6zjvvqG3atFGfffZZ1zW5ubnqbbfdpiYlJalGo1FNTk5Wr7zySjU1NdXj+9y3b58KqH/99Velc++//77at29f1WQyqVFRUeqZZ56pfvbZZ67zdrtdjYqKUgcPHuw69tdff6mAes8997g9a9myZWq3bt1Us9ms9u7dW12xYoUKqJ9//nmVcVitVvWOO+5QIyIi1MjISHXmzJnqNddco15wwQUe3091FFWtRUGNAMnNzcVisZCTk0NERESgwxHilFf4118cmHwFxlat6Lh8WUBi2HP2OZTu20frd94mdNCggMRQl7L+9xFpDz1E2OjRJL+kNU4v3rGDtEcfxdQqmaQn5gU4QtGYrVixgpEjR5KVlVXvrZRE3ZHpSyGEm8L160GnJ6h7N3RBvu3AdNYpswewTpli0IPB4Cp54Y1a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83g8DBo0iH/9618A9O/fn507dzJz5kwmT57cxq3z3TfffMPs2bP58ssv6dmzJ1u3buWhhx4iPj7+tOrHmc7pdDJhwgQUReGDDz5o6+b4bNOmTbz99tts3rwZSZLaujmCcFo7I6cvIyMj0Wg0tXbz5eTkEBsb20at8t19993HDz/8wG+//UZiYqL38djYWBwOB8XFxTWOb2/92rRpE7m5uQwYMACtVotWq2XlypXMmDEDrVZLTEzMadGPuLg4zjrrrBqP9ejRg2PHjgF429ref8+mTp3Kk08+yfXXX0/v3r25+eabefjhh5k2bRpw+vSjOl/aHBsbW2tjj8vlorCwsN31qyogS0tLY+nSpd5RMmj//fjjjz/Izc0lOTnZ+/89LS2NRx99lJSUFKD990EQ2oszMijT6/UMHDiQ5cuXex/zeDwsX76cYcOGtWHLGqYoCvfddx8LFizg119/JTU1tcbzAwcORKfT1ejXvn37OHbsWLvq1+jRo9mxYwdbt271fgwaNIhJkyZ5Pz8d+jFixIhaKUn2799Phw4dAEhNTSU2NrZGPywWC+vWrWtX/bBarchyzf/qGo0Gj8cDnD79qM6XNg8bNozi4mI2bdrkPebXX3/F4/EwdOjQU97m+lQFZAcOHGDZsmVERETUeL699+Pmm29m+/btNf6/x8fHM3XqVH755Reg/fdBENqNtt5p0Fq++uorxWAwKJ999pmye/du5a677lJCQ0OV7Ozstm5avf7+978rISEhyooVK5SsrCzvh9Vq9R5zzz33KMnJycqvv/6qbNy4URk2bJgybNiwNmy1b6rvvlSU06Mf69evV7RarfLKK68oBw4cUGbPnq0EBAQos2bN8h7z6quvKqGhocr333+vbN++XbnqqquU1NRUpaKiog1bXtPkyZOVhIQE5YcfflCOHDmifPvtt0pkZKTy+OOPe49pj/0oLS1VtmzZomzZskUBlDfeeEPZsmWLd1eiL22++OKLlf79+yvr1q1TVq1apXTp0kW54YYb2k0/HA6HcuWVVyqJiYnK1q1ba/y/t9vt7aYfjf0sTnby7ktFafs+CMLp4IwNyhRFUd555x0lOTlZ0ev1ypAhQ5S1a9e2dZMaBNT58emnn3qPqaioUO69914lLCxMCQgIUK655holKyur7Rrto5ODstOlH4sWLVJ69eqlGAwGpXv37sp//vOfGs97PB7lmWeeUWJiYhSDwaCMHj1a2bdvXxu1tm4Wi0V58MEHleTkZMVoNCodO3ZUnn766Rov+u2xH7/99lud/x8mT57sc5sLCgqUG264QTGbzUpwcLBy2223KaWlpe2mH0eOHKn3//1vv/3WbvrR2M/iZHUFZW3dB0E4HUiKUi2ttyAIgiAIgtAmzsg1ZYIgCIIgCKcbEZQJgiAIgiC0AyIoEwRBEARBaAdEUCYIgiAIgtAOiKBMEARBEAShHRBBmSAIgiAIQjsggjJBEARBEIR2QARlgiAIgiAI7YAIygRBAGDFihVIklSrULwgCIJwaoigTBAEQRAEoR0QQZkgCIIgCEI7IIIyQWgnPB4P06ZNIzU1FZPJRN++fZk3bx5wYmpx8eLF9OnTB6PRyNlnn83OnTtrXGP+/Pn07NkTg8FASkoK06dPr/G83W7niSeeICkpCYPBQOfOnfnkk09qHLNp0yYGDRpEQEAAw4cPZ9++fa3bcUEQBAEQQZkgtBvTpk3j888/Z+bMmezatYuHH36Ym266iZUrV3qPmTp1KtOnT2fDhg1ERUVxxRVX4HQ6ATWYmjBhAtdffz07duzg+eef55lnnuGzzz7znn/LLbcwZ84cZsyYwZ49e/jwww8xm8012vH0008zffp0Nm7ciFar5fbbbz8l/RcEQfirkxRFUdq6EYLwV2e32wkPD2fZsmUMGzbM+/gdd9yB1Wrlrrvu4vzzz+err75i4sSJABQWFpKYmMhnn33GhAkTmDRpEnl5eSxZssR7/uOPP87ixYvZtWsX+/fvp1u3bixdupQxY8bUasOKFSs4//zzWbZsGaNHjwbgxx9/5LLLLqOiogKj0djK3wVBEIS/NjFSJgjtwMGDB7FarVx44YWYzWbvx+eff86hQ4e8x1UP2MLDw+nWrRt79uwBYM+ePYwYMaLGdUeMGMGBAwdwu91s3boVjUbDqFGjGmxLnz59vJ/HxcUBkJub2+I+CoIgCA3TtnUDBEGAsrIyABYvXkxCQkKN5wwGQ43ArLlMJpNPx+l0Ou/nkiQB6no3QRAEoXWJkTJBaAfOOussDAYDx44do3PnzjU+kpKSvMetXbvW+3lRURH79++nR48eAPTo0YPVq1fXuO7q1avp2rUrGo2G3r174/F4aqxREwRBENoPMVImCO1AUFAQjz32GA8//DAej4eRI0dSUlLC6tWrCQ4OpkOHDgC8+OKLREREEBMTw9NPP01kZCRXX301AI8++iiDBw/mpZdeYuLEiaxZs4Z3332X999/H4CUlBQmT57M7bffzowZM+jbty9paWnk5uYyYcKEtuq6IAiCUEkEZYLQTrz00ktERUUxbdo0Dh8+TGhoKAMGDOCpp57yTh+++uqrPPjggxw4cIB+/fqxaNEi9Ho9AAMGDOCbb77h2Wef5aWXXiIuLo4XX3yRW2+91XuPDz74gKeeeop7772XgoICkpOTeeqpp9qiu4IgCMJJxO5LQTgNVO2MLCoqIjQ0tK2bIwiCILQCsaZMEARBEAShHRBBmSAIgiAIQjsgpi8FQRAEQRDaATFSJgiCIAiC0A6IoEwQBEEQBKEdEEGZIAiCIAhCOyCCMkEQBEEQhHZABGWCIAiCIAjtgAjKBEEQBEEQ2gERlAmCIAiCILQDIigTBEEQBEFoB/4fx7CPt5g9atAAAAAASUVORK5CYII=", "text/plain": ["
"]}, "metadata": {}, "output_type": "display_data"}], "source": ["\n", "metrics = pd.read_csv(f\"{trainer.logger.log_dir}/metrics.csv\")\n", "del metrics[\"step\"]\n", "metrics.set_index(\"epoch\", inplace=True)\n", "display(metrics.dropna(axis=1, how=\"all\").head())\n", "sn.relplot(data=metrics, kind=\"line\")"]}, {"cell_type": "markdown", "id": "1d901e52", "metadata": {"papermill": {"duration": 0.004993, "end_time": "2023-10-12T02:32:39.605567", "exception": false, "start_time": "2023-10-12T02:32:39.600574", "status": "completed"}, "tags": []}, "source": ["## Congratulations - Time to Join the Community!\n", "\n", "Congratulations on completing this notebook tutorial! If you enjoyed this and would like to join the Lightning\n", "movement, you can do so in the following ways!\n", "\n", "### Star [Lightning](https://github.com/Lightning-AI/lightning) on GitHub\n", "The easiest way to help our community is just by starring the GitHub repos! This helps raise awareness of the cool\n", "tools we're building.\n", "\n", "### Join our [Slack](https://www.pytorchlightning.ai/community)!\n", "The best way to keep up to date on the latest advancements is to join our community! Make sure to introduce yourself\n", "and share your interests in `#general` channel\n", "\n", "\n", "### Contributions !\n", "The best way to contribute to our community is to become a code contributor! At any time you can go to\n", "[Lightning](https://github.com/Lightning-AI/lightning) or [Bolt](https://github.com/Lightning-AI/lightning-bolts)\n", "GitHub Issues page and filter for \"good first issue\".\n", "\n", "* [Lightning good first issue](https://github.com/Lightning-AI/lightning/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22)\n", "* [Bolt good first issue](https://github.com/Lightning-AI/lightning-bolts/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22)\n", "* You can also contribute your own notebooks with useful examples !\n", "\n", "### Great thanks from the entire Pytorch Lightning Team for your interest !\n", "\n", "[![Pytorch Lightning](data:image/png;base64,NDA0OiBOb3QgRm91bmQ=){height=\"60px\" width=\"240px\"}](https://pytorchlightning.ai)"]}, {"cell_type": "raw", "metadata": {"raw_mimetype": "text/restructuredtext"}, "source": [".. customcarditem::\n", " :header: How to train a Deep Q Network\n", " :card_description: Main takeaways: 1. RL has the same flow as previous models we have seen, with a few additions 2. Handle unsupervised learning by using an IterableDataset where the dataset...\n", " :tags: RL,GPU/TPU,Lightning-Examples"]}], "metadata": {"jupytext": {"cell_metadata_filter": "colab_type,colab,id,-all", "formats": "ipynb,py:percent", "main_language": "python"}, "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.12"}, "papermill": {"default_parameters": {}, "duration": 19.101198, "end_time": "2023-10-12T02:32:40.831451", "environment_variables": {}, "exception": null, "input_path": "lightning_examples/reinforce-learning-DQN/dqn.ipynb", "output_path": ".notebooks/lightning_examples/reinforce-learning-DQN.ipynb", "parameters": {}, "start_time": "2023-10-12T02:32:21.730253", "version": "2.4.0"}, "widgets": {"application/vnd.jupyter.widget-state+json": {"state": {"0be695684aef408e84d9a2c2e522bff5": {"model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {"_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": "inline-flex", "flex": null, "flex_flow": "row wrap", "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": "100%"}}, "2b59434d81104bd48d3b5adffc45f47b": {"model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": {"_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HTMLView", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_489d91d3875d4124b7127d84b595a644", "placeholder": "\u200b", "style": "IPY_MODEL_d92ff7b35cc0413e89a61d5ba5c34cd3", "tabbable": null, "tooltip": null, "value": " 13/? [00:00<00:00, 203.78it/s, v_num=0, total_reward=180.0, steps=1949.0]"}}, "3304ac22d5354fb8a53019f41f58cd54": {"model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {"_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": "2", "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null}}, "489d91d3875d4124b7127d84b595a644": {"model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {"_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null}}, "6fb47dc8190d4a45952e2472cbd6183f": {"model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "FloatProgressModel", "state": {"_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "ProgressView", "bar_style": "success", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_3304ac22d5354fb8a53019f41f58cd54", "max": 1.0, "min": 0.0, "orientation": "horizontal", "style": "IPY_MODEL_e0a1205acd74451cb08110fbf6ef4bd7", "tabbable": null, "tooltip": null, "value": 1.0}}, "92023abcd7774a91896fc743d933e5c5": {"model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HBoxModel", "state": {"_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HBoxView", "box_style": "", "children": ["IPY_MODEL_a4f3e026571249a9ac60467020b11d14", "IPY_MODEL_6fb47dc8190d4a45952e2472cbd6183f", "IPY_MODEL_2b59434d81104bd48d3b5adffc45f47b"], "layout": "IPY_MODEL_0be695684aef408e84d9a2c2e522bff5", "tabbable": null, "tooltip": null}}, "a4f3e026571249a9ac60467020b11d14": {"model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": {"_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "HTMLView", "description": "", "description_allow_html": false, "layout": "IPY_MODEL_b41bba4382ea419db046bb439a2363ce", "placeholder": "\u200b", "style": "IPY_MODEL_a5c08f2566084f2a8f23c315be61a9d0", "tabbable": null, "tooltip": null, "value": "Epoch 149: "}}, "a5c08f2566084f2a8f23c315be61a9d0": {"model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": {"_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "background": null, "description_width": "", "font_size": null, "text_color": null}}, "b41bba4382ea419db046bb439a2363ce": {"model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {"_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null}}, "d92ff7b35cc0413e89a61d5ba5c34cd3": {"model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": {"_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "HTMLStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "background": null, "description_width": "", "font_size": null, "text_color": null}}, "e0a1205acd74451cb08110fbf6ef4bd7": {"model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "ProgressStyleModel", "state": {"_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "bar_color": null, "description_width": ""}}}, "version_major": 2, "version_minor": 0}}}, "nbformat": 4, "nbformat_minor": 5}