Introducción
Después del lanzamiento de los modelos Llama y Mistral, los LLM de código abierto le quitaron protagonismo a OpenAI. Desde entonces, se han lanzado varios modelos basados en la arquitectura Llama y Mistral, con un rendimiento a la par de modelos propietarios como GPT-3.5 Turbo, Claude, Gemini, etc. Sin embargo, estos modelos son demasiado grandes para usarse en hardware de consumo.
Pero últimamente ha surgido una nueva clase de LLM. Estos son los LLM en la categoría de parámetros sub-7B. Menos parámetros los hacen lo suficientemente compactos como para ejecutarse en hardware de consumo, manteniendo al mismo tiempo una eficiencia comparable a la de los modelos 7B. Modelos como Tiny-Llama-1B, Phi-2 de Microsoft y Qwen-3b de Alibaba pueden ser excelentes sustitutos de modelos más grandes para ejecutar localmente o implementar en el borde. Al mismo tiempo, el ajuste es crucial para sacar lo mejor de cualquier modelo base para cualquier tarea posterior.
Aquí exploraremos cómo ajustar una base. Modelo Tiny-Llama en un conjunto de datos de Alpaca limpio.
OBJETIVOS DE APRENDIZAJE
- Comprender el ajuste fino y sus diferentes métodos.
- Conozca herramientas y técnicas para un ajuste eficiente.
- Obtenga más información sobre WandB para registrar registros de entrenamiento.
- Ajuste Tiny-Llama en el conjunto de datos de Alpaca en Colab.
Este artículo fue publicado como parte del Blogatón de ciencia de datos.
Tabla de contenidos.
¿Qué es el ajuste fino de LLM?
El ajuste es el proceso de hacer que un modelo previamente entrenado aprenda nuevos conocimientos. El modelo previamente entrenado es un modelo de propósito general entrenado con una gran cantidad de datos. Sin embargo, en la mayoría de los casos, no funcionan según lo previsto y el ajuste fino es la forma más eficaz de hacer que el modelo se adapte a casos de uso específicos. Por ejemplo, base LLM obtienen buenos resultados en la generación de texto en controles de calidad de un solo turno, pero tienen dificultades con conversaciones de varios turnos, como los modelos de chat.
Los modelos base deben entrenarse con transcripciones de diálogos para poder mantener conversaciones de varios turnos. El ajuste es esencial para moldear modelos previamente entrenados en diferentes avatares. La calidad de los modelos ajustados depende de la calidad de los datos y de las capacidades del modelo base. Hay varias formas de ajustar el modelo, como LoRA, QLoRA, etc.
Repasemos brevemente estos conceptos.
lora
LoRA significa Adaptación de rango bajo, una técnica popular de ajuste fino en la que seleccionamos algunos parámetros entrenables en lugar de actualizar todos los parámetros mediante una aproximación de rango bajo de las matrices de peso originales. El modelo LoRA se puede ajustar más rápido en hardware con menor uso intensivo de computación.
QLoRA
QLoRA o Quantized LoRA es un paso más allá que el LoRA. En lugar de un modelo de precisión total, cuantifica los pesos del modelo para reducir la precisión del punto flotante antes de aplicar LoRA. La cuantización es el proceso de reducir valores de bits más altos a valores más bajos. Un proceso de cuantificación de 4 bits implica cuantificar los pesos de 16 bits en valores flotantes de 4 bits.
La cuantificación del modelo conduce a una reducción sustancial del tamaño del modelo con una precisión comparable a la del modelo original. En QLoRA, tomamos un modelo cuantificado y le aplicamos LoRA. Los modelos se pueden cuantificar de múltiples formas, como mediante llama.cpp, AWQ, bitsandbytes, etc.
Ajustes finos con Unsloth
Unsloth es una plataforma de código abierto para ajustar más rápidamente los modelos de lenguajes grandes más populares. Admite LLM populares, incluidos Llama-2 y Mistral, y sus derivados como Yi, Open-hermes, etc. Implementa núcleos Triton personalizados y un motor de respaldo manual para mejorar la velocidad del entrenamiento del modelo.
Aquí, usaremos el Unsloth para afinar un modelo Tiny-Llama cuantificado base de 4 bits en el Alpaca conjunto de datos. El modelo está cuantificado con bits y bytes, y los núcleos están optimizados con Triton de OpenAI.
Iniciar sesión con WandB
En el aprendizaje automático, es fundamental registrar métricas de capacitación y evaluación. Esto nos da una imagen completa del recorrido del tren. Pesos y sesgos (WandB) es una biblioteca de código abierto para visualizar y rastrear experimentos de aprendizaje automático. Tiene una aplicación web dedicada para visualizar métricas de entrenamiento en tiempo real. También nos permite gestionar los modelos de producción de forma centralizada. Usaremos WandB solo para realizar un seguimiento de nuestra ejecución de ajuste de Tiny-Llama.
Para utilizar WandB, regístrese para obtener una cuenta gratuita y cree una Clave API.
Ahora, comencemos a ajustar nuestro modelo.
¿Cómo afinar Tiny-Llama?
El ajuste fino es una tarea que requiere mucha computación. Requiere una máquina con 10-15 GB de VRAM, o puede usar el tiempo de ejecución gratuito de GPU Tesla T4 de Colab.
Ahora instala Unsloth y WandB.
%%capture
import torch
major_version, minor_version = torch.cuda.get_device_capability()
!pip install wandb
if major_version >= 8:
# Use this for new GPUs like Ampere, Hopper GPUs (RTX 30xx, RTX 40xx, A100, H100, L40)
!pip install "unsloth[colab_ampere] @ git+https://github.com/unslothai/unsloth.git"
else:
# Use this for older GPUs (V100, Tesla T4, RTX 20xx)
!pip install "unsloth[colab] @ git+https://github.com/unslothai/unsloth.git"
pass
Lo siguiente es cargar el modelo preentrenado cuantificado de 4 bits con Unsloth.
from unsloth import FastLanguageModel
import torch
max_seq_length = 4096 # Choose any! We auto support RoPE Scaling internally!
dtype = None # None for auto detection. Float16 for Tesla T4, V100, Bfloat16 for Ampere+
load_in_4bit = True # Use 4bit quantization to reduce memory usage. Can be False.
model, tokenizer = FastLanguageModel.from_pretrained(
model_name = "unsloth/tinyllama-bnb-4bit", # "unsloth/tinyllama" for 16bit loading
max_seq_length = max_seq_length,
dtype = dtype,
load_in_4bit = load_in_4bit,
)
Esto instalará el modelo localmente. El tamaño del modelo de 4 bits rondará los 760 MB.
Ahora aplica PEFT al modelo Tiny-Llama de 4 bits.
model = FastLanguageModel.get_peft_model(
model,
r = 32, # Choose any number > 0 ! Suggested 8, 16, 32, 64, 128
target_modules = ["q_proj", "k_proj", "v_proj", "o_proj",
"gate_proj", "up_proj", "down_proj",],
lora_alpha = 32,
lora_dropout = 0, # Currently only supports dropout = 0
bias = "none", # Currently only supports bias = "none"
use_gradient_checkpointing = True, # @@@ IF YOU GET OUT OF MEMORY - set to True @@@
random_state = 3407,
use_rslora = False, # We support rank stabilized LoRA
loftq_config = None, # And LoftQ
)
Preparar datos
El siguiente paso es preparar el conjunto de datos para realizar ajustes. Como mencioné anteriormente, usaremos un limpio conjunto de datos de alpaca. Esta es una versión limpia del conjunto de datos original de Alpaca. Sigue el formato instrucción-entrada-respuesta. Aquí hay un ejemplo de datos de Alpaca.
Ahora, preparemos nuestros datos.
@title prepare data
#alpaca_prompt = """Below is an instruction that describes a task, paired with an input that
provides further context.
Write a response that appropriately completes the request.
### Instruction:
{}
### Input:
{}
### Response:
{}"""
EOS_TOKEN = tokenizer.eos_token
def formatting_prompts_func(examples):
instructions = examples["instruction"]
inputs = examples["input"]
outputs = examples["output"]
texts = []
for instruction, input, output in zip(instructions, inputs, outputs):
# Must add EOS_TOKEN, otherwise your generation will go on forever!
text = alpaca_prompt.format(instruction, input, output) + EOS_TOKEN
texts.append(text)
return { "text" : texts, }
pass
from datasets import load_dataset
dataset = load_dataset("yahma/alpaca-cleaned", split = "train")
dataset = dataset.map(formatting_prompts_func, batched = True,)
Ahora, divida los datos en datos de tren y evaluación. He tomado datos de evaluación pequeños ya que los datos de evaluación más grandes ralentizan el entrenamiento.
dataset_dict = dataset.train_test_split(test_size=0.004)
Configurar WandB
Ahora, configure Pesos y Sesgos en su tiempo de ejecución actual.
# @title wandb init
import wandb
wandb.login()
Proporcione la clave API para iniciar sesión en WandB cuando se le solicite.
Configurar variables de entorno.
%env WANDB_WATCH=all
%env WANDB_SILENT=true
Modelo de tren
Hasta ahora, hemos cargado el modelo de 4 bits, creado la configuración LoRA, preparado el conjunto de datos y configurado WandB. El siguiente paso es entrenar el modelo con los datos. Para eso, necesitamos definir un entrenador de la biblioteca Trl. Usaremos el SFTrainer de Trl. Pero antes de eso, inicialice WandB y defina los argumentos de entrenamiento apropiados.
import os
from trl import SFTTrainer
from transformers import TrainingArguments
from transformers.utils import logging
import wandb
logging.set_verbosity_info()
project_name = "tiny-llama"
entity = "wandb"
# os.environ["WANDB_LOG_MODEL"] = "checkpoint"
wandb.init(project=project_name, name = "tiny-llama-unsloth-sft")
Argumentos de entrenamiento
args = TrainingArguments(
per_device_train_batch_size = 2,
per_device_eval_batch_size=2,
gradient_accumulation_steps = 4,
evaluation_strategy="steps",
warmup_ratio = 0.1,
num_train_epochs = 1,
learning_rate = 2e-5,
fp16 = not torch.cuda.is_bf16_supported(),
bf16 = torch.cuda.is_bf16_supported(),
optim = "adamw_8bit",
weight_decay = 0.1,
lr_scheduler_type = "linear",
seed = 3407,
output_dir = "outputs",
report_to="wandb", # enable logging to W&B
# run_name="tiny-llama-alpaca-run", # name of the W&B run (optional)
logging_steps=1, # how often to log to W&B
logging_strategy = 'steps',
save_total_limit=2,
)
Esto es importante para el entrenamiento. Para mantener bajo el uso de GPU, mantenga bajos los pasos de tren, lote de evaluación y acumulación de gradiente. logging_steps es el número de pasos antes de que las métricas se registren en WandB.
Ahora, inicialice el SFTTrainer.
trainer = SFTTrainer(
model = model,
tokenizer = tokenizer,
train_dataset = dataset_dict["train"],
eval_dataset=dataset_dict["test"],
dataset_text_field = "text",
max_seq_length = max_seq_length,
dataset_num_proc = 2,
packing = True, # Packs short sequences together to save time!
args = args,
)
Ahora, comienza el entrenamiento.
trainer_stats = trainer.train()
wandb.finish()
Durante la ejecución del entrenamiento, WandB realizará un seguimiento de las métricas de entrenamiento y evaluación. Visita el enlace del panel proporcionado y lo ve en tiempo real.
Esta es una captura de pantalla de mi ejecución en una computadora portátil Colab.
La velocidad del entrenamiento dependerá de múltiples factores, incluidos los tamaños de los datos de entrenamiento y evaluación, el tamaño de los lotes de entrenamiento y evaluación, y el número de épocas. Si tiene problemas de uso de GPU, intente reducir los tamaños de los pasos de acumulación de gradientes y lotes. El tamaño del lote del tren = tamaño_lote_por_dispositivo * pasos_acumulación_gradiente. Y el número de pasos de optimización = datos de entrenamiento totales/tamaño del lote. Puedes jugar con los parámetros y ver cuál funciona mejor.
Puede visualizar la pérdida de capacitación y evaluación de su capacitación en el panel de WandB.
Pérdida del tren
Pérdida de evaluación
Inferencia
Puede guardar los adaptadores LoRA localmente o enviarlos al repositorio de HuggingFace.
model.save_pretrained("lora_model") # Local saving
# model.push_to_hub("your_name/lora_model", token = "...") # Online saving
También puede cargar el modelo guardado desde el disco y usarlo para realizar inferencias.
if False:
from unsloth import FastLanguageModel
model, tokenizer = FastLanguageModel.from_pretrained(
model_name = "lora_model", # YOUR MODEL YOU USED FOR TRAINING
max_seq_length = max_seq_length,
dtype = dtype,
load_in_4bit = load_in_4bit,
)
inputs = tokenizer(
[
alpaca_prompt.format(
"capital of France?", # instruction
"", # input
"", # output - leave this blank for a generation!
)
]*1, return_tensors = "pt").to("cuda")
outputs = model.generate(**inputs, max_new_tokens = 64, use_cache = True)
tokenizer.batch_decode(outputs)
Para transmitir las respuestas del modelo.
from transformers import TextStreamer
text_streamer = TextStreamer(tokenizer)
_ = model.generate(**inputs, streamer = text_streamer, max_new_tokens = 64)
Entonces, se trataba de ajustar un modelo Tiny-Llama con registro WandB.
Aquí está la Cuaderno colaborativo por lo mismo.
Conclusión
Los LLM pequeños pueden ser beneficiosos para la implementación en hardware con restricciones informáticas, como computadoras personales, teléfonos móviles y otros dispositivos portátiles, etc. El ajuste fino permite que estos modelos funcionen mejor en tareas posteriores. En este artículo, aprendimos cómo ajustar un modelo de lenguaje base en un conjunto de datos.
Puntos clave
- El ajuste es el proceso de hacer que un modelo previamente entrenado se adapte a una nueva tarea específica.
- Tiny-Llama es un LLM con solo 1.1 mil millones de parámetros y está capacitado en 3 billones de tokens.
- Hay diferentes formas de ajustar los LLM, como LoRA y QLoRA.
- Unsloth es una plataforma de código abierto que proporciona LLM optimizados para CUDA para acelerar el ajuste de los LLM.
- Weights and Biases (WandB) es una herramienta para rastrear y almacenar experimentos de ML.
Preguntas frecuentes
R. El ajuste, en el contexto del aprendizaje automático, especialmente el aprendizaje profundo, es una técnica en la que se toma un modelo previamente entrenado y se adapta a una tarea nueva y específica.
R. Es posible ajustar LLM más pequeños de forma gratuita en Colab a través de la GPU Tesla T4 con QLoRA.
R. El ajuste mejora enormemente la capacidad de LLM para realizar tareas posteriores, como juegos de roles, generación de código, etc.
R. Tiny-Llama entrenado con 3 billones de tokens es un LLM con 1.1 millones de parámetros. El modelo adopta la arquitectura original Llama-2.
R. Unsloth es una herramienta de código abierto que proporciona un ajuste de LLM más rápido y eficiente al optimizar los núcleos de GPU con Triton.
Los medios que se muestran en este artículo no son propiedad de Analytics Vidhya y se utilizan a discreción del autor.
Relacionado:
- Distribución de relaciones públicas y contenido potenciado por SEO. Consiga amplificado hoy.
- PlatoData.Network Vertical Generativo Ai. Empodérate. Accede Aquí.
- PlatoAiStream. Inteligencia Web3. Conocimiento amplificado. Accede Aquí.
- PlatoESG. Carbón, tecnología limpia, Energía, Ambiente, Solar, Gestión de residuos. Accede Aquí.
- PlatoSalud. Inteligencia en Biotecnología y Ensayos Clínicos. Accede Aquí.
- Fuente: https://www.analyticsvidhya.com/blog/2024/02/fine-tuning-a-tiny-llama-model-with-unsloth/
- :posee
- :es
- :no
- :dónde
- $ UP
- 1
- 11
- 12
- 15%
- 16
- 1b
- 258
- 32
- 7
- 8
- a
- A100
- Poder
- Nuestra Empresa
- Mi Cuenta
- acumulación
- la exactitud
- adaptar
- adaptaciónes
- add
- Todos
- permite
- también
- cantidad
- an
- Analytics
- Analítica Vidhya
- y
- cualquier
- abejas
- applicación
- Aplicá
- La aplicación de
- adecuado
- adecuadamente
- arquitectura
- somos
- argumentos
- en torno a
- artículo
- AS
- At
- auto
- avatares
- b
- bases
- basado
- BE
- esto
- antes
- a continuación
- beneficioso
- beneficios
- MEJOR
- mejores
- parcialidad
- los prejuicios
- mil millones
- Poco
- los bits
- en blanco
- blogatón
- brevemente
- llevar
- pero
- by
- PUEDEN
- capacidades
- capacidad
- capital
- cases
- Categoría
- chat
- Elige
- clase
- código
- compacto
- comparable
- completar
- ultima
- computadoras
- conceptos
- Configuración
- configurado
- consumidor
- Hardware de consumo
- contexto
- conversaciones
- Para crear
- creado
- crucial
- Current
- En la actualidad
- personalizado
- Dash
- página de información de sus operaciones
- datos
- conjuntos de datos
- a dedicados
- profundo
- deep learning
- definir
- depender
- depende
- desplegar
- Desplegando
- Derivados
- describe
- Detección
- diálogos
- una experiencia diferente
- discreción
- do
- DE INSCRIPCIÓN
- Más temprano
- Southern Implants
- Eficaz
- eficiencia
- eficiente
- más
- aparición
- habilitar
- encuentro
- Motor
- Mejora
- suficientes
- entidad
- Entorno
- épocas
- especialmente
- esencial
- etc.
- Éter (ETH)
- evaluación
- ejemplo
- ejemplos
- experimentos
- explorar
- factores importantes
- FALLO
- false
- muchos
- más rápida
- pocos
- menos
- Flotador
- flotante
- siguiente
- formato
- Francia
- Gratuito
- Desde
- promover
- Gemini
- propósito general
- generación de AHSS
- obtener
- Git
- dado
- da
- Go
- GPU
- GPU
- maravillosa
- Materiales
- Tienen
- esta página
- Alta
- más alto
- mantener
- Cómo
- Como Hacer
- Sin embargo
- HTTPS
- AbrazandoCara
- i
- if
- implementos
- importar
- importante
- mejorar
- in
- Incluye
- Las opciones de entrada
- entradas
- instalar
- Instrucciones
- Destinado a
- dentro
- implica
- cuestiones
- IT
- jpg
- Guardar
- acuerdo
- Clave
- especialistas
- Kumar
- idioma
- large
- mayores
- Prospectos
- APRENDE:
- aprendido
- aprendizaje
- Abandonar
- menos
- Permíteme
- Biblioteca
- como
- luz de calcio
- lineal
- LINK
- Llama
- llm
- carga
- carga
- local
- localmente
- log
- conectado
- registro
- de
- Baja
- inferior
- máquina
- máquina de aprendizaje
- para lograr
- Realizar
- gestionan
- manual
- max-ancho
- Medios
- Salud Cerebral
- mencionado
- métodos
- Métrica
- ML
- Móvil
- teléfonos móviles
- modelo
- modelos
- más,
- más eficiente
- MEJOR DE TU
- múltiples
- debe
- my
- nombre
- ¿ Necesita ayuda
- Nuevo
- Next
- Ninguna
- cuaderno
- número
- of
- a menudo
- mayor
- on
- en línea
- , solamente
- de código abierto
- OpenAI
- optimización
- optimizado
- optimizando
- or
- reconocida por
- OS
- Otro
- de otra manera
- nuestros
- salir
- salida
- salidas
- Más de
- propiedad
- Packs
- emparejado
- parámetro
- parámetros
- parte
- pass
- realizar
- realizar
- con
- Computadoras personales
- móviles
- imagen
- plataforma
- Platón
- Inteligencia de datos de Platón
- PlatónDatos
- Jugar
- punto
- Popular
- posible
- Precisión
- Preparar
- preparado
- Producción
- propietario
- proporciona un
- publicado
- Push
- Q&A
- calidad
- R
- clasificar
- en tiempo real
- reducir
- la reducción de
- reducción
- liberado
- repositorio
- solicita
- requiere
- la investigación
- respuesta
- respuestas
- volvemos
- Función
- rtx
- Ejecutar
- mismo
- Guardar
- salvado
- ahorro
- la ampliación
- Ciencia:
- ver
- dispersores
- selecciona
- set
- En Corto
- mostrado
- firmar
- desde
- Tamaño
- tamaños
- disminuye
- chica
- menores
- soluciones y
- velocidad
- dividido
- es la
- comienzo
- paso
- pasos
- en streaming
- Luchar
- sustancial
- tal
- SOPORTE
- soportes
- ¡Prepárate!
- toma
- Tarea
- tareas
- la técnica
- técnicas
- Tesla
- test
- texto
- generación de texto
- que
- esa
- El proyecto
- su
- Les
- luego
- Ahí.
- Estas
- ellos
- cosa
- así
- A través de esta formación, el personal docente y administrativo de escuelas y universidades estará preparado para manejar los recursos disponibles que derivan de la diversidad cultural de sus estudiantes. Además, un mejor y mayor entendimiento sobre estas diferencias y similitudes culturales permitirá alcanzar los objetivos de inclusión previstos.
- equipo
- a
- juntos
- ficha
- Tokens
- demasiado
- se
- del IRS
- antorcha
- Total
- seguir
- Seguimiento
- Entrenar
- entrenado
- Formación
- transformers
- Trillones
- Tritón
- verdadero
- try
- actualización
- us
- Uso
- utilizan el
- usado
- Valores
- versión
- vía
- Visite
- visualizar
- fue
- Camino..
- formas
- we
- vestibles
- web
- webp
- peso
- WELL
- tuvieron
- ¿
- Que es
- cuando
- que
- mientras
- seguirá
- funciona
- escribir
- Usted
- tú
- zephyrnet