diff --git a/README.md b/README.md index c18b43d8fe..822aa9ff96 100644 --- a/README.md +++ b/README.md @@ -181,6 +181,14 @@ face restore a particular generated image, pass it again with the same prompt and generated seed along with the `-U` and `-G` prompt arguments to perform those actions. +## Google Colab + +Stable Diffusion AI Notebook: Open In Colab
+Open and follow instructions to use an isolated environment running Dream.
+ +Output example: +![Colab Notebook](static/colab_notebook.png) + ## Barebones Web Server As of version 1.10, this distribution comes with a bare bones web diff --git a/Stable_Diffusion_AI_Notebook.ipynb b/Stable_Diffusion_AI_Notebook.ipynb new file mode 100644 index 0000000000..defc158346 --- /dev/null +++ b/Stable_Diffusion_AI_Notebook.ipynb @@ -0,0 +1,256 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "Stable_Diffusion_AI_Notebook.ipynb", + "provenance": [], + "collapsed_sections": [], + "private_outputs": true + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + }, + "accelerator": "GPU", + "gpuClass": "standard" + }, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# Stable Diffusion AI Notebook\n", + "\n", + "\"stable-diffusion-ai\"
\n", + "#### Instructions:\n", + "1. Execute each cell in order to mount a Dream bot and create images from text.
\n", + "2. Once cells 1-8 were run correctly you'll be executing a terminal in cell #9, you'll to enter `pipenv run scripts/dream.py` command to run Dream bot.
\n", + "3. After launching dream bot, you'll see:
`Dream > ` in terminal.
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 display images in cell #10.\n", + "4. To quit Dream bot use `q` command.
\n", + "---\n", + "Note: 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.
\n", + "Requirements: 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 #6\n", + "##### For more details visit Github repository: [lstein/stable-diffusion](https://github.com/lstein/stable-diffusion)\n", + "---\n" + ], + "metadata": { + "id": "ycYWcsEKc6w7" + } + }, + { + "cell_type": "code", + "source": [ + "#@title 1. Check current GPU assigned\n", + "!nvidia-smi -L\n", + "!nvidia-smi" + ], + "metadata": { + "cellView": "form", + "id": "a2Z5Qu_o8VtQ" + }, + "execution_count": null, + "outputs": [] + }, + { + "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", + "if exists(\"/content/stable-diffusion/\")==True:\n", + " print(\"Already downloaded repo\")\n", + "else:\n", + " !git clone --quiet https://github.com/lstein/stable-diffusion.git # Original repo\n", + " %cd stable-diffusion/\n", + " !git checkout --quiet tags/release-1.09\n", + " " + ] + }, + { + "cell_type": "code", + "source": [ + "#@title 3. Install Python 3.8 \n", + "%%capture --no-stderr\n", + "import gc\n", + "!apt-get -qq install python3.8\n", + "gc.collect()" + ], + "metadata": { + "id": "daHlozvwKesj", + "cellView": "form" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "#@title 4. Install dependencies from file in a VirtualEnv\n", + "#@markdown Be patient, it takes ~ 5 - 7min
\n", + "%%capture --no-stderr\n", + "#Virtual environment\n", + "!pip install pipenv -q\n", + "!pip install colab-xterm\n", + "%load_ext colabxterm\n", + "!pipenv --python 3.8\n", + "!pipenv install -r requirements.txt --skip-lock\n", + "gc.collect()\n" + ], + "metadata": { + "cellView": "form", + "id": "QbXcGXYEFSNB" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "#@title 5. Mount google Drive\n", + "from google.colab import drive\n", + "drive.mount('/content/drive')" + ], + "metadata": { + "cellView": "form", + "id": "YEWPV-sF1RDM" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "#@title 6. Drive Path to model\n", + "#@markdown Path should start with /content/drive/path-to-your-file
\n", + "#@markdown Note: Model should be downloaded from https://huggingface.co
\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)==True:\n", + " print(\"✅ Valid directory\")\n", + "else: \n", + " print(\"❌ File doesn't exist\")" + ], + "metadata": { + "cellView": "form", + "id": "zRTJeZ461WGu" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "#@title 7. 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/stable-diffusion/models/ldm/stable-diffusion-v1\")==True:\n", + " print(\"❗ Dir stable-diffusion-v1 already exists\")\n", + "else:\n", + " %mkdir /content/stable-diffusion/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/stable-diffusion/models/ldm/stable-diffusion-v1/model.ckpt\")==True:\n", + " print(\"❗ Symlink already created\")\n", + "else: \n", + " src = model_path\n", + " dst = '/content/stable-diffusion/models/ldm/stable-diffusion-v1/model.ckpt'\n", + " os.symlink(src, dst) \n", + " print(\"✅ Symbolic link created successfully\")" + ], + "metadata": { + "id": "UY-NNz4I8_aG", + "cellView": "form" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "#@title 8. Load small ML models required\n", + "%%capture --no-stderr\n", + "!pipenv run scripts/preload_models.py\n", + "gc.collect()" + ], + "metadata": { + "cellView": "form", + "id": "ChIDWxLVHGGJ" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "#@title 9. Run Terminal and Execute Dream bot\n", + "#@markdown Steps:
\n", + "#@markdown 1. Execute command `pipenv run scripts/dream.py` to run dream bot.
\n", + "#@markdown 2. After initialized you'll see `Dream>` line.
\n", + "#@markdown 3. Example text: `Astronaut floating in a distant galaxy`
\n", + "#@markdown 4. To quit Dream bot use: `q` command.
\n", + "\n", + "#Run from virtual env\n", + "\n", + "%xterm\n", + "gc.collect()" + ], + "metadata": { + "id": "ir4hCrMIuUpl", + "cellView": "form" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "#@title 10. Show generated images\n", + "\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 glob.glob('/content/stable-diffusion/outputs/img-samples/*.png'):\n", + " images.append(mpimg.imread(img_path))\n", + "\n", + "# Remove ticks and labels on x-axis and y-axis both\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": { + "cellView": "form", + "id": "qnLohSHmKoGk" + }, + "execution_count": null, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/static/colab_notebook.png b/static/colab_notebook.png new file mode 100644 index 0000000000..933664a86f Binary files /dev/null and b/static/colab_notebook.png differ