事实证明,Transformer模型在自然语言处理、音频处理和计算机视觉等广泛的机器学习任务上非常有效。但是,这些大型模型的预测速度可能使其不适用于会话或搜索等对时延很敏感的用例。此外,优化它们在现实世界中的性能也需大量的时间、精力和技能,这另许多公司和组织可望不可即。
幸运的是,Hugging Face引入了Optimum,这是一个开源库,可以更轻松地减少各种硬件平台上Transformer模型的预测时延。在本文中,您将了解到如何为Graphcore智能处理器(IPU)——一种高度灵活、易于使用的并行处理器,专为AI工作负载而设计——加速Transformer模型。
当Optimum遇见Graphcore IPU
通过Graphcore和Hugging Face的合作,我们正把BERT作为第一个IPU优化模型进行引入。在接下来的几个月中,我们将推出更多此类的IPU优化模型,涵盖视觉、语音、翻译和文本生成等应用。
Graphcore工程师使用Hugging Face Transformer为我们的IPU系统实施和优化了BERT,以帮助开发人员轻松训练、微调和加速其最先进的模型。
起用IPU和Optimum
让我们以BERT为例,帮助您起用Optimum和IPU。
在本指南中,我们将在Graphcloud(Graphcore的基于云的机器学习平台)中使用 IPU-POD16系统,并按照Graphcloud入门中的PyTorch设置说明进行操作。
Graphcore的Poplar SDK已经安装在Graphcloud服务器上。如果您的设置有所不同,您可以在用于IPU的PyTorch:用户指南中找到适用于您系统的说明。
设置Poplar SDK环境
您需要运行以下命令来激活多个环境变量以启用Graphcore工具和Poplar库。在运行Poplar SDK 2.3版和Ubuntu 18.04的最新系统上,您可以在/opt/gc/poplar_sdk-ubuntu_18_04-2.3.0+774-b47c577c2a/文件夹中找到。
您需要同时运行Poplar和PopART(Poplar高级运行时)的启用脚本才能使用PyTorch:
$ 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$ pip 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脚本仅适用于具有快速分词器(由🤗分词器库支持)的模型,因为它使用这些分词器的特殊功能。BERT模型就是这种情况,您应该将其名称作为输入自变数传递给–model_name_or_path。为了使用IPU,Optimum将从传递给自变数–ipu_config_name的路径中查找ipu_config.json文件。
$ python 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中可用的SQuAD v1.1。您也可以提供自己的CSV/JSON/TXT训练和评估文件,只要它们遵循与SQuAD数据集或Datasets库中的其他问答数据集相同的格式即可。
加载预训练的模型和分词器
要将单词转换为标记,此脚本将需要快速分词器。如果您没有通过,它会显示一个错误。这里是受到支持的分词器列表,供参考。
# 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 base模型(uncased):使用掩码语言建模(MLM)目标的英语语言预训练模型。本文介绍这一概念并首次在此存储库中发布。这个模型是外露的(uncased):它在英语和英语之间没有区别。
训练和验证
您现在可以使用Optimum中提供的IPUTrainer类别来利用整个Graphcore软件和硬件栈,并在IPU中以最少的代码更改来训练您的模型。借助Optimum,您可以即插即用最先进的硬件来训练您最先进的模型。

为了训练和验证BERT模型,您可以将自变数–do_train和–do_eval传递给run_qa.py脚本。使用上面的超参数执行脚本后,您应该会看到以下训练和验证结果:
***** train metrics *****
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
验证步骤产生以下结果:
***** eval metrics *****
epoch = 3.0
eval_exact_match = 80.6623
eval_f1 = 88.2757
eval_samples = 10784
您可以在Optimum-Graphcore: SQuAD示例中查看IPU BERT的其余实施。
用于IPU系统上Optimum Transformer的资源