diff --git a/BE_1_Apprentissage_automatique.ipynb b/BE_1_Apprentissage_automatique.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..cbce31b7e5e1f1c18f05509cb6233bf0f2e14255 --- /dev/null +++ b/BE_1_Apprentissage_automatique.ipynb @@ -0,0 +1,934 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + } + }, + "cells": [ + { + "cell_type": "code", + "source": [ + "!pip install torch" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "-PGv_hz-jJn7", + "outputId": "b61225a8-8ad9-4b18-b574-6d547223f42d" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Requirement already satisfied: torch in /usr/local/lib/python3.10/dist-packages (2.1.0+cu121)\n", + "Requirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from torch) (3.13.1)\n", + "Requirement already satisfied: typing-extensions in /usr/local/lib/python3.10/dist-packages (from torch) (4.5.0)\n", + "Requirement already satisfied: sympy in /usr/local/lib/python3.10/dist-packages (from torch) (1.12)\n", + "Requirement already satisfied: networkx in /usr/local/lib/python3.10/dist-packages (from torch) (3.2.1)\n", + "Requirement already satisfied: jinja2 in /usr/local/lib/python3.10/dist-packages (from torch) (3.1.3)\n", + "Requirement already satisfied: fsspec in /usr/local/lib/python3.10/dist-packages (from torch) (2023.6.0)\n", + "Requirement already satisfied: triton==2.1.0 in /usr/local/lib/python3.10/dist-packages (from torch) (2.1.0)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from jinja2->torch) (2.1.4)\n", + "Requirement already satisfied: mpmath>=0.19 in /usr/local/lib/python3.10/dist-packages (from sympy->torch) (1.3.0)\n" + ] + } + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "txZqkKH5hC2i", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "44497a9f-d0ed-44ad-f859-19f8315f3327" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Collecting gym==0.26.2\n", + " Downloading gym-0.26.2.tar.gz (721 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m721.7/721.7 kB\u001b[0m \u001b[31m4.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25h Installing build dependencies ... \u001b[?25l\u001b[?25hdone\n", + " Getting requirements to build wheel ... \u001b[?25l\u001b[?25hdone\n", + " Preparing metadata (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n", + "Requirement already satisfied: numpy>=1.18.0 in /usr/local/lib/python3.10/dist-packages (from gym==0.26.2) (1.23.5)\n", + "Requirement already satisfied: cloudpickle>=1.2.0 in /usr/local/lib/python3.10/dist-packages (from gym==0.26.2) (2.2.1)\n", + "Requirement already satisfied: gym-notices>=0.0.4 in /usr/local/lib/python3.10/dist-packages (from gym==0.26.2) (0.0.8)\n", + "Building wheels for collected packages: gym\n", + " Building wheel for gym (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n", + " Created wheel for gym: filename=gym-0.26.2-py3-none-any.whl size=827620 sha256=c0e52d00d327e4107d9d7487856d18889281e05f722af341747342271291b415\n", + " Stored in directory: /root/.cache/pip/wheels/b9/22/6d/3e7b32d98451b4cd9d12417052affbeeeea012955d437da1da\n", + "Successfully built gym\n", + "Installing collected packages: gym\n", + " Attempting uninstall: gym\n", + " Found existing installation: gym 0.25.2\n", + " Uninstalling gym-0.25.2:\n", + " Successfully uninstalled gym-0.25.2\n", + "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", + "dopamine-rl 4.0.6 requires gym<=0.25.2, but you have gym 0.26.2 which is incompatible.\u001b[0m\u001b[31m\n", + "\u001b[0mSuccessfully installed gym-0.26.2\n", + "Collecting pyglet==2.0.10\n", + " Downloading pyglet-2.0.10-py3-none-any.whl (858 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m858.3/858.3 kB\u001b[0m \u001b[31m5.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hInstalling collected packages: pyglet\n", + "Successfully installed pyglet-2.0.10\n", + "Requirement already satisfied: pygame==2.5.2 in /usr/local/lib/python3.10/dist-packages (2.5.2)\n", + "Collecting PyQt5\n", + " Downloading PyQt5-5.15.10-cp37-abi3-manylinux_2_17_x86_64.whl (8.2 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m8.2/8.2 MB\u001b[0m \u001b[31m23.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hCollecting PyQt5-sip<13,>=12.13 (from PyQt5)\n", + " Downloading PyQt5_sip-12.13.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.whl (338 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m338.1/338.1 kB\u001b[0m \u001b[31m29.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hCollecting PyQt5-Qt5>=5.15.2 (from PyQt5)\n", + " Downloading PyQt5_Qt5-5.15.2-py3-none-manylinux2014_x86_64.whl (59.9 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m59.9/59.9 MB\u001b[0m \u001b[31m8.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hInstalling collected packages: PyQt5-Qt5, PyQt5-sip, PyQt5\n", + "Successfully installed PyQt5-5.15.10 PyQt5-Qt5-5.15.2 PyQt5-sip-12.13.0\n" + ] + } + ], + "source": [ + "!pip install gym==0.26.2\n", + "!pip install pyglet==2.0.10\n", + "!pip install pygame==2.5.2\n", + "!pip install PyQt5" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The REINFORCE algorithm (also known as Vanilla Policy Gradient) is a policy gradient method that optimizes the policy directly using gradient descent. The following is the pseudocode of the REINFORCE algorithm:" + ], + "metadata": { + "id": "4w5SGUKBozft" + } + }, + { + "cell_type": "markdown", + "source": [ + "**Setup the CartPole environment**\n", + "\n", + "**Setup the agent as a simple neural network with:**\n", + " \n", + "- One fully connected layer with 128 units and ReLU activation followed by a dropout layer\n", + "\n", + "- One fully connected layer followed by softmax activation\n", + "\n", + "**Repeat 500 times:**\n", + "\n", + " Reset the environment\n", + " \n", + " Reset the buffer\n", + " \n", + " Repeat until the end of the episode:\n", + " \n", + " - Compute action probabilities\n", + " \n", + " - Sample the action based on the probabilities and\n", + " store its probability in the buffer\n", + " \n", + " - Step the environment with the action\n", + " \n", + " - Compute and store in the buffer the return using gamma=0.99\n", + " \n", + " Normalize the return\n", + " \n", + " Compute the policy loss as -sum(log(prob) * return)\n", + " \n", + " Update the policy using an Adam optimizer and a learning rate of 5e-3" + ], + "metadata": { + "id": "ibubEQw2pPfn" + } + }, + { + "cell_type": "code", + "source": [ + "import gym, pygame, numpy as np, matplotlib.pyplot as plt\n", + "import torch, torch.nn as nn, torch.nn.functional as F, torch.optim as optim\n", + "from torch.distributions import Categorical\n", + "\n", + "# Setup the CartPole environment\n", + "env = gym.make(\"CartPole-v1\", render_mode=\"human\")\n", + "\n", + "# Setup the agent as a simple neural network\n", + "class Agent(nn.Module) :\n", + " def __init__(self) :\n", + " super(Agent, self).__init__()\n", + " self.FC1 = nn.Linear(env.observation_space.shape[0], 128)\n", + " self.FC2 = nn.Linear(128, env.action_space.n)\n", + "\n", + " def forward(self, x) :\n", + " x = self.FC1(x)\n", + " x = F.relu(x)\n", + " x = F.dropout(x)\n", + " x = self.FC2(x)\n", + " x = F.softmax(x, dim=1)\n", + " return x\n", + "\n", + "# Creation of the agent\n", + "agent = Agent()\n", + "rewards_tot = []\n", + "\n", + "# Repeat 500 times\n", + "for i in range(500):\n", + " # Reset the environment\n", + " obs = env.reset()\n", + " obs = obs[0] if isinstance(obs, tuple) else obs\n", + " # Reset the buffer\n", + " rewards, log_probs_list, terminated, step = [], [], False, 0\n", + "\n", + " # Repeat until the end of the episode\n", + " while terminated == False and step < 500:\n", + " step += 1\n", + " # Compute action probabilities\n", + " obs_tensor = torch.FloatTensor(obs).unsqueeze(0)\n", + " log_probs = agent(obs_tensor)\n", + " probs = torch.exp(log_probs)\n", + " # Sample the action based on the probabilities and store probability\n", + " action = torch.multinomial(probs, 1).item()\n", + " # Step the environment with the action\n", + " new_obs, reward, terminated, _ = env.step(action)\n", + " env.render()\n", + " # Compute and store the return in the buffer\n", + " rewards.append(reward)\n", + " log_probs_list.append(log_probs[0, action])\n", + " obs = new_obs\n", + "\n", + " # Normalize the return\n", + " R = 0\n", + " returns = []\n", + " for r_i in rewards[::-1] :\n", + " R = r_i + 0.99*R\n", + " returns.insert(0, R)\n", + " returns = torch.tensor(returns)\n", + " returns = 1/(returns.std(dim=0) + 1e-9) * (returns - returns.mean(dim=0))\n", + " rewards_tot.append(sum(rewards))\n", + " # Compute the policy loss\n", + " loss = -torch.sum(torch.stack(log_probs_list) * torch.FloatTensor(returns))\n", + " # Update policy with an Adam optimizer\n", + " optimizer = optim.Adam(agent.parameters(), lr=5e-3)\n", + " optimizer.zero_grad()\n", + " loss.backward()\n", + " optimizer.step()\n", + "\n", + "# Close the environment\n", + "env.close()\n", + "# Reward plot\n", + "plt.figure()\n", + "plt.plot(rewards_tot)\n", + "plt.xlabel('Episode')\n", + "plt.ylabel('Reward')\n", + "plt.title('Reinforcement rewards')\n", + "plt.show()" + ], + "metadata": { + "id": "hsWjK91KmKLZ", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 472 + }, + "outputId": "da6ceb82-877f-41f3-f20a-2614db89fa2b" + }, + "execution_count": 17, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "<Figure size 640x480 with 1 Axes>" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjsAAAHHCAYAAABZbpmkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAADGDklEQVR4nOydd5wU9f3/X1vu9hp3x1GO3hRBVBBBEAFFQRF7j4qJ+rVEozFK1FhiTX4hMbFEYyyxoIkldo0aDAoqKCAioBQRFCnC0a9zd7s78/tjb2Y/n898PlP2tt69nz58sDc7O/OZ2dn5vOZdfbqu6yAIgiAIgmin+DM9AIIgCIIgiFRCYocgCIIgiHYNiR2CIAiCINo1JHYIgiAIgmjXkNghCIIgCKJdQ2KHIAiCIIh2DYkdgiAIgiDaNSR2CIIgCIJo15DYIQiCIAiiXUNihyBylI8++gg+nw8fffRRQp/fvn07zj77bHTp0gU+nw8PPvhgUsdHtF/uuusu+Hy+TA+DIFxDYocg0sCsWbPg8/nM/4PBIHr37o2LL74YP/74Y0bGdP311+P999/HLbfcgn/+85844YQTMjKOXGP16tW466678MMPP2R6KARBuCSY6QEQREfinnvuwcCBA9HU1IRFixZh1qxZWLBgAVauXImCggJP2zrqqKOwb98+5OfnJzSWuXPn4rTTTsMNN9yQ0Oc7KqtXr8bdd9+NSZMmYcCAAZkeDkEQLiCxQxBpZNq0aRg9ejQA4LLLLkPXrl3xpz/9CW+//TbOPfdcT9vy+/2eBRLLjh07UF5envDnRZqampCfnw+/nwzGTjQ0NKC4uDjTw1ASiUSgaVrCQpogsg26KxFEBpk4cSIA4LvvvuOWf/PNNzj77LNRUVGBgoICjB49Gm+//Ta3jixmZ9KkSTj44IOxevVqHHPMMSgqKkLv3r1x7733musYLjVd1/HII4+YrjWD77//Hueccw4qKipQVFSEI444Au+++6503y+99BJ++9vfonfv3igqKkJtbS0AYPHixTjxxBPRuXNnFBcXY/jw4fjrX//q+RiNsS5YsADXXnstunXrhvLycvz85z9HS0sLqqur8bOf/QydO3dG586dcdNNN0HXdW4bmqbhwQcfxEEHHYSCggJUVlbi5z//Ofbu3cutN2DAAJx88slYsGABxowZg4KCAgwaNAjPPfccN55zzjkHAHDMMceY584uburiiy9GSUkJvvvuO5x44ono1KkTpk+f7npsM2bMQJcuXbjj+uUvfwmfz4eHHnrIXLZ9+3b4fD48+uijAICWlhbccccdGDVqFMrKylBcXIyJEydi3rx53Ph++OEH+Hw+/OUvf8GDDz6I/fbbD6FQCKtXrwYALFiwAIcffjgKCgqw33774fHHH5ce55w5czBhwgSUl5ejpKQEQ4YMwa233qo8LwSRTsiyQxAZxIj76Ny5s7ls1apVGD9+PHr37o2bb74ZxcXFePnll3H66afjtddewxlnnGG7zb179+KEE07AmWeeiXPPPRevvvoqfvOb3+CQQw7BtGnTcNRRR+Gf//wnfvrTn+K4447Dz372M/Oz27dvx5FHHonGxkZce+216NKlC5599lmceuqpePXVVy37/t3vfof8/HzccMMNaG5uRn5+PubMmYOTTz4ZPXv2xK9+9Sv06NEDa9aswTvvvINf/epXCR3jL3/5S/To0QN33303Fi1ahCeeeALl5eX47LPP0K9fP/zhD3/Ae++9hz//+c84+OCDuWP6+c9/jlmzZuGSSy7Btddeiw0bNuBvf/sbli1bhk8//RR5eXnmuuvXr8fZZ5+NSy+9FBdddBGefvppXHzxxRg1ahQOOuggHHXUUbj22mvx0EMP4dZbb8WBBx4IAOa/KiKRCKZOnYoJEybgL3/5C4qKilyPbeLEiXjggQewatUqHHzwwQCA+fPnw+/3Y/78+bj22mvNZUDMvQkAtbW1ePLJJ3H++efj8ssvR11dHZ566ilMnToVn3/+OQ499FBujM888wyamppwxRVXIBQKoaKiAl9//TWOP/54dOvWDXfddRcikQjuvPNOVFZWcp9dtWoVTj75ZAwfPhz33HMPQqEQ1q9fj08//dT2vBBE2tAJgkg5zzzzjA5A/+CDD/SdO3fqmzdv1l999VW9W7dueigU0jdv3myuO3nyZP2QQw7Rm5qazGWapulHHnmkPnjwYHPZvHnzdAD6vHnzzGVHH320DkB/7rnnzGXNzc16jx499LPOOosbEwD96quv5pZdd911OgB9/vz55rK6ujp94MCB+oABA/RoNMrte9CgQXpjY6O5biQS0QcOHKj3799f37t3L7dtTdM8H6Nx3qZOncp9fty4cbrP59OvvPJKbt99+vTRjz76aHPZ/Pnz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v7ICAHDrG18nf+NptuzkamxTtkBihyAIgoiThjm1sTlu2cnVOZwvKpjedhGEd0jsEARBdHBULplUBWuny7KTSvQ0t4ugbKy2QWKHIAiig6On2SXDWnZy1WCR7nNG2Vhtg8QOQRBEByfdfZ7ag2WHy8ZKS4ByynfBkZvfihoSOwRBEAwdss5Omvs8sdlYuRoQnvaigmTZaRMkdgiCIAiTdBcVzNU5PO1FBXNUFGYLJHYIgiA6OLridapsXPvCud8ugqVdZmPl/tfCkVGx88knn+CUU05Br1694PP58Oabb3LvX3zxxfD5fNz/J5xwArfOnj17MH36dJSWlqK8vByXXnop6uvr03gUBEEQuU26g23bh2UnvW6s9GudHP1iFGRU7DQ0NGDEiBF45JFHlOuccMIJ2LZtm/n/iy++yL0/ffp0rFq1CnPmzME777yDTz75BFdccUWqh04QRDslV2NI2obKtpMawkzvg1w93+kO6qZsrLYRzOTOp02bhmnTptmuEwqF0KNHD+l7a9aswezZs7FkyRKMHj0aAPDwww/jxBNPxF/+8hf06tUr6WMmCIJob6TbssPuI1cDb/mYnTS4sXJMFOq6jurGMDoX52d6KAByIGbno48+Qvfu3TFkyBBcddVV2L17t/newoULUV5ebgodAJgyZQr8fj8WL16s3GZzczNqa2u5/wmCIIj0hGqw4iBHtQ4Xa9QeLTttPabfv7sGI383B+99vS05A2ojWS12TjjhBDz33HP48MMP8ac//Qkff/wxpk2bhmg05u+tqqpC9+7duc8Eg0FUVFSgqqpKud2ZM2eirKzM/L9v374pPQ6CIIhsJt2tD/iO4bmpdthRp0OH5Fog91MLNgAA/vDemgyPJEZG3VhOnHfeeebrQw45BMOHD8d+++2Hjz76CJMnT054u7fccgtmzJhh/l1bW0uChyAIAB21zg7zOi07jL/MtUncwM6Npes6dje0oGtJKGn7i+bmacoastqyIzJo0CB07doV69evBwD06NEDO3bs4NaJRCLYs2ePMs4HiMUBlZaWcv8TBEF0VNKdWdQe3Fh823P+nVvfWInRv/8AH63l56e2kKsBytny7JBTYmfLli3YvXs3evbsCQAYN24cqqursXTpUnOduXPnQtM0jB07NlPDJAiCyCmUdXZSNFFp7c6yw/Pi55sAAPfOXpu0/aU7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yeGuu+6Cz+fj/h86dKj5fladZ51ICS+99JKen5+vP/300/qqVav0yy+/XC8vL9e3b9+e6aHlDO+9955+22236a+//roOQH/jjTe49//4xz/qZWVl+ptvvqmvWLFCP/XUU/WBAwfq+/btM9c54YQT9BEjRuiLFi3S58+fr++///76+eefn+YjyW6mTp2qP/PMM/rKlSv15cuX6yeeeKLer18/vb6+3lznyiuv1Pv27at/+OGH+hdffKEfccQR+pFHHmm+H4lE9IMPPlifMmWKvmzZMv29997Tu3btqt9yyy2ZOKSs5O2339bfffdd/dtvv9XXrl2r33rrrXpeXp6+cuVKXdfpHKeCzz//XB8wYIA+fPhw/Ve/+pW5nM51crjzzjv1gw46SN+2bZv5/86dO833s+k8k9hJEWPGjNGvvvpq8+9oNKr36tVLnzlzZgZHlbuIYkfTNL1Hjx76n//8Z3NZdXW1HgqF9BdffFHXdV1fvXq1DkBfsmSJuc5///tf3efz6T/++GPaxp5r7NixQwegf/zxx7qux85rXl6e/sorr5jrrFmzRgegL1y4UNf1mDD1+/16VVWVuc6jjz6ql5aW6s3Nzek9gByic+fO+pNPPknnOAXU1dXpgwcP1ufMmaMfffTRptihc5087rzzTn3EiBHS97LtPJMbKwW0tLRg6dKlmDJlirnM7/djypQpWLhwYQZH1n7YsGEDqqqquHNcVlaGsWPHmud44cKFKC8vx+jRo811pkyZAr/fj8WLF6d9zLlCTU0NAKCiogIAsHTpUoTDYe5cDx06FP369ePO9SGHHILKykpznalTp6K2tharVq1K4+hzg2g0ipdeegkNDQ0YN24cneMUcPXVV+Okk07izilA13OyWbduHXr16oVBgwZh+vTp2LRpE4DsO8/UCDQF7Nq1C9FolPsCAaCyshLffPNNhkbVvqiqqgIA6Tk23quqqkL37t2594PBICoqKsx1CB5N03Dddddh/PjxOPjggwHEzmN+fj7Ky8u5dcVzLfsujPeIGF9//TXGjRuHpqYmlJSU4I033sCwYcOwfPlyOsdJ5KWXXsKXX36JJUuWWN6j6zl5jB07FrNmzcKQIUOwbds23H333Zg4cSJWrlyZdeeZxA5BECZXX301Vq5ciQULFmR6KO2SIUOGYPny5aipqcGrr76Kiy66CB9//HGm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\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "We can see that even if the average reward per episode increases, it does not reach the max reward value, and still oscillates much after 500 episodes." + ], + "metadata": { + "id": "pBWdzYVTin8v" + } + }, + { + "cell_type": "markdown", + "source": [ + "**Familiarization with a complete RL pipeline: Application to training a robotic arm**\n", + "\n", + "In this section, you will use the Stable-Baselines3 package to train a robotic arm using RL. You'll get familiar with several widely-used tools for training, monitoring and sharing machine learning models." + ], + "metadata": { + "id": "FIrOnfQ0j9oZ" + } + }, + { + "cell_type": "code", + "source": [ + "!pip install stable-baselines3\n", + "!pip install moviepy\n", + "!pip install huggingface-sb3==2.3.1\n", + "!pip install wandb" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "bXo-UY1AnjHN", + "outputId": "0f6a1d4b-95e9-4e48-989b-8931e6d86abd" + }, + "execution_count": 25, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Requirement already satisfied: stable-baselines3 in /usr/local/lib/python3.10/dist-packages (2.2.1)\n", + "Requirement already satisfied: gymnasium<0.30,>=0.28.1 in /usr/local/lib/python3.10/dist-packages (from stable-baselines3) (0.29.1)\n", + "Requirement already satisfied: numpy>=1.20 in /usr/local/lib/python3.10/dist-packages (from stable-baselines3) (1.25.2)\n", + "Requirement already satisfied: torch>=1.13 in /usr/local/lib/python3.10/dist-packages (from stable-baselines3) (2.1.0+cu121)\n", + "Requirement already satisfied: cloudpickle in /usr/local/lib/python3.10/dist-packages (from stable-baselines3) (2.2.1)\n", + "Requirement already satisfied: pandas in /usr/local/lib/python3.10/dist-packages (from stable-baselines3) (1.5.3)\n", + "Requirement already satisfied: matplotlib in /usr/local/lib/python3.10/dist-packages (from stable-baselines3) (3.7.1)\n", + "Requirement already satisfied: typing-extensions>=4.3.0 in /usr/local/lib/python3.10/dist-packages (from gymnasium<0.30,>=0.28.1->stable-baselines3) (4.10.0)\n", + "Requirement already satisfied: farama-notifications>=0.0.1 in /usr/local/lib/python3.10/dist-packages (from gymnasium<0.30,>=0.28.1->stable-baselines3) (0.0.4)\n", + "Requirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from torch>=1.13->stable-baselines3) (3.13.1)\n", + "Requirement already satisfied: sympy in /usr/local/lib/python3.10/dist-packages (from torch>=1.13->stable-baselines3) (1.12)\n", + "Requirement already satisfied: networkx in /usr/local/lib/python3.10/dist-packages (from torch>=1.13->stable-baselines3) (3.2.1)\n", + "Requirement already satisfied: jinja2 in /usr/local/lib/python3.10/dist-packages (from torch>=1.13->stable-baselines3) (3.1.3)\n", + "Requirement already satisfied: fsspec in /usr/local/lib/python3.10/dist-packages (from torch>=1.13->stable-baselines3) (2023.6.0)\n", + "Requirement already satisfied: triton==2.1.0 in /usr/local/lib/python3.10/dist-packages (from torch>=1.13->stable-baselines3) (2.1.0)\n", + "Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->stable-baselines3) (1.2.0)\n", + "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.10/dist-packages (from matplotlib->stable-baselines3) (0.12.1)\n", + "Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib->stable-baselines3) (4.49.0)\n", + "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->stable-baselines3) (1.4.5)\n", + "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib->stable-baselines3) (23.2)\n", + "Requirement already satisfied: pillow>=6.2.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib->stable-baselines3) (9.4.0)\n", + "Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->stable-baselines3) (3.1.1)\n", + "Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.10/dist-packages (from matplotlib->stable-baselines3) (2.8.2)\n", + "Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas->stable-baselines3) (2023.4)\n", + "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.7->matplotlib->stable-baselines3) (1.16.0)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from jinja2->torch>=1.13->stable-baselines3) (2.1.5)\n", + "Requirement already satisfied: mpmath>=0.19 in /usr/local/lib/python3.10/dist-packages (from sympy->torch>=1.13->stable-baselines3) (1.3.0)\n", + "Requirement already satisfied: moviepy in /usr/local/lib/python3.10/dist-packages (1.0.3)\n", + "Requirement already satisfied: decorator<5.0,>=4.0.2 in /usr/local/lib/python3.10/dist-packages (from moviepy) (4.4.2)\n", + "Requirement already satisfied: tqdm<5.0,>=4.11.2 in /usr/local/lib/python3.10/dist-packages (from moviepy) (4.66.2)\n", + "Requirement already satisfied: requests<3.0,>=2.8.1 in /usr/local/lib/python3.10/dist-packages (from moviepy) (2.31.0)\n", + "Requirement already satisfied: proglog<=1.0.0 in /usr/local/lib/python3.10/dist-packages (from moviepy) (0.1.10)\n", + "Requirement already satisfied: numpy>=1.17.3 in /usr/local/lib/python3.10/dist-packages (from moviepy) (1.25.2)\n", + "Requirement already satisfied: imageio<3.0,>=2.5 in /usr/local/lib/python3.10/dist-packages (from moviepy) (2.31.6)\n", + "Requirement already satisfied: imageio-ffmpeg>=0.2.0 in /usr/local/lib/python3.10/dist-packages (from moviepy) (0.4.9)\n", + "Requirement already satisfied: pillow<10.1.0,>=8.3.2 in /usr/local/lib/python3.10/dist-packages (from imageio<3.0,>=2.5->moviepy) (9.4.0)\n", + "Requirement already satisfied: setuptools in /usr/local/lib/python3.10/dist-packages (from imageio-ffmpeg>=0.2.0->moviepy) (67.7.2)\n", + "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests<3.0,>=2.8.1->moviepy) (3.3.2)\n", + "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests<3.0,>=2.8.1->moviepy) (3.6)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests<3.0,>=2.8.1->moviepy) (2.0.7)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests<3.0,>=2.8.1->moviepy) (2024.2.2)\n", + "Requirement already satisfied: huggingface-sb3==2.3.1 in /usr/local/lib/python3.10/dist-packages (2.3.1)\n", + "Requirement already satisfied: huggingface-hub~=0.8 in /usr/local/lib/python3.10/dist-packages (from huggingface-sb3==2.3.1) (0.20.3)\n", + "Requirement already satisfied: pyyaml~=6.0 in /usr/local/lib/python3.10/dist-packages (from huggingface-sb3==2.3.1) (6.0.1)\n", + "Requirement already satisfied: wasabi in /usr/local/lib/python3.10/dist-packages (from huggingface-sb3==2.3.1) (1.1.2)\n", + "Requirement already satisfied: numpy in /usr/local/lib/python3.10/dist-packages (from huggingface-sb3==2.3.1) (1.25.2)\n", + "Requirement already satisfied: cloudpickle>=1.6 in /usr/local/lib/python3.10/dist-packages (from huggingface-sb3==2.3.1) (2.2.1)\n", + "Requirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from huggingface-hub~=0.8->huggingface-sb3==2.3.1) (3.13.1)\n", + "Requirement already satisfied: fsspec>=2023.5.0 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub~=0.8->huggingface-sb3==2.3.1) (2023.6.0)\n", + "Requirement already satisfied: requests in /usr/local/lib/python3.10/dist-packages (from huggingface-hub~=0.8->huggingface-sb3==2.3.1) (2.31.0)\n", + "Requirement already satisfied: tqdm>=4.42.1 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub~=0.8->huggingface-sb3==2.3.1) (4.66.2)\n", + "Requirement already satisfied: typing-extensions>=3.7.4.3 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub~=0.8->huggingface-sb3==2.3.1) (4.10.0)\n", + "Requirement already satisfied: packaging>=20.9 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub~=0.8->huggingface-sb3==2.3.1) (23.2)\n", + "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests->huggingface-hub~=0.8->huggingface-sb3==2.3.1) (3.3.2)\n", + "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests->huggingface-hub~=0.8->huggingface-sb3==2.3.1) (3.6)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests->huggingface-hub~=0.8->huggingface-sb3==2.3.1) (2.0.7)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests->huggingface-hub~=0.8->huggingface-sb3==2.3.1) (2024.2.2)\n", + "Collecting wandb\n", + " Downloading wandb-0.16.4-py3-none-any.whl (2.2 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.2/2.2 MB\u001b[0m \u001b[31m24.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: Click!=8.0.0,>=7.1 in /usr/local/lib/python3.10/dist-packages (from wandb) (8.1.7)\n", + "Collecting GitPython!=3.1.29,>=1.0.0 (from wandb)\n", + " Downloading GitPython-3.1.42-py3-none-any.whl (195 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m195.4/195.4 kB\u001b[0m \u001b[31m22.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: requests<3,>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from wandb) (2.31.0)\n", + "Requirement already satisfied: psutil>=5.0.0 in /usr/local/lib/python3.10/dist-packages (from wandb) (5.9.5)\n", + "Collecting sentry-sdk>=1.0.0 (from wandb)\n", + " Downloading sentry_sdk-1.40.6-py2.py3-none-any.whl (258 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m258.5/258.5 kB\u001b[0m \u001b[31m17.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hCollecting docker-pycreds>=0.4.0 (from wandb)\n", + " Downloading docker_pycreds-0.4.0-py2.py3-none-any.whl (9.0 kB)\n", + "Requirement already satisfied: PyYAML in /usr/local/lib/python3.10/dist-packages (from wandb) (6.0.1)\n", + "Collecting setproctitle (from wandb)\n", + " Downloading setproctitle-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (30 kB)\n", + "Requirement already satisfied: setuptools in /usr/local/lib/python3.10/dist-packages (from wandb) (67.7.2)\n", + "Requirement already satisfied: appdirs>=1.4.3 in /usr/local/lib/python3.10/dist-packages (from wandb) (1.4.4)\n", + "Requirement already satisfied: protobuf!=4.21.0,<5,>=3.19.0 in /usr/local/lib/python3.10/dist-packages (from wandb) (3.20.3)\n", + "Requirement already satisfied: six>=1.4.0 in /usr/local/lib/python3.10/dist-packages (from docker-pycreds>=0.4.0->wandb) (1.16.0)\n", + "Collecting gitdb<5,>=4.0.1 (from GitPython!=3.1.29,>=1.0.0->wandb)\n", + " Downloading gitdb-4.0.11-py3-none-any.whl (62 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m62.7/62.7 kB\u001b[0m \u001b[31m8.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests<3,>=2.0.0->wandb) (3.3.2)\n", + "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests<3,>=2.0.0->wandb) (3.6)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests<3,>=2.0.0->wandb) (2.0.7)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests<3,>=2.0.0->wandb) (2024.2.2)\n", + "Collecting smmap<6,>=3.0.1 (from gitdb<5,>=4.0.1->GitPython!=3.1.29,>=1.0.0->wandb)\n", + " Downloading smmap-5.0.1-py3-none-any.whl (24 kB)\n", + "Installing collected packages: smmap, setproctitle, sentry-sdk, docker-pycreds, gitdb, GitPython, wandb\n", + "Successfully installed GitPython-3.1.42 docker-pycreds-0.4.0 gitdb-4.0.11 sentry-sdk-1.40.6 setproctitle-1.3.3 smmap-5.0.1 wandb-0.16.4\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "import wandb, gymnasium as gym\n", + "from stable_baselines3 import A2C\n", + "from stable_baselines3.common.evaluation import evaluate_policy\n", + "from huggingface_hub import hf_api\n", + "from wandb.integration.sb3 import WandbCallback\n", + "\n", + "# Setup the Cartpole environment\n", + "env = gym.make(\"CartPole-v1\", render_mode=\"rgb_array\")\n", + "# Choosing the model\n", + "model = A2C(\"MlpPolicy\", env, verbose=1)\n", + "# Printing initial reward\n", + "reward_before_moy, _ = evaluate_policy(model, env, n_eval_episodes=10)\n", + "print(f\"Mean reward before training: {reward_before_moy:.2f}\")\n", + "# Model training during 10000 timesteps\n", + "model.learn(total_timesteps=10_000)\n", + "# Printing reward after training\n", + "reward_after_moy, _ = evaluate_policy(model, env, n_eval_episodes=10)\n", + "print(f\"Mean reward after training: {reward_after_moy:.2f}\")\n", + "\n", + "# Upload and save model\n", + "# Saving the trained model\n", + "model_save_path = \"model\"\n", + "model.save(model_save_path)\n", + "model_path = \"model.zip\"\n", + "# Creating repository\n", + "repo_name=\"BE-RL\"\n", + "rep = hf_api.create_repo(token=\"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\", repo_id=repo_name)\n", + "# Uploading model in repository\n", + "repo_id=\"hchauvin78/BE-RL\"\n", + "hf_api.upload_file(token=\"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\", repo_id=repo_id, path_or_fileobj=model_path, path_in_repo=repo_name)\n", + "\n", + "\n", + "# Training with WandB\n", + "# Initializing WandB\n", + "wandb.init(project=\"cartpole-training\", entity=\"hchauvin78\", anonymous=\"allow\")\n", + "\n", + "#Configuring WandB\n", + "config = wandb.config\n", + "config.learning_rate = 0.001\n", + "config.gamma = 0.99\n", + "config.n_steps = 500\n", + "\n", + "#Monitoring model training with WandB\n", + "model = A2C('MlpPolicy', env, verbose=1, tensorboard_log=\"logs/\")\n", + "episode_rewards = []\n", + "\n", + "for i in range(25000):\n", + " obs = env.reset()[0]\n", + " reward_tot = 0\n", + " terminated = False\n", + "\n", + " while terminated == False:\n", + " action, _ = model.predict(obs, deterministic=True)\n", + " obs, reward, terminated, info, _ = env.step(action)\n", + " reward_tot += reward\n", + "\n", + " episode_rewards.append(reward_tot)\n", + " wandb.log({\"Episode Reward\": reward_tot, \"Episode\": i})\n", + " #Log mean reward every 10 episodes\n", + " if i % 10 == 0:\n", + " mean_reward = sum(episode_rewards[-10:]) / 10\n", + " wandb.log({\"Mean Reward\": mean_reward})\n", + "\n", + "\n", + "#Log final metrics to WandB\n", + "wandb.log({\"Mean Reward\": mean_reward})\n", + "#Finish WandB run\n", + "wandb.finish()\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "bxKGLrEPkT1W", + "outputId": "71ea3ef7-e5e5-4a0c-fb88-7cbced62c64b" + }, + "execution_count": 28, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Using cpu device\n", + "Wrapping the env with a `Monitor` wrapper\n", + "Wrapping the env in a DummyVecEnv.\n", + "Mean reward before training: 355.20\n", + "------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 31.5 |\n", + "| ep_rew_mean | 31.5 |\n", + "| time/ | |\n", + "| fps | 398 |\n", + "| iterations | 100 |\n", + "| time_elapsed | 1 |\n", + "| total_timesteps | 500 |\n", + "| train/ | |\n", + "| entropy_loss | -0.574 |\n", + "| explained_variance | 0.669 |\n", + "| learning_rate | 0.0007 |\n", + "| n_updates | 99 |\n", + "| policy_loss | 1.52 |\n", + "| value_loss | 6.1 |\n", + "------------------------------------\n", + "------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 30.2 |\n", + "| ep_rew_mean | 30.2 |\n", + "| time/ | |\n", + "| fps | 470 |\n", + "| iterations | 200 |\n", + "| time_elapsed | 2 |\n", + "| total_timesteps | 1000 |\n", + "| train/ | |\n", + "| entropy_loss | -0.517 |\n", + "| explained_variance | -0.893 |\n", + "| learning_rate | 0.0007 |\n", + "| n_updates | 199 |\n", + "| policy_loss | 2.03 |\n", + "| value_loss | 11.1 |\n", + "------------------------------------\n", + "------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 31.7 |\n", + "| ep_rew_mean | 31.7 |\n", + "| time/ | |\n", + "| fps | 504 |\n", + "| iterations | 300 |\n", + "| time_elapsed | 2 |\n", + "| total_timesteps | 1500 |\n", + "| train/ | |\n", + "| entropy_loss | -0.574 |\n", + "| explained_variance | 0.197 |\n", + "| learning_rate | 0.0007 |\n", + "| n_updates | 299 |\n", + "| policy_loss | 0.67 |\n", + "| value_loss | 3.55 |\n", + "------------------------------------\n", + "------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 32.3 |\n", + "| ep_rew_mean | 32.3 |\n", + "| time/ | |\n", + "| fps | 525 |\n", + "| iterations | 400 |\n", + "| time_elapsed | 3 |\n", + "| total_timesteps | 2000 |\n", + "| train/ | |\n", + "| entropy_loss | -0.517 |\n", + "| explained_variance | -0.0114 |\n", + "| learning_rate | 0.0007 |\n", + "| n_updates | 399 |\n", + "| policy_loss | 1.48 |\n", + "| value_loss | 6.36 |\n", + "------------------------------------\n", + "------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 32.8 |\n", + "| ep_rew_mean | 32.8 |\n", + "| time/ | |\n", + "| fps | 535 |\n", + "| iterations | 500 |\n", + "| time_elapsed | 4 |\n", + "| total_timesteps | 2500 |\n", + "| train/ | |\n", + "| entropy_loss | -0.494 |\n", + "| explained_variance | -0.0975 |\n", + "| learning_rate | 0.0007 |\n", + "| n_updates | 499 |\n", + "| policy_loss | 0.907 |\n", + "| value_loss | 5.78 |\n", + "------------------------------------\n", + "------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 34.7 |\n", + "| ep_rew_mean | 34.7 |\n", + "| time/ | |\n", + "| fps | 541 |\n", + "| iterations | 600 |\n", + "| time_elapsed | 5 |\n", + "| total_timesteps | 3000 |\n", + "| train/ | |\n", + "| entropy_loss | -0.447 |\n", + "| explained_variance | -0.00207 |\n", + "| learning_rate | 0.0007 |\n", + "| n_updates | 599 |\n", + "| policy_loss | 1.28 |\n", + "| value_loss | 4.87 |\n", + "------------------------------------\n", + "------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 35.5 |\n", + "| ep_rew_mean | 35.5 |\n", + "| time/ | |\n", + "| fps | 544 |\n", + "| iterations | 700 |\n", + "| time_elapsed | 6 |\n", + "| total_timesteps | 3500 |\n", + "| train/ | |\n", + "| entropy_loss | -0.302 |\n", + "| explained_variance | 0.0436 |\n", + "| learning_rate | 0.0007 |\n", + "| n_updates | 699 |\n", + "| policy_loss | 1.57 |\n", + "| value_loss | 4.52 |\n", + "------------------------------------\n", + "------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 36.8 |\n", + "| ep_rew_mean | 36.8 |\n", + "| time/ | |\n", + "| fps | 549 |\n", + "| iterations | 800 |\n", + "| time_elapsed | 7 |\n", + "| total_timesteps | 4000 |\n", + "| train/ | |\n", + "| entropy_loss | -0.256 |\n", + "| explained_variance | -0.00302 |\n", + "| learning_rate | 0.0007 |\n", + "| n_updates | 799 |\n", + "| policy_loss | 1.88 |\n", + "| value_loss | 4.09 |\n", + "------------------------------------\n", + "------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 38.6 |\n", + "| ep_rew_mean | 38.6 |\n", + "| time/ | |\n", + "| fps | 552 |\n", + "| iterations | 900 |\n", + "| time_elapsed | 8 |\n", + "| total_timesteps | 4500 |\n", + "| train/ | |\n", + "| entropy_loss | -0.229 |\n", + "| explained_variance | 0.037 |\n", + "| learning_rate | 0.0007 |\n", + "| n_updates | 899 |\n", + "| policy_loss | 1.99 |\n", + "| value_loss | 3.64 |\n", + "------------------------------------\n", + "------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 40.3 |\n", + "| ep_rew_mean | 40.3 |\n", + "| time/ | |\n", + "| fps | 556 |\n", + "| iterations | 1000 |\n", + "| time_elapsed | 8 |\n", + "| total_timesteps | 5000 |\n", + "| train/ | |\n", + "| entropy_loss | -0.42 |\n", + "| explained_variance | 4.21e-05 |\n", + "| learning_rate | 0.0007 |\n", + "| n_updates | 999 |\n", + "| policy_loss | -4.77 |\n", + "| value_loss | 1.13e+03 |\n", + "------------------------------------\n", + "------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 42.5 |\n", + "| ep_rew_mean | 42.5 |\n", + "| time/ | |\n", + "| fps | 558 |\n", + "| iterations | 1100 |\n", + "| time_elapsed | 9 |\n", + "| total_timesteps | 5500 |\n", + "| train/ | |\n", + "| entropy_loss | -0.473 |\n", + "| explained_variance | 4.71e-06 |\n", + "| learning_rate | 0.0007 |\n", + "| n_updates | 1099 |\n", + "| policy_loss | 0.298 |\n", + "| value_loss | 2.76 |\n", + "------------------------------------\n", + "-------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 44.3 |\n", + "| ep_rew_mean | 44.3 |\n", + "| time/ | |\n", + "| fps | 561 |\n", + "| iterations | 1200 |\n", + "| time_elapsed | 10 |\n", + "| total_timesteps | 6000 |\n", + "| train/ | |\n", + "| entropy_loss | -0.384 |\n", + "| explained_variance | -0.000385 |\n", + "| learning_rate | 0.0007 |\n", + "| n_updates | 1199 |\n", + "| policy_loss | 0.415 |\n", + "| value_loss | 2.35 |\n", + "-------------------------------------\n", + "------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 46.4 |\n", + "| ep_rew_mean | 46.4 |\n", + "| time/ | |\n", + "| fps | 559 |\n", + "| iterations | 1300 |\n", + "| time_elapsed | 11 |\n", + "| total_timesteps | 6500 |\n", + "| train/ | |\n", + "| entropy_loss | -0.342 |\n", + "| explained_variance | 0.000243 |\n", + "| learning_rate | 0.0007 |\n", + "| n_updates | 1299 |\n", + "| policy_loss | 0.578 |\n", + "| value_loss | 1.93 |\n", + "------------------------------------\n", + "------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 52 |\n", + "| ep_rew_mean | 52 |\n", + "| time/ | |\n", + "| fps | 548 |\n", + "| iterations | 1400 |\n", + "| time_elapsed | 12 |\n", + "| total_timesteps | 7000 |\n", + "| train/ | |\n", + "| entropy_loss | -0.352 |\n", + "| explained_variance | 0.00346 |\n", + "| learning_rate | 0.0007 |\n", + "| n_updates | 1399 |\n", + "| policy_loss | 0.887 |\n", + "| value_loss | 1.55 |\n", + "------------------------------------\n", + "-------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 55.2 |\n", + "| ep_rew_mean | 55.2 |\n", + "| time/ | |\n", + "| fps | 539 |\n", + "| iterations | 1500 |\n", + "| time_elapsed | 13 |\n", + "| total_timesteps | 7500 |\n", + "| train/ | |\n", + "| entropy_loss | -0.518 |\n", + "| explained_variance | -0.000267 |\n", + "| learning_rate | 0.0007 |\n", + "| n_updates | 1499 |\n", + "| policy_loss | 0.277 |\n", + "| value_loss | 1.21 |\n", + "-------------------------------------\n", + "------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 60.7 |\n", + "| ep_rew_mean | 60.7 |\n", + "| time/ | |\n", + "| fps | 529 |\n", + "| iterations | 1600 |\n", + "| time_elapsed | 15 |\n", + "| total_timesteps | 8000 |\n", + "| train/ | |\n", + "| entropy_loss | -0.456 |\n", + "| explained_variance | 0.000455 |\n", + "| learning_rate | 0.0007 |\n", + "| n_updates | 1599 |\n", + "| policy_loss | 0.236 |\n", + "| value_loss | 0.918 |\n", + "------------------------------------\n", + "-------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 64.2 |\n", + "| ep_rew_mean | 64.2 |\n", + "| time/ | |\n", + "| fps | 531 |\n", + "| iterations | 1700 |\n", + "| time_elapsed | 15 |\n", + "| total_timesteps | 8500 |\n", + "| train/ | |\n", + "| entropy_loss | -0.397 |\n", + "| explained_variance | -0.000141 |\n", + "| learning_rate | 0.0007 |\n", + "| n_updates | 1699 |\n", + "| policy_loss | 0.27 |\n", + "| value_loss | 0.668 |\n", + "-------------------------------------\n", + "------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 67.1 |\n", + "| ep_rew_mean | 67.1 |\n", + "| time/ | |\n", + "| fps | 534 |\n", + "| iterations | 1800 |\n", + "| time_elapsed | 16 |\n", + "| total_timesteps | 9000 |\n", + "| train/ | |\n", + "| entropy_loss | -0.412 |\n", + "| explained_variance | 6.56e-07 |\n", + "| learning_rate | 0.0007 |\n", + "| n_updates | 1799 |\n", + "| policy_loss | 0.417 |\n", + "| value_loss | 0.45 |\n", + "------------------------------------\n", + "-------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 75.1 |\n", + "| ep_rew_mean | 75.1 |\n", + "| time/ | |\n", + "| fps | 536 |\n", + "| iterations | 1900 |\n", + "| time_elapsed | 17 |\n", + "| total_timesteps | 9500 |\n", + "| train/ | |\n", + "| entropy_loss | -0.365 |\n", + "| explained_variance | -1.88e-05 |\n", + "| learning_rate | 0.0007 |\n", + "| n_updates | 1899 |\n", + "| policy_loss | 0.139 |\n", + "| value_loss | 0.274 |\n", + "-------------------------------------\n", + "------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 79.9 |\n", + "| ep_rew_mean | 79.9 |\n", + "| time/ | |\n", + "| fps | 538 |\n", + "| iterations | 2000 |\n", + "| time_elapsed | 18 |\n", + "| total_timesteps | 10000 |\n", + "| train/ | |\n", + "| entropy_loss | -0.356 |\n", + "| explained_variance | 5.39e-05 |\n", + "| learning_rate | 0.0007 |\n", + "| n_updates | 1999 |\n", + "| policy_loss | 0.101 |\n", + "| value_loss | 0.148 |\n", + "------------------------------------\n", + "Mean reward after training: 256.70\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.10/dist-packages/notebook/utils.py:280: DeprecationWarning: distutils Version classes are deprecated. Use packaging.version instead.\n", + " return LooseVersion(v) >= LooseVersion(check)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "<IPython.core.display.Javascript object>" + ], + "application/javascript": [ + "\n", + " window._wandbApiKey = new Promise((resolve, reject) => {\n", + " function loadScript(url) {\n", + " return new Promise(function(resolve, reject) {\n", + " let newScript = document.createElement(\"script\");\n", + " newScript.onerror = reject;\n", + " newScript.onload = resolve;\n", + " document.body.appendChild(newScript);\n", + " newScript.src = url;\n", + " });\n", + " }\n", + " loadScript(\"https://cdn.jsdelivr.net/npm/postmate/build/postmate.min.js\").then(() => {\n", + " const iframe = document.createElement('iframe')\n", + " iframe.style.cssText = \"width:0;height:0;border:none\"\n", + " document.body.appendChild(iframe)\n", + " const handshake = new Postmate({\n", + " container: iframe,\n", + " url: 'https://wandb.ai/authorize'\n", + " });\n", + " const timeout = setTimeout(() => reject(\"Couldn't auto authenticate\"), 5000)\n", + " handshake.then(function(child) {\n", + " child.on('authorize', data => {\n", + " clearTimeout(timeout)\n", + " resolve(data)\n", + " });\n", + " });\n", + " })\n", + " });\n", + " " + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "\u001b[34m\u001b[1mwandb\u001b[0m: (1) Private W&B dashboard, no account required\n", + "\u001b[34m\u001b[1mwandb\u001b[0m: (2) Use an existing W&B account\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[34m\u001b[1mwandb\u001b[0m: Enter your choice: 1\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "\u001b[34m\u001b[1mwandb\u001b[0m: You chose 'Private W&B dashboard, no account required'\n", + "\u001b[34m\u001b[1mwandb\u001b[0m: Appending key for api.wandb.ai to your netrc file: /root/.netrc\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Problem at: <ipython-input-28-b66b1c5d0647> 35 <cell line: 35>\n" + ] + }, + { + "output_type": "error", + "ename": "CommError", + "evalue": "It appears that you do not have permission to access the requested resource. Please reach out to the project owner to grant you access. If you have the correct permissions, verify that there are no issues with your networking setup.(Error 404: Not Found)", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mCommError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m<ipython-input-28-b66b1c5d0647>\u001b[0m in \u001b[0;36m<cell line: 35>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 33\u001b[0m \u001b[0;31m# Training with WandB\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 34\u001b[0m \u001b[0;31m# Initializing WandB\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 35\u001b[0;31m \u001b[0mwandb\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mproject\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"cartpole-training\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mentity\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"hchauvin78\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0manonymous\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"allow\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 36\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 37\u001b[0m \u001b[0;31m#Configuring WandB\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/wandb/sdk/wandb_init.py\u001b[0m in \u001b[0;36minit\u001b[0;34m(job_type, dir, config, project, entity, reinit, tags, group, name, notes, magic, config_exclude_keys, config_include_keys, anonymous, mode, allow_val_change, resume, force, tensorboard, sync_tensorboard, monitor_gym, save_code, id, settings)\u001b[0m\n\u001b[1;32m 1193\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlogger\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1194\u001b[0m \u001b[0mlogger\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexception\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1195\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1196\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyboardInterrupt\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1197\u001b[0m \u001b[0;32massert\u001b[0m \u001b[0mlogger\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/wandb/sdk/wandb_init.py\u001b[0m in \u001b[0;36minit\u001b[0;34m(job_type, dir, config, project, entity, reinit, tags, group, name, notes, magic, config_exclude_keys, config_include_keys, anonymous, mode, allow_val_change, resume, force, tensorboard, sync_tensorboard, monitor_gym, save_code, id, settings)\u001b[0m\n\u001b[1;32m 1174\u001b[0m \u001b[0mexcept_exit\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mwi\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msettings\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_except_exit\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1175\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1176\u001b[0;31m \u001b[0mrun\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mwi\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1177\u001b[0m \u001b[0mexcept_exit\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mwi\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msettings\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_except_exit\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1178\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mKeyboardInterrupt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mException\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/wandb/sdk/wandb_init.py\u001b[0m in \u001b[0;36minit\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 783\u001b[0m \u001b[0mbackend\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcleanup\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 784\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mteardown\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 785\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0merror\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 786\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 787\u001b[0m \u001b[0;32massert\u001b[0m \u001b[0mrun_result\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;31m# for mypy\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mCommError\u001b[0m: It appears that you do not have permission to access the requested resource. Please reach out to the project owner to grant you access. If you have the correct permissions, verify that there are no issues with your networking setup.(Error 404: Not Found)" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "I am struggling to access my Hugging Face account even though I generated tokens... as I cannot understand what is happening I will stop there :'(" + ], + "metadata": { + "id": "_fV955Vjvett" + } + } + ] +} \ No newline at end of file