Skip to content

Guia de Início Rápido do HiDream

Neste exemplo, vamos treinar um Lycoris LoKr para HiDream, na esperança de termos memória suficiente para isso.

Uma GPU de 24G provavelmente é o mínimo viável sem offload extensivo de blocos e fused backward pass. Um Lycoris LoKr funciona tão bem quanto!

Requisitos de hardware

O HiDream tem 17B de parâmetros no total, com ~8B ativos a qualquer momento usando um gate MoE aprendido para distribuir o trabalho. Ele usa quatro text encoders e o VAE do Flux.

No geral, o modelo sofre com complexidade arquitetural e parece ser um derivado do Flux Dev, seja por destilação direta ou por fine-tuning contínuo, evidente em algumas amostras de validação que parecem compartilhar os mesmos pesos.

Pré-requisitos

Certifique-se de que você tenha Python instalado; o SimpleTuner funciona bem com 3.10 até 3.12.

Você pode verificar executando:

python --version

Se você não tem Python 3.12 instalado no Ubuntu, pode tentar o seguinte:

apt -y install python3.13 python3.13-venv

Dependências da imagem de contêiner

Para Vast, RunPod e TensorDock (entre outros), o seguinte funciona em uma imagem CUDA 12.2-12.8 para habilitar a compilação de extensões CUDA:

apt -y install nvidia-cuda-toolkit

Instalação

Instale o SimpleTuner via pip:

pip install 'simpletuner[cuda]'

# CUDA 13 / Blackwell users (NVIDIA B-series GPUs)
pip install 'simpletuner[cuda13]' --extra-index-url https://download.pytorch.org/whl/cu130

Para instalação manual ou setup de desenvolvimento, veja a documentação de instalação.

Configurando o ambiente

Para rodar o SimpleTuner, você precisará configurar um arquivo de configuração, os diretórios de dataset e modelo, e um arquivo de configuração do dataloader.

Arquivo de configuração

Um script experimental, configure.py, pode permitir que você pule esta seção inteiramente por meio de uma configuração interativa passo a passo. Ele contém alguns recursos de segurança que ajudam a evitar armadilhas comuns.

Nota: Isso não configura seu dataloader. Você ainda terá que fazer isso manualmente, mais tarde.

Para executá-lo:

simpletuner configure

⚠️ Para usuários localizados em países onde o Hugging Face Hub não é facilmente acessível, você deve adicionar HF_ENDPOINT=https://hf-mirror.com ao seu ~/.bashrc ou ~/.zshrc dependendo de qual $SHELL seu sistema usa.

Se você preferir configurar manualmente:

Copie config/config.json.example para config/config.json:

cp config/config.json.example config/config.json

Lá, você possivelmente precisará modificar as seguintes variáveis:

  • model_type - Defina como lora.
  • lora_type - Defina como lycoris.
  • model_family - Defina como hidream.
  • model_flavour - Defina como full, porque dev foi destilado de um jeito que não é facilmente treinável diretamente, a menos que você queira ir até o fim e quebrar sua destilação.
  • Na verdade, o modelo full também é difícil de treinar, mas é o único que não foi destilado.
  • output_dir - Defina o diretório onde deseja armazenar seus checkpoints e imagens de validação. É recomendado usar um caminho completo aqui.
  • train_batch_size - 1, talvez?.
  • validation_resolution - Defina como 1024x1024 ou uma das outras resoluções suportadas pelo HiDream.
  • Outras resoluções podem ser especificadas separando por vírgulas: 1024x1024,1280x768,2048x2048
  • validation_guidance - Use qualquer valor que você costuma selecionar em inferência para HiDream; um valor mais baixo em torno de 2.5-3.0 gera resultados mais realistas
  • validation_num_inference_steps - Use algo em torno de 30
  • use_ema - Definir como true ajuda muito a obter um resultado mais suavizado junto com o seu checkpoint principal.

  • optimizer - Você pode usar qualquer otimizador que conheça e com o qual se sinta confortável, mas usaremos optimi-lion neste exemplo.

  • mixed_precision - É recomendado definir como bf16 para a configuração de treinamento mais eficiente, ou no (mas consumirá mais memória e será mais lento).
  • gradient_checkpointing - Desativar isso será o mais rápido, mas limita seus tamanhos de batch. É necessário habilitar isso para obter o menor uso de VRAM.

