Transformer模型在各种机器学习任务上都表现出极高的效率,如自然语言处理、音频处理和计算机视觉。然而,这些大型模型的预测速度可能使它们在对话应用或搜索等对延迟敏感的用例中变得不切实际。此外,优化它们在实际环境中的性能需要相当多的时间、精力和技能,这是许多公司和组织所无法达到的。
幸运的是,Hugging Face推出了Optimum,这是一个开源库,可以大大简化在各种硬件平台上降低Transformer模型预测延迟的过程。在本博文中,您将了解如何为Graphcore智能处理单元(IPU)加速Transformer模型,Graphcore IPU是一个专为AI工作负载从头设计的高度灵活、易于使用的并行处理器。
Optimum遇见Graphcore IPU
通过Graphcore和Hugging Face之间的合作,我们现在推出了第一个针对IPU进行优化的BERT模型。在接下来的几个月中,我们将推出更多这样的IPU优化模型,涵盖视觉、语音、翻译和文本生成等各个应用领域。
Graphcore的工程师们使用Hugging Face transformers实现并优化了BERT,帮助开发人员轻松训练、微调和加速他们的最先进模型。
开始使用IPUs和Optimum
让我们以BERT作为例子,帮助您开始使用Optimum和IPUs。
在本指南中,我们将使用Graphcloud中的IPU-POD16系统,Graphcloud是Graphcore的基于云的机器学习平台,并按照《Graphcloud入门》中的PyTorch设置说明进行操作。
Graphcore的Poplar SDK已经安装在Graphcloud服务器上。如果您有其他设置,请在《IPU的PyTorch用户指南》中找到适用于您系统的指令。
设置Poplar SDK环境
您需要运行以下命令来设置几个环境变量,以启用Graphcore工具和Poplar库。在运行Poplar SDK版本2.3的最新系统上,您可以在文件夹/opt/gc/poplar_sdk-ubuntu_18_04-2.3.0+774-b47c577c2a/
中找到它们。
为了使用PyTorch,您需要同时运行Poplar和PopART(Poplar Advanced Runtime)的enable脚本:
$ 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 IPUs之间的接口。
请确保您在上一步中创建的PopTorch虚拟环境已被激活。您的终端应该有一个前缀,显示poptorch环境的名称,如下所示:
(poptorch_env) user@host:~/workspace/poptorch_env$ pip3 install optimum[graphcore] optuna
克隆 Optimum Graphcore 存储库
Optimum Graphcore 存储库包含在 IPU 中使用 Optimum 模型的示例代码。您应该克隆该存储库并将目录更改为包含 BERT 的 IPU 实现的example/question-answering
文件夹。
$ git clone https://github.com/huggingface/optimum-graphcore.git
$ cd optimum-graphcore/examples/question-answering
现在,我们将使用run_qa.py
在 SQUAD1.1 数据集上对 IPU 实现的 BERT 进行微调。
运行示例以对 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 库中的其他问答数据集相同的格式。
加载预训练模型和分词器
为了将单词转换为标记,此脚本需要一个快速分词器。如果您没有传递一个,它将显示一个错误。作为参考,这是支持的分词器列表。
# 分词器检查:此脚本需要一个快速分词器。
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 base model (uncased):使用掩码语言建模(MLM)目标在英语上预训练的模型。它在这篇论文中被介绍,并在这个存储库中首次发布。此模型是无大小写区分的:它不区分英语和英文。”
训练和验证
现在,您可以使用 Optimum 中可用的 IPUTrainer 类充分利用整个 Graphcore 软件和硬件堆栈,在 IPUs 中进行模型训练并进行最小的代码更改。借助 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
验证步骤产生了以下结果:
***** 评估指标 *****
epoch = 3.0
eval_exact_match = 80.6623
eval_f1 = 88.2757
eval_samples = 10784
您可以在Optimum-Graphcore: SQuAD Examples中查看其余的IPU BERT实现。
IPU系统上Optimum Transformers的资源
- Optimum-Graphcore: SQuAD Examples
- Graphcore Hugging Face Models & Datasets
- GitHub教程:使用Hugging Face transformers在IPU上进行BERT微调
- Graphcore开发者门户网站
- Graphcore GitHub
- 在Docker Hub上的Graphcore SDK容器