Spaces:
Running
on
Zero
Running
on
Zero
# DreamBooth training example for HiDream Image | |
[DreamBooth](https://huggingface.co/papers/2208.12242) is a method to personalize text2image models like stable diffusion given just a few (3~5) images of a subject. | |
The `train_dreambooth_lora_hidream.py` script shows how to implement the training procedure with [LoRA](https://huggingface.co/docs/peft/conceptual_guides/adapter#low-rank-adaptation-lora) and adapt it for [HiDream Image](https://huggingface.co/docs/diffusers/main/en/api/pipelines/). | |
This will also allow us to push the trained model parameters to the Hugging Face Hub platform. | |
## Running locally with PyTorch | |
### Installing the dependencies | |
Before running the scripts, make sure to install the library's training dependencies: | |
**Important** | |
To make sure you can successfully run the latest versions of the example scripts, we highly recommend **installing from source** and keeping the install up to date as we update the example scripts frequently and install some example-specific requirements. To do this, execute the following steps in a new virtual environment: | |
```bash | |
git clone https://github.com/huggingface/diffusers | |
cd diffusers | |
pip install -e . | |
``` | |
Then cd in the `examples/dreambooth` folder and run | |
```bash | |
pip install -r requirements_hidream.txt | |
``` | |
And initialize an [🤗Accelerate](https://github.com/huggingface/accelerate/) environment with: | |
```bash | |
accelerate config | |
``` | |
Or for a default accelerate configuration without answering questions about your environment | |
```bash | |
accelerate config default | |
``` | |
Or if your environment doesn't support an interactive shell (e.g., a notebook) | |
```python | |
from accelerate.utils import write_basic_config | |
write_basic_config() | |
``` | |
When running `accelerate config`, if we specify torch compile mode to True there can be dramatic speedups. | |
Note also that we use PEFT library as backend for LoRA training, make sure to have `peft>=0.14.0` installed in your environment. | |
### 3d icon example | |
For this example we will use some 3d icon images: https://huggingface.co/datasets/linoyts/3d_icon. | |
This will also allow us to push the trained LoRA parameters to the Hugging Face Hub platform. | |
Now, we can launch training using: | |
> [!NOTE] | |
> The following training configuration prioritizes lower memory consumption by using gradient checkpointing, | |
> 8-bit Adam optimizer, latent caching, offloading, no validation. | |
> all text embeddings are pre-computed to save memory. | |
```bash | |
export MODEL_NAME="HiDream-ai/HiDream-I1-Dev" | |
export INSTANCE_DIR="linoyts/3d_icon" | |
export OUTPUT_DIR="trained-hidream-lora" | |
accelerate launch train_dreambooth_lora_hidream.py \ | |
--pretrained_model_name_or_path=$MODEL_NAME \ | |
--dataset_name=$INSTANCE_DIR \ | |
--output_dir=$OUTPUT_DIR \ | |
--mixed_precision="bf16" \ | |
--instance_prompt="3d icon" \ | |
--caption_column="prompt"\ | |
--validation_prompt="a 3dicon, a llama eating ramen" \ | |
--resolution=1024 \ | |
--train_batch_size=1 \ | |
--gradient_accumulation_steps=4 \ | |
--use_8bit_adam \ | |
--rank=8 \ | |
--learning_rate=2e-4 \ | |
--report_to="wandb" \ | |
--lr_scheduler="constant_with_warmup" \ | |
--lr_warmup_steps=100 \ | |
--max_train_steps=1000 \ | |
--cache_latents\ | |
--gradient_checkpointing \ | |
--validation_epochs=25 \ | |
--seed="0" \ | |
--push_to_hub | |
``` | |
For using `push_to_hub`, make you're logged into your Hugging Face account: | |
```bash | |
huggingface-cli login | |
``` | |
To better track our training experiments, we're using the following flags in the command above: | |
* `report_to="wandb` will ensure the training runs are tracked on [Weights and Biases](https://wandb.ai/site). To use it, be sure to install `wandb` with `pip install wandb`. Don't forget to call `wandb login <your_api_key>` before training if you haven't done it before. | |
* `validation_prompt` and `validation_epochs` to allow the script to do a few validation inference runs. This allows us to qualitatively check if the training is progressing as expected. | |
## Notes | |
Additionally, we welcome you to explore the following CLI arguments: | |
* `--lora_layers`: The transformer modules to apply LoRA training on. Please specify the layers in a comma separated. E.g. - "to_k,to_q,to_v" will result in lora training of attention layers only. | |
* `--rank`: The rank of the LoRA layers. The higher the rank, the more parameters are trained. The default is 16. | |
We provide several options for optimizing memory optimization: | |
* `--offload`: When enabled, we will offload the text encoder and VAE to CPU, when they are not used. | |
* `cache_latents`: When enabled, we will pre-compute the latents from the input images with the VAE and remove the VAE from memory once done. | |
* `--use_8bit_adam`: When enabled, we will use the 8bit version of AdamW provided by the `bitsandbytes` library. | |
Refer to the [official documentation](https://huggingface.co/docs/diffusers/main/en/api/pipelines/) of the `HiDreamImagePipeline` to know more about the model. | |
## Using quantization | |
You can quantize the base model with [`bitsandbytes`](https://huggingface.co/docs/bitsandbytes/index) to reduce memory usage. To do so, pass a JSON file path to `--bnb_quantization_config_path`. This file should hold the configuration to initialize `BitsAndBytesConfig`. Below is an example JSON file: | |
```json | |
{ | |
"load_in_4bit": true, | |
"bnb_4bit_quant_type": "nf4" | |
} | |
``` | |
Below, we provide some numbers with and without the use of NF4 quantization when training: | |
``` | |
(with quantization) | |
Memory (before device placement): 9.085089683532715 GB. | |
Memory (after device placement): 34.59585428237915 GB. | |
Memory (after backward): 36.90267467498779 GB. | |
(without quantization) | |
Memory (before device placement): 0.0 GB. | |
Memory (after device placement): 57.6400408744812 GB. | |
Memory (after backward): 59.932212829589844 GB. | |
``` | |
The reason why we see some memory before device placement in the case of quantization is because, by default bnb quantized models are placed on the GPU first. |