我们开发了Optimum Ascend作为Transformers和昇腾NPU之间的接口。Optimum Ascend提供一组易用工具,用于加载模型并在单NPU和多NPU配置上进行模型训练和评估,进行不同的下游任务。
当前昇腾适配的版本要求Transformers版本为4.25.1,PyTorch版本为1.11.0。
执行以下代码进行安装。
git clone https://gitee.com/ascend/transformers.git -b optimum && cd transformers pip install -e .
Optimum Ascend设计初衷是让所有transformers用户能够简单直接地进行训练和评估,同时充分利用昇腾NPU的计算能力。
代码中有两种类型的class:
NPUTrainer与Transformers Trainer非常相似。将Transformers Trainer脚本适配到NPU上时,只需要将Transformers Trainer class代码中的Trainer替换为NPUTrainer即可。以下为使用示例。
原始脚本:
from transformers import Trainer, TrainingArguments
training_args = TrainingArguments(
# training arguments...
)
# A lot of code here
# Initialize our Trainer
trainer = Trainer(
model=model,
args=training_args, # Original training arguments.
train_dataset=train_dataset if training_args.do_train else None,
eval_dataset=eval_dataset if training_args.do_eval else None,
compute_metrics=compute_metrics,
tokenizer=tokenizer,
data_collator=data_collator,
)
from optimum.ascend import transfor_to_npu .....
from optimum.ascend import NPUTrainer, NPUTrainingArguments
training_args = NPUTrainingArguments(
# training arguments...
fp16=True, # whether to use mixed precision training
fp16_opt_level="O2", # set mixed precision training mode
)
# A lot of code here
# Initialize our Trainer
trainer = NPUTrainer(
model=model,
args=training_args, # Original training arguments.
train_dataset=train_dataset if training_args.do_train else None,
eval_dataset=eval_dataset if training_args.do_eval else None,
compute_metrics=compute_metrics,
tokenizer=tokenizer,
data_collator=data_collator,
)适配昇腾的Transformers支持模型和下游任务列表见下表。
在执行translation下游任务时,在eval阶段需要进行算子二进制配置。用户需先参考《CANN软件安装指南》中章节安装二进制算子包,再在eval阶段开始前添加以下代码。
torch_npu.npu.set_compile_mode(jit_compile=False)
更多算子二进制配置内容可参考算子二进制调优。
模型 |
单卡 |
多卡 |
下游任务 |
|---|---|---|---|
BERT |
√ |
√ |
|
ALBERT |
√ |
√ |
question answering |
RoBERTa |
√ |
√ |
language modeling |
T5 |
√ |
√ |
translation |
GPT-2 |
√ |
√ |
language modeling |
当前支持在昇腾NPU上对Transformers进行单机单卡、单机多卡训练和APEX模块下的混合精度训练。这里以question_answering下游任务为插件使用样例代码。点击链接获取样例代码run_qa.py,随后执行如下命令拉起训练。
python3.7 run_qa.py \
--model_name_or_path albert-base-v2 \
--dataset_name squad \
--do_train \
--do_eval \
--num_train_epochs 3 \
--learning_rate 3e-5 \
--device_id 0 \
--fp16 \
--fp16_opt_level O2 \
--use_combine_grad \
--loss_scale 1024.0 \
--dataloader_drop_last \
--output_dir ./output
训练命令参数说明如下。
--model_name_or_path // 与训练模型文件夹路径 --dataset_name // 数据集名称 --do_train // 执行训练 --do_eval // 执行评估 --num_train_epochs // 训练的epoch次数 --learning_rate // 初始学习率 --device_id // [插件新增参数]指定单卡训练时的卡号,多卡训练无需使用 --fp16 // 使用混合精度训练,当前只支持apex --fp16_opt_level // apex混合精度级别 --use_combine_grad // [插件新增参数]apex混合精度训练使用combine_grad选项,用于性能调优 --loss_scale // [插件新增参数]apex混合精度训练使用固定loss_scale,用于性能调优 --dataloader_drop_last // 丢弃最后一个不完整的batch --output_dir // 训练结果和checkpoint保存路径