使用 Transformers 和 Ray Tune 進行超引數搜尋

釋出於 2020 年 11 月 2 日
在 GitHub 上更新
Anyscale 團隊 Richard Liaw 的客座部落格文章

Hugging Face 的 transformers 庫擁有前沿的研究實現和數千個易於訪問的預訓練模型,已成為當今自然語言處理成功和發展的關鍵。

為了使任何機器學習模型都能取得良好的效能,使用者通常需要實施某種形式的引數調整。然而,幾乎所有人(1, 2)最終都忽略了超引數調優,或者選擇使用小搜尋空間進行簡單的網格搜尋。

然而,簡單的實驗就能證明使用高階調優技術的好處。以下是 Hugging Face transformersRTE 資料集上對 BERT 模型進行 最新實驗的結果。與標準超引數最佳化技術相比,像 PBT 這樣的遺傳最佳化技術可以提供巨大的效能改進。

演算法 最佳驗證準確率。 最佳測試準確率。 總 GPU 分鐘 總成本
網格搜尋 74% 65.4% 45 分鐘 $2.30
貝葉斯最佳化 + 提前停止 77% 66.9% 104 分鐘 $5.30
基於群體的訓練 78% 70.5% 48 分鐘 $2.45

如果您正在使用 Transformers,您會希望有一種方法可以輕鬆訪問強大的超引數調優解決方案,同時又不放棄 Transformers 框架的可定製性。

alt_text

在 Transformers 3.1 版本中,Hugging Face TransformersRay Tune 合作提供了一個簡單而強大的整合。 Ray Tune 是一個流行的 Python 超引數調優庫,它開箱即用地提供了許多最先進的演算法,並與一流的工具(如 Weights and Biases 和 tensorboard)整合。

為了演示這個新的 Hugging Face + Ray Tune 整合,我們利用 Hugging Face Datasets 庫來在 MRPC 上微調 BERT。

要執行此示例,請先執行

pip install "ray[tune]" transformers datasets scipy sklearn torch

只需新增幾行程式碼,即可輕鬆插入 Ray 的標準調優演算法之一。

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
)

預設情況下,每個試驗將使用 1 個 CPU,如果可用,可選地使用 1 個 GPU。您可以透過傳遞 resources_per_trial 引數,利用多個 GPU 進行並行超引數搜尋

您還可以輕鬆切換不同的引數調優演算法,例如 HyperBand貝葉斯最佳化基於群體的訓練

要執行此示例,請首先執行: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",
    # Choose among many libraries:
    # https://docs.ray.io/en/latest/tune/api_docs/suggestion.html
    search_alg=HyperOptSearch(metric="objective", mode="max"),
    # Choose among schedulers:
    # https://docs.ray.io/en/latest/tune/api_docs/schedulers.html
    scheduler=ASHAScheduler(metric="objective", mode="max"))

它也與 Weights and Biases 開箱即用!

alt_text

立即試用:

如果您喜歡這篇部落格文章,請務必檢視

社群

註冊登入發表評論

© . This site is unofficial and not affiliated with Hugging Face, Inc.