Lora-trainer-all / lora_research_notes.md
Allex21's picture
Upload 12 files
7c8a29e verified

A newer version of the Gradio SDK is available: 6.2.0

Upgrade

LoRA (Low-Rank Adaptation)

LoRA é uma técnica de treinamento leve que reduz significativamente o número de parâmetros treináveis. Funciona inserindo um número menor de novos pesos no modelo e apenas estes são treinados. Isso torna o treinamento com LoRA muito mais rápido, eficiente em termos de memória e produz pesos de modelo menores (algumas centenas de MBs), que são mais fáceis de armazenar e compartilhar. LoRA também pode ser combinado com outras técnicas de treinamento como DreamBooth para acelerar o treinamento.

Versatilidade do LoRA

LoRA é muito versátil e suportado para DreamBooth, Kandinsky 2.2, Stable Diffusion XL, text-to-image e Wuerstchen.

Script de Treinamento

O guia explora o script train_text_to_image_lora.py para familiarização e adaptação. Antes de executar o script, é necessário instalar a biblioteca diffusers do GitHub e as dependências necessárias para o script (PyTorch ou Flax).

Configuração do Ambiente

É necessário inicializar um ambiente 🤗 Accelerate usando accelerate config ou accelerate config default. Para ambientes sem shell interativo, pode-se usar from accelerate.utils import write_basic_config e write_basic_config().

Preparação do Dataset

Para treinar um modelo com seu próprio dataset, é importante seguir o guia de criação de dataset para treinamento.

Parâmetros do Script

O script de treinamento possui muitos parâmetros personalizáveis, encontrados na função parse_args(). Parâmetros importantes para LoRA incluem:

  • --rank: a dimensão interna das matrizes de baixa patente a serem treinadas; um rank mais alto significa mais parâmetros treináveis.
  • --learning_rate: a taxa de aprendizado padrão é 1e-4, mas com LoRA, pode-se usar uma taxa de aprendizado mais alta.

Implementação no Script

O código de pré-processamento do dataset e o loop de treinamento são encontrados na função main(). O Diffusers usa ~peft.LoraConfig da biblioteca PEFT para configurar os parâmetros do adaptador LoRA, como rank, alpha e quais módulos inserir os pesos LoRA. O adaptador é adicionado ao UNet, e apenas as camadas LoRA são filtradas para otimização.

Exemplo de configuração do LoraConfig:

unet_lora_config = LoraConfig(
    r=args.rank,
    lora_alpha=args.rank,
    init_lora_weights="gaussian",
    target_modules=["to_k", "to_q", "to_v", "to_out.0"],
)
unet.add_adapter(unet_lora_config)
lora_layers = filter(lambda p: p.requires_grad, unet.parameters())

O otimizador é inicializado com lora_layers, pois são os únicos pesos a serem otimizados.

Lançamento do Script

Para lançar o script de treinamento, é necessário definir variáveis de ambiente como MODEL_NAME, OUTPUT_DIR, HUB_MODEL_ID e DATASET_NAME. Um exemplo de comando de treinamento é fornecido, incluindo parâmetros como mixed_precision, resolution, train_batch_size, learning_rate, entre outros.

Uso do Modelo Treinado

Após o treinamento, o modelo pode ser usado para inferência, carregando os pesos LoRA treinados (pytorch_lora_weights.safetensors) em um pipeline como AutoPipelineForText2Image.