Algumas opções avançadas do HiDream podem ser definidas para incluir loss auxiliar de MoE durante o treinamento. Ao adicionar a loss MoE, o valor será naturalmente muito mais alto do que o normal.

  • hidream_use_load_balancing_loss - Defina como true para habilitar a loss de balanceamento de carga.
  • hidream_load_balancing_loss_weight - Esta é a magnitude da loss auxiliar. Um valor de 0.01 é o padrão, mas você pode definir 0.1 ou 0.2 para um treinamento mais agressivo.

O impacto dessas opções é atualmente desconhecido.

Seu config.json ficará parecido com o meu no final:

Ver exemplo de configuração
{
    "validation_torch_compile": "false",
    "validation_step_interval": 200,
    "validation_seed": 42,
    "validation_resolution": "1024x1024",
    "validation_prompt": "A photo-realistic image of a cat",
    "validation_num_inference_steps": "20",
    "validation_guidance": 3.0,
    "validation_guidance_rescale": "0.0",
    "vae_batch_size": 1,
    "train_batch_size": 1,
    "tracker_run_name": "eval_loss_test1",
    "seed": 42,
    "resume_from_checkpoint": "latest",
    "resolution": 1024,
    "resolution_type": "pixel_area",
    "report_to": "tensorboard",
    "output_dir": "output/models-hidream",
    "optimizer": "optimi-lion",
    "num_train_epochs": 0,
    "num_eval_images": 1,
    "model_type": "lora",
    "model_family": "hidream",
    "offload_during_startup": true,
    "mixed_precision": "bf16",
    "minimum_image_size": 0,
    "max_train_steps": 10000,
    "max_grad_norm": 0.01,
    "lycoris_config": "config/lycoris_config.json",
    "lr_warmup_steps": 100,
    "lr_scheduler": "constant_with_warmup",
    "lora_type": "lycoris",
    "learning_rate": "4e-5",
    "gradient_checkpointing": "true",
    "grad_clip_method": "value",
    "eval_steps_interval": 100,
    "disable_benchmark": false,
    "data_backend_config": "config/hidream/multidatabackend.json",
    "checkpoints_total_limit": 5,
    "checkpoint_step_interval": 500,
    "caption_dropout_probability": 0.0,
    "base_model_precision": "int8-quanto",
    "text_encoder_3_precision": "int8-quanto",
    "text_encoder_4_precision": "int8-quanto",
    "aspect_bucket_rounding": 2
}

ℹ️ Usuários multi-GPU podem consultar este documento para informações sobre como configurar o número de GPUs a usar.

