? PEFT
Métodos de ajuste fino con eficiencia de parámetros (PEFT) de última generación
El ajuste fino de grandes modelos previamente entrenados suele ser prohibitivamente costoso debido a su escala. Los métodos de ajuste fino de parámetros eficientes (PEFT) permiten la adaptación eficiente de grandes modelos previamente entrenados a diversas aplicaciones posteriores ajustando solo una pequeña cantidad de parámetros (adicionales) del modelo en lugar de todos los parámetros del modelo. Esto reduce significativamente los costos computacionales y de almacenamiento. Las técnicas PEFT de última generación logran un rendimiento comparable al de los modelos totalmente ajustados.
PEFT está integrado con Transformers para facilitar el entrenamiento y la inferencia de modelos, los Difusores para administrar cómodamente diferentes adaptadores y Accelerate para el entrenamiento y la inferencia distribuidos para modelos realmente grandes.
Consejo
Visite la organización PEFT para leer sobre los métodos PEFT implementados en la biblioteca y para ver cuadernos que demuestran cómo aplicar estos métodos a una variedad de tareas posteriores. Haga clic en el botón "Ver repositorios" en la página de la organización para recibir notificaciones sobre los métodos y cuadernos recientemente implementados.
Consulte la sección Referencia de la API de adaptadores PEFT para obtener una lista de los métodos PEFT admitidos y lea las guías conceptuales de Adaptadores, Indicaciones suaves y IA3 para obtener más información sobre cómo funcionan estos métodos.
Instale PEFT desde pip:
pip install peft
Prepare un modelo para entrenar con un método PEFT como LoRA envolviendo el modelo base y la configuración PEFT con get_peft_model
. Para el modelo bigscience/mt0-large, ¡solo estás entrenando el 0,19% de los parámetros!
from transformers import AutoModelForSeq2SeqLM
from peft import get_peft_config , get_peft_model , LoraConfig , TaskType
model_name_or_path = "bigscience/mt0-large"
tokenizer_name_or_path = "bigscience/mt0-large"
peft_config = LoraConfig (
task_type = TaskType . SEQ_2_SEQ_LM , inference_mode = False , r = 8 , lora_alpha = 32 , lora_dropout = 0.1
)
model = AutoModelForSeq2SeqLM . from_pretrained ( model_name_or_path )
model = get_peft_model ( model , peft_config )
model . print_trainable_parameters ()
"trainable params: 2359296 || all params: 1231940608 || trainable%: 0.19151053100118282"
Para cargar un modelo PEFT para inferencia:
from peft import AutoPeftModelForCausalLM
from transformers import AutoTokenizer
import torch
model = AutoPeftModelForCausalLM . from_pretrained ( "ybelkada/opt-350m-lora" ). to ( "cuda" )
tokenizer = AutoTokenizer . from_pretrained ( "facebook/opt-350m" )
model . eval ()
inputs = tokenizer ( "Preheat the oven to 350 degrees and place the cookie dough" , return_tensors = "pt" )
outputs = model . generate ( input_ids = inputs [ "input_ids" ]. to ( "cuda" ), max_new_tokens = 50 )
print ( tokenizer . batch_decode ( outputs , skip_special_tokens = True )[ 0 ])
"Preheat the oven to 350 degrees and place the cookie dough in the center of the oven. In a large bowl, combine the flour, baking powder, baking soda, salt, and cinnamon. In a separate bowl, combine the egg yolks, sugar, and vanilla."
Hay muchos beneficios de usar PEFT, pero el principal es el enorme ahorro en computación y almacenamiento, lo que hace que PEFT sea aplicable a muchos casos de uso diferentes.
Considere los requisitos de memoria para entrenar los siguientes modelos en el conjunto de datos ought/raft/twitter_complaints con una GPU A100 de 80 GB con más de 64 GB de CPU RAM.
Modelo | Ajuste completo | PEFT-LoRA PyTorch | PEFT-LoRA DeepSpeed con descarga de CPU |
---|---|---|---|
bigscience/T0_3B (parámetros 3B) | GPU de 47,14 GB/CPU de 2,96 GB | GPU de 14,4 GB/CPU de 2,96 GB | GPU de 9,8 GB/CPU de 17,8 GB |
bigscience/mt0-xxl (12B parámetros) | GPU OOM | GPU de 56 GB/CPU de 3 GB | GPU de 22 GB / CPU de 52 GB |
bigscience/bloomz-7b1 (parámetros 7B) | GPU OOM | GPU de 32 GB/CPU de 3,8 GB | GPU de 18,1 GB/CPU de 35 GB |
Con LoRA puedes ajustar completamente un modelo de parámetros de 12B que de otro modo se habría quedado sin memoria en la GPU de 80GB, y adaptar y entrenar cómodamente un modelo de parámetros de 3B. Cuando observa el rendimiento del modelo de parámetros 3B, es comparable a un modelo completamente ajustado con una fracción de la memoria de la GPU.
Nombre del envío | Exactitud |
---|---|
Línea de base humana (crowdsourcing) | 0,897 |
Flan-T5 | 0,892 |
lora-t0-3b | 0.863 |
Consejo
El rendimiento del modelo bigscience/T0_3B no está optimizado en la tabla anterior. Puede obtener aún más rendimiento jugando con las plantillas de instrucciones de entrada, los hiperparámetros LoRA y otros hiperparámetros relacionados con el entrenamiento. El tamaño del punto de control final de este modelo es de sólo 19 MB en comparación con los 11 GB del modelo bigscience/T0_3B completo. Obtenga más información sobre las ventajas de realizar ajustes con PEFT en esta publicación de blog.
La cuantificación es otro método para reducir los requisitos de memoria de un modelo al representar los datos con menor precisión. Se puede combinar con métodos PEFT para que sea aún más fácil entrenar y cargar LLM para inferencia.
PEFT puede ayudarle a ahorrar almacenamiento al evitar el ajuste completo de los modelos en cada una de las tareas o conjuntos de datos posteriores. En muchos casos, solo está ajustando una fracción muy pequeña de los parámetros de un modelo y cada punto de control tiene un tamaño de solo unos pocos MB (en lugar de GB). Estos adaptadores PEFT más pequeños demuestran un rendimiento comparable al de un modelo totalmente ajustado. Si tiene muchos conjuntos de datos, puede ahorrar una gran cantidad de almacenamiento con un modelo PEFT y no tener que preocuparse por olvidos catastróficos o sobreajustes de la red troncal o del modelo base.
PEFT cuenta con un amplio respaldo en todo el ecosistema de Hugging Face debido a la enorme eficiencia que aporta al entrenamiento y la inferencia.
El proceso de difusión iterativo consume mucha memoria, lo que puede dificultar el entrenamiento. PEFT puede ayudar a reducir los requisitos de memoria y reducir el tamaño de almacenamiento del punto de control del modelo final. Por ejemplo, considere la memoria necesaria para entrenar un modelo de difusión estable con LoRA en una GPU A100 de 80 GB con más de 64 GB de RAM de CPU. ¡El tamaño del punto de control del modelo final es de solo 8,8 MB!
Modelo | Ajuste completo | PEFT-LoRA | PEFT-LoRA con control de gradiente |
---|---|---|---|
CompVis/difusión-estable-v1-4 | GPU de 27,5 GB/CPU de 3,97 GB | GPU de 15,5 GB/CPU de 3,84 GB | GPU de 8,12 GB/CPU de 3,77 GB |
Consejo
Eche un vistazo al script de entrenamiento ejemplos/lora_dreambooth/train_dreambooth.py para intentar entrenar su propio modelo de difusión estable con LoRA y juegue con el espacio smangrul/peft-lora-sd-dreambooth que se ejecuta en una instancia T4. Obtenga más información sobre la integración PEFT en Difusores en este tutorial.
Accelerate es una biblioteca para capacitación distribuida e inferencia en diversas configuraciones y hardware de capacitación (GPU, TPU, Apple Silicon, etc.). Los modelos PEFT funcionan con Accelerate desde el primer momento, lo que hace que sea realmente conveniente entrenar modelos realmente grandes o usarlos para realizar inferencias en hardware de consumo con recursos limitados.
PEFT también se puede aplicar a la capacitación de LLM con componentes RLHF como el clasificador y la política. Comience leyendo:
Utilice este espacio o consulte los documentos para descubrir qué modelos admiten oficialmente un método PEFT listo para usar. Incluso si no ve ningún modelo en la lista a continuación, puede configurar manualmente la configuración del modelo para habilitar PEFT para un modelo. Lea la guía de arquitectura de nuevos transformadores para saber cómo hacerlo.
Si desea contribuir a PEFT, consulte nuestra guía de contribuciones.
¿Para usar? PEFT en su publicación, cítelo utilizando la siguiente entrada BibTeX.
@Misc { peft ,
title = { PEFT: State-of-the-art Parameter-Efficient Fine-Tuning methods } ,
author = { Sourab Mangrulkar and Sylvain Gugger and Lysandre Debut and Younes Belkada and Sayak Paul and Benjamin Bossan } ,
howpublished = { url{https://github.com/huggingface/peft} } ,
year = { 2022 }
}