Skip to content

Latest commit

 

History

History
189 lines (162 loc) · 6.01 KB

File metadata and controls

189 lines (162 loc) · 6.01 KB

Question answering

本目录展示如何基于晟腾 NPU 在问答数据集例如 SQuAD 上 fine-tune Transformers 模型。详细说明请参考官方demo

在 SQuAD1.0 上 fine-tune 模型

run_qa.py 用于在问答数据集(例如 SQUAD)上 fine-tune huggingface hub里任何包含 ForQuestionAnswering 结构的模型。

注意: run_qa.py 只能用于包含 fast tokenizer 的模型的训练,你可以从这里查看模型是否包含 fast tokenizer。

准备训练环境

请参考《Transformers_npu 安装方法》准备训练环境并安装 Transformers 套件和适配插件。

安装依赖

cd ./examples/question-answering/
pip3 install -r requrements.txt

修改训练脚本run_qa.py

run_qa.pytrainer_qa.pyutils_qa.py 取自 Transformers 官方仓, 需要在 run_qa.py 脚本中引入 transformers_npu 插件以支持在晟腾 NPU 上使用 Transformers 套件,具体修改见 run_qa.py 第 30 行。

import logging
import os
import sys
from dataclasses import dataclass, field
from typing import Optional

import datasets
from datasets import load_dataset, load_metric

import transformers_npu   # <<< 修改点
import transformers
from trainer_qa import QuestionAnsweringTrainer
from transformers import (
    AutoConfig,
    AutoModelForQuestionAnswering,
    AutoTokenizer,
    DataCollatorWithPadding,
    EvalPrediction,
    HfArgumentParser,
    PreTrainedTokenizerFast,
    TrainingArguments,
    default_data_collator,
    set_seed,
)
from transformers.trainer_utils import get_last_checkpoint
from transformers.utils import check_min_version
from transformers.utils.versions import require_version
from utils_qa import postprocess_qa_predictions

准备模型权重、数据集脚本和 metrics 脚本

为避免网络波动导致模型权重、数据集和 metrics 脚本下载失败,这里介绍从本地加载模型权重,数据集下载脚本和 metrics 脚本的方法。

  1. 下载模型权重

    这里以 albert-base-v2 为例。访问 huggingface hub 并搜索 albert-base-v2,选择 Use in Transformers 获取 git 下载地址,如下图所示 img.png

    Git 执行如下命令:

    git lfs install
    git clone https://huggingface.co/albert-base-v2
  2. 下载数据集脚本

    执行如下命令下载问答数据集脚本

    git clone https://huggingface.co/datasets/squad
  3. 下载 metrics 脚本

    执行如下命令下载 metrics 脚本

    git clone https://github.com/huggingface/datasets.git
  4. 将上述文件移动到跟训练脚本 run_qa.py 同级目录下

    如下图所示 img.png

训练模型

cd ./examples/question-answering/test/
# 执行单卡训练脚本
bash ./train_performance_1p.sh --model_name=bart-base # 不指定模型名,则默认为 albert-base-v2

训练结果展示

注: NPU 数据基于测试版本给出,需要补充商发版本的数据。

models F1 FPS Epochs AMP_Type
bart-base 1p-GPU - 60.247 1 O2
1p-NPU - 76.549 1 O2
8p-GPU 89.8722 319.242 2 O2
8p-NPU 89.7334 555.023 2 O2
albert-base-v2 1p-GPU - 38.294 1 O1
1p-NPU - 93.482 1 O1
8p-GPU 90.8276 570.732 2 O1
8p-NPU 88.7564 700.265 2 O1

问题

  1. 模型 bart evalation 阶段报 ”ValueError: predictions should be a tuple with two elements (start_logits, end_logits)."

    def post_processing_function(examples, features, predictions, stage="eval"):
        # Post-processing: we match the start logits and end logits to answers in the original context.
        predictions = postprocess_qa_predictions(
            examples=examples,
            features=features,
            predictions=predictions,   # >>> predictions=predictions[0:2],
            version_2_with_negative=data_args.version_2_with_negative,
            n_best_size=data_args.n_best_size,
            max_answer_length=data_args.max_answer_length,
            null_score_diff_threshold=data_args.null_score_diff_threshold,
            output_dir=training_args.output_dir,
            log_level=log_level,
            prefix=stage,
        )
  2. 模型 bart evalation 阶段报内存溢出

    训练参数增加 --max_eval_samples 2000