ℹ️ Esta configuração define os níveis de precisão dos text encoders T5 (#3) e Llama (#4) para int8 para economizar memória em placas de 24G. Você pode remover essas opções ou defini-las como no_change se tiver mais memória disponível.

E um arquivo simples config/lycoris_config.json - note que o FeedForward pode ser removido para maior estabilidade de treinamento.

Ver exemplo de configuração
{
    "algo": "lokr",
    "multiplier": 1.0,
    "linear_dim": 16384,
    "linear_alpha": 1,
    "full_matrix": true,
    "use_scalar": true,
    "factor": 16,
    "apply_preset": {
        "target_module": [
            "Attention",
        ],
        "module_algo_map": {
            "Attention": {
                "factor": 16
            },
        }
    }
}

Definir "use_scalar": true em config/lycoris_config.json ou definir "init_lokr_norm": 1e-4 em config/config.json vai acelerar o treinamento consideravelmente. Habilitar ambos parece desacelerar o treinamento levemente. Observe que definir init_lokr_norm vai alterar levemente as imagens de validação no step 0.

Adicionar o módulo FeedForward ao config/lycoris_config.json treinará um número muito maior de parâmetros, incluindo todos os experts. Treinar os experts parece ser bem difícil, porém.

Uma opção mais fácil é treinar apenas os parâmetros de feed forward fora dos experts usando o seguinte arquivo config/lycoris_config.json.

Ver exemplo de configuração
{
    "algo": "lokr",
    "multiplier": 1.0,
    "linear_dim": 16384,
    "linear_alpha": 1,
    "full_matrix": true,
    "use_scalar": true,
    "factor": 16,
    "apply_preset": {
        "name_algo_map": {
            "double_stream_blocks.*.block.attn*": {
                "factor": 16
            },
            "double_stream_blocks.*.block.ff_t*": {
                "factor": 16
            },
            "double_stream_blocks.*.block.ff_i.shared_experts*": {
                "factor": 16
            },
            "single_stream_blocks.*.block.attn*": {
                "factor": 16
            },
            "single_stream_blocks.*.block.ff_i.shared_experts*": {
                "factor": 16
            }
        },
        "use_fnmatch": true
    }
}

Recursos experimentais avançados

Mostrar detalhes experimentais avançados O SimpleTuner inclui recursos experimentais que podem melhorar significativamente a estabilidade e o desempenho do treinamento. * **[Scheduled Sampling (Rollout)](../experimental/SCHEDULED_SAMPLING.md):** reduz o viés de exposição e melhora a qualidade de saída ao deixar o modelo gerar suas próprias entradas durante o treinamento. > ⚠️ Esses recursos aumentam a sobrecarga computacional do treinamento. #### Prompts de validação Dentro de `config/config.json` está o "prompt de validação primário", que normalmente é o principal instance_prompt no qual você está treinando para seu único assunto ou estilo. Além disso, um arquivo JSON pode ser criado contendo prompts extras para executar durante as validações. O arquivo de exemplo `config/user_prompt_library.json.example` contém o seguinte formato:
{
  "nickname": "the prompt goes here",
  "another_nickname": "another prompt goes here"
}
Os nicknames são o nome do arquivo de validação, então mantenha-os curtos e compatíveis com seu sistema de arquivos. Para apontar o treinador para essa biblioteca de prompts, adicione-a ao TRAINER_EXTRA_ARGS com uma nova linha no final do `config.json`:
  "--user_prompt_library": "config/user_prompt_library.json",
Um conjunto de prompts diversificados ajuda a determinar se o modelo está colapsando conforme treina. Neste exemplo, a palavra `` deve ser substituída pelo nome do seu assunto (instance_prompt).
{
    "anime_<token>": "a breathtaking anime-style portrait of <token>, capturing her essence with vibrant colors and expressive features",
    "chef_<token>": "a high-quality, detailed photograph of <token> as a sous-chef, immersed in the art of culinary creation",
    "just_<token>": "a lifelike and intimate portrait of <token>, showcasing her unique personality and charm",
    "cinematic_<token>": "a cinematic, visually stunning photo of <token>, emphasizing her dramatic and captivating presence",
    "elegant_<token>": "an elegant and timeless portrait of <token>, exuding grace and sophistication",
    "adventurous_<token>": "a dynamic and adventurous photo of <token>, captured in an exciting, action-filled moment",
    "mysterious_<token>": "a mysterious and enigmatic portrait of <token>, shrouded in shadows and intrigue",
    "vintage_<token>": "a vintage-style portrait of <token>, evoking the charm and nostalgia of a bygone era",
    "artistic_<token>": "an artistic and abstract representation of <token>, blending creativity with visual storytelling",
    "futuristic_<token>": "a futuristic and cutting-edge portrayal of <token>, set against a backdrop of advanced technology",
    "woman": "a beautifully crafted portrait of a woman, highlighting her natural beauty and unique features",
    "man": "a powerful and striking portrait of a man, capturing his strength and character",
    "boy": "a playful and spirited portrait of a boy, capturing youthful energy and innocence",
    "girl": "a charming and vibrant portrait of a girl, emphasizing her bright personality and joy",
    "family": "a heartwarming and cohesive family portrait, showcasing the bonds and connections between loved ones"
}
> ℹ️ O HiDream usa 128 tokens por padrão e depois trunca. #### Acompanhamento de CLIP score Se você quiser habilitar avaliações para pontuar o desempenho do modelo, veja [este documento](../evaluation/CLIP_SCORES.md) para informações sobre configuração e interpretação de CLIP scores.

Perda de avaliação estável

Se você quiser usar perda MSE estável para pontuar o desempenho do modelo, veja este documento para informações sobre configuração e interpretação de perda de avaliação.

Prévias de validação

O SimpleTuner suporta streaming de prévias intermediárias de validação durante a geração usando modelos Tiny AutoEncoder. Isso permite ver imagens de validação sendo geradas passo a passo em tempo real via callbacks de webhook.

Para habilitar:

Ver exemplo de configuração
{
  "validation_preview": true,
  "validation_preview_steps": 1
}

Requisitos: - Configuração de webhook - Validação habilitada

Defina validation_preview_steps para um valor maior (ex.: 3 ou 5) para reduzir a sobrecarga do Tiny AutoEncoder. Com validation_num_inference_steps=20 e validation_preview_steps=5, você receberá imagens de prévia nos steps 5, 10, 15 e 20.

Shift do cronograma de flow

Modelos flow-matching como OmniGen, Sana, Flux e SD3 têm uma propriedade chamada "shift" que permite deslocar a porção treinada do cronograma de timesteps usando um valor decimal simples.

O modelo full foi treinado com um valor de 3.0 e o dev usou 6.0.

Na prática, usar um valor de shift tão alto tende a destruir ambos os modelos. Um valor de 1.0 é um bom ponto de partida, mas pode mover o modelo pouco, e 3.0 pode ser alto demais.

Auto-shift

Uma abordagem comumente recomendada é seguir vários trabalhos recentes e habilitar shift de timestep dependente de resolução, --flow_schedule_auto_shift, que usa valores de shift maiores para imagens maiores e menores para imagens menores. Isso resulta em resultados de treinamento estáveis, porém potencialmente medíocres.

Especificação manual

Agradecimentos a General Awareness do Discord pelos exemplos a seguir

Ao usar um valor de --flow_schedule_shift de 0.1 (um valor muito baixo), apenas os detalhes mais finos da imagem são afetados: image

Ao usar um valor de --flow_schedule_shift de 4.0 (um valor muito alto), as grandes características composicionais e potencialmente o espaço de cores do modelo são impactados: image

Considerações sobre o dataset

É crucial ter um dataset substancial para treinar seu modelo. Existem limitações no tamanho do dataset, e você precisará garantir que seu dataset seja grande o suficiente para treinar seu modelo efetivamente. Observe que o tamanho mínimo do dataset é train_batch_size * gradient_accumulation_steps, além de ser maior que vae_batch_size. O dataset não será utilizável se for muito pequeno.

ℹ️ Com poucas imagens, você pode ver a mensagem no images detected in dataset - aumentar o valor de repeats supera essa limitação.

Dependendo do dataset que você tem, será necessário configurar o diretório do dataset e o arquivo de configuração do dataloader de forma diferente. Neste exemplo, usaremos pseudo-camera-10k como dataset.

Crie um documento --data_backend_config (config/multidatabackend.json) contendo:

Ver exemplo de configuração
[
  {
    "id": "pseudo-camera-10k-hidream",
    "type": "local",
    "crop": true,
    "crop_aspect": "square",
    "crop_style": "center",
    "resolution": 1024,
    "minimum_image_size": 1024,
    "maximum_image_size": 1024,
    "target_downsample_size": 1024,
    "resolution_type": "pixel_area",
    "cache_dir_vae": "cache/vae/hidream/pseudo-camera-10k",
    "instance_data_dir": "datasets/pseudo-camera-10k",
    "disabled": false,
    "skip_file_discovery": "",
    "caption_strategy": "filename",
    "metadata_backend": "discovery",
    "repeats": 0,
    "is_regularisation_data": true
  },
  {
    "id": "dreambooth-subject",
    "type": "local",
    "crop": false,
    "resolution": 1024,
    "minimum_image_size": 1024,
    "maximum_image_size": 1024,
    "target_downsample_size": 1024,
    "resolution_type": "pixel_area",
    "cache_dir_vae": "cache/vae/hidream/dreambooth-subject",
    "instance_data_dir": "datasets/dreambooth-subject",
    "caption_strategy": "instanceprompt",
    "instance_prompt": "the name of your subject goes here",
    "metadata_backend": "discovery",
    "repeats": 1000
  },
  {
    "id": "text-embeds",
    "type": "local",
    "dataset_type": "text_embeds",
    "default": true,
    "cache_dir": "cache/text/hidream",
    "disabled": false,
    "write_batch_size": 128
  }
]

ℹ️ Use caption_strategy=textfile se você tiver arquivos .txt contendo captions. Veja opções e requisitos de caption_strategy em DATALOADER.md.

Depois, crie um diretório datasets:

mkdir -p datasets
pushd datasets
    huggingface-cli download --repo-type=dataset bghira/pseudo-camera-10k --local-dir=pseudo-camera-10k
    mkdir dreambooth-subject
    # coloque suas imagens em dreambooth-subject/ agora
popd

Isso vai baixar cerca de 10k amostras de fotos para o seu diretório datasets/pseudo-camera-10k, que será criado automaticamente.

Suas imagens Dreambooth devem ir para o diretório datasets/dreambooth-subject.

Login no WandB e Huggingface Hub

Você vai querer fazer login no WandB e no HF Hub antes de iniciar o treinamento, especialmente se estiver usando --push_to_hub e --report_to=wandb.

Se você vai enviar itens para um repositório Git LFS manualmente, também deve executar git config --global credential.helper store

Execute os seguintes comandos:

wandb login

e

huggingface-cli login

Siga as instruções para fazer login nos dois serviços.

Executando o treinamento

A partir do diretório do SimpleTuner, você tem várias opções para iniciar o treinamento:

Opção 1 (Recomendado - pip install):

pip install 'simpletuner[cuda]'

# CUDA 13 / Blackwell users (NVIDIA B-series GPUs)
pip install 'simpletuner[cuda13]' --extra-index-url https://download.pytorch.org/whl/cu130
simpletuner train

Opção 2 (Método Git clone):

simpletuner train

Opção 3 (Método legado - ainda funciona):

./train.sh

Isso vai iniciar o cache de text embeds e saídas VAE em disco.

Para mais informações, veja os documentos dataloader e tutorial.

Rodando inferência no LoKr depois

Como é um modelo novo, o exemplo precisará de alguns ajustes para funcionar. Aqui vai um exemplo funcional:

Mostrar exemplo de inferência em Python
import torch
from helpers.models.hidream.pipeline import HiDreamImagePipeline
from helpers.models.hidream.transformer import HiDreamImageTransformer2DModel
from lycoris import create_lycoris_from_weights
from transformers import PreTrainedTokenizerFast, LlamaForCausalLM

llama_repo = "unsloth/Meta-Llama-3.1-8B-Instruct"
model_id = 'HiDream-ai/HiDream-I1-Dev'
adapter_repo_id = 'bghira/hidream5m-photo-1mp-Prodigy'
adapter_filename = 'pytorch_lora_weights.safetensors'

tokenizer_4 = PreTrainedTokenizerFast.from_pretrained(
    llama_repo,
)
text_encoder_4 = LlamaForCausalLM.from_pretrained(
    llama_repo,
    output_hidden_states=True,
    output_attentions=True,
    torch_dtype=torch.bfloat16,
)

def download_adapter(repo_id: str):
    import os
    from huggingface_hub import hf_hub_download
    adapter_filename = "pytorch_lora_weights.safetensors"
    cache_dir = os.environ.get('HF_PATH', os.path.expanduser('~/.cache/huggingface/hub/models'))
    cleaned_adapter_path = repo_id.replace("/", "_").replace("\\", "_").replace(":", "_")
    path_to_adapter = os.path.join(cache_dir, cleaned_adapter_path)
    path_to_adapter_file = os.path.join(path_to_adapter, adapter_filename)
    os.makedirs(path_to_adapter, exist_ok=True)
    hf_hub_download(
        repo_id=repo_id, filename=adapter_filename, local_dir=path_to_adapter
    )

    return path_to_adapter_file

adapter_file_path = download_adapter(repo_id=adapter_repo_id)
transformer = HiDreamImageTransformer2DModel.from_pretrained(model_id, torch_dtype=torch.bfloat16, subfolder="transformer")
pipeline = HiDreamImagePipeline.from_pretrained(
    model_id,
    torch_dtype=torch.bfloat16,
    tokenizer_4=tokenizer_4,
    text_encoder_4=text_encoder_4,
    transformer=transformer,
)
lora_scale = 1.0
wrapper, _ = create_lycoris_from_weights(lora_scale, adapter_file_path, pipeline.transformer)
wrapper.merge_to()

prompt = "Place your test prompt here."
negative_prompt = 'ugly, cropped, blurry, low-quality, mediocre average'

## Opcional: quantize o modelo para economizar VRAM.
## Nota: o modelo foi quantizado durante o treinamento, e por isso é recomendado fazer o mesmo na inferência.
from optimum.quanto import quantize, freeze, qint8
quantize(pipeline.transformer, weights=qint8)
freeze(pipeline.transformer)

pipeline.to('cuda' if torch.cuda.is_available() else 'mps' if torch.backends.mps.is_available() else 'cpu') # o pipeline já está no nível de precisão alvo
t5_embeds, llama_embeds, negative_t5_embeds, negative_llama_embeds, pooled_embeds, negative_pooled_embeds = pipeline.encode_prompt(
    prompt=prompt, prompt_2=prompt, prompt_3=prompt, prompt_4=prompt, num_images_per_prompt=1
)
# Vamos zerar os text encoders para economizar memória.
pipeline.text_encoder.to("meta")
pipeline.text_encoder_2.to("meta")
pipeline.text_encoder_3.to("meta")
pipeline.text_encoder_4.to("meta")
model_output = pipeline(
    t5_prompt_embeds=t5_embeds,
    llama_prompt_embeds=llama_embeds,
    pooled_prompt_embeds=pooled_embeds,
    negative_t5_prompt_embeds=negative_t5_embeds,
    negative_llama_prompt_embeds=negative_llama_embeds,
    negative_pooled_prompt_embeds=negative_pooled_embeds,
    num_inference_steps=30,
    generator=torch.Generator(device='cuda' if torch.cuda.is_available() else 'mps' if torch.backends.mps.is_available() else 'cpu').manual_seed(42),
    width=1024,
    height=1024,
    guidance_scale=3.2,
).images[0]

model_output.save("output.png", format="PNG")

Notas e dicas de solução de problemas

Configuração de VRAM mais baixa

A configuração de VRAM mais baixa do HiDream é de cerca de 20-22G:

  • SO: Ubuntu Linux 24
  • GPU: Um único dispositivo NVIDIA CUDA (10G, 12G)
  • Memória do sistema: aproximadamente 50G de memória do sistema (pode ser mais, pode ser menos)
  • Precisão do modelo base:
  • Para sistemas Apple e AMD, int8-quanto (ou fp8-torchao, int8-torchao seguem perfis de uso de memória semelhantes)
    • int4-quanto também funciona, mas você pode ter menor precisão / piores resultados
  • Para sistemas NVIDIA, nf4-bnb é relatado como funcionando bem, mas será mais lento que int8-quanto
  • Otimizador: Lion 8Bit Paged, bnb-lion8bit-paged
  • Resolução: 1024px
  • Batch size: 1, zero steps de gradient accumulation
  • DeepSpeed: desativado / não configurado
  • PyTorch: 2.7+
  • Usando --quantize_via=cpu para evitar erro outOfMemory durante a inicialização em placas <=16G.
  • Habilitar --gradient_checkpointing
  • Use um LoRA ou Lycoris bem pequeno (ex.: rank 1 ou fator Lokr 25)
  • Definir a variável de ambiente PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True ajuda a minimizar o uso de VRAM ao treinar múltiplas proporções de aspecto.

NOTA: O pré-cache de embeddings VAE e saídas do text encoder pode usar mais memória e ainda dar OOM. VAE tiling e slicing são habilitados por padrão. Se você ver OOM, tente habilitar offload_during_startup=true; caso contrário, talvez você simplesmente esteja sem sorte.

A velocidade foi de aproximadamente 3 iterações por segundo em uma NVIDIA 4090 usando Pytorch 2.7 e CUDA 12.8

Loss mascarada

Se você estiver treinando um assunto ou estilo e quiser mascarar um ou outro, veja a seção de treinamento com loss mascarada no guia de Dreambooth.

Quantização

Embora int8 seja a melhor opção para trade-offs de velocidade/qualidade vs memória, nf4 e int4 também estão disponíveis. int4 não é recomendado para HiDream, pois pode levar a piores resultados, mas com treinamento suficiente, você acabaria com um modelo int4 razoavelmente capaz.

Taxas de aprendizado

LoRA (--lora_type=standard)

  • Taxas de aprendizado mais altas em torno de 4e-4 funcionam melhor para LoRAs menores (rank-1 até rank-8)
  • Taxas de aprendizado mais baixas em torno de 6e-5 funcionam melhor para LoRAs maiores (rank-64 até rank-256)
  • Definir lora_alpha diferente de lora_rank não é suportado devido às limitações do Diffusers, a menos que você saiba o que está fazendo em ferramentas de inferência depois.
  • Como usar isso depois para inferência está fora do escopo, mas definir lora_alpha como 1.0 permitiria manter a taxa de aprendizado igual em todos os ranks de LoRA.

LoKr (--lora_type=lycoris)

  • Taxas de aprendizado moderadas são melhores para LoKr (1e-4 com AdamW, 2e-5 com Lion)
  • Outros algos precisam de mais exploração.
  • Prodigy parece ser uma boa escolha para LoRA ou LoKr, mas pode superestimar a taxa de aprendizado necessária e suavizar a pele.

Artefatos de imagem

O HiDream tem uma resposta desconhecida a artefatos de imagem, embora use o VAE do Flux e tenha limitações semelhantes de detalhes finos.

O problema mais prevalente é usar uma taxa de aprendizado alta demais e/ou batch size baixo demais. Isso pode fazer o modelo produzir imagens com artefatos, como pele lisa, borrado e pixelização.

Bucketing de aspecto

Inicialmente, o modelo não respondia muito bem a buckets de aspecto, mas a implementação foi melhorada pela comunidade.

Treinamento multi-resolução

O modelo pode ser inicialmente treinado em uma resolução mais baixa como 512px para acelerar o treinamento, mas não é certo se o modelo vai generalizar muito bem para resoluções mais altas. Treinar sequencialmente primeiro em 512px e depois em 1024px provavelmente é a melhor abordagem.

É uma boa ideia habilitar --flow_schedule_auto_shift ao treinar em resoluções diferentes de 1024px. Resoluções mais baixas usam menos VRAM, permitindo batch sizes maiores.

Full-rank tuning

O DeepSpeed vai usar MUITA memória do sistema com HiDream, mas o fine-tuning completo parece funcionar bem em um sistema muito grande.

Lycoris LoKr é recomendado no lugar do fine-tuning full-rank, pois é mais estável e tem menor uso de memória.

PEFT LoRA é útil para estilos mais simples, mas é mais difícil manter detalhes finos com ele.