{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "3b05af3b",
   "metadata": {},
   "source": [
    "(tune-comet-ref)=\n",
    "\n",
    "# Using Comet with Tune\n",
    "\n",
    "[Comet](https://www.comet.ml/site/) is a tool to manage and optimize the\n",
    "entire ML lifecycle, from experiment tracking, model optimization and dataset\n",
    "versioning to model production monitoring.\n",
    "\n",
    "```{image} /images/comet_logo_full.png\n",
    ":align: center\n",
    ":alt: Comet\n",
    ":height: 120px\n",
    ":target: https://www.comet.ml/site/\n",
    "```\n",
    "\n",
    "```{contents}\n",
    ":backlinks: none\n",
    ":local: true\n",
    "```\n",
    "\n",
    "## Example\n",
    "\n",
    "To illustrate logging your trial results to Comet, we'll define a simple training function\n",
    "that simulates a `loss` metric:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "19e3c389",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from ray import tune\n",
    "from ray.air import session\n",
    "\n",
    "\n",
    "def train_function(config, checkpoint_dir=None):\n",
    "    for i in range(30):\n",
    "        loss = config[\"mean\"] + config[\"sd\"] * np.random.randn()\n",
    "        session.report({\"loss\": loss})"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6fb69a24",
   "metadata": {},
   "source": [
    "Now, given that you provide your Comet API key and your project name like so:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "993d5be6",
   "metadata": {},
   "outputs": [],
   "source": [
    "api_key = \"YOUR_COMET_API_KEY\"\n",
    "project_name = \"YOUR_COMET_PROJECT_NAME\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e9ce0d76",
   "metadata": {
    "tags": [
     "remove-cell"
    ]
   },
   "outputs": [],
   "source": [
    "# This cell is hidden from the rendered notebook. It makes the \n",
    "from unittest.mock import MagicMock\n",
    "from ray.air.callbacks.comet import CometLoggerCallback\n",
    "\n",
    "CometLoggerCallback._logger_process_cls = MagicMock\n",
    "api_key = \"abc\"\n",
    "project_name = \"test\""
   ]
  },
  {
   "cell_type": "markdown",
   "source": [
    "You can add a Comet logger by specifying the `callbacks` argument in your `tune.run` accordingly:"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "dbb761e7",
   "metadata": {},
   "outputs": [],
   "source": [
    "from ray.air.callbacks.comet import CometLoggerCallback\n",
    "\n",
    "analysis = tune.run(\n",
    "    train_function,\n",
    "    name=\"comet\",\n",
    "    metric=\"loss\",\n",
    "    mode=\"min\",\n",
    "    callbacks=[\n",
    "        CometLoggerCallback(\n",
    "            api_key=api_key, project_name=project_name, tags=[\"comet_example\"]\n",
    "        )\n",
    "    ],\n",
    "    config={\"mean\": tune.grid_search([1, 2, 3]), \"sd\": tune.uniform(0.2, 0.8)},\n",
    ")\n",
    "print(analysis.best_config)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d7e46189",
   "metadata": {},
   "source": [
    "## Tune Comet Logger\n",
    "\n",
    "Ray Tune offers an integration with Comet through the `CometLoggerCallback`,\n",
    "which automatically logs metrics and parameters reported to Tune to the Comet UI.\n",
    "\n",
    "Click on the following dropdown to see this callback API in detail:\n",
    "\n",
    "```{eval-rst}\n",
    ".. autoclass:: ray.air.callbacks.comet.CometLoggerCallback\n",
    "   :noindex:\n",
    "```"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "orphan": true
 },
 "nbformat": 4,
 "nbformat_minor": 5
}