Lora-trainer-all / lora_research_notes.md
Allex21's picture
Upload 12 files
7c8a29e verified
## 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`:
```python
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`.