透過 Optimum 上手 Hugging Face Transformers for IPU
事實證明,Transformer 模型在自然語言處理、音訊處理和計算機視覺等廣泛的機器學習任務中極為高效。然而,這些大型模型的預測速度可能使其不適用於對話式應用或搜尋等對延遲敏感的用例。此外,在現實世界中最佳化其效能需要大量的時間、精力和技能,這超出了許多公司和組織的能力範圍。
幸運的是,Hugging Face 推出了 Optimum,這是一個開源庫,它使得在各種硬體平臺上降低 Transformer 模型的預測延遲變得更加容易。在這篇博文中,您將學習如何為 Graphcore 智慧處理單元 (IPU) 加速 Transformer 模型,這是一種高度靈活、易於使用的並行處理器,專為 AI 工作負載而設計。
Optimum 遇見 Graphcore IPU
透過 Graphcore 和 Hugging Face 之間的這次合作,我們現在將 BERT 作為首個經過 IPU 最佳化的模型推出。在接下來的幾個月中,我們將推出更多這類經過 IPU 最佳化的模型,涵蓋視覺、語音、翻譯和文字生成等應用。
Graphcore 的工程師已經使用 Hugging Face transformers 為我們的 IPU 系統實現並優化了 BERT,以幫助開發者輕鬆地訓練、微調和加速他們最先進的模型。
開始使用 IPU 和 Optimum
讓我們以 BERT 為例,幫助您開始使用 Optimum 和 IPU。
在本指南中,我們將在 Graphcore 的雲端機器學習平臺 Graphcloud 中使用 IPU-POD16 系統,並遵循 Graphcloud 入門 中的 PyTorch 設定說明。
Graphcore 的 Poplar SDK 已安裝在 Graphcloud 伺服器上。如果您的設定不同,可以在 PyTorch for the IPU:使用者指南中找到適用於您系統的說明。
設定 Poplar SDK 環境
您需要執行以下命令來設定多個環境變數,以啟用 Graphcore 工具和 Poplar 庫。在執行 Poplar SDK 2.3 版本的最新 Ubuntu 18.04 系統上,您可以找到/opt/gc/poplar_sdk-ubuntu_18_04-2.3.0+774-b47c577c2a/
中。
要使用 PyTorch,您需要執行 Poplar 和 PopART (Poplar Advanced Runtime) 的兩個啟用指令碼
$ cd /opt/gc/poplar_sdk-ubuntu_18_04-2.3.0+774-b47c577c2a/
$ source poplar-ubuntu_18_04-2.3.0+774-b47c577c2a/enable.sh
$ source popart-ubuntu_18_04-2.3.0+774-b47c577c2a/enable.sh
為 IPU 設定 PopTorch
PopTorch 是 Poplar SDK 的一部分。它提供的函式允許 PyTorch 模型在 IPU 上執行,且只需極少的程式碼更改。您可以按照指南 為 IPU 設定 PyTorch 建立並激活一個 PopTorch 環境。
$ virtualenv -p python3 ~/workspace/poptorch_env
$ source ~/workspace/poptorch_env/bin/activate
$ pip3 install -U pip
$ pip3 install /opt/gc/poplar_sdk-ubuntu_18_04-2.3.0+774-b47c577c2a/poptorch-<sdk-version>.whl
安裝 Optimum Graphcore
現在您的環境已具備所有 Graphcore Poplar 和 PopTorch 庫,您需要在此環境中安裝最新的 🤗 Optimum Graphcore 包。這將是 🤗 Transformers 庫和 Graphcore IPU 之間的介面。
請確保您在上一步中建立的 PopTorch 虛擬環境已啟用。您的終端應顯示一個字首,如下所示,表示 poptorch 環境的名稱
(poptorch_env) user@host:~/workspace/poptorch_env$ pip3 install optimum[graphcore] optuna
克隆 Optimum Graphcore 倉庫
Optimum Graphcore 倉庫包含了在 IPU 上使用 Optimum 模型的示例程式碼。您應該克隆該倉庫並切換到 example/question-answering
目錄,其中包含 BERT 的 IPU 實現。
$ git clone https://github.com/huggingface/optimum-graphcore.git
$ cd optimum-graphcore/examples/question-answering
現在,我們將使用 run_qa.py
在 SQUAD1.1 資料集上微調 BERT 的 IPU 實現。
執行示例以在 SQuAD1.1 上微調 BERT
run_qa.py
指令碼只適用於具有快速分詞器(由 🤗 Tokenizers 庫支援)的模型,因為它使用了這些分詞器的特殊功能。我們的 BERT 模型就是這種情況,您應將其名稱作為 --model_name_or_path
的輸入引數。為了使用 IPU,Optimum 將從傳遞給 --ipu_config_name
引數的路徑中查詢 ipu_config.json
檔案。
$ python3 run_qa.py \
--ipu_config_name=./ \
--model_name_or_path bert-base-uncased \
--dataset_name squad \
--do_train \
--do_eval \
--output_dir output \
--overwrite_output_dir \
--per_device_train_batch_size 2 \
--per_device_eval_batch_size 2 \
--learning_rate 6e-5 \
--num_train_epochs 3 \
--max_seq_length 384 \
--doc_stride 128 \
--seed 1984 \
--lr_scheduler_type linear \
--loss_scaling 64 \
--weight_decay 0.01 \
--warmup_ratio 0.1 \
--output_dir /tmp/debug_squad/
深入瞭解 Optimum-Graphcore
獲取資料
獲取資料集的一個非常簡單的方法是使用 Hugging Face Datasets 庫,它使開發人員可以輕鬆地在 Hugging Face Hub 上下載和共享資料集。它還具有基於 git 和 git-lfs 的預構建資料版本控制,因此您只需指向同一個倉庫即可迭代更新資料版本。
在這裡,資料集附帶了訓練和驗證檔案,以及資料集配置,以幫助確定在每個模型執行階段使用哪些輸入。引數 --dataset_name==squad
指向 Hugging Face Hub 上的 SQuAD v1.1。您也可以提供自己的 CSV/JSON/TXT 訓練和評估檔案,只要它們遵循與 SQuAD 資料集或 Datasets 庫中其他問答資料集相同的格式即可。
載入預訓練模型和分詞器
為了將單詞轉換為詞元 (token),此指令碼需要一個快速分詞器。如果您沒有傳入一個,它將顯示錯誤。作為參考,這是支援的分詞器列表。
# Tokenizer check: this script requires a fast tokenizer.
if not isinstance(tokenizer, PreTrainedTokenizerFast):
raise ValueError("This example script only works for models that have a fast tokenizer. Checkout the big table of models
"at https://huggingface.co/transformers/index.html#supported-frameworks to find the model types that meet this "
"requirement"
)
引數 ```--model_name_or_path==bert-base-uncased`` 載入 Hugging Face Hub 中可用的 bert-base-uncased 模型實現。
來自 Hugging Face Hub 的描述
“BERT 基礎模型 (uncased):在英語上使用掩碼語言建模 (MLM) 目標進行預訓練的模型。它在這篇論文中被引入,並首次在這個倉庫中釋出。該模型不區分大小寫:它不區分 english 和 English。”
訓練和驗證
您現在可以使用 Optimum 中提供的 IPUTrainer
類來利用整個 Graphcore 軟體和硬體堆疊,並以最少的程式碼更改在 IPU 中訓練您的模型。感謝 Optimum,您可以即插即用最先進的硬體來訓練您最先進的模型。

為了訓練和驗證 BERT 模型,您可以將引數 --do_train
和 --do_eval
傳遞給 run_qa.py
指令碼。使用上述超引數執行指令碼後,您應該會看到以下訓練和驗證結果
"epoch": 3.0,
"train_loss": 0.9465060763888888,
"train_runtime": 368.4015,
"train_samples": 88524,
"train_samples_per_second": 720.877,
"train_steps_per_second": 2.809
The validation step yields the following results:
***** eval metrics *****
epoch = 3.0
eval_exact_match = 80.6623
eval_f1 = 88.2757
eval_samples = 10784
您可以在 Optimum-Graphcore:SQuAD 示例中檢視 IPU BERT 實現的其餘部分。