min-dalle-test/min(DALL·E).ipynb

356 lines
92 KiB
Plaintext
Raw Normal View History

2022-06-27 21:23:30 +00:00
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "min(DALL·E)",
"provenance": [],
"authorship_tag": "ABX9TyOA/dulxoA/nPo/1dMvuKPE",
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
},
"accelerator": "GPU",
"gpuClass": "standard"
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/github/kuprel/min-dalle/blob/main/min(DALL%C2%B7E).ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"source": [
"# min(DALL·E)"
],
"metadata": {
"id": "3WL-G_f2_ld8"
}
},
{
"cell_type": "code",
"source": [
"! pip install torch flax wandb\n",
"! git clone https://github.com/kuprel/min-dalle"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "ix_xt4X1_6F4",
"outputId": "e3b12dcb-89c7-4e55-af3d-cb7431d18c39"
},
"execution_count": 1,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n",
"Requirement already satisfied: torch in /usr/local/lib/python3.7/dist-packages (1.11.0+cu113)\n",
"Collecting flax\n",
" Downloading flax-0.5.2-py3-none-any.whl (197 kB)\n",
"\u001b[K |████████████████████████████████| 197 kB 7.7 MB/s \n",
"\u001b[?25hCollecting wandb\n",
" Downloading wandb-0.12.19-py2.py3-none-any.whl (1.8 MB)\n",
"\u001b[K |████████████████████████████████| 1.8 MB 57.2 MB/s \n",
"\u001b[?25hRequirement already satisfied: typing-extensions in /usr/local/lib/python3.7/dist-packages (from torch) (4.1.1)\n",
"Collecting rich~=11.1\n",
" Downloading rich-11.2.0-py3-none-any.whl (217 kB)\n",
"\u001b[K |████████████████████████████████| 217 kB 66.0 MB/s \n",
"\u001b[?25hRequirement already satisfied: msgpack in /usr/local/lib/python3.7/dist-packages (from flax) (1.0.4)\n",
"Collecting optax\n",
" Downloading optax-0.1.2-py3-none-any.whl (140 kB)\n",
"\u001b[K |████████████████████████████████| 140 kB 48.1 MB/s \n",
"\u001b[?25hRequirement already satisfied: matplotlib in /usr/local/lib/python3.7/dist-packages (from flax) (3.2.2)\n",
"Requirement already satisfied: jax>=0.3.2 in /usr/local/lib/python3.7/dist-packages (from flax) (0.3.8)\n",
"Collecting PyYAML>=5.4.1\n",
" Downloading PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (596 kB)\n",
"\u001b[K |████████████████████████████████| 596 kB 47.5 MB/s \n",
"\u001b[?25hRequirement already satisfied: numpy>=1.12 in /usr/local/lib/python3.7/dist-packages (from flax) (1.21.6)\n",
"Requirement already satisfied: scipy>=1.2.1 in /usr/local/lib/python3.7/dist-packages (from jax>=0.3.2->flax) (1.4.1)\n",
"Requirement already satisfied: absl-py in /usr/local/lib/python3.7/dist-packages (from jax>=0.3.2->flax) (1.1.0)\n",
"Requirement already satisfied: opt-einsum in /usr/local/lib/python3.7/dist-packages (from jax>=0.3.2->flax) (3.3.0)\n",
"Collecting colorama<0.5.0,>=0.4.0\n",
" Downloading colorama-0.4.5-py2.py3-none-any.whl (16 kB)\n",
"Requirement already satisfied: pygments<3.0.0,>=2.6.0 in /usr/local/lib/python3.7/dist-packages (from rich~=11.1->flax) (2.6.1)\n",
"Collecting commonmark<0.10.0,>=0.9.0\n",
" Downloading commonmark-0.9.1-py2.py3-none-any.whl (51 kB)\n",
"\u001b[K |████████████████████████████████| 51 kB 7.4 MB/s \n",
"\u001b[?25hCollecting pathtools\n",
" Downloading pathtools-0.1.2.tar.gz (11 kB)\n",
"Requirement already satisfied: setuptools in /usr/local/lib/python3.7/dist-packages (from wandb) (57.4.0)\n",
"Collecting sentry-sdk>=1.0.0\n",
" Downloading sentry_sdk-1.6.0-py2.py3-none-any.whl (145 kB)\n",
"\u001b[K |████████████████████████████████| 145 kB 60.3 MB/s \n",
"\u001b[?25hCollecting GitPython>=1.0.0\n",
" Downloading GitPython-3.1.27-py3-none-any.whl (181 kB)\n",
"\u001b[K |████████████████████████████████| 181 kB 18.8 MB/s \n",
"\u001b[?25hRequirement already satisfied: protobuf<4.0dev,>=3.12.0 in /usr/local/lib/python3.7/dist-packages (from wandb) (3.17.3)\n",
"Requirement already satisfied: requests<3,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from wandb) (2.23.0)\n",
"Requirement already satisfied: promise<3,>=2.0 in /usr/local/lib/python3.7/dist-packages (from wandb) (2.3)\n",
"Requirement already satisfied: Click!=8.0.0,>=7.0 in /usr/local/lib/python3.7/dist-packages (from wandb) (7.1.2)\n",
"Requirement already satisfied: psutil>=5.0.0 in /usr/local/lib/python3.7/dist-packages (from wandb) (5.4.8)\n",
"Collecting shortuuid>=0.5.0\n",
" Downloading shortuuid-1.0.9-py3-none-any.whl (9.4 kB)\n",
"Requirement already satisfied: six>=1.13.0 in /usr/local/lib/python3.7/dist-packages (from wandb) (1.15.0)\n",
"Collecting docker-pycreds>=0.4.0\n",
" Downloading docker_pycreds-0.4.0-py2.py3-none-any.whl (9.0 kB)\n",
"Collecting setproctitle\n",
" Downloading setproctitle-1.2.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (29 kB)\n",
"Collecting gitdb<5,>=4.0.1\n",
" Downloading gitdb-4.0.9-py3-none-any.whl (63 kB)\n",
"\u001b[K |████████████████████████████████| 63 kB 2.1 MB/s \n",
"\u001b[?25hCollecting smmap<6,>=3.0.1\n",
" Downloading smmap-5.0.0-py3-none-any.whl (24 kB)\n",
"Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.0.0->wandb) (1.24.3)\n",
"Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.0.0->wandb) (2.10)\n",
"Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.0.0->wandb) (2022.6.15)\n",
"Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.0.0->wandb) (3.0.4)\n",
"Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->flax) (3.0.9)\n",
"Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->flax) (1.4.3)\n",
"Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->flax) (2.8.2)\n",
"Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib->flax) (0.11.0)\n",
"Collecting chex>=0.0.4\n",
" Downloading chex-0.1.3-py3-none-any.whl (72 kB)\n",
"\u001b[K |████████████████████████████████| 72 kB 652 kB/s \n",
"\u001b[?25hRequirement already satisfied: jaxlib>=0.1.37 in /usr/local/lib/python3.7/dist-packages (from optax->flax) (0.3.7+cuda11.cudnn805)\n",
"Requirement already satisfied: toolz>=0.9.0 in /usr/local/lib/python3.7/dist-packages (from chex>=0.0.4->optax->flax) (0.11.2)\n",
"Requirement already satisfied: dm-tree>=0.1.5 in /usr/local/lib/python3.7/dist-packages (from chex>=0.0.4->optax->flax) (0.1.7)\n",
"Requirement already satisfied: flatbuffers<3.0,>=1.12 in /usr/local/lib/python3.7/dist-packages (from jaxlib>=0.1.37->optax->flax) (2.0)\n",
"Building wheels for collected packages: pathtools\n",
" Building wheel for pathtools (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
" Created wheel for pathtools: filename=pathtools-0.1.2-py3-none-any.whl size=8806 sha256=2febc96495d437d35565155a6e69de17a3d55cbf3f5c420d9e048d873f38dff5\n",
" Stored in directory: /root/.cache/pip/wheels/3e/31/09/fa59cef12cdcfecc627b3d24273699f390e71828921b2cbba2\n",
"Successfully built pathtools\n",
"Installing collected packages: smmap, gitdb, commonmark, colorama, chex, shortuuid, setproctitle, sentry-sdk, rich, PyYAML, pathtools, optax, GitPython, docker-pycreds, wandb, flax\n",
" Attempting uninstall: PyYAML\n",
" Found existing installation: PyYAML 3.13\n",
" Uninstalling PyYAML-3.13:\n",
" Successfully uninstalled PyYAML-3.13\n",
"Successfully installed GitPython-3.1.27 PyYAML-6.0 chex-0.1.3 colorama-0.4.5 commonmark-0.9.1 docker-pycreds-0.4.0 flax-0.5.2 gitdb-4.0.9 optax-0.1.2 pathtools-0.1.2 rich-11.2.0 sentry-sdk-1.6.0 setproctitle-1.2.3 shortuuid-1.0.9 smmap-5.0.0 wandb-0.12.19\n",
"Cloning into 'min-dalle'...\n",
"remote: Enumerating objects: 73, done.\u001b[K\n",
"remote: Counting objects: 100% (73/73), done.\u001b[K\n",
"remote: Compressing objects: 100% (45/45), done.\u001b[K\n",
"remote: Total 73 (delta 34), reused 63 (delta 24), pack-reused 0\u001b[K\n",
"Unpacking objects: 100% (73/73), done.\n"
]
}
]
},
{
"cell_type": "markdown",
"source": [
"### Login to Weights & Biases to download DALL·E mini model"
],
"metadata": {
"id": "XXlcJR5FAXgQ"
}
},
{
"cell_type": "code",
"source": [
"import wandb\n",
"import os\n",
"\n",
"os.chdir('min-dalle')\n",
"wandb.login()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 119
},
"id": "iSis7y_MAMSb",
"outputId": "a0eb5279-5135-47e8-b954-1fa11a4c9d97"
},
"execution_count": 2,
"outputs": [
{
"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: Logging into wandb.ai. (Learn how to deploy a W&B server locally: https://wandb.me/wandb-server)\n",
"\u001b[34m\u001b[1mwandb\u001b[0m: You can find your API key in your browser here: https://wandb.ai/authorize\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"wandb: Paste an API key from your profile and hit enter, or press ctrl+c to quit: ··········\n"
]
},
{
"output_type": "stream",
"name": "stderr",
"text": [
"\u001b[34m\u001b[1mwandb\u001b[0m: Appending key for api.wandb.ai to your netrc file: /root/.netrc\n"
]
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"True"
]
},
"metadata": {},
"execution_count": 2
}
]
},
{
"cell_type": "markdown",
"source": [
"### Download VQGan and DALL·E mini"
],
"metadata": {
"id": "Zl_ZFisFApeh"
}
},
{
"cell_type": "code",
"source": [
"! git lfs install\n",
"! git clone https://huggingface.co/dalle-mini/vqgan_imagenet_f16_16384 ./pretrained/vqgan\n",
"! wandb artifact get --root=./pretrained/dalle_bart_mini dalle-mini/dalle-mini/mini-1:v0"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "H3FlI-r1_t1F",
"outputId": "47685e11-29ed-4810-a8ed-e8a0fc7d9b8d"
},
"execution_count": 3,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Updated git hooks.\n",
"Git LFS initialized.\n",
"Cloning into './pretrained/vqgan'...\n",
"remote: Enumerating objects: 20, done.\u001b[K\n",
"remote: Counting objects: 100% (20/20), done.\u001b[K\n",
"remote: Compressing objects: 100% (19/19), done.\u001b[K\n",
"remote: Total 20 (delta 6), reused 0 (delta 0), pack-reused 0\u001b[K\n",
"Unpacking objects: 100% (20/20), done.\n",
"\u001b[34m\u001b[1mwandb\u001b[0m: Downloading dataset artifact dalle-mini/dalle-mini/mini-1:v0\n",
"\u001b[34m\u001b[1mwandb\u001b[0m: Downloading large artifact mini-1:v0, 1673.43MB. 7 files... Done. 0:0:14.2\n",
"\u001b[34m\u001b[1mwandb\u001b[0m: Artifact downloaded to ./pretrained/dalle_bart_mini\n"
]
}
]
},
{
"cell_type": "markdown",
"source": [
"### Generate an Image"
],
"metadata": {
"id": "c52TV1GbBNgS"
}
},
{
"cell_type": "code",
"source": [
"from min_dalle.generate_image import generate_image_from_text\n",
"\n",
"image = generate_image_from_text(\"alien life\", seed=7)\n",
"display(image)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 480
},
"id": "nQ0UG05dA4p2",
"outputId": "589b43cd-2204-4adb-e2fc-0f539ef8bdf5"
},
"execution_count": 4,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"parsing metadata from ./pretrained/dalle_bart_mini\n",
"tokenizing text\n",
"['Ġalien']\n",
"['Ġlife']\n",
"text tokens [0, 8925, 742, 2]\n",
"loading flax encoder\n",
"encoding text tokens\n",
"loading flax decoder\n",
"sampling image tokens\n",
"image tokens [6965, 6172, 1052, 14447, 6172, 12062, 15771, 2193, 10710, 4147, 1052, 6172, 2528, 14447, 5772, 8447, 6965, 14447, 14447, 14447, 11665, 6879, 15798, 9479, 910, 15303, 5605, 7542, 1052, 14447, 14447, 2528, 6965, 1052, 14447, 6078, 3386, 2519, 12838, 16017, 867, 8447, 11993, 12426, 11196, 14447, 14447, 2528, 6965, 14447, 14447, 7491, 16147, 13512, 8269, 271, 10397, 15945, 15945, 4903, 12892, 14447, 14447, 2528, 6965, 14447, 14447, 351, 358, 10362, 6001, 8612, 14037, 7864, 14246, 5201, 2810, 14447, 14447, 2528, 6965, 14447, 14447, 10549, 15618, 11792, 13401, 16223, 1464, 12861, 6992, 572, 601, 14447, 14447, 2528, 6965, 14447, 14447, 14447, 13183, 194, 14633, 1994, 10912, 2778, 5495, 12187, 2528, 14447, 14447, 2528, 6965, 14447, 14447, 14447, 2528, 14068, 4054, 5071, 1948, 5286, 7771, 12062, 12016, 14447, 14447, 2528, 6965, 14447, 14447, 14447, 7504, 15433, 7781, 4816, 12062, 663, 3812, 8447, 8173, 14447, 14447, 2528, 6965, 14447, 14447, 6078, 13401, 6790, 2813, 10121, 4301, 4811, 5984, 3851, 8493, 14447, 14447, 2528, 6965, 14447, 14447, 4465, 12509, 4238, 12290, 10543, 8222, 11348, 13909, 5919, 6965, 14447, 14447, 2528, 11591, 14447, 6172, 11665, 9501, 2810, 9570, 7781, 910, 10549, 4395, 10639, 16147, 8173, 14164, 2528, 11591, 14164, 11993, 11610, 15891, 6242, 1936, 14602, 4903, 3583, 11574, 7516, 12892, 8173, 14447, 2528, 11591, 7467, 5243, 13157, 2810, 6790, 16017, 7236, 4301, 11725, 10689, 11941, 12659, 8173, 1052, 2528, 6965, 6598, 4465, 4816, 2895, 11820, 3132, 15917, 1811, 4904, 6933, 6690, 4811, 7504, 2528, 11605, 7467, 4815, 351, 6948, 10228, 7771, 9479, 9213, 11196, 6628, 9897, 12480, 5885, 14247, 5772, 5772]\n",
"detokenizing image\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<PIL.Image.Image image mode=RGB size=256x256 at 0x7F5F555D01D0>"
],
"image/png": "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
},
"metadata": {}
}
]
}
]
}