Búsqueda de hiperparámetros con Transformers y Ray Tune
Hiperparámetros con Transformers y Ray Tune.
Una publicación de blog invitada por Richard Liaw del equipo de Anyscale
Con implementaciones de investigación de vanguardia y miles de modelos entrenados accesibles fácilmente, la biblioteca Hugging Face transformers se ha vuelto fundamental para el éxito y crecimiento del procesamiento de lenguaje natural en la actualidad.
Para que cualquier modelo de aprendizaje automático logre un buen rendimiento, los usuarios a menudo necesitan implementar alguna forma de ajuste de parámetros. Sin embargo, casi todos (1, 2) terminan ignorando la afinación de hiperparámetros o eligen hacer una búsqueda de cuadrícula simplista con un espacio de búsqueda pequeño.
Sin embargo, experimentos simples pueden mostrar los beneficios de utilizar una técnica de ajuste avanzada. A continuación se muestra un experimento reciente realizado en un modelo BERT de Hugging Face transformers en el conjunto de datos RTE. Técnicas de optimización genética como PBT pueden proporcionar mejoras significativas en el rendimiento en comparación con las técnicas de optimización de hiperparámetros estándar.
Algoritmo | Mejor precisión de validación | Mejor precisión de prueba | Tiempo total de GPU | Costo total en $ |
Búsqueda en cuadrícula | 74% | 65.4% | 45 min | $2.30 |
Optimización bayesiana + Detención temprana | 77% | 66.9% | 104 min | $5.30 |
Entrenamiento poblacional | 78% | 70.5% | 48 min | $2.45 |
Si estás utilizando Transformers, querrás tener una forma de acceder fácilmente a soluciones potentes de ajuste de hiperparámetros sin renunciar a la personalización del framework de Transformers.
- Modelos más rápidos de TensorFlow en Hugging Face Transformers
- Hugging Face en PyTorch / XLA TPUs
- Consideraciones simples para personas simples construyendo redes ne...
En la versión 3.1 de Transformers, Hugging Face Transformers y Ray Tune se unieron para proporcionar una integración simple pero potente. Ray Tune es una popular biblioteca de Python para el ajuste de hiperparámetros que ofrece muchos algoritmos de vanguardia listos para usar, junto con integraciones con las mejores herramientas de su clase, como Weights and Biases y tensorboard.
Para demostrar esta nueva integración de Hugging Face + Ray Tune, aprovechamos la biblioteca de conjuntos de datos de Hugging Face para ajustar finamente BERT en MRPC.
Para ejecutar este ejemplo, por favor ejecuta primero:
pip install "ray[tune]" transformers datasets scipy sklearn torch
Simplemente conecta uno de los algoritmos de ajuste estándar de Ray agregando unas pocas líneas de código.
from datasets import load_dataset, load_metric
from transformers import (AutoModelForSequenceClassification, AutoTokenizer,
Trainer, TrainingArguments)
tokenizer = AutoTokenizer.from_pretrained('distilbert-base-uncased')
dataset = load_dataset('glue', 'mrpc')
metric = load_metric('glue', 'mrpc')
def encode(examples):
outputs = tokenizer(
examples['sentence1'], examples['sentence2'], truncation=True)
return outputs
encoded_dataset = dataset.map(encode, batched=True)
def model_init():
return AutoModelForSequenceClassification.from_pretrained(
'distilbert-base-uncased', return_dict=True)
def compute_metrics(eval_pred):
predictions, labels = eval_pred
predictions = predictions.argmax(axis=-1)
return metric.compute(predictions=predictions, references=labels)
# Evaluate during training and a bit more often
# than the default to be able to prune bad trials early.
# Disabling tqdm is a matter of preference.
training_args = TrainingArguments(
"test", evaluation_strategy="steps", eval_steps=500, disable_tqdm=True)
trainer = Trainer(
args=training_args,
tokenizer=tokenizer,
train_dataset=encoded_dataset["train"],
eval_dataset=encoded_dataset["validation"],
model_init=model_init,
compute_metrics=compute_metrics,
)
# Default objective is the sum of all metrics
# when metrics are provided, so we have to maximize it.
trainer.hyperparameter_search(
direction="maximize",
backend="ray",
n_trials=10 # number of trials
)
De forma predeterminada, cada prueba utilizará 1 CPU y opcionalmente 1 GPU si está disponible. Puede aprovechar varias GPUs para una búsqueda de hiperparámetros paralela pasando un argumento resources_per_trial
.
También puede intercambiar fácilmente diferentes algoritmos de ajuste de parámetros como HyperBand, Bayesian Optimization, Population-Based Training:
Para ejecutar este ejemplo, primero ejecute: pip install hyperopt
from ray.tune.suggest.hyperopt import HyperOptSearch
from ray.tune.schedulers import ASHAScheduler
trainer = Trainer(
args=training_args,
tokenizer=tokenizer,
train_dataset=encoded_dataset["train"],
eval_dataset=encoded_dataset["validation"],
model_init=model_init,
compute_metrics=compute_metrics,
)
best_trial = trainer.hyperparameter_search(
direction="maximize",
backend="ray",
# Elija entre muchas bibliotecas:
# https://docs.ray.io/en/latest/tune/api_docs/suggestion.html
search_alg=HyperOptSearch(metric="objective", mode="max"),
# Elija entre planificadores:
# https://docs.ray.io/en/latest/tune/api_docs/schedulers.html
scheduler=ASHAScheduler(metric="objective", mode="max"))
¡También funciona con Weights and Biases de inmediato!
Pruébalo hoy:
pip install -U ray
pip install -U transformers datasets
- Consulta la documentación y el hilo de discusión de Hugging Face
- Ejemplo completo de cómo usar la búsqueda de hiperparámetros de Hugging Face para la clasificación de texto
Si te gustó esta publicación de blog, asegúrate de revisar:
- Ejemplo de Transformers + GLUE + Ray Tune
- Nuestro informe de Weights and Biases sobre la Optimización de Hiperparámetros para Transformers
- La forma más sencilla de servir tu modelo de procesamiento del lenguaje natural desde cero