{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "4b23e3a6-544b-4e8c-b37c-70d8d5f04e46", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Looking in indexes: https://download.pytorch.org/whl/cu121\n", "Collecting torch\n", " Downloading https://download.pytorch.org/whl/cu121/torch-2.5.1%2Bcu121-cp312-cp312-linux_x86_64.whl (780.4 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m780.4/780.4 MB\u001b[0m \u001b[31m4.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:02\u001b[0m\n", "\u001b[?25hCollecting torchvision\n", " Downloading https://download.pytorch.org/whl/cu121/torchvision-0.20.1%2Bcu121-cp312-cp312-linux_x86_64.whl (7.3 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m7.3/7.3 MB\u001b[0m \u001b[31m14.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n", "\u001b[?25hCollecting torchaudio\n", " Downloading https://download.pytorch.org/whl/cu121/torchaudio-2.5.1%2Bcu121-cp312-cp312-linux_x86_64.whl (3.4 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.4/3.4 MB\u001b[0m \u001b[31m15.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n", "\u001b[?25hCollecting filelock (from torch)\n", " Downloading https://download.pytorch.org/whl/filelock-3.13.1-py3-none-any.whl.metadata (2.8 kB)\n", "Requirement already satisfied: typing-extensions>=4.8.0 in /usr/local/lib/python3.12/dist-packages (from torch) (4.14.0)\n", "Collecting networkx (from torch)\n", " Downloading https://download.pytorch.org/whl/networkx-3.3-py3-none-any.whl.metadata (5.1 kB)\n", "Requirement already satisfied: jinja2 in /usr/local/lib/python3.12/dist-packages (from torch) (3.1.6)\n", "Collecting fsspec (from torch)\n", " Downloading https://download.pytorch.org/whl/fsspec-2024.6.1-py3-none-any.whl.metadata (11 kB)\n", "Collecting nvidia-cuda-nvrtc-cu12==12.1.105 (from torch)\n", " Downloading https://download.pytorch.org/whl/cu121/nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-manylinux1_x86_64.whl (23.7 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m23.7/23.7 MB\u001b[0m \u001b[31m13.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n", "\u001b[?25hCollecting nvidia-cuda-runtime-cu12==12.1.105 (from torch)\n", " Downloading https://download.pytorch.org/whl/cu121/nvidia_cuda_runtime_cu12-12.1.105-py3-none-manylinux1_x86_64.whl (823 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m823.6/823.6 kB\u001b[0m \u001b[31m34.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hCollecting nvidia-cuda-cupti-cu12==12.1.105 (from torch)\n", " Downloading https://download.pytorch.org/whl/cu121/nvidia_cuda_cupti_cu12-12.1.105-py3-none-manylinux1_x86_64.whl (14.1 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m14.1/14.1 MB\u001b[0m \u001b[31m14.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n", "\u001b[?25hCollecting nvidia-cudnn-cu12==9.1.0.70 (from torch)\n", " Downloading https://download.pytorch.org/whl/cu121/nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl (664.8 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m664.8/664.8 MB\u001b[0m \u001b[31m4.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:02\u001b[0m\n", "\u001b[?25hCollecting nvidia-cublas-cu12==12.1.3.1 (from torch)\n", " Downloading https://download.pytorch.org/whl/cu121/nvidia_cublas_cu12-12.1.3.1-py3-none-manylinux1_x86_64.whl (410.6 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m410.6/410.6 MB\u001b[0m \u001b[31m6.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n", "\u001b[?25hCollecting nvidia-cufft-cu12==11.0.2.54 (from torch)\n", " Downloading https://download.pytorch.org/whl/cu121/nvidia_cufft_cu12-11.0.2.54-py3-none-manylinux1_x86_64.whl (121.6 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m121.6/121.6 MB\u001b[0m \u001b[31m8.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n", "\u001b[?25hCollecting nvidia-curand-cu12==10.3.2.106 (from torch)\n", " Downloading https://download.pytorch.org/whl/cu121/nvidia_curand_cu12-10.3.2.106-py3-none-manylinux1_x86_64.whl (56.5 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m56.5/56.5 MB\u001b[0m \u001b[31m10.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n", "\u001b[?25hCollecting nvidia-cusolver-cu12==11.4.5.107 (from torch)\n", " Downloading https://download.pytorch.org/whl/cu121/nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl (124.2 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m124.2/124.2 MB\u001b[0m \u001b[31m9.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n", "\u001b[?25hCollecting nvidia-cusparse-cu12==12.1.0.106 (from torch)\n", " Downloading https://download.pytorch.org/whl/cu121/nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl (196.0 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m196.0/196.0 MB\u001b[0m \u001b[31m7.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n", "\u001b[?25hCollecting nvidia-nccl-cu12==2.21.5 (from torch)\n", " Downloading https://download.pytorch.org/whl/nvidia_nccl_cu12-2.21.5-py3-none-manylinux2014_x86_64.whl (188.7 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m188.7/188.7 MB\u001b[0m \u001b[31m8.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n", "\u001b[?25hCollecting nvidia-nvtx-cu12==12.1.105 (from torch)\n", " Downloading https://download.pytorch.org/whl/cu121/nvidia_nvtx_cu12-12.1.105-py3-none-manylinux1_x86_64.whl (99 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m99.1/99.1 kB\u001b[0m \u001b[31m11.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hCollecting triton==3.1.0 (from torch)\n", " Downloading https://download.pytorch.org/whl/triton-3.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (209.6 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m209.6/209.6 MB\u001b[0m \u001b[31m7.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n", "\u001b[?25hRequirement already satisfied: setuptools in /usr/lib/python3/dist-packages (from torch) (68.1.2)\n", "Collecting sympy==1.13.1 (from torch)\n", " Downloading https://download.pytorch.org/whl/sympy-1.13.1-py3-none-any.whl (6.2 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m6.2/6.2 MB\u001b[0m \u001b[31m17.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n", "\u001b[?25hCollecting nvidia-nvjitlink-cu12 (from nvidia-cusolver-cu12==11.4.5.107->torch)\n", " Downloading https://download.pytorch.org/whl/cu121/nvidia_nvjitlink_cu12-12.1.105-py3-none-manylinux1_x86_64.whl (19.8 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m19.8/19.8 MB\u001b[0m \u001b[31m11.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n", "\u001b[?25hCollecting mpmath<1.4,>=1.1.0 (from sympy==1.13.1->torch)\n", " Downloading https://download.pytorch.org/whl/mpmath-1.3.0-py3-none-any.whl (536 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m536.2/536.2 kB\u001b[0m \u001b[31m13.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m\n", "\u001b[?25hRequirement already satisfied: numpy in /usr/local/lib/python3.12/dist-packages (from torchvision) (2.3.1)\n", "Collecting pillow!=8.3.*,>=5.3.0 (from torchvision)\n", " Downloading https://download.pytorch.org/whl/pillow-11.0.0-cp312-cp312-manylinux_2_28_x86_64.whl.metadata (9.1 kB)\n", "Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.12/dist-packages (from jinja2->torch) (3.0.2)\n", "Downloading https://download.pytorch.org/whl/pillow-11.0.0-cp312-cp312-manylinux_2_28_x86_64.whl (4.4 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m4.4/4.4 MB\u001b[0m \u001b[31m13.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n", "\u001b[?25hDownloading https://download.pytorch.org/whl/filelock-3.13.1-py3-none-any.whl (11 kB)\n", "Downloading https://download.pytorch.org/whl/fsspec-2024.6.1-py3-none-any.whl (177 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m177.6/177.6 kB\u001b[0m \u001b[31m13.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hDownloading https://download.pytorch.org/whl/networkx-3.3-py3-none-any.whl (1.7 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.7/1.7 MB\u001b[0m \u001b[31m14.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n", "\u001b[?25hInstalling collected packages: mpmath, sympy, pillow, nvidia-nvtx-cu12, nvidia-nvjitlink-cu12, nvidia-nccl-cu12, nvidia-curand-cu12, nvidia-cufft-cu12, nvidia-cuda-runtime-cu12, nvidia-cuda-nvrtc-cu12, nvidia-cuda-cupti-cu12, nvidia-cublas-cu12, networkx, fsspec, filelock, triton, nvidia-cusparse-cu12, nvidia-cudnn-cu12, nvidia-cusolver-cu12, torch, torchvision, torchaudio\n", "Successfully installed filelock-3.13.1 fsspec-2024.6.1 mpmath-1.3.0 networkx-3.3 nvidia-cublas-cu12-12.1.3.1 nvidia-cuda-cupti-cu12-12.1.105 nvidia-cuda-nvrtc-cu12-12.1.105 nvidia-cuda-runtime-cu12-12.1.105 nvidia-cudnn-cu12-9.1.0.70 nvidia-cufft-cu12-11.0.2.54 nvidia-curand-cu12-10.3.2.106 nvidia-cusolver-cu12-11.4.5.107 nvidia-cusparse-cu12-12.1.0.106 nvidia-nccl-cu12-2.21.5 nvidia-nvjitlink-cu12-12.1.105 nvidia-nvtx-cu12-12.1.105 pillow-11.0.0 sympy-1.13.1 torch-2.5.1+cu121 torchaudio-2.5.1+cu121 torchvision-0.20.1+cu121 triton-3.1.0\n", "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", "\u001b[0mCollecting diffusers\n", " Downloading diffusers-0.34.0-py3-none-any.whl.metadata (20 kB)\n", "Collecting transformers\n", " Downloading transformers-4.53.2-py3-none-any.whl.metadata (40 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m40.9/40.9 kB\u001b[0m \u001b[31m248.7 kB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n", "\u001b[?25hCollecting accelerate\n", " Downloading accelerate-1.9.0-py3-none-any.whl.metadata (19 kB)\n", "Collecting importlib_metadata (from diffusers)\n", " Downloading importlib_metadata-8.7.0-py3-none-any.whl.metadata (4.8 kB)\n", "Requirement already satisfied: filelock in /usr/local/lib/python3.12/dist-packages (from diffusers) (3.13.1)\n", "Collecting huggingface-hub>=0.27.0 (from diffusers)\n", " Downloading huggingface_hub-0.33.4-py3-none-any.whl.metadata (14 kB)\n", "Requirement already satisfied: numpy in /usr/local/lib/python3.12/dist-packages (from diffusers) (2.3.1)\n", "Collecting regex!=2019.12.17 (from diffusers)\n", " Downloading regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (40 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m40.5/40.5 kB\u001b[0m \u001b[31m311.1 kB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n", "\u001b[?25hRequirement already satisfied: requests in /usr/local/lib/python3.12/dist-packages (from diffusers) (2.32.4)\n", "Collecting safetensors>=0.3.1 (from diffusers)\n", " Downloading safetensors-0.5.3-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (3.8 kB)\n", "Requirement already satisfied: Pillow in /usr/local/lib/python3.12/dist-packages (from diffusers) (11.0.0)\n", "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.12/dist-packages (from transformers) (25.0)\n", "Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.12/dist-packages (from transformers) (6.0.2)\n", "Collecting tokenizers<0.22,>=0.21 (from transformers)\n", " Downloading tokenizers-0.21.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (6.8 kB)\n", "Collecting tqdm>=4.27 (from transformers)\n", " Downloading tqdm-4.67.1-py3-none-any.whl.metadata (57 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m57.7/57.7 kB\u001b[0m \u001b[31m252.1 kB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n", "\u001b[?25hRequirement already satisfied: psutil in /usr/local/lib/python3.12/dist-packages (from accelerate) (7.0.0)\n", "Requirement already satisfied: torch>=2.0.0 in /usr/local/lib/python3.12/dist-packages (from accelerate) (2.5.1+cu121)\n", "Requirement already satisfied: fsspec>=2023.5.0 in /usr/local/lib/python3.12/dist-packages (from huggingface-hub>=0.27.0->diffusers) (2024.6.1)\n", "Requirement already satisfied: typing-extensions>=3.7.4.3 in /usr/local/lib/python3.12/dist-packages (from huggingface-hub>=0.27.0->diffusers) (4.14.0)\n", "Collecting hf-xet<2.0.0,>=1.1.2 (from huggingface-hub>=0.27.0->diffusers)\n", " Downloading hf_xet-1.1.5-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (879 bytes)\n", "Requirement already satisfied: networkx in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->accelerate) (3.3)\n", "Requirement already satisfied: jinja2 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->accelerate) (3.1.6)\n", "Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.1.105 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->accelerate) (12.1.105)\n", "Requirement already satisfied: nvidia-cuda-runtime-cu12==12.1.105 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->accelerate) (12.1.105)\n", "Requirement already satisfied: nvidia-cuda-cupti-cu12==12.1.105 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->accelerate) (12.1.105)\n", "Requirement already satisfied: nvidia-cudnn-cu12==9.1.0.70 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->accelerate) (9.1.0.70)\n", "Requirement already satisfied: nvidia-cublas-cu12==12.1.3.1 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->accelerate) (12.1.3.1)\n", "Requirement already satisfied: nvidia-cufft-cu12==11.0.2.54 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->accelerate) (11.0.2.54)\n", "Requirement already satisfied: nvidia-curand-cu12==10.3.2.106 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->accelerate) (10.3.2.106)\n", "Requirement already satisfied: nvidia-cusolver-cu12==11.4.5.107 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->accelerate) (11.4.5.107)\n", "Requirement already satisfied: nvidia-cusparse-cu12==12.1.0.106 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->accelerate) (12.1.0.106)\n", "Requirement already satisfied: nvidia-nccl-cu12==2.21.5 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->accelerate) (2.21.5)\n", "Requirement already satisfied: nvidia-nvtx-cu12==12.1.105 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->accelerate) (12.1.105)\n", "Requirement already satisfied: triton==3.1.0 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->accelerate) (3.1.0)\n", "Requirement already satisfied: setuptools in /usr/lib/python3/dist-packages (from torch>=2.0.0->accelerate) (68.1.2)\n", "Requirement already satisfied: sympy==1.13.1 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->accelerate) (1.13.1)\n", "Requirement already satisfied: nvidia-nvjitlink-cu12 in /usr/local/lib/python3.12/dist-packages (from nvidia-cusolver-cu12==11.4.5.107->torch>=2.0.0->accelerate) (12.1.105)\n", "Requirement already satisfied: mpmath<1.4,>=1.1.0 in /usr/local/lib/python3.12/dist-packages (from sympy==1.13.1->torch>=2.0.0->accelerate) (1.3.0)\n", "Collecting zipp>=3.20 (from importlib_metadata->diffusers)\n", " Downloading zipp-3.23.0-py3-none-any.whl.metadata (3.6 kB)\n", "Requirement already satisfied: charset_normalizer<4,>=2 in /usr/local/lib/python3.12/dist-packages (from requests->diffusers) (3.4.2)\n", "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.12/dist-packages (from requests->diffusers) (3.10)\n", "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.12/dist-packages (from requests->diffusers) (2.5.0)\n", "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.12/dist-packages (from requests->diffusers) (2025.6.15)\n", "Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.12/dist-packages (from jinja2->torch>=2.0.0->accelerate) (3.0.2)\n", "Downloading diffusers-0.34.0-py3-none-any.whl (3.8 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.8/3.8 MB\u001b[0m \u001b[31m3.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m0m\n", "\u001b[?25hDownloading transformers-4.53.2-py3-none-any.whl (10.8 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m10.8/10.8 MB\u001b[0m \u001b[31m14.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m0:01\u001b[0m\n", "\u001b[?25hDownloading accelerate-1.9.0-py3-none-any.whl (367 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m367.1/367.1 kB\u001b[0m \u001b[31m27.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hDownloading huggingface_hub-0.33.4-py3-none-any.whl (515 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m515.3/515.3 kB\u001b[0m \u001b[31m28.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hDownloading regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (796 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m796.9/796.9 kB\u001b[0m \u001b[31m30.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hDownloading safetensors-0.5.3-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (471 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m471.6/471.6 kB\u001b[0m \u001b[31m30.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hDownloading tokenizers-0.21.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.1 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.1/3.1 MB\u001b[0m \u001b[31m36.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n", "\u001b[?25hDownloading tqdm-4.67.1-py3-none-any.whl (78 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m78.5/78.5 kB\u001b[0m \u001b[31m294.7 kB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n", "\u001b[?25hDownloading importlib_metadata-8.7.0-py3-none-any.whl (27 kB)\n", "Downloading hf_xet-1.1.5-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.1 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.1/3.1 MB\u001b[0m \u001b[31m35.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n", "\u001b[?25hDownloading zipp-3.23.0-py3-none-any.whl (10 kB)\n", "Installing collected packages: zipp, tqdm, safetensors, regex, hf-xet, importlib_metadata, huggingface-hub, tokenizers, diffusers, transformers, accelerate\n", "Successfully installed accelerate-1.9.0 diffusers-0.34.0 hf-xet-1.1.5 huggingface-hub-0.33.4 importlib_metadata-8.7.0 regex-2024.11.6 safetensors-0.5.3 tokenizers-0.21.2 tqdm-4.67.1 transformers-4.53.2 zipp-3.23.0\n", "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", "\u001b[0mCollecting datasets\n", " Downloading datasets-4.0.0-py3-none-any.whl.metadata (19 kB)\n", "Requirement already satisfied: pillow in /usr/local/lib/python3.12/dist-packages (11.0.0)\n", "Collecting matplotlib\n", " Downloading matplotlib-3.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (11 kB)\n", "Requirement already satisfied: tqdm in /usr/local/lib/python3.12/dist-packages (4.67.1)\n", "Requirement already satisfied: filelock in /usr/local/lib/python3.12/dist-packages (from datasets) (3.13.1)\n", "Requirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.12/dist-packages (from datasets) (2.3.1)\n", "Collecting pyarrow>=15.0.0 (from datasets)\n", " Downloading pyarrow-21.0.0-cp312-cp312-manylinux_2_28_x86_64.whl.metadata (3.3 kB)\n", "Collecting dill<0.3.9,>=0.3.0 (from datasets)\n", " Downloading dill-0.3.8-py3-none-any.whl.metadata (10 kB)\n", "Collecting pandas (from datasets)\n", " Downloading pandas-2.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (91 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m91.2/91.2 kB\u001b[0m \u001b[31m256.5 kB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n", "\u001b[?25hRequirement already satisfied: requests>=2.32.2 in /usr/local/lib/python3.12/dist-packages (from datasets) (2.32.4)\n", "Collecting xxhash (from datasets)\n", " Downloading xxhash-3.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (12 kB)\n", "Collecting multiprocess<0.70.17 (from datasets)\n", " Downloading multiprocess-0.70.16-py312-none-any.whl.metadata (7.2 kB)\n", "Requirement already satisfied: fsspec<=2025.3.0,>=2023.1.0 in /usr/local/lib/python3.12/dist-packages (from fsspec[http]<=2025.3.0,>=2023.1.0->datasets) (2024.6.1)\n", "Requirement already satisfied: huggingface-hub>=0.24.0 in /usr/local/lib/python3.12/dist-packages (from datasets) (0.33.4)\n", "Requirement already satisfied: packaging in /usr/local/lib/python3.12/dist-packages (from datasets) (25.0)\n", "Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.12/dist-packages (from datasets) (6.0.2)\n", "Collecting contourpy>=1.0.1 (from matplotlib)\n", " Downloading contourpy-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (5.5 kB)\n", "Collecting cycler>=0.10 (from matplotlib)\n", " Downloading cycler-0.12.1-py3-none-any.whl.metadata (3.8 kB)\n", "Collecting fonttools>=4.22.0 (from matplotlib)\n", " Downloading fonttools-4.59.0-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl.metadata (107 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m107.9/107.9 kB\u001b[0m \u001b[31m681.9 kB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n", "\u001b[?25hCollecting kiwisolver>=1.3.1 (from matplotlib)\n", " Downloading kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (6.2 kB)\n", "Requirement already satisfied: pyparsing>=2.3.1 in /usr/lib/python3/dist-packages (from matplotlib) (3.1.1)\n", "Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.12/dist-packages (from matplotlib) (2.9.0.post0)\n", "Collecting aiohttp!=4.0.0a0,!=4.0.0a1 (from fsspec[http]<=2025.3.0,>=2023.1.0->datasets)\n", " Downloading aiohttp-3.12.14-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (7.6 kB)\n", "Requirement already satisfied: typing-extensions>=3.7.4.3 in /usr/local/lib/python3.12/dist-packages (from huggingface-hub>=0.24.0->datasets) (4.14.0)\n", "Requirement already satisfied: hf-xet<2.0.0,>=1.1.2 in /usr/local/lib/python3.12/dist-packages (from huggingface-hub>=0.24.0->datasets) (1.1.5)\n", "Requirement already satisfied: six>=1.5 in /usr/lib/python3/dist-packages (from python-dateutil>=2.7->matplotlib) (1.16.0)\n", "Requirement already satisfied: charset_normalizer<4,>=2 in /usr/local/lib/python3.12/dist-packages (from requests>=2.32.2->datasets) (3.4.2)\n", "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.12/dist-packages (from requests>=2.32.2->datasets) (3.10)\n", "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.12/dist-packages (from requests>=2.32.2->datasets) (2.5.0)\n", "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.12/dist-packages (from requests>=2.32.2->datasets) (2025.6.15)\n", "Collecting pytz>=2020.1 (from pandas->datasets)\n", " Downloading pytz-2025.2-py2.py3-none-any.whl.metadata (22 kB)\n", "Collecting tzdata>=2022.7 (from pandas->datasets)\n", " Downloading tzdata-2025.2-py2.py3-none-any.whl.metadata (1.4 kB)\n", "Collecting aiohappyeyeballs>=2.5.0 (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<=2025.3.0,>=2023.1.0->datasets)\n", " Downloading aiohappyeyeballs-2.6.1-py3-none-any.whl.metadata (5.9 kB)\n", "Collecting aiosignal>=1.4.0 (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<=2025.3.0,>=2023.1.0->datasets)\n", " Downloading aiosignal-1.4.0-py3-none-any.whl.metadata (3.7 kB)\n", "Requirement already satisfied: attrs>=17.3.0 in /usr/local/lib/python3.12/dist-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<=2025.3.0,>=2023.1.0->datasets) (25.3.0)\n", "Collecting frozenlist>=1.1.1 (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<=2025.3.0,>=2023.1.0->datasets)\n", " Downloading frozenlist-1.7.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (18 kB)\n", "Collecting multidict<7.0,>=4.5 (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<=2025.3.0,>=2023.1.0->datasets)\n", " Downloading multidict-6.6.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (5.3 kB)\n", "Collecting propcache>=0.2.0 (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<=2025.3.0,>=2023.1.0->datasets)\n", " Downloading propcache-0.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (12 kB)\n", "Collecting yarl<2.0,>=1.17.0 (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<=2025.3.0,>=2023.1.0->datasets)\n", " Downloading yarl-1.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (73 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m73.9/73.9 kB\u001b[0m \u001b[31m829.3 kB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n", "\u001b[?25hDownloading datasets-4.0.0-py3-none-any.whl (494 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m494.8/494.8 kB\u001b[0m \u001b[31m1.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0mm\n", "\u001b[?25hDownloading matplotlib-3.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (8.6 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m8.6/8.6 MB\u001b[0m \u001b[31m7.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n", "\u001b[?25hDownloading contourpy-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (323 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m323.7/323.7 kB\u001b[0m \u001b[31m15.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hDownloading cycler-0.12.1-py3-none-any.whl (8.3 kB)\n", "Downloading dill-0.3.8-py3-none-any.whl (116 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m116.3/116.3 kB\u001b[0m \u001b[31m10.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hDownloading fonttools-4.59.0-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl (4.9 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m4.9/4.9 MB\u001b[0m \u001b[31m17.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n", "\u001b[?25hDownloading kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.5/1.5 MB\u001b[0m \u001b[31m34.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m\n", "\u001b[?25hDownloading multiprocess-0.70.16-py312-none-any.whl (146 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m146.7/146.7 kB\u001b[0m \u001b[31m14.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hDownloading pyarrow-21.0.0-cp312-cp312-manylinux_2_28_x86_64.whl (42.8 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m42.8/42.8 MB\u001b[0m \u001b[31m13.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n", "\u001b[?25hDownloading pandas-2.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (12.0 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m12.0/12.0 MB\u001b[0m \u001b[31m14.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n", "\u001b[?25hDownloading xxhash-3.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (194 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m194.4/194.4 kB\u001b[0m \u001b[31m19.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hDownloading aiohttp-3.12.14-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.7 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.7/1.7 MB\u001b[0m \u001b[31m34.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m\n", "\u001b[?25hDownloading pytz-2025.2-py2.py3-none-any.whl (509 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m509.2/509.2 kB\u001b[0m \u001b[31m32.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hDownloading tzdata-2025.2-py2.py3-none-any.whl (347 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m347.8/347.8 kB\u001b[0m \u001b[31m27.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hDownloading aiohappyeyeballs-2.6.1-py3-none-any.whl (15 kB)\n", "Downloading aiosignal-1.4.0-py3-none-any.whl (7.5 kB)\n", "Downloading frozenlist-1.7.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (241 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m241.8/241.8 kB\u001b[0m \u001b[31m20.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hDownloading multidict-6.6.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (256 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m256.1/256.1 kB\u001b[0m \u001b[31m22.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hDownloading propcache-0.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (224 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m224.4/224.4 kB\u001b[0m \u001b[31m19.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hDownloading yarl-1.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (355 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m355.6/355.6 kB\u001b[0m \u001b[31m26.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hInstalling collected packages: pytz, xxhash, tzdata, pyarrow, propcache, multidict, kiwisolver, frozenlist, fonttools, dill, cycler, contourpy, aiohappyeyeballs, yarl, pandas, multiprocess, matplotlib, aiosignal, aiohttp, datasets\n", "Successfully installed aiohappyeyeballs-2.6.1 aiohttp-3.12.14 aiosignal-1.4.0 contourpy-1.3.2 cycler-0.12.1 datasets-4.0.0 dill-0.3.8 fonttools-4.59.0 frozenlist-1.7.0 kiwisolver-1.4.8 matplotlib-3.10.3 multidict-6.6.3 multiprocess-0.70.16 pandas-2.3.1 propcache-0.3.2 pyarrow-21.0.0 pytz-2025.2 tzdata-2025.2 xxhash-3.5.0 yarl-1.20.1\n", "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", "\u001b[0mCollecting wandb\n", " Downloading wandb-0.21.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (10 kB)\n", "Requirement already satisfied: tensorboard in /usr/local/lib/python3.12/dist-packages (2.19.0)\n", "Collecting click!=8.0.0,>=7.1 (from wandb)\n", " Downloading click-8.2.1-py3-none-any.whl.metadata (2.5 kB)\n", "Collecting gitpython!=3.1.29,>=1.0.0 (from wandb)\n", " Downloading GitPython-3.1.44-py3-none-any.whl.metadata (13 kB)\n", "Requirement already satisfied: packaging in /usr/local/lib/python3.12/dist-packages (from wandb) (25.0)\n", "Requirement already satisfied: platformdirs in /usr/local/lib/python3.12/dist-packages (from wandb) (4.3.8)\n", "Requirement already satisfied: protobuf!=4.21.0,!=5.28.0,<7,>=3.19.0 in /usr/local/lib/python3.12/dist-packages (from wandb) (6.31.1)\n", "Collecting pydantic<3 (from wandb)\n", " Downloading pydantic-2.11.7-py3-none-any.whl.metadata (67 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m68.0/68.0 kB\u001b[0m \u001b[31m192.8 kB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n", "\u001b[?25hRequirement already satisfied: pyyaml in /usr/local/lib/python3.12/dist-packages (from wandb) (6.0.2)\n", "Requirement already satisfied: requests<3,>=2.0.0 in /usr/local/lib/python3.12/dist-packages (from wandb) (2.32.4)\n", "Collecting sentry-sdk>=2.0.0 (from wandb)\n", " Downloading sentry_sdk-2.33.0-py2.py3-none-any.whl.metadata (10 kB)\n", "Requirement already satisfied: typing-extensions<5,>=4.8 in /usr/local/lib/python3.12/dist-packages (from wandb) (4.14.0)\n", "Requirement already satisfied: absl-py>=0.4 in /usr/local/lib/python3.12/dist-packages (from tensorboard) (2.3.0)\n", "Requirement already satisfied: grpcio>=1.48.2 in /usr/local/lib/python3.12/dist-packages (from tensorboard) (1.73.1)\n", "Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.12/dist-packages (from tensorboard) (3.8.2)\n", "Requirement already satisfied: numpy>=1.12.0 in /usr/local/lib/python3.12/dist-packages (from tensorboard) (2.3.1)\n", "Requirement already satisfied: setuptools>=41.0.0 in /usr/lib/python3/dist-packages (from tensorboard) (68.1.2)\n", "Requirement already satisfied: six>1.9 in /usr/lib/python3/dist-packages (from tensorboard) (1.16.0)\n", "Requirement already satisfied: tensorboard-data-server<0.8.0,>=0.7.0 in /usr/local/lib/python3.12/dist-packages (from tensorboard) (0.7.2)\n", "Requirement already satisfied: werkzeug>=1.0.1 in /usr/local/lib/python3.12/dist-packages (from tensorboard) (3.1.3)\n", "Collecting gitdb<5,>=4.0.1 (from gitpython!=3.1.29,>=1.0.0->wandb)\n", " Downloading gitdb-4.0.12-py3-none-any.whl.metadata (1.2 kB)\n", "Collecting annotated-types>=0.6.0 (from pydantic<3->wandb)\n", " Downloading annotated_types-0.7.0-py3-none-any.whl.metadata (15 kB)\n", "Collecting pydantic-core==2.33.2 (from pydantic<3->wandb)\n", " Downloading pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (6.8 kB)\n", "Collecting typing-inspection>=0.4.0 (from pydantic<3->wandb)\n", " Downloading typing_inspection-0.4.1-py3-none-any.whl.metadata (2.6 kB)\n", "Requirement already satisfied: charset_normalizer<4,>=2 in /usr/local/lib/python3.12/dist-packages (from requests<3,>=2.0.0->wandb) (3.4.2)\n", "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.12/dist-packages (from requests<3,>=2.0.0->wandb) (3.10)\n", "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.12/dist-packages (from requests<3,>=2.0.0->wandb) (2.5.0)\n", "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.12/dist-packages (from requests<3,>=2.0.0->wandb) (2025.6.15)\n", "Requirement already satisfied: MarkupSafe>=2.1.1 in /usr/local/lib/python3.12/dist-packages (from werkzeug>=1.0.1->tensorboard) (3.0.2)\n", "Collecting smmap<6,>=3.0.1 (from gitdb<5,>=4.0.1->gitpython!=3.1.29,>=1.0.0->wandb)\n", " Downloading smmap-5.0.2-py3-none-any.whl.metadata (4.3 kB)\n", "Downloading wandb-0.21.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (22.2 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m22.2/22.2 MB\u001b[0m \u001b[31m12.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n", "\u001b[?25hDownloading click-8.2.1-py3-none-any.whl (102 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m102.2/102.2 kB\u001b[0m \u001b[31m9.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hDownloading GitPython-3.1.44-py3-none-any.whl (207 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m207.6/207.6 kB\u001b[0m \u001b[31m17.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hDownloading pydantic-2.11.7-py3-none-any.whl (444 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m444.8/444.8 kB\u001b[0m \u001b[31m25.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hDownloading pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.0/2.0 MB\u001b[0m \u001b[31m37.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n", "\u001b[?25hDownloading sentry_sdk-2.33.0-py2.py3-none-any.whl (356 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m356.4/356.4 kB\u001b[0m \u001b[31m32.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hDownloading annotated_types-0.7.0-py3-none-any.whl (13 kB)\n", "Downloading gitdb-4.0.12-py3-none-any.whl (62 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m62.8/62.8 kB\u001b[0m \u001b[31m5.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hDownloading typing_inspection-0.4.1-py3-none-any.whl (14 kB)\n", "Downloading smmap-5.0.2-py3-none-any.whl (24 kB)\n", "Installing collected packages: typing-inspection, smmap, sentry-sdk, pydantic-core, click, annotated-types, pydantic, gitdb, gitpython, wandb\n", "Successfully installed annotated-types-0.7.0 click-8.2.1 gitdb-4.0.12 gitpython-3.1.44 pydantic-2.11.7 pydantic-core-2.33.2 sentry-sdk-2.33.0 smmap-5.0.2 typing-inspection-0.4.1 wandb-0.21.0\n", "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", "\u001b[0mCollecting opencv-python\n", " Downloading opencv_python-4.12.0.88-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.metadata (19 kB)\n", "Collecting scikit-image\n", " Downloading scikit_image-0.25.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (14 kB)\n", "Collecting numpy<2.3.0,>=2 (from opencv-python)\n", " Downloading numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (62 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m62.0/62.0 kB\u001b[0m \u001b[31m252.8 kB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n", "\u001b[?25hCollecting scipy>=1.11.4 (from scikit-image)\n", " Downloading scipy-1.16.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.metadata (61 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m61.9/61.9 kB\u001b[0m \u001b[31m679.3 kB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n", "\u001b[?25hRequirement already satisfied: networkx>=3.0 in /usr/local/lib/python3.12/dist-packages (from scikit-image) (3.3)\n", "Requirement already satisfied: pillow>=10.1 in /usr/local/lib/python3.12/dist-packages (from scikit-image) (11.0.0)\n", "Collecting imageio!=2.35.0,>=2.33 (from scikit-image)\n", " Downloading imageio-2.37.0-py3-none-any.whl.metadata (5.2 kB)\n", "Collecting tifffile>=2022.8.12 (from scikit-image)\n", " Downloading tifffile-2025.6.11-py3-none-any.whl.metadata (32 kB)\n", "Requirement already satisfied: packaging>=21 in /usr/local/lib/python3.12/dist-packages (from scikit-image) (25.0)\n", "Collecting lazy-loader>=0.4 (from scikit-image)\n", " Downloading lazy_loader-0.4-py3-none-any.whl.metadata (7.6 kB)\n", "Downloading opencv_python-4.12.0.88-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (67.0 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m67.0/67.0 MB\u001b[0m \u001b[31m11.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n", "\u001b[?25hDownloading scikit_image-0.25.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (15.0 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m15.0/15.0 MB\u001b[0m \u001b[31m14.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n", "\u001b[?25hDownloading imageio-2.37.0-py3-none-any.whl (315 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m315.8/315.8 kB\u001b[0m \u001b[31m20.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hDownloading lazy_loader-0.4-py3-none-any.whl (12 kB)\n", "Downloading numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (16.5 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m16.5/16.5 MB\u001b[0m \u001b[31m14.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n", "\u001b[?25hDownloading scipy-1.16.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (35.1 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m35.1/35.1 MB\u001b[0m \u001b[31m8.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0mm\n", "\u001b[?25hDownloading tifffile-2025.6.11-py3-none-any.whl (230 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m230.8/230.8 kB\u001b[0m \u001b[31m19.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hInstalling collected packages: numpy, lazy-loader, tifffile, scipy, opencv-python, imageio, scikit-image\n", " Attempting uninstall: numpy\n", " Found existing installation: numpy 2.3.1\n", " Uninstalling numpy-2.3.1:\n", " Successfully uninstalled numpy-2.3.1\n", "Successfully installed imageio-2.37.0 lazy-loader-0.4 numpy-2.2.6 opencv-python-4.12.0.88 scikit-image-0.25.2 scipy-1.16.0 tifffile-2025.6.11\n", "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", "\u001b[0mCollecting einops\n", " Downloading einops-0.8.1-py3-none-any.whl.metadata (13 kB)\n", "Downloading einops-0.8.1-py3-none-any.whl (64 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m64.4/64.4 kB\u001b[0m \u001b[31m192.7 kB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n", "\u001b[?25hInstalling collected packages: einops\n", "Successfully installed einops-0.8.1\n", "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", "\u001b[0m" ] } ], "source": [ "# Install required packages\n", "!pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121\n", "!pip install diffusers transformers accelerate\n", "!pip install datasets pillow matplotlib tqdm\n", "!pip install wandb tensorboard\n", "!pip install opencv-python scikit-image\n", "!pip install einops" ] }, { "cell_type": "code", "execution_count": 2, "id": "a66917c9-173b-4547-baa6-56f303707025", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Filesystem Size Used Avail Use% Mounted on\n", "overlay 131G 8.9G 123G 7% /\n", "tmpfs 64M 0 64M 0% /dev\n", "shm 15G 0 15G 0% /dev/shm\n", "/dev/loop6 1.7T 386G 1.3T 24% /etc/hosts\n", "/dev/nvme0n1p2 1.9T 562G 1.2T 32% /usr/bin/nvidia-smi\n", "tmpfs 13G 2.9M 13G 1% /run/nvidia-persistenced/socket\n", "tmpfs 63G 0 63G 0% /sys/fs/cgroup\n", "tmpfs 63G 0 63G 0% /proc/asound\n", "tmpfs 63G 0 63G 0% /proc/acpi\n", "tmpfs 63G 0 63G 0% /proc/scsi\n", "tmpfs 63G 0 63G 0% /sys/firmware\n", "tmpfs 63G 0 63G 0% /sys/devices/virtual/powercap\n" ] } ], "source": [ "!df -h" ] }, { "cell_type": "code", "execution_count": 1, "id": "88aec5bc-9914-44ee-8ab9-4b46378ee61a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Using device: cuda\n", "GPU: NVIDIA GeForce RTX 3060\n", "CUDA Version: 12.1\n", "Available VRAM: 11.66 GB\n", "Current VRAM usage: 0.00 GB\n" ] } ], "source": [ "import torch\n", "import torch.nn as nn\n", "import torch.nn.functional as F\n", "from torch.utils.data import DataLoader, Dataset\n", "import torchvision.transforms as transforms\n", "from torchvision import datasets\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from tqdm import tqdm\n", "import os\n", "import math\n", "from PIL import Image\n", "import random\n", "\n", "# Check GPU setup\n", "device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n", "print(f\"Using device: {device}\")\n", "\n", "if torch.cuda.is_available():\n", " print(f\"GPU: {torch.cuda.get_device_name(0)}\")\n", " print(f\"CUDA Version: {torch.version.cuda}\")\n", " print(f\"Available VRAM: {torch.cuda.get_device_properties(0).total_memory / 1024**3:.2f} GB\")\n", " print(f\"Current VRAM usage: {torch.cuda.memory_allocated(0) / 1024**3:.2f} GB\")\n", "\n", "# Set random seeds for reproducibility\n", "torch.manual_seed(42)\n", "np.random.seed(42)\n", "random.seed(42)\n", "if torch.cuda.is_available():\n", " torch.cuda.manual_seed(42)" ] }, { "cell_type": "code", "execution_count": 2, "id": "bea9f729-e07e-4e17-996b-608fb7aff7af", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Package Version\n", "------------------------- --------------\n", "absl-py 2.3.0\n", "accelerate 1.9.0\n", "aiohappyeyeballs 2.6.1\n", "aiohttp 3.12.14\n", "aiosignal 1.4.0\n", "annotated-types 0.7.0\n", "anyio 4.9.0\n", "argon2-cffi 25.1.0\n", "argon2-cffi-bindings 21.2.0\n", "arrow 1.3.0\n", "asttokens 3.0.0\n", "async-lru 2.0.5\n", "attrs 25.3.0\n", "babel 2.17.0\n", "bash_kernel 0.10.0\n", "beautifulsoup4 4.13.4\n", "bleach 6.2.0\n", "blinker 1.7.0\n", "certifi 2025.6.15\n", "cffi 1.17.1\n", "charset-normalizer 3.4.2\n", "click 8.2.1\n", "comm 0.2.2\n", "conda-pack 0.8.1\n", "contourpy 1.3.2\n", "cryptography 41.0.7\n", "cycler 0.12.1\n", "datasets 4.0.0\n", "dbus-python 1.3.2\n", "debugpy 1.8.14\n", "decorator 5.2.1\n", "defusedxml 0.7.1\n", "diffusers 0.34.0\n", "dill 0.3.8\n", "distro 1.9.0\n", "einops 0.8.1\n", "executing 2.2.0\n", "fastjsonschema 2.21.1\n", "filelock 3.13.1\n", "filetype 1.2.0\n", "fonttools 4.59.0\n", "fqdn 1.5.1\n", "frozenlist 1.7.0\n", "fsspec 2024.6.1\n", "gitdb 4.0.12\n", "GitPython 3.1.44\n", "grpcio 1.73.1\n", "h11 0.16.0\n", "hf-xet 1.1.5\n", "httpcore 1.0.9\n", "httplib2 0.20.4\n", "httpx 0.28.1\n", "huggingface-hub 0.33.4\n", "idna 3.10\n", "imageio 2.37.0\n", "importlib_metadata 8.7.0\n", "iniconfig 2.1.0\n", "iotop 0.6\n", "ipykernel 6.29.5\n", "ipython 9.3.0\n", "ipython_pygments_lexers 1.1.1\n", "ipywidgets 8.1.7\n", "isoduration 20.11.0\n", "jedi 0.19.2\n", "Jinja2 3.1.6\n", "json5 0.12.0\n", "jsonpointer 3.0.0\n", "jsonschema 4.24.0\n", "jsonschema-specifications 2025.4.1\n", "jupyter 1.1.1\n", "jupyter-archive 3.4.0\n", "jupyter_client 8.6.3\n", "jupyter-console 6.6.3\n", "jupyter_core 5.8.1\n", "jupyter-events 0.12.0\n", "jupyter-http-over-ws 0.0.8\n", "jupyter-lsp 2.2.5\n", "jupyter_server 2.16.0\n", "jupyter_server_terminals 0.5.3\n", "jupyterlab 4.4.4\n", "jupyterlab_pygments 0.3.0\n", "jupyterlab_server 2.27.3\n", "jupyterlab_widgets 3.0.15\n", "kiwisolver 1.4.8\n", "launchpadlib 1.11.0\n", "lazr.restfulclient 0.14.6\n", "lazr.uri 1.0.6\n", "lazy_loader 0.4\n", "Markdown 3.8.2\n", "MarkupSafe 3.0.2\n", "matplotlib 3.10.3\n", "matplotlib-inline 0.1.7\n", "mistune 3.1.3\n", "mpmath 1.3.0\n", "multidict 6.6.3\n", "multiprocess 0.70.16\n", "nbclient 0.10.2\n", "nbconvert 7.16.6\n", "nbformat 5.10.4\n", "nbzip 0.1.0\n", "nest-asyncio 1.6.0\n", "networkx 3.3\n", "notebook 7.4.3\n", "notebook_shim 0.2.4\n", "numpy 2.2.6\n", "nvidia-cublas-cu12 12.1.3.1\n", "nvidia-cuda-cupti-cu12 12.1.105\n", "nvidia-cuda-nvrtc-cu12 12.1.105\n", "nvidia-cuda-runtime-cu12 12.1.105\n", "nvidia-cudnn-cu12 9.1.0.70\n", "nvidia-cufft-cu12 11.0.2.54\n", "nvidia-curand-cu12 10.3.2.106\n", "nvidia-cusolver-cu12 11.4.5.107\n", "nvidia-cusparse-cu12 12.1.0.106\n", "nvidia-nccl-cu12 2.21.5\n", "nvidia-nvjitlink-cu12 12.1.105\n", "nvidia-nvtx-cu12 12.1.105\n", "oauthlib 3.2.2\n", "opencv-python 4.12.0.88\n", "overrides 7.7.0\n", "packaging 25.0\n", "pandas 2.3.1\n", "pandocfilters 1.5.1\n", "parso 0.8.4\n", "pexpect 4.9.0\n", "pillow 11.0.0\n", "pip 24.0\n", "platformdirs 4.3.8\n", "pluggy 1.6.0\n", "prometheus_client 0.22.1\n", "prompt_toolkit 3.0.51\n", "propcache 0.3.2\n", "protobuf 6.31.1\n", "psutil 7.0.0\n", "ptyprocess 0.7.0\n", "pure_eval 0.2.3\n", "pyarrow 21.0.0\n", "pycparser 2.22\n", "pydantic 2.11.7\n", "pydantic_core 2.33.2\n", "Pygments 2.19.2\n", "PyGObject 3.48.2\n", "PyJWT 2.7.0\n", "pyparsing 3.1.1\n", "pytest 8.4.1\n", "python-apt 2.7.7+ubuntu4\n", "python-dateutil 2.9.0.post0\n", "python-json-logger 3.3.0\n", "pytz 2025.2\n", "PyYAML 6.0.2\n", "pyzmq 27.0.0\n", "referencing 0.36.2\n", "regex 2024.11.6\n", "requests 2.32.4\n", "rfc3339-validator 0.1.4\n", "rfc3986-validator 0.1.1\n", "rpds-py 0.25.1\n", "safetensors 0.5.3\n", "scikit-image 0.25.2\n", "scipy 1.16.0\n", "Send2Trash 1.8.3\n", "sentry-sdk 2.33.0\n", "setuptools 68.1.2\n", "six 1.16.0\n", "smmap 5.0.2\n", "sniffio 1.3.1\n", "soupsieve 2.7\n", "stack-data 0.6.3\n", "supervisor 4.2.5\n", "sympy 1.13.1\n", "tensorboard 2.19.0\n", "tensorboard-data-server 0.7.2\n", "terminado 0.18.1\n", "tifffile 2025.6.11\n", "tinycss2 1.4.0\n", "tokenizers 0.21.2\n", "torch 2.5.1+cu121\n", "torchaudio 2.5.1+cu121\n", "torchvision 0.20.1+cu121\n", "tornado 6.5.1\n", "tqdm 4.67.1\n", "traitlets 5.14.3\n", "transformers 4.53.2\n", "triton 3.1.0\n", "types-python-dateutil 2.9.0.20250516\n", "typing_extensions 4.14.0\n", "typing-inspection 0.4.1\n", "tzdata 2025.2\n", "uri-template 1.3.0\n", "urllib3 2.5.0\n", "uv 0.7.16\n", "wadllib 1.3.6\n", "wandb 0.21.0\n", "wcwidth 0.2.13\n", "webcolors 24.11.1\n", "webencodings 0.5.1\n", "websocket-client 1.8.0\n", "Werkzeug 3.1.3\n", "wheel 0.42.0\n", "widgetsnbextension 4.0.14\n", "xxhash 3.5.0\n", "yarl 1.20.1\n", "zipp 3.23.0\n" ] } ], "source": [ "!pip list" ] }, { "cell_type": "code", "execution_count": 3, "id": "aeb74a18-747e-40ef-8229-0de619fa3859", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Downloading CIFAR-10 dataset...\n", "Downloading https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz to ./data/cifar-10-python.tar.gz\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 170M/170M [00:14<00:00, 11.9MB/s] \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Extracting ./data/cifar-10-python.tar.gz to ./data\n", "Dataset downloaded successfully!\n", "Number of training images: 50000\n", "Image shape: torch.Size([3, 32, 32])\n", "Classes: ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']\n", "Batch size: 128\n", "Number of batches: 391\n" ] }, { "data": { "image/png": "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vfvd79bSpUv1+c9//vg/Gsnf4wceuSdzLTr33HP193//9/rN3/xNPf3pT1exWNRLX/pS+5nnP//5Wrlypd7ylrfo/e9/vxKJhP76r/9aw8PD2rdv3/Htenp69NGPflRvfetb9fSnP12ve93r1N/frzvuuEPVavWklzpJGhoa0k033aQLLrhAz33uc/W9731Py5Yts+cDPJVRn05EfQIWpydrrUqlUvrDP/xDXX755XrOc56jSy+9VLt379anP/3pk87tv//3/65/+Id/0K//+q/rW9/6lrZu3apOp6P7779f//AP/6Abb7xR5513ntatW6c//MM/1Ac/+EHt2bNHv/qrv6pSqaTdu3frn/7pn/T2t79d73vf+36u+4D/Qo/PL0DhZ9m2bVv0tre9LVq9enWUTqejUqkUbd26Nbrqqquier1+fLuH+yrI3/qt34qWLl0a5XK5aOvWrdEtt9wSXXTRRSf8auHVV18dXXjhhdHg4GCUyWSidevWRe9///ujmZmZKIoe/DXI97///dFZZ50VlUqlqFAoRGeddVb0l3/5lyec5yP52tpH+tfZoiiKdu7cGb3qVa+K+vr6omw2G51//vnRV77ylZO227VrV/TiF784yuVy0fDwcPRbv/Vb0XXXXRdJiv7t3/4teG4AHt6TsRbNz89Hr3vd66K+vr5I0vG/OuL+ukgURdFtt90WPeMZz4jS6XS0cuXK6M///M9P+grth3z5y1+OtmzZEuVyuainpyc6//zzo7/7u787nj/cr2Lv2LEjWrp0abRp06aT6iSAk1Gf/gP1CVi8noy1Koqi6C//8i+jNWvWRJlMJjrvvPOi73znOyedWxQ9+Nfc/uRP/iTavHlzlMlkov7+/ujcc8+Nfu/3fu/4OT7kuuuuiy644IKoUChEhUIhOvXUU6MrrrjihL/mxl9nWzxiUfQwv8cKPIF97GMf03vf+14dOHCAPzUDAAAAAOAXhEUkPKHVarUT/pX+er2upz3taep0Otq2bdvjeGYAAAAAADy58G8i4QntFa94hVauXKmzzz5bMzMz+tznPqf7779fn//85x/vUwMAAAAA4EmFRSQ8ob3gBS/Q//2//1ef//zn1el0dNppp+mLX/yiLr300sf71AAAAAAAeFLhr7MBAAAAAAAgKP54nwAAAAAAAAAWPxaRAAAAAAAAELTgfxNp64UX2bxcnrJ5Jt4NHmMw7f9m3cqhvM2HBwo2H+or2TydSNk8mcnZXJKU8E06NV22ebPt26C/r9fm8U7L5pLUaDRsXq/XbZ7NZW3eUcfm1dq8zSWpt6/HbxD5YzQbTZsn5O91IpGwealYtLkkFQq+P6ZSvh1rgWuIYoE14Hj48Q61UzuK2fyKP/hE8BiPhU9++Rs2P3D/bTYf331f8Bidjm/PJStPtfnKdZts3j+60ubZnD/+tntutrkk7d1xp81bc/7ZTATaoKff16dk1tdwSTp/64U2X7/Rt3N9xo9F99x9u827Xf9MSFKz5WvkvffcZfPZ8oTNG01fo1tNX5+mJqs2l6S5Ss3m7Y4/h5GRQZv3D/ga2YnmbC5J7cBwVq/58fL6f7wxeIzFoNsNz4+wSAT+AYhYzI+ZtYp/NienfG0YGOj3JyCp0/T1KZf3dTiRztg8NPfoyreBr15PHfH44vlz/OVLfZ/46W9Bfjihfi9Jybi/86H2aHf9vF+BcyjPzNo8G0/7/UsqBObVcw0/rsbz/tnKZfw5hN4rJKmvt8/mU9N+jtSs+LE/9G/gtJrh99BAiVAi6ftKOuX7Sm/Bv1+Njfg6euDIUZtLUqXp+2NPjz9Gu+VbslKZsfmK5YH3ZEmplO+vyaTP/+Gf77D54qlgAAAAAAAAWLRYRAIAAAAAAEAQi0gAAAAAAAAIYhEJAAAAAAAAQSwiAQAAAAAAIIhFJAAAAAAAAASFvwP8391z7z02n5mctHm//1ZDSVJs0G801Cn5z+dGbF7p+q81nO/4r9uLYuGvf6zW/ddDV2uBr27u+K/6nUj470XMJkNfvii12/4YicBXWGYy/j5V6xV//AV8hXas7r8+OvBNoWo1fDvnkv7rH+cb/hynOm1/ApLyef9VnLF4yucJnyvwdajVevhrNtstv00iuYAHdxGYDXxl6WDfgM2j4SXBY0RJ/3WaS1eutXmn69s63vVf/dyt+j5Xn/Y1WJKimv/q52VDvoauXLHe5ivWr7L52LLlNpekkRF/L1Ip3yfbff6rilcsH/Wfb4frU73uv8a3PD1v84kJ31+TaV+fFPMFsD8wlkpSNvAVuDOz/hwzWT9OdCPfX1MLqC2zM9M2bzbC490TwWL6qm/812pU/dc2Tx3YZfP99/nPS9LMrJ+DbX3OL9u8JxeoP4E/f44Fvr+b3r74pBJ+TOm0/fylG3h3kaRY2r9DNdp+zAh97btivt/1lfzcoKfg5+yS1Jzzz1a35ucP+VTO5r15nxeCz6ZUzPh3h/HAe2g38nk268fukeEhm0vS1LQf27OB61w25ueqCfm5wciIf8dMLaCdd+07ZPNMyvfH/n7f30q+q2mwt9dvoHAtrlQDBwmglgMAAAAAACCIRSQAAAAAAAAEsYgEAAAAAACAIBaRAAAAAAAAEMQiEgAAAAAAAIJYRAIAAAAAAEAQi0gAAAAAAAAISi50w1wy5jdI+3jVYCZ4jDVLem0+MjJg81y+YPNYzF9DrVG3eb3VsLkkRYFjpHM5v4N25Pff9efQO5D3+5fUbvljpFP+HDsdv/9E2t/rRtO3syS12r4d84FjJAv+GrKBz7djFZvHo67NJaktfw2JwCNVLPj+PF/x59hqt/wBJMUD5zA3OxPcx6LQ8tfabPi8Wm0GD7F64zKbh+5Hs+X7/cCQr3/JlF/z37Bho80lacszz7P5siXLbd7bO2zzVtIXh3w2PA4kfXlSrN22ea0yb/NGoK/kc+Ea2t83YvN1a0+z+X33PeAPEPPn2GhUbd7b0+/3LykVGLNnZv0zEcnn3a6/kdPT/nmRpFrVj3dRoK88UURPlgt5Cgjdq3jM50f277b5nbd8x+atmn/2JSlV9M9/LTCu9wz4uXY3MLeJYn6sorc/KPRO8lhKJ/09iwXuaf/QYPAYlUDfTXUSNm8Hxv5Y4NkcG/Xj9uhI+Bp2bd9p86Gkn8ctXTZq83jLt3N8AX2mJ5e1+VBvyeZRwr8/9fb5a8wXwnOoRNzfy+HRIZtn0ymbh95d2pGfY/X29dlckpYH3tcTgRWWZMp/PpPw8+VuM/AyLqmn5O9V1Aq/yzr8JhIAAAAAAACCWEQCAAAAAABAEItIAAAAAAAACGIRCQAAAAAAAEEsIgEAAAAAACCIRSQAAAAAAAAEsYgEAAAAAACAIBaRAAAAAAAAEJRc6IbZWNvmpVLC5qcs6w8eYzDn95Hq1m0+P9W0eafr18xqFX+N8YyNJUk9fUWbJ9N+J+WZOf/5wB0bKOX9BpLmZis2b9Z9Xqu3bB4pZvNioWBzSWo1azaPd3xDpDK+nTsdfw3JhL+GRsN/XpLSqbTN413f3xrzU/4AncjGGf84SZLa3a7NZ+Yb4Z0sAu267y+xdsfmmXQueIyZiQmbD44ut/nKzettPrJizOapQH9SO9wnW21fQ+8/PGnz6q5xv/+4r8EP3HWHzSXp6ZtOs/mF5z/d5lHkn4vZ2Rmb79t7yOaSlE5lfZ7usfnQ8DJ/Dvu3+/1nfZ2fr/kaLkmzs74/J1O+Bvb0+HOo1ao27/jyJ0lqt319ymQCz8QTRCzm2xqLRyTfJ1sN3+8P7d9r8568H4vyfSWbS9KxaT+PnDx80OZLVqz0B4j7yYWvwFIsTn9fbHp7fL/K5vyYt2TJSPAYRyf8/CKXDbwfTZVtPjo8bPNMYFKcy4XHk+UrR21eCLzftJp+4EvLn0Mm7e+DJFUDY++KZf5eRSlf49KB96tmM/zeMDTUa/Nk3J9Do+HnOKXQ/CRQp+dmAu9fkhoN/14xOOSfqVzBv8cmY37/yWa4v9Yr/jrbC3iXdfhNJAAAAAAAAASxiAQAAAAAAIAgFpEAAAAAAAAQxCISAAAAAAAAglhEAgAAAAAAQBCLSAAAAAAAAAhiEQkAAAAAAABByYVu2J/xm+YyGZv3FnPBYwz3pGze6XZ8Hth/IpnwG8T9mlqj2wocQUomfTslo67NO42azaOEP8djx8o2l6ROy7fUXLVq82qnafNirsefQCN0p6SEfDvFY5H/fMb3t1rFt3M+1WvzZOSPL0n1um+nWqtt8678McrzdZ9Xwv11vurPod56YqwzN6oVmxdzWZv3DAwHj3HOWWfbfMXaDTafa/u2fmDXfpvPBp7L+XLZ5pI0WZ60+eEj0zbv6Q20U7xh43/+4pf85yWlLr3E5hc96wL/+ZTv96OjY/4EogmfSypPz9n8x7ffafNkyo+XhZKvoe2Orw3N+bLNJSkwlGh4eNDmncA4MDk1bvO48v4EFB5P+/r6gvsAFipawLgemnuMT/kau2fPPps3Ap8vZdM2l6Tq/KzN77/jdpuPrl5n877RZf4EAu24gGZWLBYLb4RfmFC973b9nLxZ9/NRSRpdOmLzfNaPCZmEf4dbOuz332r5eeLkxFGbS1Kpp2TzZMoPrN2mb8dU0vf7eDz88NSq/vlX4NGKZ307N5r+/anR9PNAScoE1gzmZ/0cq1D0faXT8e+Zk1N+rptJFWwuSaES1Qy0w9z8vM3jgRvVnAm/Szebfj5cLIav03livCECAAAAAADgccUiEgAAAAAAAIJYRAIAAAAAAEAQi0gAAAAAAAAIYhEJAAAAAAAAQSwiAQAAAAAAIIhFJAAAAAAAAAQlF7rhSF/W5qVUwubZrM8lKZ6IbJ7L5Wzeands3lXM5lHUtHmz7c9PkjrNlj+HyOdRx59DlEzbfK5ZsbkkdTr+XlQ7XZu32z6fm/fXeLARPsdU3B+jZ97fy9aRcZvXylWbrxzeYPORkRU2l6RYacbmjekJm8/P+3aama3bfGKmZnNJ2r1/1uadRPi5XQwymZTNW4mSzWu5YvAYu2d9e/7ke7fafGpy3uYHDx21eSrh+3zomZGkRtvXl3rd50uH/ZBx7Mhem/dkMjaXpLmy75Pbdu+2+dKlQzZPpfw1LF0xanNJGgtss+/Ifps/cJfPR5YO23zPPl871Ar3hW7Tb9NJ+vE0m/b3MpP0z2St7vcvST09vTZPJsP9CVi48Bwviny/PXjggM137/P5/h27bD5UCo9Vy4cKNj+8z9fpu370Q5ufd3GfzfOB5zYwFcfjIC4/HjTrfr7ZaTSCx2gH5iiNup+XJxP+9x5my5M2j8k/u1EnPCYdPHTY5r0lP9fMB97hZhv+vSGKwjUqnfVznFbbv6O1mv5exuL+PnQD7+KS1E34bTJpP38IlepqzV9DOpP3eSo8t8hnfSHLZPy9npku27xc9n2hlA3UWUmxwDtcsFYH8JtIAAAAAAAACGIRCQAAAAAAAEEsIgEAAAAAACCIRSQAAAAAAAAEsYgEAAAAAACAIBaRAAAAAAAAEMQiEgAAAAAAAIKSC91wbKRg85502+bFfDp4jFjUCmwRBT7ftXmjVrV5XDGbD5Z6bS5JhULW5rMzEzbv7emx+Vzdt9HeA37/kjTfSNg87ZtRy/K+2yRTNZvvmSz7A0iqR/4cUzHfF/p6SjbfsvnpNp893LF5VPXHl6TeoZTNG1XfjvPzfo03k/L7XzHq20CSRkaW2PzobD24j8Ugn/fXcazs69OO/fuDx7j3nrttHk/5+9lp+Ge3NlexeSLuH8xaY9bmkjQ957eZm5+3+e4D99m8mPN97tT1p9hcktRu2vj73/22zVetWWPzjadstPngYLjOZ7L+Xvf2ZGweb8/YvNLwz36t2vB5ec7mktTp+Dqdzfn6Mj/rj9ETGC8zWV/jJanZ9M9MterH9CeOwKAbmJsszC9iH0ZgSIxCG0hSYA6nmL+G2KP+c9FwG3W7fixptX2fnav6MfXAkUmbHw3kktTp+PFw+Yhvp/t/eKvNR0aX2nzj08+3+UJePeJR4F6HulOgKwR2H3yf+IWILZ4/x48Fns902t+zKAo/3+2OfzYaNT8m9ef9e2gq7m9qMu7HtHozPCals/4dr9nw85fmjJ/npUs5n6cX8C6d8tfRafv5Qy7rz6EVGJdLPX02l6RsoB1jMf8OFpqrtpr+87GUn6OFzu/BgwT6c2Ce1mkG3vGSRZv3DA7YXJJaLT9ezVYe3Rxq8VQwAAAAAAAALFosIgEAAAAAACCIRSQAAAAAAAAEsYgEAAAAAACAIBaRAAAAAAAAEMQiEgAAAAAAAIJYRAIAAAAAAEBQcqEbDpRyfkfNss0zqfCh8pm8zRu1ls1b3bbN+/r6bR5Fkc2bnfCaW6tVt3m+WLT5ofGGzXfumbH5sTnfBpJUDWyyOpew+a9e+DSbL1/qr/FLt+30JyDplu1HbN7uNm2ejPt7OVc+ZvPqnL8PpVLK5pKkTszG2azfRzrr70M+5j/f7oT7wsqxMZuXpuaC+1gM+gaGbL5j/zabH9qzO3iMQsr3iXJl2ubzM0dtHut2/f7n5n1e87VHkpIZ32eGliyxea7Ua/Nlq8+y+YpAn5ak3XfcYvNEzD/7rU7H5uMTkzY/44xNNpek9RvW2nzF0mGbF5/pa+id9++zeaOe9XnK9yVJ6qrH55GvH0eOHLR5OpOxeW+/72sPqti0VqsuYB9PBH68+sUcwY9HC9hBIPcbhOZXDx7C97lY6M89Y/4aY4E2WFgL+a1Wrl5t83zJP3czlVrg8OF56N37/FiTS/pnM1n3Nfaem//V5oPL/LPdv9zXT0mKtX1/iUX+PoT6ezcwRwzEvxCB7vqYisd9v4oCDZLL+3dESarH/LiULhRs3qn4OZhi/j1zdMmozduTC7jpbf9sFNL+2WoE5nG9owM2r1Yf/Zg3tMTPTxrz/hoTgXePVMq3gSRlA+/79Zp/98ikfX+Lp/176EygL7Vafh4pSYnAO1a97tcs1PXz4VzWz/OS6bTfv6R6y9/LY+PjwX04/CYSAAAAAAAAglhEAgAAAAAAQBCLSAAAAAAAAAhiEQkAAAAAAABBLCIBAAAAAAAgiEUkAAAAAAAABLGIBAAAAAAAgKDkQjccGRiyeW2qbvN4LHyo+WrLH6PZtnkylrB5tdWxeWhFrdZqBraQ+vp7bN7sRDbftf+QzSdn/TVEybTNJSmR8Ffak/XHGEnO2jwb6AsbepbaXJIOD/hzPFo+ZvNG1d+r2x/YZvN4u2vzVtHfZ0lS7xKfx/0z0dubt3mp6/tSvemfJ0mKmv5erh4uBPexGOzceavN79+5w+aHDu0MHqMzN2/zUm/R5qduXGPz0zedbvPD4zWb7x2v2FyShkd9n1y1zp9jaXDE5ken/TlEE7ttLkl79+y1+Xh50uabTvP7f97GTTavzPt2lqSuL5GKmr7+3PNvt9h8wyln23zJsj6b/9ut37G5JB056p/9VsuPt/VAjZ2amrN5rthvc0nqRr4Oz1fDff6J4b/+z/NifrgIiqLADgLjUTcKPDSSWm3fp9JpP7+JBS8yZtMFNVFgntnf7+fKF1x4sc3v+sn9Nt+9a4/NJanT9m29I3HY5tk1y/z+H9hu87v+9fs2f8ZLh20uSbm8H087/lYqFsoDx28vrDcEjuGPsuAXsMfAgWMzNg89/4W6r9WSVOrz88l60/fbYiJr82VLB2yeyfv7kZi2sSSpP+9rUF8+Z/PSqO/7jbhv521H/DuiJPX1+feTRsVfaL3qx/5U4D60Zv3nJaneaNi8G6iziZTP5+f9/KMdmOaF3tUlabjPv6MN9Pj+uH3Wv3cMDvg5UqCJJEk9Bd8fu32l8E4MfhMJAAAAAAAAQSwiAQAAAAAAIIhFJAAAAAAAAASxiAQAAAAAAIAgFpEAAAAAAAAQxCISAAAAAAAAglhEAgAAAAAAQBCLSAAAAAAAAAhKLnTD/qFhnxdzNo/HU8FjlGenbd6qzPljdDo276pr8yjlm6NYzNpcklry7XDfzgdsPt+o2Dybzdg8lw7f0lwhb/P+RNvmt+04avN2059Do3fU5pI0PODbOqYem7fadZtXmzWbV6qRzZst30aSFGs1Axv4OBX3G0TxhP98MtwX2o2GP0bHt8Ni8W/fucnmySWn2Hz9aWcEj5Fr+vqx6bQNNj9l43Kbd+r+fkbxQJ/VhM0lKZnyz1Ui0WfzVtvXn8rclM17m+Hnph3oc3uP+mNkiwf9OfT023ztutU2l6Qo8OcvtXLV5vf/4Ha//5rva6e/4FdsfsaZa20uSbUfzdp8547dNs8Xijbv7R8KnIEfryVpdtbf60bdt/MTRhQYDALxwo7hn6tIPg+dQjvyz/b2HdsDe5BqNT//OXXTJptnMr6GxmOPviG7kT9GNzCt3rL1l2y+b7evX5/8q0/aXJLaNT/32Dtetnmm4MeJDQO+/j3w3R/ZfHh5uD6duvV8m1fl+1uq688xHegLU9UZm0tSo+nnT522r3FrlqwJHuOx0mj7MWdqytfifNXPuSWpEZgTpwLPTrZUsHk9cM/mq4H5xwLKQ6Lt99GY8++xwyU/bj6wfZfNi1n//iZJxZx/D200/Fyyf+mgzWMd/z7fXkBfyAZeT+bq/tnJZPw1HjlyyB+g6z9f7O3zn5dUr/n5R7vVsnku68eSUiFt86m5eZtLUr3h70Up0B9D+E0kAAAAAAAABLGIBAAAAAAAgCAWkQAAAAAAABDEIhIAAAAAAACCWEQCAAAAAABAEItIAAAAAAAACGIRCQAAAAAAAEHJBW8ZT9k4lvL5QmSyfh95FW2eDKyJxeM+b6lr80yu1+aSNHFkzubViWmbrxvI2rxR98fPFvJ+A0mnrF9m83jgIO2Ev0+zs/4ak4kZm0tSKV2w+WD/epuv27DS5rv33Wrz+x84aPN0qmFzSYqieZu32/7xiyfTNk+l/X3odn1/lqSuYjaPxZ4Y68xH943b/JyzXmzzTGY4eIyBhM+XjvXYfKrsa8P+HVM2b3YzNo/HOjaXpETS94lOFOjXgT7badRsHnXCfbLU5+/F5FzF5vFA7ehGUeAMQrkUGCpUzPq+sHrM16dswp9DXL62nHH6GptLUl9fn82/XGva/Mhh31+XjYzZvBMLDGaSUim/j9nZ8FjyRBDqk7EFdMkosI+o0/bHCJX6mB8r9h/cZ/N//upXAgcI388tE8ds/uyLnmPzTMbX0HBtCD76agdqXLFUsvlLXv4Sm+94YFvgDKSbvvovNp9t+b5w34HDNu+P5WyerfvO9G9f9+cnSclBP9+PL+mzeaXs+1Kq68fLw7MHbC5JM3P+GPW6r3FrXvT24DEeK0sGfL9s1/2YUyr6Z0uSorYfUxJJ329yOT8nDj2+1cCY1myH57uZrJ8DbTplg82PHDlq80bDX8TQ8IjNJand8dfZVeBdu+jnUM2qr3GJnK8PkpSI++evMuXn9DNV/+z19vo52HzVt3On27K5JGUC6x6ttq+zy1b5eWDo/Wx65ojNpfB7YN9AuD85T4w3RAAAAAAAADyuWEQCAAAAAABAEItIAAAAAAAACGIRCQAAAAAAAEEsIgEAAAAAACCIRSQAAAAAAAAEsYgEAAAAAACAoORCN6zVWzaPtWqBPbSDx6hUZmzebPk1r3Y8Z/P56qzNZ6tzNl+2ItxcUdsfY9VQzObrlqVsXq37zy/beLbNJSkd1W0+PePvda5vyB9gMmHjFaNj/vOSypWKzdeeusHmPf35QH6azafHfV+YLvu+KkmpdMHm8Shj81a3Y/Nu1x+/0wo/c3HfnRRFUXAfi0G+OGjzVOAyyuVjwWNkBvpsXm37G1L3j51y/SV//G7gZtV9f5GkKFDC6q2qzbM5v4N4rGnzbjxcQ4uDvj6koymbJ3L9No/Svj51Y74NJCnWCTzbCX+dqULa5rmiz9sNX58mDx61uSQNFoZt/vIXvcDmP7pjj83na74v1BvjNpekRs3PK/pK/l4/cQSe3Vj4z/umpydtPjPtn5tYwteXI+O+Rt7yo1ttfts9d9hckmanyjZvtHyf2nzG6TYfGfZzl0TguZWk2TlfH8rlss1XL19u87HlIza/7G2vt7kk7T+40+b/9hN/LxoVXyO37z9s8/xS//nJu++2uSRV/9Hn67aeY/PpeV8jq4H3gUas7E9AUrPVsHm3+8SYP0lSMevv2WnrV9o8l/dzbik8Lh7Z5/tVu+3bu1BcYvPyvJ+EJWJ+3JWkmHydnJvx/W78mB/3AiVOkn9HlKT5QN/vRv4dr1r171/zs35c7sn32FySmvIXGsX8+0si7sfEnpKfT+fyvh2TSf88SFKplLV5Ih6YawZe4nbv22fzWCrcX9MJfw5z1dDajcdvIgEAAAAAACCIRSQAAAAAAAAEsYgEAAAAAACAIBaRAAAAAAAAEMQiEgAAAAAAAIJYRAIAAAAAAEAQi0gAAAAAAAAISi50w06sY/Oo0/Z5FAWPkcvmbV4s+fzQeM3mu/eP2zyZ8ueYPnrQ5pJUP+KPsWFJyua/fPEGm+88OGXz0rJhm0vS0OCozY+NH7V5X1/B5vGuv8Z0PGHzB8/Bt3UyW7b5ePmwzQ8enrd5KuX7Wl9v1+aSVKv5/hQl/RpuLB6zebfrn8l4zH/+wWP4c+iEH9tFYWzVGpuHrrNenw0e4+isL5fpviGbt9ppm8dS/rmpzfs+24rCfyaQTGZs3k74PN/TY/ORwbLNoylfoyWp2fJjSazrrzOXy9k8VH66kT++JHU6gWcv5Q8SJfw1zFfmbB7r+vqTCfR3SZoN1PlcfsDmFz7rTJs/sHOvze++94jNJWl+tmLzdCob3Mfi0LBpqJYrXMo1Mzth8+/e/D2b7z10wOYTs2WbTwf6bLzg658kZRt+bnFsMnSN37X56tUrbJ7J+PonSQcP+Dleq9m0ea1atvn8nM9TC5i1b3r6Wpvfvv1Omzfn/MC/v+zHy3zat9HyPl+jJWn3j35s80TG17j4mK9fM+2q379N/13k+3Sj4Z/7xaSY9ldcyPtnM5UOP9+9ff6e5AJ1bnpy0ub33PuAzduBuUMmXfQnIGlgqb+GQwd9HZ0c9zWs3vZj2uxMeK6qmL/OKPD6Ui7798yWL3FqNgIbSMrnfX8bGOy1eSxwjY12YM2i62tcrR6eB0aq27zd9vsI1YdOYF6QCzyTC5FMhZ9bh99EAgAAAAAAQBCLSAAAAAAAAAhiEQkAAAAAAABBLCIBAAAAAAAgiEUkAAAAAAAABLGIBAAAAAAAgCAWkQAAAAAAABCUXOiGfX1Fm7eTbZvPz9eDx4haHZvPzJVtvnfv0cA5zNs8l/Vraod3zdpckpZk0zZftmyVzfvG1to8Ndf1J5BN+VzS8rPO97s4ctDmufa4zTvy97pSCfeFpflhmzc7vh1iBd9flxfGbF7qG7X53OQRm0vSsaMTNm/FfF+pNwPtFI9sXMhk/eclNWv+mUilw/1pMYhiCZu3Wr4+VefmgsfI5HI2n5udsnmz3vDnMOvPIRWzsUqFjN9A0nD/gM17Bgr+832+DTrJXpvXMv4+SNLUKv9sNjqH/Q5aVRt32k2bd7uBhpbUiQfqT8r3x76Bfn8OncA1BPpzb6+/T5KUjvn6UQ6Mt1HL146zN/ka2lcK99evfOVfbD5+xI9Fi8U9991h82TS19lW0/dZSZoul21enp+x+b7DftzvHRm0+UCgzw0O+TFdksZ3+mf7vrvvsvlN37jJ5r09/hwTSf/cSlKj6Z+bZsOP21+/0eepwB/tji0f8RtIyg/5/nT20zbZ/Mffvd/mVfn698Ckn4vnOn6ckaT+VsnmO/7tNpuXh/38ZypQw1PN8PypHZpXVH0d1zuCh3jMLB9dYvNO17+f9ff5MU2SEoF5WmrIz09Gh4ds/o1vftvm3a4/fn8pPPYfOeSf3yUDvt+E3qXLR2s2nzgafvfoG+ixeaHg3z16+/08rlTw96nU6z8vSYWir1Htmm+HXTv22DyR9POLasPPx5sLGHObDf9MJBK+mMcCdTSX9dfQiYXfz1qtls8D41UIv4kEAAAAAACAIBaRAAAAAAAAEMQiEgAAAAAAAIJYRAIAAAAAAEAQi0gAAAAAAAAIYhEJAAAAAAAAQSwiAQAAAAAAIIhFJAAAAAAAAAQlF7rhXHnS76g5Z/NUbAHrVQkfJxN+g+r8jM37SwWb9xWzNq9NzdpckkaWDdp82ZkX2/zuA02bb9vh8y1LB2wuSeWy38eSdWfZPK6qzZuNcZv3RV2bS9LsMd/fcs2WzZcO+HYodzI2T53Zb/Na+bDNJen7X/2yzQ/sP2bzRDoVOELMprUo8HFJrcA6crzl23nRaPs+nez6vNc/+pKkFb2+vU9d22fzYjZn80SgRlZmyzavV339k6Rcwd/PUzb452bFquU2j6dW2Xy+XLa5JK1YutTmp+z2z03PgL+ZA/09Nk8m0zaXpG7g2YoCY1m2kLd5u962eTxw/FQ8PN7W1bD54FDR5vNVPw5Uykdsvmx42OaS9Ksvfb7Nr7/hG8F9LAY333qzzWuzFZsXsn7uIkkvecnLbd6O/Jh3213327y3FBgTu3Wbj40ssbkktY7WbF6u+HaqbPfXMJDxz0Wh1/d5SSr2+36bLfj5TW+fLw69Pb4+9fSEzzFX9PXl4uc8w+YzE2Wb33XXLpt3Wn6s3Fv2fUWSUik//0kenrD53JSvoe0ePx7Hc+H6dGDfIZvPBp7rxSQKzMszgfloIhEec1qB5zeT8P0mSvm80w3MZ+P+Ghb0WxVdP4datWqtzYcC497yw/M2z2RC7wVST68fLxKBdj527KDNtzzjfJuPjo3ZXJLaka8Bs5P+PXJ6Ytrmk2Xf15IJP4kaHuqzuSR1AxPBbsfXoN5iyebTM37NIYr7+yhJzZpv507Ln2MIv4kEAAAAAACAIBaRAAAAAAAAEMQiEgAAAAAAAIJYRAIAAAAAAEAQi0gAAAAAAAAIYhEJAAAAAAAAQSwiAQAAAAAAICi50A0TMZ93anM2jxTYgaS42v4YsYTNp1p+/8nZyOZRo2nzpX0FfwBJT3/2c2y+/JRn2vwfP/3XNh8tFG2eaNZsLkkHd+30x1h7ms2zg+ttXoh8X6hOHbO5JOW6/TZv1qo2n5jzed/wGpsPjq62eW2+x+aSFA9s0knXbR6L+2em1fL9Ndbu+BOQFIv8Nu32gkvE4+qiZ51r87WnnWXzQwcPBo+xbGzA5hs3rLP56PCIzRORv99zc2WbN1q+z0vhPlUs+BpXLGZtnkjnbJ7q+j4rSbXKuM3POX2VzVdvXG3zVtcPFNEC/myl3fVjVRQYMBMp/1y16n6s6rb88ePJ8DXEsoExObCPRsu3YzKRsnmnWfbHlzQ85Me7C37p6cF9LAa79uyy+cyxaZtvWLMheIxczj+7hw75cXfP7n02Lxb8sx2qP7HZ8NykVvb9WoH6tWGdr8HrhnttXuoPj+vHjs3YvH/APzdLV/j7NDfr2zHdtbEkKdv1c+WeQDs871f8PHZyatbmRw/4vjbRCF9EYcYfY6TH36tkzNfQZaVBf/wlozaXpAO7d9u8WfVz4cVk3/79Ng/NDebm5oPH6MtkbN6Unx90kmmbF0olmzdqvr6MjPj3DknKxH0dW7d2mf98xl9DPOXrbDrjx1VJyuX8NvFAHY0C7/ONWX+vW73hWj+41NegeNvvY9WK5TbPZH39mK2UbZ5Oh999kjG/TTswR0okfZ3uNBr+81k/P5KkqO33USz4OhjCbyIBAAAAAAAgiEUkAAAAAAAABLGIBAAAAAAAgCAWkQAAAAAAABDEIhIAAAAAAACCWEQCAAAAAABAEItIAAAAAAAACEoudMNY5PNOq+U/Hw+vVyUDm0Q1f4x4139+YDBv89FC2+bnnHeKP4CkTVueafPpY/M2z7TLNl+7fIXNu7FAI0gaHRm2ebvu26Fabtq82fafb9XC3a6jos13Hjxg87vu/pHNtzzTX8Pg6KDNZ+eO2VySUr67aWh1webdwDPTaXZs3m74a5SkmfGyzRtzgYtYJM4981Sbb37aWTavnb4ueIxCb4/NQ09eFIvZPJ5I2XygMOr3v4A/Eght0u36q2i3/LOtwDjQaNQCZyCtW7/S5rm0f25qlRmbR/FA/YmF61MUGBC7kc87gb7Q7frPN2u+HTtd30aSFE8G+mOgt8xNVm2+d/d+m2+94Gk2l6Rqa87m+ay/hsWiMuP7ZLXu72cmnw0eY2bOH2Pv/j027w/Ut06lbvNYvWHzw0d22FySDh8c98eI+2Nc8spX2Lw7P2Xzb37v2zaXpL13+rnHYG/G5ke2+z67bMzXv5nWUZtLklJ+fjIwuMTmZ5xyus2bv+Zr5Kf+79/YvDbn+5IkHSz7ubKSaRvXm34sm5+YsPlY4HmQpHTOj9lDI33BfSwW1ap/trry/bbZ9vNRSRoY9ves2/Xzi3rdzy9WrPTvR/fc9YDNU4ExUZKWjo7YfHi43+aJwDtayncppTPh+Uk+MF4kEoHrrPm5Zm121uZT4+H3oyjua0AuMLaHrrGn5OdQs1U/FkQd39ckKZfN2TwWqFGtln9H68n5eVxnAf21J+/PIZUI7sLiN5EAAAAAAAAQxCISAAAAAAAAglhEAgAAAAAAQBCLSAAAAAAAAAhiEQkAAAAAAABBLCIBAAAAAAAgiEUkAAAAAAAABCUXumG33bF5rdG1ebpQDJ9MMm3zRLxh8/VL+22ezfk1s9WrVtr8rAuebXNJWnrKmTb/yS2ftvnKFQM2H918hs3Tw+tsLknJfK/Nq/V5m9dm52x+9NB+m08fPWBzSeq0qjbPlbI2HxpK2Xz/odttvmTpMpu3q76NJCmq+f4aq0zbvBPV/P5jkc1zGd8GkpQe9dvMZmLBfSwGuULB5sVsxuaF/AJKYTJh466/HYrFfFvGA3k38jW22/L5g/vwJxmL+xrZlj9GPNBdolj4zy2Kfb4Gtjv+HDpdf5/U9ScZyY91khQPXWjH552kf+4iBTpTu2njWDd8DZlAO6U6/l4V6v7z0VFfv8Z3HbW5JC0/ZbnNJ+LhOrwYNBu+LaqNis137N4RPMY/XX+dzb/3r/9q81jk++zRWd/Wx/bss3kqXJ7UCvTb9Kifu3z/O9+1eWN2wub3bn/A5pI0f6Rt8/Ixfw19Q37uMh7Y/2w53Of7+3M2b3b8dX772z+2ea5n0B9/aMTmE61Jm0tSteHb4cBc3eZRYO5SKftnLjF+zOaS1D/U5/eRWPAr1uMunvBjUqPmx5xM4P1NkhpNf88yWT/mxANznE7T19m56bLNq/OzNpekNSvX2zwX6HfFfMnmvYFnt9Vu2VySOh1/rxIJ385DQ/4cjx3z7Xx4fMrmknTb3XfafP16/z5+bNzfq0OHx23eln8/6+vxbSBJqcB8OJPxtb4deKdo1P3zEpjKSpLyA35dZHb+0c2h+E0kAAAAAAAABLGIBAAAAAAAgCAWkQAAAAAAABDEIhIAAAAAAACCWEQCAAAAAABAEItIAAAAAAAACGIRCQAAAAAAAEHJhW6YSvhNp+eqNu/UY8Fj5PI5myfikc1HBvM233+obPN1v/YrNl9+hs8f1G/T1lzF5r2lXpsPbzzb5pXkgM0l6Z7bf2jzRs2f4+xs2eYTB/fZPNFp2lySslnf35atWWbzMzeut3k7UbB5KtHn83TL5pKUrNdsXt170Obddsfm7cAS8Hwi4TeQlB/07bBkbDC4j8Wg1Ov7fZRI2bzaCPfJqNGweSOwj8q8f66aLf/5RsP3uXa7a3NJarX8PlqBc6hWfZ2vVuZs3u6Gz7E04GtgqbfP5n2lIZtn02mbd7rhvqBY28Zx+bxUytp88pg/h3pt3ubdrh+HJCkm3w7dju/vPaWMzVetXGLzWtU/D5IUdX079pZ8/VosegN9uhWo5bPzs8Fj3PuTn9j8yK5dNo8HpoP5pK+hmXigPzXDz1Vcfp64Ymy5zQdKvt9PV/2YvHb1qTaXpL2daX+MyQmblzL+HI9W/DlWqn5eIEnTU0dtHgvMDeoxf43l6g6bx9N+Lt9N+L4iSVHan2NVfizpBMbDQuAci73hGppI+Ae3G4Xv1WIxOjxq80zK3498JnxPc3n/fLcD7waprn8H7Mn68WL9Mj8m9QXeQSVpbKTP5sWMb6eegh/763F/DuluuJ1nZ3w7ZAv+GKm8r/VHxv38Y/+UnydK0gM7jvhjHKvbfHbGn0Or5eeip20as3kx69tAkjpVP0dS1/eFKPL9OZv259AJvCNKUiywdtPuhN9lHX4TCQAAAAAAAEEsIgEAAAAAACCIRSQAAAAAAAAEsYgEAAAAAACAIBaRAAAAAAAAEMQiEgAAAAAAAIJYRAIAAAAAAEAQi0gAAAAAAAAISi50w0atbvN8xu8qlk0Ej5GKt20edXyeK/pjvOw1L7f5lhf+ss17hpbYXJKO7rrP5onANZbnZmw+vucBmx+a69hckr59/T/ZvJhL2bzemLf56JJem/eUijaXpN0H9tm8GWjHgbHVNt94xrn+BDoZG0+VD/jPS6rW/RrtdM1fQyzyz1S91rX5fBTZXJKief9cb+oL7mJRuP7LX7N5J/Vdm09PHw0eY35mwubxQHM3Gk2bHz3qz6HT9QcYGB7xJyCpf2jQ5pmE73OVqbLNt2339W9mbs7mkrRy7WqbJ1K+PvWU/DWuWbPS5stXjNpcktasXWbzgUzM5qWsv4Zub48/gYQf61qBsVKSEklfnxKBa1iyesjm2R5fQ1tReKxKpH0+MBBop0WiOODHxGSpYPPmZCV4jIlt+22+sujPIRb3jT0XmAPWAmNyLJe1uSRlY75fjx+ZtPltP7jD5ktKJZtPTpdtLknlatXm835YVm3cz/Ek/9wlQw+FpFzKjxX1ph+Lxstlm3fi/j7lkzmbx+LhP7+OB98ZAg0dtWxcqdRsPjvrc0nqH+zzG3T9vVxMosA9zebyNk8FxhNJSmX8NvW5hs1bLV9jeku+xp39tGGbh54bSUql/POXTPq80w3027ivs5l0+LW9WPTzi3RgbI+6/hipwPN77/3321ySKlX/fKrjx7zQfDqd8G0Qj/v5SRQLP7vduJ/DzNZ8DZmr+nsdqvXNZnie1274YzQb/pkL4TeRAAAAAAAAEMQiEgAAAAAAAIJYRAIAAAAAAEAQi0gAAAAAAAAIYhEJAAAAAAAAQSwiAQAAAAAAIIhFJAAAAAAAAAQlF7phN2oGNujYONbuBo/Rjlp+H7HI5tlMj83PPvdcm2dSKZvf+5PbbS5J04d22rzRqNt8bnrS5vt33Gvz+Shnc0lKdfw5FJMJm/dkCzYf7u+z+eGjh20uSe2W7wvVuXmb79+9L3CEe2w6Pz9n82zS90VJamdGbD7Z9v01l8vaPF/y9zqXzNhckuaqszZvd9vBfSwGN33rZpv3LT/F5lHH9ydJ+vH3v2nz1StW2HxocNDmB/b756IdqLH5gT6bS1Iz7uvw0QP7bf7L5z/L5mefudnm1UD9k6R4yg9Lu/fttfm27b4G33mXr+P9fUWbS9IrX/VrNt+6eaPN05H/85vlS31faiZ8jY7FYzaXpG7ka1hLvr/Fkz7P9Pn6lYuH/wyrm/DzDj9iLx7dtL/WqOPvVzoRbqtUy9+Plb2+/rTjvk/N1Xx9SvT45yaRCc9NqkfKNm+UqzafnfTj9kTXt+N0w+9fktace5bND4/7OVx5qmzzYtG3Y70aHqtaKf/s1Rt+XK+1/DgRD9SXbNofP4r5+Z0kdeTPIZH040S87etbtxsYC49N21yS2v6RUzIdrsOLRTMw556r+GcjXsoHj1Er+/lmq+3PIZ/zc+ZEPG3z8mTZ5o1UeF4/M1+zeavTb/Mo8Oylkr7PpAJ1WpKqnYbfINBvmzX/+XzGP3tHDoff8eqRrxGNhO8L6aS/14mcb6dq1TdCuxlY85CUSftzmKn7vnJkcsrmkQL3OgrXl1jMX2cucC9D+E0kAAAAAAAABLGIBAAAAAAAgCAWkQAAAAAAABDEIhIAAAAAAACCWEQCAAAAAABAEItIAAAAAAAACGIRCQAAAAAAAEHJhW/a9Wm76Q+UygeP0Gl3bN5U2+ZLegdsfuOXv2LzgSX32Hxk6QqbS1KzOmPzVCpj82Kh1+bJeMLmhVTK5pI0OjJk89rclM1zCX8Nk+PjNm81/X2WpFI2Z/Pm/JzNt9/+Q5sfvn+bzRvtms2V8vdBkjqhe7W84HdQ8M9UPFO3ebbrnxdJ6pdv502b1wb3sRi8+rVvsHlmZIPNq3NHgsfYducdNl866utDPO7X7HNZ/+w3u75PbjzdX6Mk9S8dsXl1qN/mL3nhc22eL/n+VGn4PitJ3ZjP25Efi+ptf4xjx3x927v7kD8BSfl8j82PHJi0+Z57tts8XvfXsOvIMZuf//zzbC5Jq1aP2bzV8fUjnk37A6R8nY8toD4p5veRjvm+sFiUy368alR9rS80w+PN8Ki/n5N7fZ/ZsXuPzY+1fJ8cHBy0eTwwpktSpeufzU7LF4d2tWHzesP3p3YssrkkHTs8YfPKfMXmUcsfo5D1c+VmLTA3kRTLZG3ervt2Shf83CTqBGpww/fnbjzczs3AO0Um5etPOhuYa+eLNs8VSjaXpFbgXobG/MVkYqps87El/vmeq1SDx2h3fQ0ZCNSQuVn/bLXbPm80A/0y3C11/47dNo8HxqR0wveJlYFxOV70/VqS6hVf5zqBdmg3fY3JBK5hetq/B0vStoN7bb5meKnNB0uBd+WEn6NVKi2bT7fLNpekZNq/b88FavV0zT8P3ci3c2wBSzipmJ9nVQJjZsgTp8IBAAAAAADgccMiEgAAAAAAAIJYRAIAAAAAAEAQi0gAAAAAAAAIYhEJAAAAAAAAQSwiAQAAAAAAIIhFJAAAAAAAAAQlF7phtxuzeTqZsHk22Q0fJO6PESUKNu82WzafmDhs8/lxn+dap9tckrry7TDQP2jzvrFhm7c7DZsfPHTE5pIUKbJ5PO67RbPdtnkilrJ5IZu3uSS1A90lEdog5q+x0yzbPB7o77PVeX98Sc1MzealMX8vK7myzee6TZvXK+E14sGetTYfGvH9dbHIpP21brv/bpvPzizguYl8n2o1/f2Yn6/YPBbzfS6b8c9Vqzpnc0maGffXcHTffpt/7cav2Xx6zp/DzPyMzSWp1NNj897+AZsXejI2P3DgkM1HhpbZXJKyPSM2/+4Nvp2mtt9h807Dj2U7jhy1+YHKrM0lacOmjTbv7fF1ure/1+a5fNZ/vuD7sySlsn48zef9vV40aoFr9UOB2rF08BAV31Q6HPMbHAqMqfPNwJg7UbZxIuXrnyRVu/4YUWBcrgXmJlHUsXk6FW7ng+PjNm93/DXE5K/h2NSUP4HAOCFJUce3QyqXs3lP2rdDp+3bMTRWJpLhuUlO/pmJJ/w+UoF7Gcv42hEF+qIkxQLnEI8t+BXrcbfvkB8XU2lfP9oNP9+VpBUrR21eqfpCODtf9efQDvS7uL+GatvP4STpvh07bZ4MHOPQft/OQwN+ftPb22dzSdq+fbvNQ++AL3vxFptnIj9HG+gr2VyScrN+jjNZLtu8GxiPUil/H2bn/XpCpbGA8arp+3w87WtMvRUYKxK+fnQXUKOm5/yce6jHjwUh/CYSAAAAAAAAglhEAgAAAAAAQBCLSAAAAAAAAAhiEQkAAAAAAABBLCIBAAAAAAAgiEUkAAAAAAAABLGIBAAAAAAAgKDkQjeMxzI2z2ZyNo/UDh6jkMv7vDRs82qrbvPBUtrmycA5NmeO2lySunF/jGqqa/MlS9b4/TebNj/lzOU2l6Sbv/X/bN6MKjZPxWI2r81Xbd5T6rG5JKWTKZsnYh2bz9d9X9h9eNrm5WnfFxox30aSNHyKX6Nd1uefmWbk+9L0hG/ndN23oSQVlg3avFb17bxYzE0esfn/u/4Gm+8/sj94jHirZvM77pjxOwg8N+12oEbGfO34l3/2z7UkpVNZmz/tnHNs3kyXbD7b8H1y175jNpekycn7/DnUfTscPLzb5rv3+P2f97RzbS5J737nb9n81ltutnl7ZtLmM42GzWuKbL7zh+H+/J0fHbZ5IdmyeSqdsHki4+cMPYVwfVq+2o+HL3/la2wevpOPjWTMX2sr8vdzvub7gyRNzc7afDLQp9opPx2M2v5+12t+zI01/NxFklqRf7bjcX8OhV4/t0gkAn02GZ4SR4E/eo0C9zJ4Dgl/DvG4H0ce3Mbn3UA7xhN+3E8k/X3qdP3no4VcQ6Cd4oGLjMUCjRDIu4FrkKRWYMhOhsb0RaQd6LcTZT+/6c37uYUkzQbeDULPX1e+T1Rqfv+h5yLq+jmeJJVy/hyOTfl3g5/cudfmhdy4zRt1Py4/yD+f6ay/hvu2+3Nckh+yeakYHttHR/0+Jvf6OX0s6WvI0XHfjstX+ON3uuEa1Wj7Z6Y6P2fzVuAYnUB/7Okt2lySGl1/jpWm7ysh/CYSAAAAAAAAglhEAgAAAAAAQBCLSAAAAAAAAAhiEQkAAAAAAABBLCIBAAAAAAAgiEUkAAAAAAAABLGIBAAAAAAAgKDkQjdMJ/16U7XRsHkiWwgeo5vI+GO0qv4YqcjmmXTe5qmUP8d0vtfmktTb4/dxZPyozavLltt8ZMV6mx88NmFzSdr89K02nx8/ZPNd2+6xeWW+bPNkomZzSertTds8pq7NDx/017Bvz4zN4xl/H3tGfV+SpOGBHpvH6nWfT/lz6J/2j++ykQGbS9LyvhU233HvEZs/+9eCh3hMLF2y1OYb16yxeRToT5KUTPhtkrGYzeMJX0Ojrq9f6VANTWV9LmlsbJnNL37BC2xeyvt+35vtt/m9d99hc0l6YPsOm48u9/eyHvl2TuT8Ndy97X6bS9K927bZPL/mNJsfPOifzYF+346ptK+P+WLO5pI0dWSvzScObLf5+IQfy+od359bXf+8SNKhsq9xW345vI/FYH5u3uazsxWbV+bDY2alEhhPAn9k2NPnx6tMzs/PQmLx8J9Z5pK+X6fSvsYlEonA531/SibDU+J2148DUeT7veTz0McTC2hHxfxOOp2Ozdvtts1DY1Ur8PnOAsbbROBeJFM+D92HbNb3pWxg/5IUdX07ZjKP7pl5LPUPDtm8t9fPPxbSXlOzczbPBcbmVtO3d7Pl82TaPzvpjK8/ktTstGx+bMpfY63tz2Gg1Gfz5ev8fZKkVss/f7OzZZvvOXDM5unhlM3jkT++JBXzgXe8ET8H6s358WquPGvzPXt223zdKatsLknNyM8/mh0/Jst3V1Urvi/1B94xJSmX9e3cqDWD+3D4TSQAAAAAAAAEsYgEAAAAAACAIBaRAAAAAAAAEMQiEgAAAAAAAIJYRAIAAAAAAEAQi0gAAAAAAAAIYhEJAAAAAAAAQSwiAQAAAAAAICi50A2XDPv1ptbkpM1rnW7wGJWKz6N4x+bJpL+cnp4hm6dTKZvXKrM2l6RcKtCkTZ//6Oabbb72lKM2P3DgiD++pHg8ZvN8xrdDIpGxeS5XsHllvmZzSarV/DbtdtPmxZw/xy3nbLR5ttTrj59o2VySOq2qzWv76zaPz2VtPpIv2fxpG0+3uSSN9C2x+W2HdwX3sRhMjU/Z/JnP2GLzLRddFDxGJpOweTLha2Q87vNu5GtkQv74raavj5JUa/o+OXlgt82n6r7fT034+7Bz+w6bS9KhY76GFUeW+R1k/HMTS+dt3mw3/P4l/cu/fs/mq9edYfOVA/4asnE/TuRTvr416nM2l6SdM3fbvFTqsXknatv8yPS8zYeGVttckqot/0x8819vtflb3/aG4DEeCxOB+VHo2a3X/XgnSY2m3yad9eN6Opu2ebXqx+R4MlT/fP16cCO/TRT5uUu74/tk6Bxzef9cSVIsUMcVRTbudMNzYXv8mG8DSYopvI1TqfpxotMJzMXTvn5FgTmoFG7nUDtEgfugUBuFPi4pm83ZPJMJ96fFYi5wz7tdP/YvGx0JHiOd82NvteFrWCHvx6RY0vfLWMLf1FQ6/GzG2r5fVmv+HDI5Pz8pDhVt3or7GidJ7aTfJtvv70M36ceKuXnfVzasXW1zSWof8XOUQxU/3pTn/Vxz44YNNt+/b7vNW+1wO8cCSyhzM4FnKvB7PKW8v0/FBYxXlYo/h0TgPTKE30QCAAAAAABAEItIAAAAAAAACGIRCQAAAAAAAEEsIgEAAAAAACCIRSQAAAAAAAAEsYgEAAAAAACAIBaRAAAAAAAAEJRc6IYrV6Rt3hvL2nzH/mrwGEfHI5s3OxmbF4v+cirVss073TmbJxaw5jY1PmHzufm2zeutGX8OUdnmpeKAzSXp6JFJmx+o1G3ejWI2XzI8ZPNYt2VzSZouT9k8U/B9oa+3ZPN0ImHzRtPfJyX98yBJlYZvx+Z8yuaFru9v61cstfnY6KDNJWn/gaM2nxwPP7eLQSHv+8PkrL8Xt995W/AYIyP9Nl8y4vt9q+X7/fR02Z9A3V9DcgHP1bI1YzZf0e+fm4PbDtu8Mt+w+ZJR32clKT/k2zmZ7bF5tebbaenSlTY/cuiAzSVpYqJs87Gxis1jkR/r5huBe5n0/b3V7fjPS8rkij6P+TrfnBz3B4j7+rZk+Rr/eUnNetPmgWZcNFotfx2KfK1PJn1bSlLWdwllcjm/gb/digVmi4nAmNpdwL3qBOYW7Y7v14m4P4dk2ufxVHiOlw7ciyjQKTuBawh9fiFCj3887q+zv6/P5qGxrNH0/b0TC19jLFB/Qu3Uavs5XLvtr6HeCY+n0qO714tJvpC3eaft72kj0CckKZnyz18q5efVoRoT+r2IwJCkZKob2H9YIzAPiyX9NeR7fRvMzfn3VEnKBWr9+Lh/v0om/TywP+fbOd/Xa3NJKmb9u8XoiN/H+NFpfw55345LRvz70dzsrM0lqRmqs4ExtTdQZ0s9/j7Ozvg2kKTxwJpEFPfzwBB+EwkAAAAAAABBLCIBAAAAAAAgiEUkAAAAAAAABLGIBAAAAAAAgCAWkQAAAAAAABDEIhIAAAAAAACCWEQCAAAAAABAUHKhG/b0p2xeG6/avH8kET5IIW/jiaMNm9ebTZsn0z02D3xc3VbHbyCp1fHnOFObtnkhl7F5vVq3ea0+bnNJagauoxPIo8jfy/nZis17evx9fnCbXpvXar6/TUz6di4WCzaPxf36aqwd2VyS0smczTPZwOfTvp1Xr19t81o1fI7f+c49Nr/zgWPBfSwGmVTX5o162ebf//43gseIWv7Z68n7+91qtW1er9Vsngys+a9es9LmknT6M0+z+bqVYzYv7z9g8yPTEzZPB+qbJK0fHLX5+Pi8zc889XSbbz7jFJv/3d9+1uaSlJS/jlbF95Vm0+dROzDWZH1fSmTC7bxm7VqbH9v/gN9B3NenXMGfw2mbNvr9S6pX/b1esXQkuI/FYHBw0OZx+flVpxOu5a22r4GdmN9Hve7rTywR83nM16du15+fJDU7fptEdwHzSPf5hP98N1rAHC/QzjH5dgqJBT7e7Yb7QjtQP7qB/pRI+nZqt339aQbyVtfnkhQP3KtYoKGiKHCNgf0nFG7nTifQzgvo84tFLp+2eTzm81rTv/tIUibw/OYy/hgx+X6TTgXqQ6CG9fT6Oi1J9dmyzZvJwHtoxveJWmBukEj4NpKkVuBWNAPvBodrfh43sHyZP/7ho/4EJOUC41G25O/lcK8f+ycm99p8oM+vByjux2RJmm/7hj51qZ9PdwPv0tVqy+cVn0vSYF+fzQOvJUH8JhIAAAAAAACCWEQCAAAAAABAEItIAAAAAAAACGIRCQAAAAAAAEEsIgEAAAAAACCIRSQAAAAAAAAEsYgEAAAAAACAoOSCN8z6TbM9aZsPFMPrVclaw+apXNfms9OBy+n4c8hll/iPp/zxJanTmLZ5Ou/PMZX07ZhI5G3eiMLn2Gw1bR5FMZvHIr//qFm3ecfHksLtoHTGxuVpfx9qzZbNe/t6bJ6Mh/tzPOnPsaq2zY9OzNl8et5/fq4yY3NJuulb9/tzqAZ3sShUa4ETDdyvX3nRS4PH6DYrNk+0/P3odvyzGSUSfv+BZyJb8LVBko6UazafK2+z+VTNX2Msm7X5/bfvtLkkTd48bvO1a061+fnrN9i8WfMFKBeoLZIUBWpoNXCMeMKPA11fglXr+r6U7Pj7JEmrlq+1eX1+0uabewo2/8GPfmzzQ3sfsLkk1Sr+mYuqvs4vFj09fjzpdgI3PAqPN43AmDZbnbd5MhWoP4G80+nYXIFYklKBOt0O9Ptu4By6UeAkYuF2jgXmR+oGJkgB3ch/PjSOSFIU+PPhbmCe2Kj5+tZq+b7WVaAN4oE2lEJ7UDfQF6LAHvKBsSqd9P1dkuIxfx3J5IJfsR536YTvM/m8n18En39JiUARSCR8e3Y6vt+124F3m8A1zs35Obck1WZnbR66xmzgXboZmEe2AnMwSaqW/bt0OpmzeWmwzx8gMEdqVf08U5ISaf98pjN+vhulfDuWevw1ZgLPd9/AiM0lKZr1c6RY3PeF+pyf39Sqgb4UeCYlKRaoUQqMNyH8JhIAAAAAAACCWEQCAAAAAABAEItIAAAAAAAACGIRCQAAAAAAAEEsIgEAAAAAACCIRSQAAAAAAAAEsYgEAAAAAACAoORCN5yfT/kNEkUbFwv14DFSucjmhUzW5r29XZvPz9YC+RGfVzs2l6RW3W9TSg/aPJvy7dxuNGyeTIbXBdOBTVKZhM1jMb+DfNF3q/gCel2707J5Oufbqacvb/OpqTmbz0W+L/UM+PsoSdW2v1fb90za/L4799t8yUCPz5cXbC5JivvrHOothfexCBSKaZv3+tKi0vDG4DEagWcvG1iTT8f8OUa5nM0zef/5bn3e5pI0Nzdr80Te96mRdX02X5efsPm23TttLkmK+fqTKmRsfvDwPpsPDvXbfGh4wOaS1KhWbF5vzNi8Mu/Hw0bV16dWo2rzZNbXP0laMjZs8z2Hjtr86L4dNq/P+zbYcfftNpekwUF/jlF/+F4tBrFAbYjFfIFqtnztkaR6w89vWq2mzeMJ/9wl4/4aoo4fS5rtts0lqdH286dYPBbI/TnGY/7z8cDnJanb9vcqMNTIn4HkW1GKAtcgSZ2u30sU83kiGThGIvA+EBCFL0FR5Fuy0/F5N3QjAnO8eGCeu5B9tFvhd4bFopD242oy0HMX8hsJ2ax/h5uf93OYRKBGpTP+GnIFPycOfV6ScoELrc2Ubb5kZKXN6/J9pq/g54mSlBoOzDUDRaYlP96E3s9yxfC7RyofaOtAjWgF6uDQsH93SXf9i2giGa5xmYy/F1Hk53n5vF83yYXaKPA8SFKt5ueKtZqfN4Twm0gAAAAAAAAIYhEJAAAAAAAAQSwiAQAAAAAAIIhFJAAAAAAAAASxiAQAAAAAAIAgFpEAAAAAAAAQxCISAAAAAAAAglhEAgAAAAAAQFByoRse2OvzRjlr89JwO3iMbK5l896i//zAgL+c+UrV5uWyz6cn0/4EJE1P+jzRTdi8G0U273Q6/gDdQK7wymEsHrN5IunbudbxR4jCXUGpru8L7eqUzTs1fy87yZTNy/P+881wM2tqtmbz3dt9ZylPBs6h4k9itHfU5pJ02qplNg9cwqJRndvmN+j6PpmKBYqLpKNHZ2y+/d49Ns8mczZP9/bZfGik3+ZjQ702l6Rk3LfDYO+gzTtdv/96bdrmS0Z6/A4kLR8bsPmhI0ds/sAD99p8TXOtzev1hs0laW6ubPNq1Z/j7MyszRvVeZt3mv7BTGQKNpeku+8etnmz4dthZGSJzZefdYb//LD/vCQNDfsall3AdS4G3a5/cBqNps1bLZ9LUrNZ93ngGM2WH5i7kb+GmALzhoSf+0hSNpOxeTzp99Fp+2uIAvOr0H2SpFjcn0OoHeKBGpxeQDuF1Ou+L7QD7ZQInGMmcI6hdq4HaoskVau+xsVivp2zWf9OEhoL283wOcZjfh/ZrO/Pi0kqcM/iHd9n0onw6+SjfTZCz2c65ef17bZ/r+gG3jskKRs4x96Sn0sGXq+UTfsxrbuAl498MW/zVmAsqNcqNm+0/Tnk0+G+kEr7Z6NS9eeQLfn5bq3p+2st0AapyPclSUoExoJ4ws/5A6/KqtZ8fy+X/XuwFK716XR4XcPhN5EAAAAAAAAQxCISAAAAAAAAglhEAgAAAAAAQBCLSAAAAAAAAAhiEQkAAAAAAABBLCIBAAAAAAAgiEUkAAAAAAAABCUXumEnNWTzVvrpNm90G8FjxNsTNs/2xmzeN5y1eX+8bfOBatfm5amczSWpPJGwea3im7zTTvsDRH7dr9v21yBJ9Vrd5um0P4dE0l/jXN2fQ23eH1+SUlHT5qV4j8278Rmbt1r+PmQKkc2zKd/XJKkv7fv8OvXZ/MyzCzY/5cyzbb56/XqbS9L5z6ra/MCh+eA+FoNu0/epeGC9PNnyfVqSelK+X//olm/b/MhRX99iqYzNn/GM82x+wbN8LkkzM/65uPPHP7B5pe7b+YG9+2y+a88em0tSrer7ZBT5cSDbM2zz2dk5m89N+/skSZXZaZv7M5SSCb9Fbylv87E1a2w+MDQWOANpZGzUH+NpZ/hj9Pj6lE74ZyoRyCVJscA2gfFwsWi1WoHcj3fttp+7SJIiP2Ylk4HpXty3dahPh+5nPB6+V1HcH6UVaIfQNXY6HZvH5NtQkhKJlM3joXaM+WuMAvcx6obneKE5XOhe1AN1PtQfUynfRskFPPuhcwzdy9A5ZrJ+vM1nfA2Wws9E6F4vJrm0v2eh9o66PpfCz05PT2BeH+j7ofYul/24HXXDdbY3598Di2lfg6Ju4B2xEahR3XCN6rb8dZQKJZsHSpBCd7rSDL/vp1q+RtVqfh/teM3mEzOzNp+f8Hlfv1/zkKTJiu9P2ZyvYVHk+8r0pJ8LzwbmypKUC/TXfD68ruE8MWZgAAAAAAAAeFyxiAQAAAAAAIAgFpEAAAAAAAAQxCISAAAAAAAAglhEAgAAAAAAQBCLSAAAAAAAAAhiEQkAAAAAAABBsSiKosf7JAAAAAAAALC48ZtIAAAAAAAACGIRCQAAAAAAAEEsIgEAAAAAACCIRSQAAAAAAAAEsYgEAAAAAACAIBaRAAAAAAAAEMQiEgAAAAAAAIJYRAIAAAAAAEAQi0iPwurVq3XZZZc93qeBgD179igWi+nP/uzPgtt+6EMfUiwWO+Fn3Gc8UdF3nxioUcBj64n0zFx88cU6/fTTg9s9VEc+85nPPKrjxWIxfehDH3pU+wDgPRlrEJ5aWER6GDt37tTll1+utWvXKpvNqqenR1u3btXHP/5x1Wq1x/v0FoVqtaoPfehD+va3v/14nwrwlEONCqNGAU891EYAjydqEJ4qko/3CSw2N9xwg1796lcrk8noDW94g04//XQ1m01973vf0/vf/37dc889uuaaax7v03zcVatV/d7v/Z6kB1eonyz+5//8n/rABz7weJ8G8DNRoxaGGgU8tTzVa+OqVatUq9WUSqUe71MBnpKe6jUITy0sIv2U3bt36zWveY1WrVqlb37zm1q6dOnx7IorrtCOHTt0ww03PI5niP9qyWRSySSPBRYnahSoUcDJqI0P/jW0bDYb3K5SqahQKDwGZwQ8dVCDHp12u61ut6t0Ov14nwoWiL/O9lM+/OEPa35+Xp/61KdOePgfsn79er373e/+mZ+fmprS+973Pp1xxhkqFovq6enRC1/4Qt1xxx0nbXvVVVdp8+bNyufz6u/v13nnnacvfOELx/O5uTm95z3v0erVq5XJZDQyMqLnPe95+vGPf3x8m2q1qvvvv18TExPBa/vud7+rV7/61Vq5cqUymYxWrFih9773vSf9auXFF1/8sH9qf9lll2n16tWSHvx798PDw5Kk3/u931MsFjvp79B/85vf1C/90i+pUCior69PL3/5y3XfffedsM+H/m2Pbdu26fWvf716e3s1PDys3/3d31UURdq/f79e/vKXq6enR6Ojo/rIRz5y0nkdO3ZMb3nLW7RkyRJls1mdddZZ+uxnP/sz2+GjH/2oVq1apVwup4suukh33333w55TSLlc1nve8x6tWLFCmUxG69ev15/8yZ+o2+0GPwv8vKhR1ChqFHCyJ3NtfMhtt92mLVu2KJfLac2aNfrEJz5xQv5w/ybSZZddpmKxqJ07d+pFL3qRSqWS/tt/+2+SpEajofe+970aHh5WqVTSy172Mh04cGDB5wPgPzwVatC9996rZz/72crn81q2bJk+/OEPn7TNQuY8P/3vQH7sYx/TunXrlMlkdO+99y7o+iTp4MGDevOb36wlS5Yok8lo8+bN+uu//usFXwsePf4486f88z//s9auXastW7b8XJ/ftWuXrr/+er361a/WmjVrdPToUV199dW66KKLdO+992psbEyS9MlPflLvete79KpXvUrvfve7Va/Xdeedd+oHP/iBXve610mSfv3Xf11f+tKX9M53vlOnnXaaJicn9b3vfU/33XefzjnnHEnSrbfeqmc/+9m68sorg/8I4rXXXqtqtap3vOMdGhwc1K233qqrrrpKBw4c0LXXXvuIrnN4eFh/9Vd/pXe84x36tV/7Nb3iFa+QJJ155pmSpG984xt64QtfqLVr1+pDH/qQarWarrrqKm3dulU//vGPj7/oPeTSSy/Vpk2b9Md//Me64YYb9Id/+IcaGBjQ1Vdfrec85zn6kz/5E33+85/X+973Pj396U/XhRdeKEmq1Wq6+OKLtWPHDr3zne/UmjVrdO211+qyyy5TuVw+qVj/zd/8jebm5nTFFVeoXq/r4x//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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Step 3: Download and prepare CIFAR-10 dataset\n", "from torchvision import datasets, transforms\n", "\n", "# Define data transforms\n", "transform = transforms.Compose([\n", " transforms.Resize(32), # CIFAR-10 is 32x32\n", " transforms.ToTensor(),\n", " transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) # Normalize to [-1, 1]\n", "])\n", "\n", "# Download CIFAR-10 dataset\n", "print(\"Downloading CIFAR-10 dataset...\")\n", "train_dataset = datasets.CIFAR10(\n", " root='./data', \n", " train=True, \n", " download=True, \n", " transform=transform\n", ")\n", "\n", "print(f\"Dataset downloaded successfully!\")\n", "print(f\"Number of training images: {len(train_dataset)}\")\n", "print(f\"Image shape: {train_dataset[0][0].shape}\")\n", "print(f\"Classes: {train_dataset.classes}\")\n", "\n", "# Create dataloader\n", "batch_size = 128 # Good for your 12GB VRAM\n", "train_loader = DataLoader(\n", " train_dataset, \n", " batch_size=batch_size, \n", " shuffle=True, \n", " num_workers=4,\n", " pin_memory=True\n", ")\n", "\n", "print(f\"Batch size: {batch_size}\")\n", "print(f\"Number of batches: {len(train_loader)}\")\n", "\n", "# Visualize some samples\n", "def show_samples(dataset, num_samples=8):\n", " fig, axes = plt.subplots(2, 4, figsize=(12, 6))\n", " for i in range(num_samples):\n", " img, label = dataset[i]\n", " # Convert from [-1, 1] to [0, 1] for display\n", " img = (img + 1) / 2\n", " img = img.permute(1, 2, 0)\n", " \n", " row, col = i // 4, i % 4\n", " axes[row, col].imshow(img)\n", " axes[row, col].set_title(f'Class: {dataset.classes[label]}')\n", " axes[row, col].axis('off')\n", " \n", " plt.tight_layout()\n", " plt.show()\n", "\n", "show_samples(train_dataset)" ] }, { "cell_type": "code", "execution_count": 4, "id": "2a4d4d2c-8119-41a3-be04-22d98bbff38a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Diffusion model components defined successfully!\n", "Next: U-Net architecture\n" ] } ], "source": [ "# Step 4: Define the U-Net architecture for diffusion model\n", "\n", "class TimeEmbedding(nn.Module):\n", " def __init__(self, dim):\n", " super().__init__()\n", " self.dim = dim\n", " \n", " def forward(self, time):\n", " device = time.device\n", " half_dim = self.dim // 2\n", " embeddings = math.log(10000) / (half_dim - 1)\n", " embeddings = torch.exp(torch.arange(half_dim, device=device) * -embeddings)\n", " embeddings = time[:, None] * embeddings[None, :]\n", " embeddings = torch.cat((embeddings.sin(), embeddings.cos()), dim=-1)\n", " return embeddings\n", "\n", "class ResidualBlock(nn.Module):\n", " def __init__(self, in_channels, out_channels, time_emb_dim, dropout=0.1):\n", " super().__init__()\n", " self.time_mlp = nn.Linear(time_emb_dim, out_channels)\n", " \n", " self.block1 = nn.Sequential(\n", " nn.GroupNorm(8, in_channels),\n", " nn.SiLU(),\n", " nn.Conv2d(in_channels, out_channels, 3, padding=1),\n", " )\n", " \n", " self.block2 = nn.Sequential(\n", " nn.GroupNorm(8, out_channels),\n", " nn.SiLU(),\n", " nn.Dropout(dropout),\n", " nn.Conv2d(out_channels, out_channels, 3, padding=1),\n", " )\n", " \n", " if in_channels != out_channels:\n", " self.shortcut = nn.Conv2d(in_channels, out_channels, 1)\n", " else:\n", " self.shortcut = nn.Identity()\n", " \n", " def forward(self, x, time_emb):\n", " h = self.block1(x)\n", " time_emb = self.time_mlp(time_emb)\n", " h = h + time_emb[:, :, None, None]\n", " h = self.block2(h)\n", " return h + self.shortcut(x)\n", "\n", "class AttentionBlock(nn.Module):\n", " def __init__(self, channels):\n", " super().__init__()\n", " self.channels = channels\n", " self.group_norm = nn.GroupNorm(8, channels)\n", " self.q = nn.Conv2d(channels, channels, 1)\n", " self.k = nn.Conv2d(channels, channels, 1)\n", " self.v = nn.Conv2d(channels, channels, 1)\n", " self.proj_out = nn.Conv2d(channels, channels, 1)\n", " \n", " def forward(self, x):\n", " B, C, H, W = x.shape\n", " h = self.group_norm(x)\n", " q = self.q(h)\n", " k = self.k(h)\n", " v = self.v(h)\n", " \n", " q = q.reshape(B, C, H*W).permute(0, 2, 1)\n", " k = k.reshape(B, C, H*W)\n", " v = v.reshape(B, C, H*W).permute(0, 2, 1)\n", " \n", " attn = torch.bmm(q, k) * (int(C) ** (-0.5))\n", " attn = F.softmax(attn, dim=2)\n", " \n", " h = torch.bmm(attn, v)\n", " h = h.permute(0, 2, 1).reshape(B, C, H, W)\n", " h = self.proj_out(h)\n", " \n", " return x + h\n", "\n", "print(\"Diffusion model components defined successfully!\")\n", "print(\"Next: U-Net architecture\")" ] }, { "cell_type": "code", "execution_count": 7, "id": "1ea769ea-8e47-47fb-add3-f4139afcc5b9", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Model created with 16,808,835 parameters\n", "Test input shape: torch.Size([4, 3, 32, 32])\n", "Test output shape: torch.Size([4, 3, 32, 32])\n", "Model forward pass successful!\n", "VRAM usage after model creation: 0.22 GB\n" ] } ], "source": [ "# Step 5: Simplified Working U-Net Model\n", "\n", "class SimpleUNet(nn.Module):\n", " def __init__(self, in_channels=3, out_channels=3, time_emb_dim=128):\n", " super().__init__()\n", " \n", " # Time embedding\n", " self.time_embedding = TimeEmbedding(time_emb_dim)\n", " self.time_mlp = nn.Sequential(\n", " nn.Linear(time_emb_dim, time_emb_dim * 4),\n", " nn.SiLU(),\n", " nn.Linear(time_emb_dim * 4, time_emb_dim * 4),\n", " )\n", " \n", " # Encoder\n", " self.conv1 = nn.Conv2d(in_channels, 64, 3, padding=1)\n", " self.res1 = ResidualBlock(64, 64, time_emb_dim * 4)\n", " self.down1 = nn.Conv2d(64, 64, 3, stride=2, padding=1) # 32->16\n", " \n", " self.res2 = ResidualBlock(64, 128, time_emb_dim * 4)\n", " self.down2 = nn.Conv2d(128, 128, 3, stride=2, padding=1) # 16->8\n", " \n", " self.res3 = ResidualBlock(128, 256, time_emb_dim * 4)\n", " self.down3 = nn.Conv2d(256, 256, 3, stride=2, padding=1) # 8->4\n", " \n", " # Middle\n", " self.mid1 = ResidualBlock(256, 512, time_emb_dim * 4)\n", " self.mid_attn = AttentionBlock(512)\n", " self.mid2 = ResidualBlock(512, 512, time_emb_dim * 4)\n", " \n", " # Decoder\n", " self.up3 = nn.ConvTranspose2d(512, 256, 3, stride=2, padding=1, output_padding=1) # 4->8\n", " self.res_up3 = ResidualBlock(256 + 256, 256, time_emb_dim * 4)\n", " \n", " self.up2 = nn.ConvTranspose2d(256, 128, 3, stride=2, padding=1, output_padding=1) # 8->16\n", " self.res_up2 = ResidualBlock(128 + 128, 128, time_emb_dim * 4)\n", " \n", " self.up1 = nn.ConvTranspose2d(128, 64, 3, stride=2, padding=1, output_padding=1) # 16->32\n", " self.res_up1 = ResidualBlock(64 + 64, 64, time_emb_dim * 4)\n", " \n", " # Output\n", " self.output = nn.Sequential(\n", " nn.GroupNorm(8, 64),\n", " nn.SiLU(),\n", " nn.Conv2d(64, out_channels, 3, padding=1),\n", " )\n", " \n", " def forward(self, x, time):\n", " # Time embedding\n", " time_emb = self.time_embedding(time)\n", " time_emb = self.time_mlp(time_emb)\n", " \n", " # Encoder\n", " x1 = self.conv1(x)\n", " x1 = self.res1(x1, time_emb)\n", " \n", " x2 = self.down1(x1)\n", " x2 = self.res2(x2, time_emb)\n", " \n", " x3 = self.down2(x2)\n", " x3 = self.res3(x3, time_emb)\n", " \n", " x4 = self.down3(x3)\n", " \n", " # Middle\n", " x4 = self.mid1(x4, time_emb)\n", " x4 = self.mid_attn(x4)\n", " x4 = self.mid2(x4, time_emb)\n", " \n", " # Decoder\n", " x = self.up3(x4)\n", " x = torch.cat([x, x3], dim=1)\n", " x = self.res_up3(x, time_emb)\n", " \n", " x = self.up2(x)\n", " x = torch.cat([x, x2], dim=1)\n", " x = self.res_up2(x, time_emb)\n", " \n", " x = self.up1(x)\n", " x = torch.cat([x, x1], dim=1)\n", " x = self.res_up1(x, time_emb)\n", " \n", " return self.output(x)\n", "\n", "# Initialize model\n", "model = SimpleUNet().to(device)\n", "print(f\"Model created with {sum(p.numel() for p in model.parameters()):,} parameters\")\n", "\n", "# Test model forward pass\n", "with torch.no_grad():\n", " test_x = torch.randn(4, 3, 32, 32).to(device)\n", " test_t = torch.randint(0, 1000, (4,)).to(device)\n", " test_output = model(test_x, test_t)\n", " print(f\"Test input shape: {test_x.shape}\")\n", " print(f\"Test output shape: {test_output.shape}\")\n", " print(\"Model forward pass successful!\")\n", " \n", "# Check memory usage\n", "print(f\"VRAM usage after model creation: {torch.cuda.memory_allocated(0) / 1024**3:.2f} GB\")" ] }, { "cell_type": "code", "execution_count": 9, "id": "52a6b46c-f17e-426c-80f5-1042f5529e44", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Diffusion scheduler created successfully!\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABJEAAAJRCAYAAAD1diY8AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAvqtJREFUeJzs3Xe0XVX9/f25T729pSckISHU0JHee68CSm9KURAFFEQUEKkqRZogvfeqFOldOoQeSAjp/fZ6yn7+4CE/+QbmOnJDuNH3awzG0Dv32WuXtT9r7ZWT3CiO41gAAAAAAACAkfiuDwAAAAAAAAB9H4tIAAAAAAAACGIRCQAAAAAAAEEsIgEAAAAAACCIRSQAAAAAAAAEsYgEAAAAAACAIBaRAAAAAAAAEMQiEgAAAAAAAIJYRAIAAAAAAEAQi0jQaaedpiiKvtFnr7vuOkVRpEmTJi3ag/o3kyZNUhRFuu666761NgD0TdQnAH0V9QlAX0aNwreFRaQl3Hvvvaf9999fw4YNUzab1dChQ7Xffvvpvffe+64PDcD/OOoTgL6K+gSgL6NGoS+L4jiOv+uDwDdzzz33aJ999lFDQ4MOO+wwjRo1SpMmTdLVV1+tefPm6bbbbtPuu+8e3E8+n1c+n1dZWdl/fAyFQkG5XE7ZbPYbr3SHTJo0SaNGjdK1116rgw8++FtpA8CiRX0C0FdRnwD0ZdQo9HWp7/oA8M1MmDBBBxxwgEaPHq1nn31WAwYMWJAde+yx2njjjXXAAQdo3LhxGj169Ffuo729XZWVlUqlUkqlvllXSCaTSiaT3+izAP47UZ8A9FXUJwB9GTUKSwL+OtsS6o9//KM6Ojp05ZVXfqm4SFL//v11xRVXqL29Xeedd56k//d3Yt9//33tu+++qq+v10YbbfSl7N91dnbqZz/7mfr376/q6mrtsssumjZtmqIo0mmnnbZgu6/6+7JLL720dtppJz3//PNaZ511VFZWptGjR+uGG274Uhvz58/XCSecoFVWWUVVVVWqqanR9ttvr7fffnsRXikAixv1CUBfRX0C0JdRo7Ak4JtIS6gHH3xQSy+9tDbeeOOvzDfZZBMtvfTS+sc//vGln++1115adtllddZZZ8n9TcaDDz5Yd9xxhw444ACtt956euaZZ7TjjjuWfHyffPKJ9txzTx122GE66KCDdM011+jggw/WWmutpbFjx0qSJk6cqPvuu0977bWXRo0apVmzZumKK67Qpptuqvfff19Dhw4tuT0AfQf1CUBfRX0C0JdRo7AkYBFpCdTc3Kzp06dr1113tdutuuqqeuCBB9Ta2rrgZ6uttppuueUW+7k33nhDd9xxh37+85/rggsukCT95Cc/0SGHHFLyCvJHH32kZ599dkEB3HvvvTV8+HBde+21+tOf/iRJWmWVVTR+/HglEv/vC3EHHHCAVlhhBV199dX67W9/W1JbAPoO6hOAvor6BKAvo0ZhScFfZ1sCfVEwqqur7XZf5C0tLQt+duSRRwb3/8gjj0j6vKj8u2OOOabkY1xppZW+tII+YMAALb/88po4ceKCn2Wz2QXFpVAoaN68eaqqqtLyyy+vN954o+S2APQd1CcAfRX1CUBfRo3CkoJFpCXQF4Xj31efv8pXFaJRo0YF9//ZZ58pkUgstO2YMWNKPsYRI0Ys9LP6+no1NjYu+P/FYlEXXHCBll12WWWzWfXv318DBgzQuHHj1NzcXHJbAPoO6hOAvor6BKAvo0ZhScEi0hKotrZWQ4YM0bhx4+x248aN07Bhw1RTU7PgZ+Xl5d/24UnS1/5r/v/+d3TPOussHXfccdpkk01000036dFHH9Vjjz2msWPHqlgsLpbjBLBoUZ8A9FXUJwB9GTUKSwr+TaQl1E477aS//e1vev755xf8C/z/7rnnntOkSZN0xBFH/Mf7HjlypIrFoj799FMtu+yyC37+ySef9OqY/6+77rpLm2++ua6++uov/bypqUn9+/dfpG0BWHyoTwD6KuoTgL6MGoUlAd9EWkL98pe/VHl5uY444gjNmzfvS9n8+fN15JFHqqKiQr/85S//431vu+22kqTLLrvsSz+/+OKLv/kBf4VkMrnQbw+48847NW3atEXaDoDFi/oEoK+iPgHoy6hRWBLwTaQl1LLLLqvrr79e++23n1ZZZRUddthhGjVqlCZNmqSrr75ac+fO1a233qplllnmP973Wmutpe9///u68MILNW/evAW//nH8+PGSpCiKFsk57LTTTvr973+vQw45RBtssIHeeecd3XzzzRo9evQi2T+A7wb1CUBfRX0C0JdRo7AkYBFpCbbXXntphRVW0Nlnn72gqPTr10+bb765Tj75ZK288srfeN833HCDBg8erFtvvVX33nuvttpq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tt9+e7344otf2u7VV1/V0UcfrbFjx6qyslIjRozQ3nvvrfHjxy+0zxNPPFGXXnqpZs6cucjOCeiLqFHfzLPPPqtddtlFw4cPV1lZmQYPHqzttttOL7zwwkLbllqjnn76aUVR9JX//etf/1qwXTqd1nHHHaczzzxTXV1di+ycgL6G+rRo/PjHP1YURdppp52+Mm9tbdWvfvUrjRo1StlsVsOGDdOee+6pjo6OBduUWvOoT/hfQX36Zp544gkdeuihWm655VRRUaHRo0frRz/6kWbMmPGl7SZNmvS1c6IoivTjH/94wbYHH3yw3faL+0N9+naxiPQt6O7u1jnnnLNI9/nPf/5T//znPxfpPkMefPBBffTRRzr88MO/9PNFXWA++ugjnXvuuZo2bZpWWWUVu+0vf/lLHXXUUVpllVV0/vnn6/jjj9f48eO16aab6pVXXlmw3bnnnqu7775bW265pS666CIdfvjhevbZZ7Xmmmvq3Xff/dI+d911V9XU1LBSjf8Z1Kj/zPjx45VIJHTkkUfq0ksv1QknnKCZM2dqk0020SOPPPKlbUutUV/42c9+phtvvPFL/40ZM+ZL2xxyyCGaO3eubrnllkV2TkBfRX365l577TVdd911Kisr+8q8ublZG2+8sa655hrts88+uvzyy/Wzn/1MXV1d6u7uXrDdf1LzqE/4X0J9+s+ceOKJevrpp7X77rvrL3/5i374wx/qjjvu0BprrPGlP7wfMGDAQnOhG2+8Ufvtt58kaZtttlmw7RFHHLHQdjfccIMqKiq00koradiwYQu2pT59i2IsMtdee20sKV599dXjbDYbT5s27Uv5pptuGo8dO/Y7Orr/3C677BJvtNFGC/28srIyPuiggxZZOy0tLfG8efPiOI7jO++8M5YUP/XUUwttl8vl4vLy8njPPff80s8nTpwYS4p/9rOfLfjZCy+8EHd3d39pu/Hjx8fZbDbeb7/9Ftr30UcfHY8cOTIuFouL4IyAvokatei0t7fHgwYNirfddtsFP/tPatRTTz0VS4rvvPPOktrbaaed4o033njRHDzQB1GfeqdYLMbrr79+fOihh8YjR46Md9xxx4W2Oeqoo+K6urp44sSJ//H+v6rmfYH6hP921Kdv5plnnokLhcJCP5MU/+Y3vwl+fsstt4xramrizs5Ou91zzz0XS4rPPPPMhTLq07eDbyJ9C04++WQVCoWSVqrz+bzOOOMMLbPMMspms1p66aV18sknf+lPhKSv/vuyF198scaOHauKigrV19fre9/73oKV1qeeekpRFOnee+9dqM1bbrlFURTppZde+trj6urq0iOPPKKtttrqSz+Pokjt7e26/vrrF3xt8OCDDw6ep1NdXa2GhobgdrlcTp2dnRo0aNCXfj5w4EAlEgmVl5cv+NkGG2ygTCbzpe2WXXZZjR07Vh988MFC+95666312Wef6a233vpmJwEsQahRvVdRUaEBAwaoqalpwc/+kxr171pbW5XP5217W2+9tZ5//nnNnz+/18cO9GXUp2/mxhtv1LvvvqszzzzzK/OmpiZde+21OvzwwzVq1Cj19PQsdJ2cr6p5X6A+4X8F9ek/s8kmmyiRSCz0s4aGhq98H/t3M2bM0FNPPaU99tjja79d+YUvznvfffddKKM+fTtYRPoWjBo1SgceeKD+9re/afr06XbbH/3oR/rd736nNddcUxdccIE23XRTnX322frhD39oP/e3v/1NP/vZz7TSSivpwgsv1Omnn67VV19dL7/8sqTPC9Lw4cN18803L/TZm2++Wcsss4zWX3/9r93/66+/rp6eHq255ppf+vmNN96obDarjTfeeMFXCI844ghJn79AzZ07t6T/isWiPb+vUl5ernXXXVfXXXedbr75Zk2ePFnjxo3TwQcfrPr6+oW+kvl/xXGsWbNmqX///gtla621liR95b9xAvy3oUZ9sxrV0tKiuXPn6sMPP9TJJ5+sd999V1tuueWC/JvUqEMOOUQ1NTUqKyvT5ptvrtdee+0rz3ettdZSHMcL/dtKwH8b6tN/Xp9aW1t14okn6uSTT9bgwYO/8pief/55dXV1acyYMdpzzz1VUVGh8vJybbjhhl/7B2ihmvcF6hP+V1Cfev+O19bWpra2tq98H/t3t912m4rF4oK/0vZ1crmc7rjjDm2wwQZaeumlF8qpT9+S7/aLUP9dvviq46uvvhpPmDAhTqVSX/rrC//3q45vvfVWLCn+0Y9+9KX9nHDCCbGk+Mknn/zSZzfddNMF/3/XXXcNfm3y17/+dZzNZuOmpqYFP5s9e3acSqXiU0891X72qquuiiXF77zzzkLZ133V8Yu/nlHKf59++ulXtuv+Olscx/HHH38cr7nmml/a1+jRo+MPP/zQnk8cx/GNN94YS4qvvvrqr8wzmUx81FFHBfcDLKmoUb2rUdtuu+2CPJPJxEccccRCX7EutUa98MIL8fe///346quvju+///747LPPjvv16xeXlZXFb7zxxkJtT58+PZYUn3vuufa6AEsq6tM3r08nnHBCPGrUqLirqyuO4/gr/zrb+eefH0uK+/XrF6+zzjrxzTffHF922WXxoEGD4vr6+nj69OkLHVMpNS+OqU/470d96v073hfOOOOMWFL8xBNP2O3WWmuteMiQIQv9dbj/68EHH4wlxZdddtlX5tSnb0fqmy4+wRs9erQOOOAAXXnllTrppJM0ZMiQhbZ56KGHJEnHHXfcl35+/PHH609/+pP+8Y9/aPPNN//K/dfV1Wnq1Kl69dVXtfbaa3/lNgceeKDOPvts3XXXXTrssMMkSbfffrvy+bz2339/e/zz5s2TJNXX1/sT/TerrbaaHnvssZK2/bo/KQuprq7W2LFjtf7662vLLbfUzJkzdc4552i33XbTc88997Wr2h9++KF++tOfav3119dBBx30ldvU19dr7ty53+i4gCUNNcr7qhp1zjnn6Pjjj9eUKVN0/fXXq6enZ6G/hlZqjdpggw20wQYbLPjcLrvsoj333FOrrrqqfv3rXy/0j9d+cZ7UKPwvoD55/16fxo8fr4suuki33nqrstns137mi1/jHUWRnnjiiQW/kWmNNdbQ+uuvr0svvVR/+MMfvvSZUmqeRH3C/xbqk+fe8Z599lmdfvrp2nvvvbXFFlt87Xbjx4/X66+/rl/84hcL/XW4/+uWW25ROp3W3nvv/ZU59enbwSLSt+iUU07RjTfeqHPOOUcXXXTRQvlnn32mRCKx0G/iGTx4sOrq6vTZZ5997b5PPPFEPf7441pnnXU0ZswYbbPNNtp333214YYbLthmhRVW0Nprr62bb755QYG5+eabtd566y3U5teJ47ik7aTPH9L/+/drF6V8Pq+tttpKm222mS6++OIFP99qq600duxY/fGPf9S555670OdmzpypHXfcUbW1tbrrrruUTCa/cv9xHCuKom/t+IG+hhr1n1l99dUX/O/9999fa665pg4++GDdddddkr55jfrCmDFjtOuuu+qee+5RoVD4Uq364jypUfhfQX0qzbHHHqsNNthA3//+9+12X/ybbDvvvPOXfqX3euutp1GjRn3lX/UI1bwvUJ/wv4b69J/78MMPtfvuu2vllVfWVVddZbf94q/qhf4qW1tbm+6//35tu+226tev31duQ336dvBvIn2LRo8erf33319XXnmlZsyY8bXbfZNOveKKK+qjjz7Sbbfdpo022kh33323NtpoI5166qlf2u7AAw/UM888o6lTp2rChAn617/+FVyhlrTgQWxsbCz5mHp6ejRz5syS/isUCv/ZCevz1et3331Xu+yyy5d+vuyyy2rFFVf8yn/PqLm5Wdtvv72ampr0yCOPaOjQoV+7/6ampuDfzwX+m1CjvnmNymQy2mWXXXTPPfeos7NT0jerUf/X8OHD1dPTo/b29i/9/IvzpEbhfwX1KVyfnnzyST3yyCM69thjNWnSpAX/5fN5dXZ2atKkSWppaZGkBfOf//sP/0uf/+P/oWP9qpr3BeoT/tdQn/6z+dOUKVO0zTbbqLa2Vg899JCqq6tte7fccouWX375Bf9m7de577771NHRYRebqE/fDhaRvmWnnHKK8vn8V/7p88iRI1UsFvXxxx9/6eezZs1SU1OTRo4cafddWVmpH/zgB7r22ms1efJk7bjjjjrzzDPV1dW1YJsf/vCHSiaTuvXWW3XzzTcrnU7rBz/4QfC4V1hhBUnSp59+ulD2dQXxxRdf1JAhQ0r6b8qUKcFj+L9mzZolSV9ZnHK53EJfse7q6tLOO++s8ePH6+9//7tWWmmlr933tGnT1NPToxVXXPE/Pi5gSUaN+uY1qrOzU3Ecq7W1VdJ/XqO+ysSJE1VWVvalbwr8+3lSo/C/hPrk69PkyZMlSXvssYdGjRq14L9p06bpySef1KhRo3TNNddI+n+/QGTatGkLtT19+nQNGDAgeF7/t+Z9gfqE/0XUp9LmT/PmzdM222yj7u5uPfroo1/51//+3csvv6xPPvkk+C0k6fNvLFVVVS30h3f/jvr07eCvs33LlllmGe2///664oorNHLkSKVS/++S77DDDjr55JN14YUX6oorrljw8/PPP1+StOOOO37tfufNm/elr+1lMhmttNJKevjhh5XL5Rb8KsT+/ftr++2310033aSuri5tt912Ja3ErrXWWspkMnrttdcWejArKyu/8le8ftv/JtJyyy0n6fN/rX+77bZb8PM33nhDH3300Zd+81GhUNAPfvADvfTSS7r//vvtbymQPv9NBZK+9G+UAP8LqFFf7d9r1OzZszVw4MAv5U1NTbr77rs1fPjwBdl/UqPmzJmz0Evb22+/rQceeEDbb7/9Qv8GwOuvv64oioK1DPhvQn36al/Upy222OIrf8334YcfrpEjR+o3v/mNVlllFUnS8ssvr9VWW03333+/5s6du+A8/vnPf2rKlCk65phjFny+1Jr3BeoT/hdRn77av8+f2tvbtcMOO2jatGl66qmntOyyywY/f8stt0iS9t13X7vdnDlz9Pjjj2ufffZRRUXF125Hffp2sIi0GPzmN7/RjTfeqI8++khjx45d8PPVVltNBx10kK688ko1NTVp00031SuvvKLrr79eu+2229f+g2uStM0222jw4MHacMMNNWjQIH3wwQe65JJLtOOOOy70FcEDDzxQe+65pyTpjDPOKOmYy8rKtM022+jxxx/X73//+y9la621lh5//HGdf/75Gjp0qEaNGqV11123V39f9ot/zPG9996T9PmvmXz++eclfb7S/0W7W2+9ta6//nq1tLRom2220YwZM3TxxRervLxcP//5zxfs7/jjj9cDDzygnXfeWfPnz9dNN930pfb+79c9H3vsMY0YMUJrrLHGNzp+YElGjfK23357LbXUUlp33XU1cOBATZ48Wddee62mT5+u22+//UvtllqjfvCDH6i8vFwbbLCBBg4cqPfff19XXnmlKioqdM455yx0DI899pg23HDDr/07/8B/K+rT1xsxYoRGjBix0M9//vOfa9CgQdptt92+9PMLLrhAW2+9tTbaaCMdccQRam5u1vnnn6/llltORx111ILtSq15X6A+4X8V9cnbb7/99Morr+jQQw/VBx98oA8++GBBVlVVtVCNKhQKuv3227XeeutpmWWWsfv+4h8SD31jifr0Lfmufi3cf6N///WP/9dBBx0US1roVzbmcrn49NNPj0eNGhWn0+l4+PDh8a9//esFv6b1C//31z9eccUV8SabbBL369cvzmaz8TLLLBP/8pe/jJubmxdqu7u7O66vr49ra2u/8lezfp177rknjqIonjx58pd+/uGHH8abbLJJXF5eHkv6yl8F+Z+S+VWR/66joyP+/e9/H6+00kpxeXl5XFtbG++0007xm2+++aXtNt1005L3WSgU4iFDhsSnnHJKr88D6MuoUd/MJZdcEm+00UZx//7941QqFQ8YMCDe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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Forward diffusion process test completed!\n" ] } ], "source": [ "# Step 6: Define the Diffusion Process (Fixed)\n", "\n", "class DDPMScheduler:\n", " def __init__(self, num_timesteps=1000, beta_start=0.0001, beta_end=0.02, device='cuda'):\n", " self.num_timesteps = num_timesteps\n", " self.device = device\n", " \n", " # Linear beta schedule\n", " self.betas = torch.linspace(beta_start, beta_end, num_timesteps).to(device)\n", " self.alphas = 1.0 - self.betas\n", " self.alpha_cumprod = torch.cumprod(self.alphas, dim=0)\n", " self.alpha_cumprod_prev = torch.cat([torch.tensor([1.0]).to(device), self.alpha_cumprod[:-1]])\n", " \n", " # Calculations for diffusion q(x_t | x_{t-1}) and others\n", " self.sqrt_alpha_cumprod = torch.sqrt(self.alpha_cumprod)\n", " self.sqrt_one_minus_alpha_cumprod = torch.sqrt(1.0 - self.alpha_cumprod)\n", " \n", " # Calculations for posterior q(x_{t-1} | x_t, x_0)\n", " self.posterior_variance = self.betas * (1.0 - self.alpha_cumprod_prev) / (1.0 - self.alpha_cumprod)\n", " self.posterior_log_variance_clipped = torch.log(\n", " torch.cat([self.posterior_variance[1:2], self.posterior_variance[1:]])\n", " )\n", " self.posterior_mean_coef1 = self.betas * torch.sqrt(self.alpha_cumprod_prev) / (1.0 - self.alpha_cumprod)\n", " self.posterior_mean_coef2 = (1.0 - self.alpha_cumprod_prev) * torch.sqrt(self.alphas) / (1.0 - self.alpha_cumprod)\n", " \n", " def add_noise(self, x_start, timesteps, noise=None):\n", " \"\"\"Forward diffusion process - add noise to images\"\"\"\n", " if noise is None:\n", " noise = torch.randn_like(x_start)\n", " \n", " # Move timesteps to same device\n", " timesteps = timesteps.to(self.device)\n", " \n", " sqrt_alpha_cumprod_t = self.sqrt_alpha_cumprod[timesteps].reshape(-1, 1, 1, 1)\n", " sqrt_one_minus_alpha_cumprod_t = self.sqrt_one_minus_alpha_cumprod[timesteps].reshape(-1, 1, 1, 1)\n", " \n", " return sqrt_alpha_cumprod_t * x_start + sqrt_one_minus_alpha_cumprod_t * noise\n", " \n", " def sample_prev_timestep(self, model_output, timestep, sample):\n", " \"\"\"Reverse diffusion process - remove noise from images\"\"\"\n", " timestep = timestep.to(self.device)\n", " \n", " # Compute coefficients for predicted original sample (x_0) and current sample (x_t)\n", " alpha_prod_t = self.alpha_cumprod[timestep]\n", " alpha_prod_t_prev = self.alpha_cumprod_prev[timestep] if timestep > 0 else torch.tensor(1.0).to(self.device)\n", " beta_prod_t = 1 - alpha_prod_t\n", " \n", " # Compute predicted original sample from predicted noise\n", " pred_original_sample = (sample - beta_prod_t ** (0.5) * model_output) / alpha_prod_t ** (0.5)\n", " \n", " # Compute coefficients for pred_original_sample and current sample x_t\n", " pred_original_sample_coeff = (alpha_prod_t_prev ** (0.5) * self.betas[timestep]) / beta_prod_t\n", " current_sample_coeff = self.alphas[timestep] ** (0.5) * (1 - alpha_prod_t_prev) / beta_prod_t\n", " \n", " # Compute predicted previous sample\n", " pred_prev_sample = pred_original_sample_coeff * pred_original_sample + current_sample_coeff * sample\n", " \n", " return pred_prev_sample\n", "\n", "# Initialize scheduler\n", "scheduler = DDPMScheduler(num_timesteps=1000, device=device)\n", "print(\"Diffusion scheduler created successfully!\")\n", "\n", "# Test the diffusion process\n", "def test_diffusion_process():\n", " # Take a batch from our dataset\n", " data_iter = iter(train_loader)\n", " images, _ = next(data_iter)\n", " images = images[:4].to(device) # Take first 4 images\n", " \n", " # Test forward process (adding noise)\n", " timesteps = torch.randint(0, scheduler.num_timesteps, (4,))\n", " noise = torch.randn_like(images)\n", " noisy_images = scheduler.add_noise(images, timesteps, noise)\n", " \n", " # Visualize original vs noisy images\n", " fig, axes = plt.subplots(2, 4, figsize=(12, 6))\n", " \n", " for i in range(4):\n", " # Original image\n", " orig_img = (images[i].cpu() + 1) / 2 # Convert from [-1,1] to [0,1]\n", " orig_img = orig_img.permute(1, 2, 0)\n", " axes[0, i].imshow(orig_img)\n", " axes[0, i].set_title('Original')\n", " axes[0, i].axis('off')\n", " \n", " # Noisy image\n", " noisy_img = (noisy_images[i].cpu() + 1) / 2\n", " noisy_img = torch.clamp(noisy_img, 0, 1)\n", " noisy_img = noisy_img.permute(1, 2, 0)\n", " axes[1, i].imshow(noisy_img)\n", " axes[1, i].set_title(f'Noisy (t={timesteps[i]})')\n", " axes[1, i].axis('off')\n", " \n", " plt.tight_layout()\n", " plt.show()\n", " \n", " print(\"Forward diffusion process test completed!\")\n", " return images, noisy_images, timesteps, noise\n", "\n", "# Run the test\n", "test_images, test_noisy, test_timesteps, test_noise = test_diffusion_process()" ] }, { "cell_type": "code", "execution_count": 10, "id": "54bba55a-5419-44b2-92d8-2a156e0a5eaa", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Training setup complete!\n", "Learning rate: 0.0001\n", "Number of epochs: 20\n", "Optimizer: AdamW\n", "Batch size: 128\n", "Number of batches per epoch: 391\n", "\n", "Testing loss computation...\n", "Test loss: 1.1121\n", "\n", "Memory usage:\n", "Current VRAM usage: 0.22 GB\n", "Max VRAM usage: 0.50 GB\n", "\n", "Ready to start training!\n", "Run the training in the next step...\n" ] } ], "source": [ "# Step 7: Define Loss Function and Training Setup\n", "\n", "def compute_loss(model, batch, scheduler, device):\n", " \"\"\"Compute the diffusion loss\"\"\"\n", " images, _ = batch\n", " images = images.to(device)\n", " batch_size = images.shape[0]\n", " \n", " # Sample random timesteps\n", " timesteps = torch.randint(0, scheduler.num_timesteps, (batch_size,), device=device)\n", " \n", " # Sample noise\n", " noise = torch.randn_like(images)\n", " \n", " # Add noise to images (forward diffusion)\n", " noisy_images = scheduler.add_noise(images, timesteps, noise)\n", " \n", " # Predict noise using model\n", " predicted_noise = model(noisy_images, timesteps)\n", " \n", " # Compute MSE loss between predicted and actual noise\n", " loss = F.mse_loss(predicted_noise, noise)\n", " \n", " return loss\n", "\n", "# Training parameters\n", "learning_rate = 1e-4\n", "num_epochs = 20 # Start with fewer epochs for testing\n", "save_every = 5 # Save model every 5 epochs\n", "\n", "# Initialize optimizer\n", "optimizer = torch.optim.AdamW(model.parameters(), lr=learning_rate, weight_decay=1e-6)\n", "\n", "# Learning rate scheduler\n", "lr_scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=num_epochs)\n", "\n", "print(\"Training setup complete!\")\n", "print(f\"Learning rate: {learning_rate}\")\n", "print(f\"Number of epochs: {num_epochs}\")\n", "print(f\"Optimizer: AdamW\")\n", "print(f\"Batch size: {batch_size}\")\n", "print(f\"Number of batches per epoch: {len(train_loader)}\")\n", "\n", "# Test the loss computation\n", "print(\"\\nTesting loss computation...\")\n", "with torch.no_grad():\n", " data_iter = iter(train_loader)\n", " test_batch = next(data_iter)\n", " test_loss = compute_loss(model, test_batch, scheduler, device)\n", " print(f\"Test loss: {test_loss.item():.4f}\")\n", "\n", "print(\"\\nMemory usage:\")\n", "print(f\"Current VRAM usage: {torch.cuda.memory_allocated(0) / 1024**3:.2f} GB\")\n", "print(f\"Max VRAM usage: {torch.cuda.max_memory_allocated(0) / 1024**3:.2f} GB\")\n", "\n", "# Training function\n", "def train_epoch(model, train_loader, optimizer, scheduler, device, epoch):\n", " model.train()\n", " total_loss = 0\n", " num_batches = len(train_loader)\n", " \n", " progress_bar = tqdm(train_loader, desc=f'Epoch {epoch+1}/{num_epochs}')\n", " \n", " for batch_idx, batch in enumerate(progress_bar):\n", " optimizer.zero_grad()\n", " \n", " # Compute loss\n", " loss = compute_loss(model, batch, scheduler, device)\n", " \n", " # Backward pass\n", " loss.backward()\n", " \n", " # Gradient clipping to prevent exploding gradients\n", " torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)\n", " \n", " # Update weights\n", " optimizer.step()\n", " \n", " total_loss += loss.item()\n", " \n", " # Update progress bar\n", " avg_loss = total_loss / (batch_idx + 1)\n", " progress_bar.set_postfix({\n", " 'loss': f'{loss.item():.4f}',\n", " 'avg_loss': f'{avg_loss:.4f}',\n", " 'lr': f'{optimizer.param_groups[0][\"lr\"]:.6f}'\n", " })\n", " \n", " # Clear cache every 50 batches to prevent memory buildup\n", " if batch_idx % 50 == 0:\n", " torch.cuda.empty_cache()\n", " \n", " return total_loss / num_batches\n", "\n", "print(\"\\nReady to start training!\")\n", "print(\"Run the training in the next step...\")" ] }, { "cell_type": "code", "execution_count": null, "id": "9c2e7980-3007-474a-8cce-11477d4224af", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Starting training...\n", "==================================================\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Epoch 1/20: 100%|██████████| 391/391 [00:43<00:00, 8.95it/s, loss=0.0746, avg_loss=0.1349, lr=0.000100]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "Epoch 1/20 completed in 43.68s\n", "Average loss: 0.1349\n", "Learning rate: 0.000099\n", "VRAM usage: 0.43 GB\n", "--------------------------------------------------\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Epoch 2/20: 13%|█▎ | 49/391 [00:05<00:37, 9.10it/s, loss=0.0544, avg_loss=0.0644, lr=0.000099]" ] } ], "source": [ "# Step 8: Start Training\n", "\n", "import time\n", "import os\n", "\n", "# Create directory to save models\n", "os.makedirs('checkpoints', exist_ok=True)\n", "\n", "# Training history\n", "train_losses = []\n", "start_time = time.time()\n", "\n", "print(\"Starting training...\")\n", "print(\"=\" * 50)\n", "\n", "try:\n", " for epoch in range(num_epochs):\n", " epoch_start_time = time.time()\n", " \n", " # Train one epoch\n", " avg_loss = train_epoch(model, train_loader, optimizer, scheduler, device, epoch)\n", " \n", " # Update learning rate\n", " lr_scheduler.step()\n", " \n", " # Record loss\n", " train_losses.append(avg_loss)\n", " \n", " # Calculate epoch time\n", " epoch_time = time.time() - epoch_start_time\n", " \n", " # Print epoch summary\n", " print(f\"\\nEpoch {epoch+1}/{num_epochs} completed in {epoch_time:.2f}s\")\n", " print(f\"Average loss: {avg_loss:.4f}\")\n", " print(f\"Learning rate: {optimizer.param_groups[0]['lr']:.6f}\")\n", " print(f\"VRAM usage: {torch.cuda.memory_allocated(0) / 1024**3:.2f} GB\")\n", " \n", " # Save model checkpoint\n", " if (epoch + 1) % save_every == 0:\n", " checkpoint = {\n", " 'epoch': epoch + 1,\n", " 'model_state_dict': model.state_dict(),\n", " 'optimizer_state_dict': optimizer.state_dict(),\n", " 'scheduler_state_dict': lr_scheduler.state_dict(),\n", " 'loss': avg_loss,\n", " 'train_losses': train_losses\n", " }\n", " torch.save(checkpoint, f'checkpoints/diffusion_model_epoch_{epoch+1}.pth')\n", " print(f\"Model saved: checkpoints/diffusion_model_epoch_{epoch+1}.pth\")\n", " \n", " print(\"-\" * 50)\n", " \n", " # Clear cache\n", " torch.cuda.empty_cache()\n", "\n", "except KeyboardInterrupt:\n", " print(\"\\nTraining interrupted by user\")\n", " \n", "# Training completed\n", "total_time = time.time() - start_time\n", "print(f\"\\nTraining completed in {total_time/60:.2f} minutes\")\n", "\n", "# Plot training loss\n", "plt.figure(figsize=(10, 6))\n", "plt.plot(train_losses, 'b-', linewidth=2, label='Training Loss')\n", "plt.xlabel('Epoch')\n", "plt.ylabel('Loss')\n", "plt.title('Training Loss Over Time')\n", "plt.legend()\n", "plt.grid(True, alpha=0.3)\n", "plt.show()\n", "\n", "# Save final model\n", "final_checkpoint = {\n", " 'epoch': num_epochs,\n", " 'model_state_dict': model.state_dict(),\n", " 'optimizer_state_dict': optimizer.state_dict(),\n", " 'scheduler_state_dict': lr_scheduler.state_dict(),\n", " 'loss': train_losses[-1],\n", " 'train_losses': train_losses\n", "}\n", "torch.save(final_checkpoint, 'checkpoints/diffusion_model_final.pth')\n", "print(\"Final model saved: checkpoints/diffusion_model_final.pth\")\n", "\n", "print(f\"\\nFinal training loss: {train_losses[-1]:.4f}\")\n", "print(f\"Best training loss: {min(train_losses):.4f} at epoch {train_losses.index(min(train_losses))+1}\")" ] }, { "cell_type": "code", "execution_count": null, "id": "e2891971-bc45-4811-ad03-a6fe443a35a7", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python3 (System)", "language": "python", "name": "system-python" }, "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.12.3" } }, "nbformat": 4, "nbformat_minor": 5 }