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.

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