使用 Accelerator 評估模型

使用 PyTorch 高效訓練 AI 模型

Dennis Lee

Data Engineer, Amazon

為什麼要切到評估模式?

  • 訓練模式
    • Dropout:將部分神經元設為 0
    • 批次正規化

Dropout 與批次正規化 一張神經網路示意圖,含輸入層、隱藏層與輸出層。隱藏層套用 Dropout 以避免過度擬合,且在啟用前對各層輸出做批次正規化。

使用 PyTorch 高效訓練 AI 模型

為什麼要切到評估模式?

  • 訓練模式
    • Dropout:將神經元設為 0
    • 批次正規化
  • 評估模式會停用這些層
  • model.eval() 會啟用評估模式

Dropout 與批次正規化 一張神經網路示意圖,含輸入層、隱藏層與輸出層。隱藏層套用 Dropout 以避免過度擬合,且在啟用前對各層輸出做批次正規化。

使用 PyTorch 高效訓練 AI 模型

用 torch.no_grad() 停用梯度

  • 訓練需要計算梯度
  • torch.no_grad() 可停用梯度
  • 同時呼叫 model.evaltorch.no_grad
model.eval()
with torch.no_grad():
    outputs = model(**inputs)

反向傳播中的梯度計算 一張神經網路的反向傳播示意圖,於各層計算梯度以調整權重。圖中顯示錯誤由輸出層向後傳至隱藏層,並以梯度下降更新權重。

使用 PyTorch 高效訓練 AI 模型

準備驗證資料集

  • 載入 MRPC 資料集的驗證切分
validation_dataset = load_dataset("glue", "mrpc", split="validation")
  • 對驗證資料集做分詞與編碼
def encode(examples):
    return tokenizer(examples["sentence1"], 
                      examples["sentence2"],
                      truncation=True,
                      padding="max_length")

validation_dataset = validation_dataset.map(encode, batched=True)
使用 PyTorch 高效訓練 AI 模型

一個 epoch 的流程:訓練與評估迴圈

  • 每個 epoch 皆遍歷訓練與驗證資料集
  • 先以訓練模式執行模型
  • 再以評估模式執行並記錄評估後的指標
for epoch in range(num_epochs):

model.train() for step, batch in enumerate(train_dataloader): # Perform training step
model.eval() for step, batch in enumerate(eval_dataloader): # Perform evaluation step
# Log evaluation metrics
使用 PyTorch 高效訓練 AI 模型

評估迴圈內部

metric = evaluate.load("glue", "mrpc")
model.eval()
for step, batch in enumerate(eval_dataloader):

with torch.no_grad(): outputs = model(**batch) predictions = outputs.logits.argmax(dim=-1)
predictions, references = accelerator.gather_for_metrics((predictions, batch["labels"]))
metric.add_batch(predictions=predictions, references=references)
eval_metric = metric.compute() print(f"Eval metrics: \n{eval_metric}")
Eval metrics: 
{'accuracy': 0.81, 'f1': 0.77}
使用 PyTorch 高效訓練 AI 模型

在評估後記錄指標

  • 追蹤工具:記錄指標的筆記本,如 TensorBoard、MLflow
  • log_with:使用所有實驗追蹤工具
  • .init_trackers():初始化追蹤工具
  • .log():追蹤 accuracyf1epoch
  • .end_training():結束追蹤
accelerator = Accelerator(project_dir=".",
                          log_with="all")

accelerator.init_trackers("my_project")
for epoch in range(num_epochs): # Training loop is here # Evaluation loop is here accelerator.log({
"accuracy": eval_metric["accuracy"], "f1": eval_metric["f1"],
}, step=epoch)
accelerator.end_training()
使用 PyTorch 高效訓練 AI 模型

一起來練習吧!

使用 PyTorch 高效訓練 AI 模型

Preparing Video For Download...