From b364cc56cdd40a69718ce2d4e7132a048c745456 Mon Sep 17 00:00:00 2001 From: Angelos Katharopoulos Date: Wed, 29 Nov 2023 10:38:20 -0800 Subject: [PATCH] Add the Llama and Stable Diffusion examples --- llama/README.md | 37 ++ llama/convert.py | 46 ++ llama/llama.py | 304 +++++++++++++ llama/requirements.txt | 2 + llama/sample_prompt.txt | 23 + stable_diffusion/README.md | 95 ++++ stable_diffusion/generated-mlx.png | Bin 0 -> 189021 bytes stable_diffusion/requirements.txt | 6 + stable_diffusion/stable_diffusion/__init__.py | 96 ++++ stable_diffusion/stable_diffusion/clip.py | 68 +++ stable_diffusion/stable_diffusion/config.py | 46 ++ stable_diffusion/stable_diffusion/model_io.py | 284 ++++++++++++ stable_diffusion/stable_diffusion/sampler.py | 70 +++ .../stable_diffusion/tokenizer.py | 95 ++++ stable_diffusion/stable_diffusion/unet.py | 423 ++++++++++++++++++ stable_diffusion/stable_diffusion/vae.py | 266 +++++++++++ stable_diffusion/txt2image.py | 55 +++ 17 files changed, 1916 insertions(+) create mode 100644 llama/README.md create mode 100644 llama/convert.py create mode 100644 llama/llama.py create mode 100644 llama/requirements.txt create mode 100644 llama/sample_prompt.txt create mode 100644 stable_diffusion/README.md create mode 100644 stable_diffusion/generated-mlx.png create mode 100644 stable_diffusion/requirements.txt create mode 100644 stable_diffusion/stable_diffusion/__init__.py create mode 100644 stable_diffusion/stable_diffusion/clip.py create mode 100644 stable_diffusion/stable_diffusion/config.py create mode 100644 stable_diffusion/stable_diffusion/model_io.py create mode 100644 stable_diffusion/stable_diffusion/sampler.py create mode 100644 stable_diffusion/stable_diffusion/tokenizer.py create mode 100644 stable_diffusion/stable_diffusion/unet.py create mode 100644 stable_diffusion/stable_diffusion/vae.py create mode 100644 stable_diffusion/txt2image.py diff --git a/llama/README.md b/llama/README.md new file mode 100644 index 00000000..1314ca86 --- /dev/null +++ b/llama/README.md @@ -0,0 +1,37 @@ +# LLaMA + +An example of generating text with LLaMA using MLX. + +LLaMA is a set of open source language models from Meta AI Research[^1] ranging from 7B to 65B parameters. + +### Setup + +Install the dependencies: + +``` +pip install -r requirements.txt +``` + +Next, download and convert the model. If you do not have access to the model +weights you will need to [request +access](https://docs.google.com/forms/d/e/1FAIpQLSfqNECQnMkycAp2jP4Z9TFX0cGR4uf7b_fBxjY_OjhJILlKGA/viewform) +from Meta. + +Convert the weights with: + +``` +python convert.py mlx_llama_weights.npz +``` + +### Run + +Once you've converted the weights to MLX format, you can interact with the +LLaMA model: + +``` +python llama.py mlx_llama.npz tokenizer.model "hello" +``` + +Run `python llama.py --help` for more details. + +[^1]: Refer to the [arXiv paper](https://arxiv.org/abs/2302.13971) and [blog post](https://ai.meta.com/blog/large-language-model-llama-meta-ai/) for more details. diff --git a/llama/convert.py b/llama/convert.py new file mode 100644 index 00000000..5cad31a0 --- /dev/null +++ b/llama/convert.py @@ -0,0 +1,46 @@ +import argparse +from itertools import starmap + +import numpy as np +import torch + + +def map_torch_to_mlx(key, value): + if "tok_embedding" in key: + key = "embedding.weight" + + elif "norm" in key: + key = key.replace("attention_norm", "norm1").replace("ffn_norm", "norm2") + + elif "wq" in key or "wk" in key or "wv" in key or "wo" in key: + key = key.replace("wq", "query_proj") + key = key.replace("wk", "key_proj") + key = key.replace("wv", "value_proj") + key = key.replace("wo", "out_proj") + + elif "w1" in key or "w2" in key or "w3" in key: + # The FFN is a separate submodule in PyTorch + key = key.replace("feed_forward.w1", "linear1") + key = key.replace("feed_forward.w3", "linear2") + key = key.replace("feed_forward.w2", "linear3") + + elif "output" in key: + key = key.replace("output", "out_proj") + + elif "rope" in key: + return None, None + + return key, value.numpy() + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Convert Llama weights to MLX") + parser.add_argument("torch_weights") + parser.add_argument("output_file") + args = parser.parse_args() + + state = torch.load(args.torch_weights) + np.savez( + args.output_file, + **{k: v for k, v in starmap(map_torch_to_mlx, state.items()) if k is not None} + ) diff --git a/llama/llama.py b/llama/llama.py new file mode 100644 index 00000000..c731e4f3 --- /dev/null +++ b/llama/llama.py @@ -0,0 +1,304 @@ +import argparse +import math +import numpy as np +from sentencepiece import SentencePieceProcessor +import time + +import mlx.core as mx +import mlx.nn as nn +from mlx.utils import tree_unflatten + + +class LlamaAttention(nn.Module): + def __init__(self, dims: int, num_heads: int): + super().__init__() + + self.num_heads = num_heads + + self.rope = nn.RoPE(dims // num_heads, traditional=True) + self.query_proj = nn.Linear(dims, dims, bias=False) + self.key_proj = nn.Linear(dims, dims, bias=False) + self.value_proj = nn.Linear(dims, dims, bias=False) + self.out_proj = nn.Linear(dims, dims, bias=False) + + def __call__(self, queries, keys, values, mask=None, cache=None): + queries = self.query_proj(queries) + keys = self.key_proj(keys) + values = self.value_proj(values) + + # Extract some shapes + num_heads = self.num_heads + B, L, D = queries.shape + + # Prepare the queries, keys and values for the attention computation + queries = queries.reshape(B, L, num_heads, -1).transpose(0, 2, 1, 3) + keys = keys.reshape(B, L, num_heads, -1).transpose(0, 2, 1, 3) + values = values.reshape(B, L, num_heads, -1).transpose(0, 2, 1, 3) + + # Add RoPE to the queries and keys and combine them with the cache + if cache is not None: + key_cache, value_cache = cache + queries = self.rope(queries, offset=key_cache.shape[2]) + keys = self.rope(keys, offset=key_cache.shape[2]) + keys = mx.concatenate([key_cache, keys], axis=2) + values = mx.concatenate([value_cache, values], axis=2) + else: + queries = self.rope(queries) + keys = self.rope(keys) + + # Finally perform the attention computation + scale = math.sqrt(1 / queries.shape[-1]) + scores = (queries * scale) @ keys.transpose(0, 1, 3, 2) + if mask is not None: + scores = scores + mask + scores = mx.softmax(scores, axis=-1) + values_hat = (scores @ values).transpose(0, 2, 1, 3).reshape(B, L, -1) + + # Note that we return the keys and values to possibly be used as a cache + return self.out_proj(values_hat), (keys, values) + + +class LlamaEncoderLayer(nn.Module): + def __init__(self, dims: int, mlp_dims: int, num_heads: int): + super().__init__() + + self.attention = LlamaAttention(dims, num_heads) + + self.norm1 = nn.RMSNorm(dims) + self.norm2 = nn.RMSNorm(dims) + + self.linear1 = nn.Linear(dims, mlp_dims, bias=False) + self.linear2 = nn.Linear(dims, mlp_dims, bias=False) + self.linear3 = nn.Linear(mlp_dims, dims, bias=False) + + def __call__(self, x, mask=None, cache=None): + y = self.norm1(x) + y, cache = self.attention(y, y, y, mask, cache) + x = x + y + + y = self.norm2(x) + a = self.linear1(y) + b = self.linear2(y) + y = a * mx.sigmoid(a) * b + y = self.linear3(y) + x = x + y + + return x, cache + + +class Llama(nn.Module): + def __init__( + self, num_layers: int, vocab_size: int, dims: int, mlp_dims: int, num_heads: int + ): + super().__init__() + + self.embedding = nn.Embedding(vocab_size, dims) + self.layers = [ + LlamaEncoderLayer(dims, mlp_dims, num_heads) for _ in range(num_layers) + ] + self.norm = nn.RMSNorm(dims) + self.out_proj = nn.Linear(dims, vocab_size, bias=False) + + def __call__(self, x): + mask = nn.MultiHeadAttention.create_additive_causal_mask(x.shape[1]) + mask = mask.astype(self.embedding.weight.dtype) + + x = self.embedding(x) + for l in self.layers: + x, _ = l(x, mask) + x = self.norm(x) + return self.out_proj(x) + + def generate(self, x, temp=1.0): + cache = [] + + # Make an additive causal mask. We will need that to process the prompt. + mask = nn.MultiHeadAttention.create_additive_causal_mask(x.shape[1]) + mask = mask.astype(self.embedding.weight.dtype) + + # First we process the prompt x the same was as in __call__ but + # save the caches in cache + x = self.embedding(x) + for l in self.layers: + x, c = l(x, mask=mask) + # We store the per layer cache in a simple python list + cache.append(c) + x = self.norm(x) + # We only care about the last logits that generate the next token + y = self.out_proj(x[:, -1]) + y = mx.random.categorical(y * (1 / temp)) + + # y now has size [1] + # Since MLX is lazily evaluated nothing is computed yet. + # Calling y.item() would force the computation to happen at + # this point but we can also choose not to do that and let the + # user choose when to start the computation. + yield y + + # Now we parsed the prompt and generated the first token we + # need to feed it back into the model and loop to generate the + # rest. + while True: + # Unsqueezing the last dimension to add a sequence length + # dimension of 1 + x = y[:, None] + + x = self.embedding(x) + for i in range(len(cache)): + # We are overwriting the arrays in the cache list. When + # the computation will happen, MLX will be discarding the + # old cache the moment it is not needed anymore. + x, cache[i] = self.layers[i](x, mask=None, cache=cache[i]) + x = self.norm(x) + y = self.out_proj(x[:, -1]) + y = mx.random.categorical(y * (1 / temp)) + + yield y + + +def tic(): + return time.time() + + +def toc(msg, start): + end = time.time() + return f"[INFO] {msg}: {end - start:.3f} s" + + +def generate(args): + + input("Press enter to start generation") + print("------") + + x = mx.array([[tokenizer.bos_id()] + tokenizer.encode(args.prompt)]) + skip = 0 + prompt_processing = None + tokens = [] + start = tic() + for token in model.generate(x, args.temp): + tokens.append(token) + + if len(tokens) == 1: + # Actually perform the computation to measure the prompt processing time + mx.eval(token) + prompt_processing = toc("Prompt processing", start) + + if len(tokens) >= args.num_tokens: + break + + elif (len(tokens) % args.write_every) == 0: + # It is perfectly ok to eval things we have already eval-ed. + mx.eval(tokens) + s = tokenizer.decode([t.item() for t in tokens]) + print(s[skip:], end="", flush=True) + skip = len(s) + + mx.eval(tokens) + full_gen = toc("Full generation", start) + s = tokenizer.decode([t.item() for t in tokens]) + print(s[skip:], end="", flush=True) + print() + print("------") + print(prompt_processing) + print(full_gen) + + +def few_shot_generate(args): + def possible_end(s): + word = "[Instruction]" + for i in range(len(word) - 1, 0, -1): + if s[-i:] == word[:i]: + return 0 + if s[-len(word) :] == word: + return 1 + return -1 + + def generate(question): + x = mx.array([[tokenizer.bos_id()] + tokenizer.encode(question)]) + skip = 0 + prompt_processing = None + tokens = [] + start = tic() + for token in model.generate(x, args.temp): + tokens.append(token) + + if len(tokens) == 1: + # Actually perform the computation to measure the prompt processing time + mx.eval(token) + prompt_processing = toc("Prompt processing", start) + + if len(tokens) >= args.num_tokens: + break + + mx.eval(tokens) + token_list = [t.item() for t in tokens] + s = tokenizer.decode(token_list) + + end = possible_end(s) + if end == 0: + continue + if end == 1: + skip = len(s) + break + + print(s[skip:], end="", flush=True) + skip = len(s) + if token_list[-1] == tokenizer.eos_id(): + break + + mx.eval(tokens) + full_gen = toc("Full generation", start) + s = tokenizer.decode([t.item() for t in tokens]) + print(s[skip:], end="", flush=True) + + prompt = open(args.prompt).read().strip() + while True: + question = input("Ask a question: ") + generate(prompt.replace("{}", question)) + print() + + +def load_model(model_path): + weights = mx.load(model_path) + mlp_dims, dims = weights["layers.0.linear1.weight"].shape + num_heads = dims // 128 + num_layers = max(int(l.split(".")[1]) for l in weights.keys() if "layers" in l) + 1 + vocab_size = weights["out_proj.weight"].shape[-1] + model = Llama(num_layers, vocab_size, dims, mlp_dims, num_heads) + model.update(tree_unflatten(list(weights.items()))) + mx.eval(model.parameters()) + return model + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Llama inference script") + parser.add_argument("model", help="The model file containing MLX weights") + parser.add_argument("tokenizer", help="The sentencepiece tokenizer") + parser.add_argument("prompt", help="The message to be processed by the model") + parser.add_argument( + "--few-shot", + action="store_true", + help="Read a few shot prompt from a file (as in `sample_prompt.txt`).", + ) + parser.add_argument( + "--num-tokens", "-n", type=int, default=100, help="How many tokens to generate" + ) + parser.add_argument( + "--write-every", type=int, default=1, help="After how many tokens to detokenize" + ) + parser.add_argument( + "--temp", type=float, default=0.8, help="The sampling temperature" + ) + parser.add_argument("--seed", type=int, default=0, help="The PRNG seed") + + args = parser.parse_args() + + mx.random.seed(args.seed) + + tokenizer = SentencePieceProcessor(model_file=args.tokenizer) + print("[INFO] Loading model from disk.") + model = load_model(args.model) + if args.few_shot: + few_shot_generate(args) + else: + generate(args) diff --git a/llama/requirements.txt b/llama/requirements.txt new file mode 100644 index 00000000..c036fa59 --- /dev/null +++ b/llama/requirements.txt @@ -0,0 +1,2 @@ +sentencepiece +torch diff --git a/llama/sample_prompt.txt b/llama/sample_prompt.txt new file mode 100644 index 00000000..6659207d --- /dev/null +++ b/llama/sample_prompt.txt @@ -0,0 +1,23 @@ +[Instruction] Give the list of U.S. states bordering Canada +[Answer] OK, here is the list of U.S. states located on the border with Canada: +- Alaska +- Michigan +- Maine +- Minnesota +- Montana +- New York +- Washington +- North Dakota +- Ohio +- Vermont +- New Hampshire +- Idaho +- Pennsylvania +[Instruction] Write a paragraph about "functional analysis" +[Answer] OK, here is a paragraph on the topic of functional analysis: +Functional analysis is a branch of mathematical analysis, the core of which is formed by the study of vector spaces endowed with some kind of limit-related structure (for example, inner product, norm, or topology) and the linear functions defined on these spaces and suitably respecting these structures. The historical roots of functional analysis lie in the study of spaces of functions and the formulation of properties of transformations of functions such as the Fourier transform as transformations defining, for example, continuous or unitary operators between function spaces. This point of view turned out to be particularly useful for the study of differential and integral equations. +[Instruction] I am starting a new dog walking business. Can you help me find 2 possible names for the business? +[Answer] OK, here are two possible names for a new dog walking business: +The first option is "Paws on Patrol", and the second option is "The Dog Whisperer". +[Instruction] {} +[Answer] diff --git a/stable_diffusion/README.md b/stable_diffusion/README.md new file mode 100644 index 00000000..170ce6b9 --- /dev/null +++ b/stable_diffusion/README.md @@ -0,0 +1,95 @@ +Stable Diffusion +================ + +Stable Diffusion in MLX. The implementation was ported from Hugginface's +[diffusers](https://huggingface.co/docs/diffusers/index) and we are fetching +and using the weights available on the Huggingface Hub by Stability AI at +[stabilitiai/stable-diffusion-2-1](https://huggingface.co/stabilityai/stable-diffusion-2-1). + +![out](generated-mlx.png) +*Image generated using Stable Diffusion in MLX and the prompt 'A big red sign saying MLX in capital letters.'* + +Installation +------------ + +The dependencies are minimal, namely: + +- `safetensors` and `huggingface-hub` to load the checkpoints. +- `regex` for the tokenization +- `numpy` because safetensors needs to return some form of array +- `tqdm` and `PIL` for the `txt2image.py` script + +You can install all of the above with the `requirements.txt` as follows: + + pip install -r requirements.txt + +Usage +------ + +Although each component in this repository can be used by itsself, the fastest +way to get started is by using the `StableDiffusion` class from the `diffusion` +module. + +```python +from stable_diffusion import StableDiffusion + +# This will download all the weights from HF hub and load the models in +# memory +sd = StableDiffusion() + +# This creates a python generator that returns the latent produced by the +# reverse diffusion process. +# +# Because MLX is lazily evaluated iterating over this generator doesn't +# actually perform the computation until mx.eval() is called. +latent_generator = sd.generate_latents("A photo of an astronaut riding a horse on Mars.") + +# Here we are evaluating each diffusion step but we could also evaluate +# once at the end. +for x_t in latent_generator: + mx.simplify(x_t) # remove possible redundant computation eg reuse + # scalars etc + mx.eval(x_t) + +# Now x_t is the last latent from the reverse process aka x_0. We can +# decode it into an image using the stable diffusion VAE. +im = sd.decode(x_t) +``` + +The above is almost line for line the implementation of the `txt2image.py` +script in the root of the repository. You can use the script as follows: + + python txt2image.py "A photo of an astronaut riding a horse on Mars." --n_images 4 --n_rows 2 + +Performance +----------- + +The following table compares the performance of the UNet in stable diffusion. +We report throughput in images per second for the provided `txt2image.py` +script and the `diffusers` library using the MPS PyTorch backend. + +At the time of writing this comparison convolutions are still some of the least +optimized operations in MLX. Despite that, MLX still achieves **~40% higher +throughput** than PyTorch with a batch size of 16 and ~15% higher when +comparing the optimal batch sizes. + +Notably, PyTorch achieves almost ~50% higher throughput for the batch size of 1 +which is unfortunate as that means that a single image can be computed faster. +However, when starting with the models not loaded in memory and PyTorch's MPS +graph kernels not cached, the compilation time more than accounts for this +speed difference. + +| Batch size | PyTorch | MLX | +| ---------- | ----------- | ----------- | +| 1 | 6.25 im/s | 4.17 im/s | +| 2 | 7.14 im/s | 5.88 im/s | +| 4 |**7.69 im/s**| 7.14 im/s | +| 6 | 7.22 im/s | 8.00 im/s | +| 8 | 6.89 im/s | 8.42 im/s | +| 12 | 6.62 im/s | 8.51 im/s | +| 16 | 6.32 im/s |**8.79 im/s**| + +The above experiments were made on an M2 Ultra with PyTorch version 2.1, +diffusers version 0.21.4 and transformers version 4.33.3. For the generation we +used classifier free guidance which means that the above batch sizes result +double the images processed by the UNet. diff --git a/stable_diffusion/generated-mlx.png b/stable_diffusion/generated-mlx.png new file mode 100644 index 0000000000000000000000000000000000000000..11e826a60f7823f2dbe7f0b6e093b313a3bee6be GIT binary patch literal 189021 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 1: + tokens += [self.tokenizer.tokenize(negative_text)] + lengths = [len(t) for t in tokens] + N = max(lengths) + tokens = [t + [0] * (N - len(t)) for t in tokens] + tokens = mx.array(tokens) + + # Compute the features + conditioning = self.text_encoder(tokens) + + # Repeat the conditioning for each of the generated images + if n_images > 1: + conditioning = _repeat(conditioning, n_images, axis=0) + + # Create the latent variables + x_T = self.sampler.sample_prior( + (n_images, *latent_size, self.autoencoder.latent_channels), + dtype=self.dtype + ) + + # Perform the denoising loop + x_t = x_T + for t, t_prev in self.sampler.timesteps(num_steps, dtype=self.dtype): + x_t_unet = mx.concatenate([x_t] * 2, axis=0) if cfg_weight > 1 else x_t + t_unet = mx.broadcast_to(t, [len(x_t_unet)]) + eps_pred = self.unet(x_t_unet, t_unet, encoder_x=conditioning) + + if cfg_weight > 1: + eps_text, eps_neg = eps_pred.split(2) + eps_pred = eps_neg + cfg_weight * (eps_text - eps_neg) + + x_t_prev = self.sampler.step(eps_pred, x_t, t, t_prev) + x_t = x_t_prev + yield x_t + + def decode(self, x_t): + x = self.autoencoder.decode(x_t / self.autoencoder.scaling_factor) + x = mx.minimum(1, mx.maximum(0, x / 2 + 0.5)) + return x diff --git a/stable_diffusion/stable_diffusion/clip.py b/stable_diffusion/stable_diffusion/clip.py new file mode 100644 index 00000000..4c30ac56 --- /dev/null +++ b/stable_diffusion/stable_diffusion/clip.py @@ -0,0 +1,68 @@ +import mlx.core as mx +import mlx.nn as nn + +from .config import CLIPTextModelConfig + + +class CLIPEncoderLayer(nn.Module): + """The transformer encoder layer from CLIP.""" + + def __init__(self, model_dims: int, num_heads: int): + super().__init__() + + self.layer_norm1 = nn.LayerNorm(model_dims) + self.layer_norm2 = nn.LayerNorm(model_dims) + + self.attention = nn.MultiHeadAttention(model_dims, num_heads) + # Add biases to the attention projections to match CLIP + self.attention.query_proj.bias = mx.zeros(model_dims) + self.attention.key_proj.bias = mx.zeros(model_dims) + self.attention.value_proj.bias = mx.zeros(model_dims) + self.attention.out_proj.bias = mx.zeros(model_dims) + + self.linear1 = nn.Linear(model_dims, 4 * model_dims) + self.linear2 = nn.Linear(4 * model_dims, model_dims) + + def __call__(self, x, attn_mask=None): + y = self.layer_norm1(x) + y = self.attention(y, y, y, attn_mask) + x = y + x + + y = self.layer_norm2(x) + y = self.linear1(y) + y = nn.gelu_approx(y) + y = self.linear2(y) + x = y + x + + return x + + +class CLIPTextModel(nn.Module): + """Implements the text encoder transformer from CLIP.""" + + def __init__(self, config: CLIPTextModelConfig): + super().__init__() + + self.token_embedding = nn.Embedding(config.vocab_size, config.model_dims) + self.position_embedding = nn.Embedding(config.max_length, config.model_dims) + self.layers = [ + CLIPEncoderLayer(config.model_dims, config.num_heads) + for i in range(config.num_layers) + ] + self.final_layer_norm = nn.LayerNorm(config.model_dims) + + def __call__(self, x): + # Extract some shapes + B, N = x.shape + + # Compute the embeddings + x = self.token_embedding(x) + x = x + self.position_embedding.weight[:N] + + # Compute the features from the transformer + mask = nn.MultiHeadAttention.create_additive_causal_mask(N, x.dtype) + for l in self.layers: + x = l(x, mask) + + # Apply the final layernorm and return + return self.final_layer_norm(x) diff --git a/stable_diffusion/stable_diffusion/config.py b/stable_diffusion/stable_diffusion/config.py new file mode 100644 index 00000000..e07bdd84 --- /dev/null +++ b/stable_diffusion/stable_diffusion/config.py @@ -0,0 +1,46 @@ +from dataclasses import dataclass +from typing import Optional, Tuple + + +@dataclass +class AutoencoderConfig: + in_channels: int = 3 + out_channels: int = 3 + latent_channels_out: int = 8 + latent_channels_in: int = 4 + block_out_channels: Tuple[int] = (128, 256, 512, 512) + layers_per_block: int = 2 + norm_num_groups: int = 32 + scaling_factor: float = 0.18215 + + +@dataclass +class CLIPTextModelConfig: + num_layers: int = 23 + model_dims: int = 1024 + num_heads: int = 16 + max_length: int = 77 + vocab_size: int = 49408 + + +@dataclass +class UNetConfig: + in_channels: int = 4 + out_channels: int = 4 + conv_in_kernel: int = 3 + conv_out_kernel: int = 3 + block_out_channels: Tuple[int] = (320, 640, 1280, 1280) + layers_per_block: Tuple[int] = (2, 2, 2, 2) + mid_block_layers: int = 2 + transformer_layers_per_block: Tuple[int] = (1, 1, 1, 1) + num_attention_heads: Tuple[int] = (5, 10, 20, 20) + cross_attention_dim: Tuple[int] = (1024,) * 4 + norm_num_groups: int = 32 + + +@dataclass +class DiffusionConfig: + beta_schedule: str = "scaled_linear" + beta_start: float = 0.00085 + beta_end: float = 0.012 + num_train_steps: int = 1000 diff --git a/stable_diffusion/stable_diffusion/model_io.py b/stable_diffusion/stable_diffusion/model_io.py new file mode 100644 index 00000000..e4f294e0 --- /dev/null +++ b/stable_diffusion/stable_diffusion/model_io.py @@ -0,0 +1,284 @@ +import json +from functools import partial + +import numpy as np +from huggingface_hub import hf_hub_download +from safetensors import safe_open as safetensor_open + +import mlx.core as mx +from mlx.utils import tree_unflatten + +from .clip import CLIPTextModel +from .config import UNetConfig, CLIPTextModelConfig, AutoencoderConfig, DiffusionConfig +from .tokenizer import Tokenizer +from .unet import UNetModel +from .vae import Autoencoder + + +_DEFAULT_MODEL = "stabilityai/stable-diffusion-2-1-base" +_MODELS = { + # See https://huggingface.co/stabilityai/stable-diffusion-2-1-base for the model details and license + "stabilityai/stable-diffusion-2-1-base": { + "unet_config": "unet/config.json", + "unet": "unet/diffusion_pytorch_model.safetensors", + "text_encoder_config": "text_encoder/config.json", + "text_encoder": "text_encoder/model.safetensors", + "vae_config": "vae/config.json", + "vae": "vae/diffusion_pytorch_model.safetensors", + "diffusion_config": "scheduler/scheduler_config.json", + "tokenizer_vocab": "tokenizer/vocab.json", + "tokenizer_merges": "tokenizer/merges.txt", + } +} + + +def _from_numpy(x): + return mx.array(np.ascontiguousarray(x)) + + +def map_unet_weights(key, value): + # Map up/downsampling + if "downsamplers" in key: + key = key.replace("downsamplers.0.conv", "downsample") + if "upsamplers" in key: + key = key.replace("upsamplers.0.conv", "upsample") + + # Map the mid block + if "mid_block.resnets.0" in key: + key = key.replace("mid_block.resnets.0", "mid_blocks.0") + if "mid_block.attentions.0" in key: + key = key.replace("mid_block.attentions.0", "mid_blocks.1") + if "mid_block.resnets.1" in key: + key = key.replace("mid_block.resnets.1", "mid_blocks.2") + + # Map attention layers + if "to_k" in key: + key = key.replace("to_k", "key_proj") + if "to_out.0" in key: + key = key.replace("to_out.0", "out_proj") + if "to_q" in key: + key = key.replace("to_q", "query_proj") + if "to_v" in key: + key = key.replace("to_v", "value_proj") + + # Map transformer ffn + if "ff.net.2" in key: + key = key.replace("ff.net.2", "linear3") + if "ff.net.0" in key: + k1 = key.replace("ff.net.0.proj", "linear1") + k2 = key.replace("ff.net.0.proj", "linear2") + v1, v2 = np.split(value, 2) + + return [(k1, _from_numpy(v1)), (k2, _from_numpy(v2))] + + if "conv_shortcut.weight" in key: + value = value.squeeze() + + if len(value.shape) == 4: + value = value.transpose(0, 2, 3, 1) + + return [(key, _from_numpy(value))] + + +def map_clip_text_encoder_weights(key, value): + # Remove prefixes + if key.startswith("text_model."): + key = key[11:] + if key.startswith("embeddings."): + key = key[11:] + if key.startswith("encoder."): + key = key[8:] + + # Map attention layers + if "self_attn." in key: + key = key.replace("self_attn.", "attention.") + if "q_proj." in key: + key = key.replace("q_proj.", "query_proj.") + if "k_proj." in key: + key = key.replace("k_proj.", "key_proj.") + if "v_proj." in key: + key = key.replace("v_proj.", "value_proj.") + + # Map ffn layers + if "mlp.fc1" in key: + key = key.replace("mlp.fc1", "linear1") + if "mlp.fc2" in key: + key = key.replace("mlp.fc2", "linear2") + + return [(key, _from_numpy(value))] + + +def map_vae_weights(key, value): + # Map up/downsampling + if "downsamplers" in key: + key = key.replace("downsamplers.0.conv", "downsample") + if "upsamplers" in key: + key = key.replace("upsamplers.0.conv", "upsample") + + # Map attention layers + if "to_k" in key: + key = key.replace("to_k", "key_proj") + if "to_out.0" in key: + key = key.replace("to_out.0", "out_proj") + if "to_q" in key: + key = key.replace("to_q", "query_proj") + if "to_v" in key: + key = key.replace("to_v", "value_proj") + + # Map the mid block + if "mid_block.resnets.0" in key: + key = key.replace("mid_block.resnets.0", "mid_blocks.0") + if "mid_block.attentions.0" in key: + key = key.replace("mid_block.attentions.0", "mid_blocks.1") + if "mid_block.resnets.1" in key: + key = key.replace("mid_block.resnets.1", "mid_blocks.2") + + # Map the quant/post_quant layers + if "quant_conv" in key: + key = key.replace("quant_conv", "quant_proj") + value = value.squeeze() + + # Map the conv_shortcut to linear + if "conv_shortcut.weight" in key: + value = value.squeeze() + + if len(value.shape) == 4: + value = value.transpose(0, 2, 3, 1) + + return [(key, _from_numpy(value))] + + +def _flatten(params): + return [(k, v) for p in params for (k, v) in p] + + +def _load_safetensor_weights(mapper, model, weight_file, float16: bool = False): + dtype = np.float16 if float16 else np.float32 + with safetensor_open(weight_file, framework="numpy") as f: + weights = _flatten([mapper(k, f.get_tensor(k).astype(dtype)) for k in f.keys()]) + model.update(tree_unflatten(weights)) + + +def _check_key(key: str, part: str): + if key not in _MODELS: + raise ValueError( + f"[{part}] '{key}' model not found, choose one of {{{','.join(_MODELS.keys())}}}" + ) + + +def load_unet(key: str = _DEFAULT_MODEL, float16: bool = False): + """Load the stable diffusion UNet from Huggingface Hub.""" + _check_key(key, "load_unet") + + # Download the config and create the model + unet_config = _MODELS[key]["unet_config"] + with open(hf_hub_download(key, unet_config)) as f: + config = json.load(f) + + n_blocks = len(config["block_out_channels"]) + model = UNetModel( + UNetConfig( + in_channels=config["in_channels"], + out_channels=config["out_channels"], + block_out_channels=config["block_out_channels"], + layers_per_block=[config["layers_per_block"]] * n_blocks, + num_attention_heads=config["attention_head_dim"], + cross_attention_dim=[config["cross_attention_dim"]] * n_blocks, + norm_num_groups=config["norm_num_groups"], + ) + ) + + # Download the weights and map them into the model + unet_weights = _MODELS[key]["unet"] + weight_file = hf_hub_download(key, unet_weights) + _load_safetensor_weights(map_unet_weights, model, weight_file, float16) + + return model + + +def load_text_encoder(key: str = _DEFAULT_MODEL, float16: bool = False): + """Load the stable diffusion text encoder from Huggingface Hub.""" + _check_key(key, "load_text_encoder") + + # Download the config and create the model + text_encoder_config = _MODELS[key]["text_encoder_config"] + with open(hf_hub_download(key, text_encoder_config)) as f: + config = json.load(f) + + model = CLIPTextModel( + CLIPTextModelConfig( + num_layers=config["num_hidden_layers"], + model_dims=config["hidden_size"], + num_heads=config["num_attention_heads"], + max_length=config["max_position_embeddings"], + vocab_size=config["vocab_size"], + ) + ) + + # Download the weights and map them into the model + text_encoder_weights = _MODELS[key]["text_encoder"] + weight_file = hf_hub_download(key, text_encoder_weights) + _load_safetensor_weights(map_clip_text_encoder_weights, model, weight_file, float16) + + return model + + +def load_autoencoder(key: str = _DEFAULT_MODEL, float16: bool = False): + """Load the stable diffusion autoencoder from Huggingface Hub.""" + _check_key(key, "load_autoencoder") + + # Download the config and create the model + vae_config = _MODELS[key]["vae_config"] + with open(hf_hub_download(key, vae_config)) as f: + config = json.load(f) + + model = Autoencoder( + AutoencoderConfig( + in_channels=config["in_channels"], + out_channels=config["out_channels"], + latent_channels_out=2 * config["latent_channels"], + latent_channels_in=config["latent_channels"], + block_out_channels=config["block_out_channels"], + layers_per_block=config["layers_per_block"], + norm_num_groups=config["norm_num_groups"], + ) + ) + + # Download the weights and map them into the model + vae_weights = _MODELS[key]["vae"] + weight_file = hf_hub_download(key, vae_weights) + _load_safetensor_weights(map_vae_weights, model, weight_file, float16) + + return model + + +def load_diffusion_config(key: str = _DEFAULT_MODEL): + """Load the stable diffusion config from Huggingface Hub.""" + _check_key(key, "load_diffusion_config") + + diffusion_config = _MODELS[key]["diffusion_config"] + with open(hf_hub_download(key, diffusion_config)) as f: + config = json.load(f) + + return DiffusionConfig( + beta_start=config["beta_start"], + beta_end=config["beta_end"], + beta_schedule=config["beta_schedule"], + num_train_steps=config["num_train_timesteps"], + ) + + +def load_tokenizer(key: str = _DEFAULT_MODEL): + _check_key(key, "load_tokenizer") + + vocab_file = hf_hub_download(key, _MODELS[key]["tokenizer_vocab"]) + with open(vocab_file, encoding="utf-8") as f: + vocab = json.load(f) + + merges_file = hf_hub_download(key, _MODELS[key]["tokenizer_merges"]) + with open(merges_file, encoding="utf-8") as f: + bpe_merges = f.read().strip().split("\n")[1 : 49152 - 256 - 2 + 1] + bpe_merges = [tuple(m.split()) for m in bpe_merges] + bpe_ranks = dict(map(reversed, enumerate(bpe_merges))) + + return Tokenizer(bpe_ranks, vocab) diff --git a/stable_diffusion/stable_diffusion/sampler.py b/stable_diffusion/stable_diffusion/sampler.py new file mode 100644 index 00000000..0d0b47eb --- /dev/null +++ b/stable_diffusion/stable_diffusion/sampler.py @@ -0,0 +1,70 @@ +from .config import DiffusionConfig + +import mlx.core as mx + + +def _linspace(a, b, num): + x = mx.arange(0, num) / (num - 1) + return (b - a) * x + a + + +def _interp(y, x_new): + """Interpolate the function defined by (arange(0, len(y)), y) at positions x_new.""" + x_low = x_new.astype(mx.int32) + x_high = mx.minimum(x_low + 1, len(y) - 1) + + y_low = y[x_low] + y_high = y[x_high] + delta_x = x_new - x_low + y_new = y_low * (1 - delta_x) + delta_x * y_high + + return y_new + + +class SimpleEulerSampler: + """A simple Euler integrator that can be used to sample from our diffusion models. + + The method ``step()`` performs one Euler step from x_t to x_t_prev. + """ + + def __init__(self, config: DiffusionConfig): + # Compute the noise schedule + if config.beta_schedule == "linear": + betas = _linspace( + config.beta_start, config.beta_end, config.num_train_steps + ) + elif config.beta_schedule == "scaled_linear": + betas = _linspace( + config.beta_start**0.5, config.beta_end**0.5, config.num_train_steps + ).square() + else: + raise NotImplementedError(f"{config.beta_schedule} is not implemented.") + + alphas = 1 - betas + alphas_cumprod = mx.cumprod(alphas) + + self._sigmas = mx.concatenate( + [mx.zeros(1), ((1 - alphas_cumprod) / alphas_cumprod).sqrt()] + ) + + def sample_prior(self, shape, dtype=mx.float32, key=None): + noise = mx.random.normal(shape, key=key) + return (noise * self._sigmas[-1] * (self._sigmas[-1].square() + 1).rsqrt()).astype(dtype) + + def sigmas(self, t): + return _interp(self._sigmas, t) + + def timesteps(self, num_steps: int, dtype=mx.float32): + steps = _linspace(len(self._sigmas) - 1, 0, num_steps + 1).astype(dtype) + return list(zip(steps, steps[1:])) + + def step(self, eps_pred, x_t, t, t_prev): + sigma = self.sigmas(t).astype(eps_pred.dtype) + sigma_prev = self.sigmas(t_prev).astype(eps_pred.dtype) + + dt = sigma_prev - sigma + x_t_prev = (sigma.square() + 1).sqrt() * x_t + eps_pred * dt + + x_t_prev = x_t_prev * (sigma_prev.square() + 1).rsqrt() + + return x_t_prev diff --git a/stable_diffusion/stable_diffusion/tokenizer.py b/stable_diffusion/stable_diffusion/tokenizer.py new file mode 100644 index 00000000..9a4af64f --- /dev/null +++ b/stable_diffusion/stable_diffusion/tokenizer.py @@ -0,0 +1,95 @@ +import regex + + +class Tokenizer: + """A simple port of CLIPTokenizer from https://github.com/huggingface/transformers/ .""" + def __init__(self, bpe_ranks, vocab): + self.bpe_ranks = bpe_ranks + self.vocab = vocab + self.pat = regex.compile( + r"""<\|startoftext\|>|<\|endoftext\|>|'s|'t|'re|'ve|'m|'ll|'d|[\p{L}]+|[\p{N}]|[^\s\p{L}\p{N}]+""", + regex.IGNORECASE, + ) + + self._cache = {self.bos: self.bos, self.eos: self.eos} + + @property + def bos(self): + return "<|startoftext|>" + + @property + def bos_token(self): + return self.vocab[self.bos] + + @property + def eos(self): + return "<|endoftext|>" + + @property + def eos_token(self): + return self.vocab[self.eos] + + def bpe(self, text): + if text in self._cache: + return self._cache[text] + + unigrams = list(text[:-1]) + [text[-1] + ""] + unique_bigrams = set(zip(unigrams, unigrams[1:])) + + if not unique_bigrams: + return unigrams + + # In every iteration try to merge the two most likely bigrams. If none + # was merged we are done. + # + # Ported from https://github.com/huggingface/transformers/blob/main/src/transformers/models/clip/tokenization_clip.py + while unique_bigrams: + bigram = min(unique_bigrams, key=lambda pair: self.bpe_ranks.get(pair, float("inf"))) + if bigram not in self.bpe_ranks: + break + + new_unigrams = [] + skip = False + for a, b in zip(unigrams, unigrams[1:]): + if skip: + skip = False + continue + + if (a, b) == bigram: + new_unigrams.append(a + b) + skip = True + + else: + new_unigrams.append(a) + + if not skip: + new_unigrams.append(b) + + unigrams = new_unigrams + unique_bigrams = set(zip(unigrams, unigrams[1:])) + + self._cache[text] = unigrams + + return unigrams + + def tokenize(self, text, prepend_bos=True, append_eos=True): + if isinstance(text, list): + return [self.tokenize(t, prepend_bos, append_eos) for t in text] + + # Lower case cleanup and split according to self.pat. Huggingface does + # a much more thorough job here but this should suffice for 95% of + # cases. + clean_text = regex.sub(r"\s+", " ", text.lower()) + tokens = regex.findall(self.pat, clean_text) + + # Split the tokens according to the byte-pair merge file + bpe_tokens = [ti for t in tokens for ti in self.bpe(t)] + + # Map to token ids and return + tokens = [self.vocab[t] for t in bpe_tokens] + if prepend_bos: + tokens = [self.bos_token] + tokens + if append_eos: + tokens.append(self.eos_token) + + return tokens diff --git a/stable_diffusion/stable_diffusion/unet.py b/stable_diffusion/stable_diffusion/unet.py new file mode 100644 index 00000000..eb8b97dd --- /dev/null +++ b/stable_diffusion/stable_diffusion/unet.py @@ -0,0 +1,423 @@ +import math +from typing import Optional + +import mlx.core as mx +import mlx.nn as nn + +from .config import UNetConfig + + +def upsample_nearest(x, scale: int = 2): + B, H, W, C = x.shape + x = mx.broadcast_to(x[:, :, None, :, None, :], (B, H, scale, W, scale, C)) + x = x.reshape(B, H * scale, W * scale, C) + + return x + + +class TimestepEmbedding(nn.Module): + def __init__(self, in_channels: int, time_embed_dim: int): + super().__init__() + + self.linear_1 = nn.Linear(in_channels, time_embed_dim) + self.linear_2 = nn.Linear(time_embed_dim, time_embed_dim) + + def __call__(self, x): + x = self.linear_1(x) + x = nn.silu(x) + x = self.linear_2(x) + + return x + + +class TransformerBlock(nn.Module): + def __init__( + self, + model_dims: int, + num_heads: int, + hidden_dims: Optional[int] = None, + memory_dims: Optional[int] = None, + ): + super().__init__() + + self.norm1 = nn.LayerNorm(model_dims) + self.attn1 = nn.MultiHeadAttention(model_dims, num_heads) + self.attn1.out_proj.bias = mx.zeros(model_dims) + + memory_dims = memory_dims or model_dims + self.norm2 = nn.LayerNorm(model_dims) + self.attn2 = nn.MultiHeadAttention( + model_dims, num_heads, key_input_dims=memory_dims + ) + self.attn2.out_proj.bias = mx.zeros(model_dims) + + hidden_dims = hidden_dims or 4 * model_dims + self.norm3 = nn.LayerNorm(model_dims) + self.linear1 = nn.Linear(model_dims, hidden_dims) + self.linear2 = nn.Linear(model_dims, hidden_dims) + self.linear3 = nn.Linear(hidden_dims, model_dims) + + def __call__(self, x, memory, attn_mask, memory_mask): + # Self attention + y = self.norm1(x) + y = self.attn1(y, y, y, attn_mask) + x = x + y + + # Cross attention + y = self.norm2(x) + y = self.attn2(y, memory, memory, memory_mask) + x = x + y + + # FFN + y = self.norm3(x) + y_a = self.linear1(y) + y_b = self.linear2(y) + y = y_a * nn.gelu_approx(y_b) # approximate gelu? + y = self.linear3(y) + x = x + y + + return x + + +class Transformer2D(nn.Module): + """A transformer model for inputs with 2 spatial dimensions.""" + + def __init__( + self, + in_channels: int, + model_dims: int, + encoder_dims: int, + num_heads: int, + num_layers: int = 1, + norm_num_groups: int = 32, + ): + super().__init__() + + self.norm = nn.GroupNorm(norm_num_groups, in_channels, pytorch_compatible=True) + self.proj_in = nn.Linear(in_channels, model_dims) + self.transformer_blocks = [ + TransformerBlock(model_dims, num_heads, memory_dims=encoder_dims) + for i in range(num_layers) + ] + self.proj_out = nn.Linear(model_dims, in_channels) + + def __call__(self, x, encoder_x, attn_mask, encoder_attn_mask): + # Save the input to add to the output + input_x = x + + # Perform the input norm and projection + B, H, W, C = x.shape + x = self.norm(x).reshape(B, -1, C) + x = self.proj_in(x) + + # Apply the transformer + for block in self.transformer_blocks: + x = block(x, encoder_x, attn_mask, encoder_attn_mask) + + # Apply the output projection and reshape + x = self.proj_out(x) + x = x.reshape(B, H, W, C) + + return x + input_x + + +class ResnetBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + out_channels: Optional[int] = None, + groups: int = 32, + temb_channels: Optional[int] = None, + ): + super().__init__() + + out_channels = out_channels or in_channels + + self.norm1 = nn.GroupNorm(groups, in_channels, pytorch_compatible=True) + self.conv1 = nn.Conv2d( + in_channels, out_channels, kernel_size=3, stride=1, padding=1 + ) + if temb_channels is not None: + self.time_emb_proj = nn.Linear(temb_channels, out_channels) + self.norm2 = nn.GroupNorm(groups, out_channels, pytorch_compatible=True) + self.conv2 = nn.Conv2d( + out_channels, out_channels, kernel_size=3, stride=1, padding=1 + ) + + if in_channels != out_channels: + self.conv_shortcut = nn.Linear(in_channels, out_channels) + + def __call__(self, x, temb=None): + if temb is not None: + temb = self.time_emb_proj(nn.silu(temb)) + + y = self.norm1(x) + y = nn.silu(y) + y = self.conv1(y) + if temb is not None: + y = y + temb[:, None, None, :] + y = self.norm2(y) + y = nn.silu(y) + y = self.conv2(y) + + x = y + (x if "conv_shortcut" not in self else self.conv_shortcut(x)) + + return x + + +class UNetBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + out_channels: int, + temb_channels: int, + prev_out_channels: Optional[int] = None, + num_layers: int = 1, + transformer_layers_per_block: int = 1, + num_attention_heads: int = 8, + cross_attention_dim=1280, + resnet_groups: int = 32, + add_downsample=True, + add_upsample=True, + add_cross_attention=True, + ): + super().__init__() + + # Prepare the in channels list for the resnets + if prev_out_channels is None: + in_channels_list = [in_channels] + [out_channels] * (num_layers - 1) + else: + in_channels_list = [prev_out_channels] + [out_channels] * (num_layers - 1) + res_channels_list = [out_channels] * (num_layers - 1) + [in_channels] + in_channels_list = [ + a + b for a, b in zip(in_channels_list, res_channels_list) + ] + + # Add resnet blocks that also process the time embedding + self.resnets = [ + ResnetBlock2D( + in_channels=ic, + out_channels=out_channels, + temb_channels=temb_channels, + groups=resnet_groups, + ) + for ic in in_channels_list + ] + + # Add optional cross attention layers + if add_cross_attention: + self.attentions = [ + Transformer2D( + in_channels=out_channels, + model_dims=out_channels, + num_heads=num_attention_heads, + num_layers=transformer_layers_per_block, + encoder_dims=cross_attention_dim, + ) + for i in range(num_layers) + ] + + # Add an optional downsampling layer + if add_downsample: + self.downsample = nn.Conv2d( + out_channels, out_channels, kernel_size=3, stride=2, padding=1 + ) + + # or upsampling layer + if add_upsample: + self.upsample = nn.Conv2d( + out_channels, out_channels, kernel_size=3, stride=1, padding=1 + ) + + def __call__( + self, + x, + encoder_x=None, + temb=None, + attn_mask=None, + encoder_attn_mask=None, + residual_hidden_states=None, + ): + output_states = [] + + for i in range(len(self.resnets)): + if residual_hidden_states is not None: + x = mx.concatenate([x, residual_hidden_states.pop()], axis=-1) + + x = self.resnets[i](x, temb) + + if "attentions" in self: + x = self.attentions[i](x, encoder_x, attn_mask, encoder_attn_mask) + + output_states.append(x) + + if "downsample" in self: + x = self.downsample(x) + output_states.append(x) + + if "upsample" in self: + x = self.upsample(upsample_nearest(x)) + output_states.append(x) + + return x, output_states + + +class UNetModel(nn.Module): + """The conditional 2D UNet model that actually performs the denoising.""" + + def __init__(self, config: UNetConfig): + super().__init__() + + self.conv_in = nn.Conv2d( + config.in_channels, + config.block_out_channels[0], + config.conv_in_kernel, + padding=(config.conv_in_kernel - 1) // 2, + ) + + self.timesteps = nn.SinusoidalPositionalEncoding( + config.block_out_channels[0], + max_freq=1, + min_freq=math.exp( + -math.log(10000) + 2 * math.log(10000) / config.block_out_channels[0] + ), + scale=1.0, + cos_first=True, + full_turns=False, + ) + self.time_embedding = TimestepEmbedding( + config.block_out_channels[0], + config.block_out_channels[0] * 4, + ) + + # Make the downsampling blocks + block_channels = [config.block_out_channels[0]] + list( + config.block_out_channels + ) + self.down_blocks = [ + UNetBlock2D( + in_channels=in_channels, + out_channels=out_channels, + temb_channels=config.block_out_channels[0] * 4, + num_layers=config.layers_per_block[i], + transformer_layers_per_block=config.transformer_layers_per_block[i], + num_attention_heads=config.num_attention_heads[i], + cross_attention_dim=config.cross_attention_dim[i], + resnet_groups=config.norm_num_groups, + add_downsample=(i < len(config.block_out_channels) - 1), + add_upsample=False, + add_cross_attention=(i < len(config.block_out_channels) - 1), + ) + for i, (in_channels, out_channels) in enumerate( + zip(block_channels, block_channels[1:]) + ) + ] + + # Make the middle block + self.mid_blocks = [ + ResnetBlock2D( + in_channels=config.block_out_channels[-1], + out_channels=config.block_out_channels[-1], + temb_channels=config.block_out_channels[0] * 4, + groups=config.norm_num_groups, + ), + Transformer2D( + in_channels=config.block_out_channels[-1], + model_dims=config.block_out_channels[-1], + num_heads=config.num_attention_heads[-1], + num_layers=config.transformer_layers_per_block[-1], + encoder_dims=config.cross_attention_dim[-1], + ), + ResnetBlock2D( + in_channels=config.block_out_channels[-1], + out_channels=config.block_out_channels[-1], + temb_channels=config.block_out_channels[0] * 4, + groups=config.norm_num_groups, + ), + ] + + # Make the upsampling blocks + block_channels = ( + [config.block_out_channels[0]] + + list(config.block_out_channels) + + [config.block_out_channels[-1]] + ) + self.up_blocks = [ + UNetBlock2D( + in_channels=in_channels, + out_channels=out_channels, + temb_channels=config.block_out_channels[0] * 4, + prev_out_channels=prev_out_channels, + num_layers=config.layers_per_block[i] + 1, + transformer_layers_per_block=config.transformer_layers_per_block[i], + num_attention_heads=config.num_attention_heads[i], + cross_attention_dim=config.cross_attention_dim[i], + resnet_groups=config.norm_num_groups, + add_downsample=False, + add_upsample=(i > 0), + add_cross_attention=(i < len(config.block_out_channels) - 1), + ) + for i, (in_channels, out_channels, prev_out_channels) in reversed( + list( + enumerate( + zip(block_channels, block_channels[1:], block_channels[2:]) + ) + ) + ) + ] + + self.conv_norm_out = nn.GroupNorm( + config.norm_num_groups, + config.block_out_channels[0], + pytorch_compatible=True, + ) + self.conv_out = nn.Conv2d( + config.block_out_channels[0], + config.out_channels, + config.conv_out_kernel, + padding=(config.conv_out_kernel - 1) // 2, + ) + + def __call__(self, x, timestep, encoder_x, attn_mask=None, encoder_attn_mask=None): + + # Compute the time embeddings + temb = self.timesteps(timestep).astype(x.dtype) + temb = self.time_embedding(temb) + + # Preprocess the input + x = self.conv_in(x) + + # Run the downsampling part of the unet + residuals = [x] + for block in self.down_blocks: + x, res = block( + x, + encoder_x=encoder_x, + temb=temb, + attn_mask=attn_mask, + encoder_attn_mask=encoder_attn_mask, + ) + residuals.extend(res) + + # Run the middle part of the unet + x = self.mid_blocks[0](x, temb) + x = self.mid_blocks[1](x, encoder_x, attn_mask, encoder_attn_mask) + x = self.mid_blocks[2](x, temb) + + # Run the upsampling part of the unet + for block in self.up_blocks: + x, _ = block( + x, + encoder_x=encoder_x, + temb=temb, + attn_mask=attn_mask, + encoder_attn_mask=encoder_attn_mask, + residual_hidden_states=residuals, + ) + + # Postprocess the output + x = self.conv_norm_out(x) + x = nn.silu(x) + x = self.conv_out(x) + + return x diff --git a/stable_diffusion/stable_diffusion/vae.py b/stable_diffusion/stable_diffusion/vae.py new file mode 100644 index 00000000..9d2bd6bc --- /dev/null +++ b/stable_diffusion/stable_diffusion/vae.py @@ -0,0 +1,266 @@ +import math +from typing import List + +import mlx.core as mx +import mlx.nn as nn + +from .config import AutoencoderConfig +from .unet import ResnetBlock2D, upsample_nearest + + +class Attention(nn.Module): + """A single head unmasked attention for use with the VAE.""" + + def __init__(self, dims: int, norm_groups: int = 32): + super().__init__() + + self.group_norm = nn.GroupNorm(norm_groups, dims, pytorch_compatible=True) + self.query_proj = nn.Linear(dims, dims) + self.key_proj = nn.Linear(dims, dims) + self.value_proj = nn.Linear(dims, dims) + self.out_proj = nn.Linear(dims, dims) + + def __call__(self, x): + B, H, W, C = x.shape + + y = self.group_norm(x) + + queries = self.query_proj(y).reshape(B, H * W, C) + keys = self.key_proj(y).reshape(B, H * W, C) + values = self.value_proj(y).reshape(B, H * W, C) + + scale = 1 / math.sqrt(queries.shape[-1]) + scores = (queries * scale) @ keys.transpose(0, 2, 1) + attn = mx.softmax(scores, axis=-1) + y = (attn @ values).reshape(B, H, W, C) + + y = self.out_proj(y) + x = x + y + + return x + + +class EncoderDecoderBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + out_channels: int, + num_layers: int = 1, + resnet_groups: int = 32, + add_downsample=True, + add_upsample=True, + ): + super().__init__() + + # Add the resnet blocks + self.resnets = [ + ResnetBlock2D( + in_channels=in_channels if i == 0 else out_channels, + out_channels=out_channels, + groups=resnet_groups, + ) + for i in range(num_layers) + ] + + # Add an optional downsampling layer + if add_downsample: + self.downsample = nn.Conv2d( + out_channels, out_channels, kernel_size=3, stride=2, padding=1 + ) + + # or upsampling layer + if add_upsample: + self.upsample = nn.Conv2d( + out_channels, out_channels, kernel_size=3, stride=1, padding=1 + ) + + def __call__(self, x): + for resnet in self.resnets: + x = resnet(x) + + if "downsample" in self: + x = self.downsample(x) + + if "upsample" in self: + x = self.upsample(upsample_nearest(x)) + + return x + + +class Encoder(nn.Module): + """Implements the encoder side of the Autoencoder.""" + + def __init__( + self, + in_channels: int, + out_channels: int, + block_out_channels: List[int] = [64], + layers_per_block: int = 2, + resnet_groups: int = 32, + ): + super().__init__() + + self.conv_in = nn.Conv2d( + in_channels, block_out_channels[0], kernel_size=3, stride=1, padding=1 + ) + + channels = [block_out_channels[0]] + list(block_out_channels) + self.down_blocks = [ + EncoderDecoderBlock2D( + in_channels, + out_channels, + num_layers=layers_per_block, + resnet_groups=resnet_groups, + add_downsample=i < len(block_out_channels) - 1, + add_upsample=False, + ) + for i, (in_channels, out_channels) in enumerate(zip(channels, channels[1:])) + ] + + self.mid_blocks = [ + ResnetBlock2D( + in_channels=block_out_channels[-1], + out_channels=block_out_channels[-1], + groups=resnet_groups, + ), + Attention(block_out_channels[-1], resnet_groups), + ResnetBlock2D( + in_channels=block_out_channels[-1], + out_channels=block_out_channels[-1], + groups=resnet_groups, + ), + ] + + self.conv_norm_out = nn.GroupNorm( + resnet_groups, block_out_channels[-1], pytorch_compatible=True + ) + self.conv_out = nn.Conv2d(block_out_channels[-1], out_channels, 3, padding=1) + + def __call__(self, x): + x = self.conv_in(x) + + for l in self.down_blocks: + x = l(x) + + x = self.mid_blocks[0](x) + x = self.mid_blocks[1](x) + x = self.mid_blocks[2](x) + + x = self.conv_norm_out(x) + x = nn.silu(x) + x = self.conv_out(x) + + return x + + +class Decoder(nn.Module): + """Implements the decoder side of the Autoencoder.""" + + def __init__( + self, + in_channels: int, + out_channels: int, + block_out_channels: List[int] = [64], + layers_per_block: int = 2, + resnet_groups: int = 32, + ): + super().__init__() + + self.conv_in = nn.Conv2d( + in_channels, block_out_channels[-1], kernel_size=3, stride=1, padding=1 + ) + + self.mid_blocks = [ + ResnetBlock2D( + in_channels=block_out_channels[-1], + out_channels=block_out_channels[-1], + groups=resnet_groups, + ), + Attention(block_out_channels[-1], resnet_groups), + ResnetBlock2D( + in_channels=block_out_channels[-1], + out_channels=block_out_channels[-1], + groups=resnet_groups, + ), + ] + + channels = list(reversed(block_out_channels)) + channels = [channels[0]] + channels + self.up_blocks = [ + EncoderDecoderBlock2D( + in_channels, + out_channels, + num_layers=layers_per_block, + resnet_groups=resnet_groups, + add_downsample=False, + add_upsample=i < len(block_out_channels) - 1, + ) + for i, (in_channels, out_channels) in enumerate(zip(channels, channels[1:])) + ] + + self.conv_norm_out = nn.GroupNorm( + resnet_groups, block_out_channels[0], pytorch_compatible=True + ) + self.conv_out = nn.Conv2d(block_out_channels[0], out_channels, 3, padding=1) + + def __call__(self, x): + x = self.conv_in(x) + + x = self.mid_blocks[0](x) + x = self.mid_blocks[1](x) + x = self.mid_blocks[2](x) + + for l in self.up_blocks: + x = l(x) + + x = self.conv_norm_out(x) + x = nn.silu(x) + x = self.conv_out(x) + + return x + + +class Autoencoder(nn.Module): + """The autoencoder that allows us to perform diffusion in the latent space.""" + + def __init__(self, config: AutoencoderConfig): + super().__init__() + + self.latent_channels = config.latent_channels_in + self.scaling_factor = config.scaling_factor + self.encoder = Encoder( + config.in_channels, + config.latent_channels_out, + config.block_out_channels, + config.layers_per_block, + resnet_groups=config.norm_num_groups, + ) + self.decoder = Decoder( + config.latent_channels_in, + config.out_channels, + config.block_out_channels, + config.layers_per_block + 1, + resnet_groups=config.norm_num_groups, + ) + + self.quant_proj = nn.Linear( + config.latent_channels_out, config.latent_channels_out + ) + self.post_quant_proj = nn.Linear( + config.latent_channels_in, config.latent_channels_in + ) + + def decode(self, z): + return self.decoder(self.post_quant_proj(z)) + + def __call__(self, x, key=None): + x = self.encoder(x) + x = self.query_proj(x) + + mean, logvar = x.split(2, axis=-1) + std = mx.exp(0.5 * logvar) + z = mx.random.normal(mean.shape, key=key) * std + mean + + x_hat = self.decode(z) + + return dict(x_hat=x_hat, z=z, mean=mean, logvar=logvar) diff --git a/stable_diffusion/txt2image.py b/stable_diffusion/txt2image.py new file mode 100644 index 00000000..a92d6687 --- /dev/null +++ b/stable_diffusion/txt2image.py @@ -0,0 +1,55 @@ +import argparse +from PIL import Image +from tqdm import tqdm + +import mlx.core as mx + +from stable_diffusion import StableDiffusion + + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description="Generate images from a textual prompt using stable diffusion" + ) + parser.add_argument("prompt") + parser.add_argument("--n_images", type=int, default=4) + parser.add_argument("--steps", type=int, default=50) + parser.add_argument("--cfg", type=float, default=7.5) + parser.add_argument("--negative_prompt", default="") + parser.add_argument("--n_rows", type=int, default=1) + parser.add_argument("--decoding_batch_size", type=int, default=1) + parser.add_argument("--output", default="out.png") + args = parser.parse_args() + + sd = StableDiffusion() + + # Generate the latent vectors using diffusion + latents = sd.generate_latents( + args.prompt, + n_images=args.n_images, + cfg_weight=args.cfg, + num_steps=args.steps, + negative_text=args.negative_prompt, + ) + for x_t in tqdm(latents, total=args.steps): + mx.simplify(x_t) + mx.simplify(x_t) + mx.eval(x_t) + + # Decode them into images + decoded = [] + for i in tqdm(range(0, args.n_images, args.decoding_batch_size)): + decoded.append(sd.decode(x_t[i : i + args.decoding_batch_size])) + mx.eval(decoded[-1]) + + # Arrange them on a grid + x = mx.concatenate(decoded, axis=0) + x = mx.pad(x, [(0, 0), (8, 8), (8, 8), (0, 0)]) + B, H, W, C = x.shape + x = x.reshape(args.n_rows, B // args.n_rows, H, W, C).transpose(0, 2, 1, 3, 4) + x = x.reshape(args.n_rows * H, B // args.n_rows * W, C) + x = (x * 255).astype(mx.uint8) + + # Save them to disc + im = Image.fromarray(x.__array__()) + im.save(args.output)