{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "ycYWcsEKc6w7"
   },
   "source": [
    "# Stable Diffusion AI Notebook (Release 2.0.0)\n",
    "\n",
    "<img src=\"https://user-images.githubusercontent.com/60411196/186547976-d9de378a-9de8-4201-9c25-c057a9c59bad.jpeg\" alt=\"stable-diffusion-ai\" width=\"170px\"/> <br>\n",
    "#### Instructions:\n",
    "1. Execute each cell in order to mount a Dream bot and create images from text. <br>\n",
    "2. Once cells 1-8 were run correctly you'll be executing a terminal in cell #9, you'll need to enter `python scripts/dream.py` command to run Dream bot.<br> \n",
    "3. After launching dream bot, you'll see: <br> `Dream > ` in terminal. <br> Insert a command, eg. `Dream > Astronaut floating in a distant galaxy`, or type `-h` for help.\n",
    "3. After completion you'll see your generated images in path `stable-diffusion/outputs/img-samples/`, you can also show last generated images in cell #10.\n",
    "4. To quit Dream bot use `q` command. <br> \n",
    "---\n",
    "<font color=\"red\">Note:</font> It takes some time to load, but after installing all dependencies you can use the bot all time you want while colab instance is up. <br>\n",
    "<font color=\"red\">Requirements:</font> For this notebook to work you need to have [Stable-Diffusion-v-1-4](https://huggingface.co/CompVis/stable-diffusion-v-1-4-original) stored in your Google Drive, it will be needed in cell #7\n",
    "##### For more details visit Github repository: [invoke-ai/InvokeAI](https://github.com/invoke-ai/InvokeAI)\n",
    "---\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "dr32VLxlnouf"
   },
   "source": [
    "## ◢ Installation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "cellView": "form",
    "id": "a2Z5Qu_o8VtQ"
   },
   "outputs": [],
   "source": [
    "# @title 1. Check current GPU assigned\n",
    "!nvidia-smi -L\n",
    "!nvidia-smi"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "cellView": "form",
    "id": "vbI9ZsQHzjqF"
   },
   "outputs": [],
   "source": [
    "# @title 2. Download stable-diffusion Repository\n",
    "from os.path import exists\n",
    "\n",
    "!git clone --quiet https://github.com/invoke-ai/InvokeAI.git # Original repo\n",
    "%cd /content/InvokeAI/\n",
    "!git checkout --quiet tags/v2.0.0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "cellView": "form",
    "id": "QbXcGXYEFSNB"
   },
   "outputs": [],
   "source": [
    "# @title 3. Install dependencies\n",
    "import gc\n",
    "\n",
    "!wget https://raw.githubusercontent.com/invoke-ai/InvokeAI/development/environments-and-requirements/requirements-base.txt\n",
    "!wget https://raw.githubusercontent.com/invoke-ai/InvokeAI/development/environments-and-requirements/requirements-win-colab-cuda.txt\n",
    "!pip install colab-xterm\n",
    "!pip install -r requirements-lin-win-colab-CUDA.txt\n",
    "!pip install clean-fid torchtext\n",
    "!pip install transformers\n",
    "gc.collect()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "cellView": "form",
    "id": "8rSMhgnAttQa"
   },
   "outputs": [],
   "source": [
    "# @title 4. Restart Runtime\n",
    "exit()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "cellView": "form",
    "id": "ChIDWxLVHGGJ"
   },
   "outputs": [],
   "source": [
    "# @title 5. Load small ML models required\n",
    "import gc\n",
    "\n",
    "%cd /content/InvokeAI/\n",
    "!python scripts/preload_models.py\n",
    "gc.collect()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "795x1tMoo8b1"
   },
   "source": [
    "## ◢ Configuration"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "cellView": "form",
    "id": "YEWPV-sF1RDM"
   },
   "outputs": [],
   "source": [
    "# @title 6. Mount google Drive\n",
    "from google.colab import drive\n",
    "\n",
    "drive.mount(\"/content/drive\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "cellView": "form",
    "id": "zRTJeZ461WGu"
   },
   "outputs": [],
   "source": [
    "# @title 7. Drive Path to model\n",
    "# @markdown Path should start with /content/drive/path-to-your-file <br>\n",
    "# @markdown <font color=\"red\">Note:</font> Model should be downloaded from https://huggingface.co <br>\n",
    "# @markdown Lastest release: [Stable-Diffusion-v-1-4](https://huggingface.co/CompVis/stable-diffusion-v-1-4-original)\n",
    "from os.path import exists\n",
    "\n",
    "model_path = \"\"  # @param {type:\"string\"}\n",
    "if exists(model_path):\n",
    "    print(\"✅ Valid directory\")\n",
    "else:\n",
    "    print(\"❌ File doesn't exist\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "cellView": "form",
    "id": "UY-NNz4I8_aG"
   },
   "outputs": [],
   "source": [
    "# @title 8. Symlink to model\n",
    "\n",
    "from os.path import exists\n",
    "import os\n",
    "\n",
    "# Folder creation if it doesn't exist\n",
    "if exists(\"/content/InvokeAI/models/ldm/stable-diffusion-v1\"):\n",
    "    print(\"❗ Dir stable-diffusion-v1 already exists\")\n",
    "else:\n",
    "    %mkdir /content/InvokeAI/models/ldm/stable-diffusion-v1\n",
    "    print(\"✅ Dir stable-diffusion-v1 created\")\n",
    "\n",
    "# Symbolic link if it doesn't exist\n",
    "if exists(\"/content/InvokeAI/models/ldm/stable-diffusion-v1/model.ckpt\"):\n",
    "    print(\"❗ Symlink already created\")\n",
    "else:\n",
    "    src = model_path\n",
    "    dst = \"/content/InvokeAI/models/ldm/stable-diffusion-v1/model.ckpt\"\n",
    "    os.symlink(src, dst)\n",
    "    print(\"✅ Symbolic link created successfully\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Mc28N0_NrCQH"
   },
   "source": [
    "## ◢ Execution"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "cellView": "form",
    "id": "ir4hCrMIuUpl"
   },
   "outputs": [],
   "source": [
    "# @title 9. Run Terminal and Execute Dream bot\n",
    "# @markdown <font color=\"blue\">Steps:</font> <br>\n",
    "# @markdown 1. Execute command `python scripts/invoke.py` to run InvokeAI.<br>\n",
    "# @markdown 2. After initialized you'll see `Dream>` line.<br>\n",
    "# @markdown 3. Example text: `Astronaut floating in a distant galaxy` <br>\n",
    "# @markdown 4. To quit Dream bot use: `q` command.<br>\n",
    "\n",
    "%load_ext colabxterm\n",
    "%xterm\n",
    "gc.collect()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "cellView": "form",
    "id": "qnLohSHmKoGk"
   },
   "outputs": [],
   "source": [
    "#@title 10. Show the last 15 generated images\n",
    "import glob\n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.image as mpimg\n",
    "%matplotlib inline\n",
    "\n",
    "images = []\n",
    "for img_path in sorted(glob.glob('/content/InvokeAI/outputs/img-samples/*.png'), reverse=True):\n",
    "    images.append(mpimg.imread(img_path))\n",
    "\n",
    "images = images[:15] \n",
    "\n",
    "plt.figure(figsize=(20,10))\n",
    "\n",
    "columns = 5\n",
    "for i, image in enumerate(images):\n",
    "    ax = plt.subplot(len(images) / columns + 1, columns, i + 1)\n",
    "    ax.axes.xaxis.set_visible(False)\n",
    "    ax.axes.yaxis.set_visible(False)\n",
    "    ax.axis('off')\n",
    "    plt.imshow(image)\n",
    "    gc.collect()\n",
    "\n"
   ]
  }
 ],
 "metadata": {
  "accelerator": "GPU",
  "colab": {
   "collapsed_sections": [],
   "private_outputs": true,
   "provenance": []
  },
  "gpuClass": "standard",
  "kernelspec": {
   "display_name": "Python 3.9.12 64-bit",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python",
   "version": "3.9.12"
  },
  "vscode": {
   "interpreter": {
    "hash": "4e870c5c5fe42db7e2c5647ae5af656ff3391bf8c2b729cbf7fa0e16ca8cb5af"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}