{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from src.pipelines.pipeline_superres_sdxl import StableDiffusionXLSuperResPipeline\n",
    "from diffusers import AutoPipelineForText2Image\n",
    "import torch\n",
    "\n",
    "from src.tools import (\n",
    "    forward_unet_wrapper, \n",
    "    forward_resnet_wrapper, \n",
    "    forward_crossattndownblock2d_wrapper, \n",
    "    forward_crossattnupblock2d_wrapper,\n",
    "    forward_downblock2d_wrapper, \n",
    "    forward_upblock2d_wrapper,\n",
    "    forward_transformer_block_wrapper)\n",
    "from src.linfusion import LinFusion"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "model_ckpt = \"stabilityai/stable-diffusion-xl-base-1.0\"\n",
    "device = torch.device('cuda:3')\n",
    "\n",
    "pipe = AutoPipelineForText2Image.from_pretrained(\n",
    "    model_ckpt, torch_dtype=torch.float16, variant=\"fp16\"\n",
    ").to(device)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "prompt = \"An astronaut floating in space. Beautiful view of the stars and the universe in the background.\"\n",
    "generator = torch.manual_seed(0)\n",
    "image = pipe(\n",
    "    prompt, height=512, width=1024, generator=generator\n",
    ").images[0]\n",
    "image"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "pipe = StableDiffusionXLSuperResPipeline.from_pretrained(\n",
    "    model_ckpt, torch_dtype=torch.float16, variant=\"fp16\"\n",
    ").to(device)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "linfusion = LinFusion.construct_for(pipe)\n",
    "pipe.enable_vae_tiling()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "generator = torch.manual_seed(0)\n",
    "image = pipe(image=image, prompt=prompt,\n",
    "             height=1024, width=2048, device=device, \n",
    "             num_inference_steps=50, guidance_scale=7.5,\n",
    "             cosine_scale_1=3, cosine_scale_2=1, cosine_scale_3=1, gaussian_sigma=0.8,\n",
    "             generator=generator, upscale_strength=0.32).images[0]\n",
    "image"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "generator = torch.manual_seed(0)\n",
    "image = pipe(image=image, prompt=prompt,\n",
    "             height=2048, width=4096, device=device, \n",
    "             num_inference_steps=50, guidance_scale=7.5,\n",
    "             cosine_scale_1=3, cosine_scale_2=1, cosine_scale_3=1, gaussian_sigma=0.8,\n",
    "             generator=generator, upscale_strength=0.24).images[0]\n",
    "image"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "for _, _module in pipe.unet.named_modules():\n",
    "    if _module.__class__.__name__ == 'BasicTransformerBlock':\n",
    "        _module.set_chunk_feed_forward(16, 1)\n",
    "        _module.forward = forward_transformer_block_wrapper(_module)\n",
    "    elif _module.__class__.__name__ == 'ResnetBlock2D':\n",
    "        _module.nonlinearity.inplace = True\n",
    "        _module.forward = forward_resnet_wrapper(_module)\n",
    "    elif _module.__class__.__name__ == 'CrossAttnDownBlock2D':\n",
    "        _module.forward = forward_crossattndownblock2d_wrapper(_module)\n",
    "    elif _module.__class__.__name__ == 'DownBlock2D':\n",
    "        _module.forward = forward_downblock2d_wrapper(_module)\n",
    "    elif _module.__class__.__name__ == 'CrossAttnUpBlock2D':\n",
    "        _module.forward = forward_crossattnupblock2d_wrapper(_module)\n",
    "    elif _module.__class__.__name__ == 'UpBlock2D':\n",
    "        _module.forward = forward_upblock2d_wrapper(_module)   \n",
    "\n",
    "pipe.unet.forward = forward_unet_wrapper(pipe.unet)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "generator = torch.manual_seed(0)\n",
    "image = pipe(image=image, prompt=prompt,\n",
    "             height=4096, width=8192, device=device, \n",
    "             num_inference_steps=50, guidance_scale=7.5,\n",
    "             cosine_scale_1=3, cosine_scale_2=1, cosine_scale_3=1, gaussian_sigma=0.8,\n",
    "             generator=generator, upscale_strength=0.16).images[0]\n",
    "image"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "generator = torch.manual_seed(0)\n",
    "image = pipe(image=image, prompt=prompt,\n",
    "             height=8192, width=16384, device=device, \n",
    "             num_inference_steps=50, guidance_scale=7.5,\n",
    "             cosine_scale_1=3, cosine_scale_2=1, cosine_scale_3=1, gaussian_sigma=0.8,\n",
    "             generator=generator, upscale_strength=0.08).images[0]\n",
    "image"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "pt2",
   "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.8.19"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
