我们开发了Optimum Ascend作为Transformers和昇腾NPU之间的接口。Optimum Ascend提供一组易用工具,用于加载模型并在单NPU和多NPU配置上进行模型训练和评估,进行不同的下游任务。
当前昇腾适配的版本要求Transformers版本为4.25.1,PyTorch版本为1.8.1。
执行以下代码进行安装。
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保存路径