{ "cells": [ { "cell_type": "markdown", "id": "396f7d27-5d90-4bf3-a77f-f9b1c9f36bef", "metadata": {}, "source": [ "# Diffusers integration with fastai\n", "By Tanishq Abraham\n", "\n", "This notebook demonstration a simple-to-use fastai integration with the [HuggingFace Diffusers](https://github.com/huggingface/diffusers/) library.\n" ] }, { "cell_type": "markdown", "id": "92135e76-e9d3-4561-a2c8-b689278c938e", "metadata": {}, "source": [ "## Imports\n", "\n", "Here are all of our imports. Mostly the fastai library and the Diffusers library." ] }, { "cell_type": "code", "execution_count": 1, "id": "df56594f-4607-4208-ba8b-c15c8fed54e5", "metadata": {}, "outputs": [], "source": [ "import diffusers\n", "from fastai.vision.all import *\n", "from fastai.vision.gan import *\n", "from copy import deepcopy" ] }, { "cell_type": "markdown", "id": "6d5974cb-13e1-4e3b-b356-cb8f15c82e2f", "metadata": {}, "source": [ "## Data loading\n", "\n", "Let's load our data. We'll work with the famous MNIST dataset." ] }, { "cell_type": "code", "execution_count": 2, "id": "3e44f2e4-f3c7-46c2-b3a1-cb36c6f6c7c4", "metadata": { "id": "okr8kAqSvIUD" }, "outputs": [], "source": [ "bs = 128 # batch size\n", "size = 32 # image size" ] }, { "cell_type": "code", "execution_count": 3, "id": "f6de6207-d249-4974-bd42-7b598cdfebbb", "metadata": { "id": "B8nsEdKXvKim" }, "outputs": [], "source": [ "path = untar_data(URLs.CIFAR)" ] }, { "cell_type": "markdown", "id": "bb1fb7d4-3fe5-4f23-b249-6df4955f5364", "metadata": {}, "source": [ "We use the highly flexible DataBlock API in fastai to create our DataLoaders.\n", "\n", "Note that we start with pure noise, generated with the obviously named `generate_noise` function." ] }, { "cell_type": "code", "execution_count": 8, "id": "266399d7-9490-4ee6-bb1d-591a3f9f8aef", "metadata": { "id": "DQF8UdVvvP4R" }, "outputs": [], "source": [ "dblock = DataBlock(blocks = (TransformBlock, ImageBlock),\n", " get_x = partial(generate_noise, size=(3, size, size)),\n", " get_items = get_image_files,\n", " splitter = IndexSplitter(list(range(len(get_image_files(path))))[-bs:]),\n", " item_tfms=Resize(size), \n", " batch_tfms = Normalize.from_stats(torch.tensor([0.5]), torch.tensor([0.5])))" ] }, { "cell_type": "code", "execution_count": 11, "id": "b7fcacd4-6dbb-45cf-8ece-c01531cf8b70", "metadata": { "id": "L6iHHHFRvRPx" }, "outputs": [], "source": [ "dls = dblock.dataloaders(path, path=path, bs=bs)" ] }, { "cell_type": "code", "execution_count": 12, "id": "564918af-745e-4ae4-93fd-a8ada58f3bd3", "metadata": { "id": "ANw0OdjzvRvY" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "dls.show_batch(max_n=8)" ] }, { "cell_type": "markdown", "id": "e07e5a05-3340-4187-81f3-4e4ebadb5ca0", "metadata": {}, "source": [ "A key aspect of the diffusion models is that our model has the same size input and output:" ] }, { "cell_type": "code", "execution_count": 13, "id": "1ed870d9-b80a-4727-a8c0-93a4de6223d8", "metadata": { "id": "XlII4jxmwUnS" }, "outputs": [], "source": [ "xb, yb = next(iter(dls.train))\n", "assert xb.shape == yb.shape" ] }, { "cell_type": "markdown", "id": "fd4d06e7-c04c-44bf-aaf5-86dd922de5b4", "metadata": {}, "source": [ "## Diffusers Callback\n", "\n", "This callback is based on my previous DDPM callback with some additional modifications.\n", "\n", "\n", "The basic idea is we set a sampler/scheduler which we use to add noise to the image to train our noise-conditioned denoising network. Then during sampling, we create a `Pipeline` which couples our model and scheduler to allow us to sample. We can exchange out different samplers and sampler parameters with the `set_sampler` and `set_sampling_params` functions in the callback." ] }, { "cell_type": "code", "execution_count": 14, "id": "1dc7794f-49c1-449d-835f-cd7be4a2d8c6", "metadata": {}, "outputs": [], "source": [ "available_samplers = {\n", " 'DDPM': diffusers.DDPMScheduler,\n", " 'DDIM': diffusers.DDIMScheduler,\n", " 'Karras': diffusers.KarrasVeScheduler,\n", " 'LMS': diffusers.LMSDiscreteScheduler,\n", " 'PNDM': diffusers.PNDMScheduler,\n", " 'VESDE': diffusers.ScoreSdeVeScheduler,\n", "# 'VPSDE': diffusers.ScoreSdeVpScheduler\n", "}\n", "\n", "corresponding_pipelines = {\n", " diffusers.DDPMScheduler: diffusers.DDPMPipeline,\n", " diffusers.DDIMScheduler: diffusers.DDIMPipeline,\n", " diffusers.KarrasVeScheduler: diffusers.KarrasVePipeline,\n", " diffusers.PNDMScheduler: diffusers.PNDMPipeline,\n", " diffusers.ScoreSdeVeScheduler: diffusers.ScoreSdeVePipeline,\n", "\n", "}" ] }, { "cell_type": "code", "execution_count": 15, "id": "49b60a37-e0f8-4381-9602-3ea08d4f1623", "metadata": {}, "outputs": [], "source": [ "class Diffusers(Callback):\n", " def __init__(self, sampler='DDPM', tensor_type=TensorImage, **kwargs):\n", " self.tensor_type=tensor_type \n", " self.set_sampler(sampler, **kwargs)\n", " \n", " def before_batch_training(self):\n", " eps = self.tensor_type(self.xb[0]) # noise, x_T\n", " x0 = self.yb[0] # original images, x_0\n", " batch_size = x0.shape[0]\n", " t = torch.randint(0, self.sampler.config.num_train_timesteps, (batch_size,), device=x0.device, dtype=torch.long) # select random timesteps\n", " xt = self.tensor_type(self.sampler.add_noise(x0, eps, t)) # noisify the images\n", " self.learn.xb = (xt, t) # input to our model is noisy image and timestep\n", " self.learn.yb = (eps,) # ground truth is the noise \n", " \n", " def before_batch_sampling(self):\n", " self.pipeline = self.create_pipeline()\n", " if not hasattr(self, 'sampling_params'): self.set_sampling_params()\n", " images = self.pipeline(batch_size=self.xb[0].shape[0], output_type=\"numpy\", **self.sampling_params).images\n", " xt = self.tensor_type(images)\n", " self.learn.pred = (xt,)\n", " raise CancelBatchException\n", " \n", " def before_batch(self):\n", " if not hasattr(self, 'gather_preds'): self.before_batch_training()\n", " else: self.before_batch_sampling()\n", " \n", " def set_sampler(self, sampler_str, **kwargs):\n", " self.sampler = available_samplers[sampler_str](**kwargs)\n", " \n", " \n", " def create_pipeline(self):\n", " assert type(self.model) == DiffusersModel, \"Need to use DiffusersModel for Pipeline to work\"\n", " return corresponding_pipelines[type(self.sampler)](self.model.m, self.sampler)\n", " \n", " \n", " def set_sampling_params(self, **kwargs):\n", " self.sampling_params = kwargs" ] }, { "cell_type": "markdown", "id": "d55f993f-ce2f-4bb3-b5e2-9334d39a7fd7", "metadata": {}, "source": [ "Since Diffusers Pipelines expect models of their own type, we need to use it. But it returns a special dataclass output so we need to get it out and return it directly so fastai knows what to do with it. Hence this `DiffusersModel` class:" ] }, { "cell_type": "code", "execution_count": 16, "id": "7a203b0b-e0b2-4f18-ad76-bae21ae10531", "metadata": {}, "outputs": [], "source": [ "class DiffusersModel(nn.Module):\n", " def __init__(self, **kwargs):\n", " super().__init__()\n", " self.m = diffusers.UNet2DModel(**kwargs)\n", " \n", " def forward(self, x, t):\n", " return self.m(x,t).sample" ] }, { "cell_type": "code", "execution_count": 17, "id": "2dfa525d-82fc-4849-a622-f1be578aa1ce", "metadata": {}, "outputs": [], "source": [ "model = DiffusersModel(sample_size=32)" ] }, { "cell_type": "markdown", "id": "ea218e6d-a37b-473f-a890-b97199d45f3e", "metadata": {}, "source": [ "Now we can create a Learner as such:" ] }, { "cell_type": "code", "execution_count": 18, "id": "ab1f3da5-0649-4730-b5b9-8069d084f400", "metadata": {}, "outputs": [], "source": [ "learn = Learner(dls, model, cbs=[Diffusers('DDIM', num_train_timesteps=1000, beta_start=0.0001, beta_end=0.02)], loss_func=nn.MSELoss())" ] }, { "cell_type": "markdown", "id": "2c6cd9a6-d2dd-48dc-aa8d-0f6b34f57309", "metadata": {}, "source": [ "And use awesome fastai features like LR finder:" ] }, { "cell_type": "code", "execution_count": 19, "id": "b6a09457-ec77-4955-8281-8aad615bbf13", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "SuggestedLRs(valley=3.0199516913853586e-05)" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "learn.lr_find()" ] }, { "cell_type": "markdown", "id": "ebaf03da-78f7-4e69-bff3-52a2537588aa", "metadata": {}, "source": [ "And train with one-cycle LR schedule:" ] }, { "cell_type": "code", "execution_count": 20, "id": "9cbf4d53-d5a0-4a16-8f9e-88971957ac6d", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
epochtrain_lossvalid_losstime
00.0579530.04504003:22
10.0431190.03325203:22
20.0413410.03697503:22
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "learn.fit_one_cycle(3, 3e-5)" ] }, { "cell_type": "code", "execution_count": 21, "id": "8773118d-9a07-4623-906c-6f87d89f5caa", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "learn.recorder.plot_loss() " ] }, { "cell_type": "markdown", "id": "f1529252-472e-417a-8425-884eed136e9a", "metadata": {}, "source": [ "Let's save our model:" ] }, { "cell_type": "code", "execution_count": 16, "id": "84f13379-d033-4c80-84ea-7747aa6e41ed", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Path('/home/tmabraham/.fastai/data/mnist_png/models/diffusers-mnist.pth')" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "learn.save('diffusers-mnist')" ] }, { "cell_type": "code", "execution_count": 17, "id": "797edaff-3ada-42db-8e5c-4dc1cdb523f4", "metadata": {}, "outputs": [], "source": [ "learn = learn.load('diffusers-mnist')" ] }, { "cell_type": "markdown", "id": "5e6fcd74-bf41-44f2-ad4e-d354442da9be", "metadata": {}, "source": [ "## Sample generation\n", "\n", "Thanks to the fastai API, sample generation is as simple as this:" ] }, { "cell_type": "code", "execution_count": 22, "id": "2e452066-fd98-4b0f-b01c-46af0f66d36f", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "070af088aa8049b680164ff0e11e75f8", "version_major": 2, "version_minor": 0 }, "text/plain": [ " 0%| | 0/50 [00:00" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "preds[0][6].show()" ] }, { "cell_type": "markdown", "id": "3377d9af-9103-4b56-9f8b-bbea12a6af2e", "metadata": {}, "source": [ "Awesome, we got a simple MNIST digit!\n", "\n", "We can also try out different samplers with different parameters:" ] }, { "cell_type": "code", "execution_count": 26, "id": "ab0c6a74-4969-4edf-8b20-71df2e814108", "metadata": {}, "outputs": [], "source": [ "learn.diffusers.set_sampler('DDPM')" ] }, { "cell_type": "code", "execution_count": 27, "id": "70243503-ffa7-4bcb-84f2-2fdf26411f17", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "41f5e2b5c22f4146a56d4c48458f06f8", "version_major": 2, "version_minor": 0 }, "text/plain": [ " 0%| | 0/1000 [00:00" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "preds[0][0].show()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.11" } }, "nbformat": 4, "nbformat_minor": 5 }