使用 Transformers 和 Ray Tune 進行超引數搜尋
Anyscale 團隊 Richard Liaw 的客座部落格文章
Hugging Face 的 transformers 庫擁有前沿的研究實現和數千個易於訪問的預訓練模型,已成為當今自然語言處理成功和發展的關鍵。
為了使任何機器學習模型都能取得良好的效能,使用者通常需要實施某種形式的引數調整。然而,幾乎所有人(1, 2)最終都忽略了超引數調優,或者選擇使用小搜尋空間進行簡單的網格搜尋。
然而,簡單的實驗就能證明使用高階調優技術的好處。以下是 Hugging Face transformers 在 RTE 資料集上對 BERT 模型進行 最新實驗的結果。與標準超引數最佳化技術相比,像 PBT 這樣的遺傳最佳化技術可以提供巨大的效能改進。
演算法 | 最佳驗證準確率。 | 最佳測試準確率。 | 總 GPU 分鐘 | 總成本 |
網格搜尋 | 74% | 65.4% | 45 分鐘 | $2.30 |
貝葉斯最佳化 + 提前停止 | 77% | 66.9% | 104 分鐘 | $5.30 |
基於群體的訓練 | 78% | 70.5% | 48 分鐘 | $2.45 |
如果您正在使用 Transformers,您會希望有一種方法可以輕鬆訪問強大的超引數調優解決方案,同時又不放棄 Transformers 框架的可定製性。
在 Transformers 3.1 版本中,Hugging Face Transformers 和 Ray 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 開箱即用!
立即試用:
pip install -U ray
pip install -U transformers datasets
- 檢視 Hugging Face 文件和討論帖
- 使用 Hugging Face 超引數搜尋進行文字分類的端到端示例
如果您喜歡這篇部落格文章,請務必檢視
- Transformers + GLUE + Ray Tune 示例
- 我們關於 Transformers 超引數最佳化的 Weights and Biases 報告
- 從零開始部署 NLP 模型最簡單的方法