文件最后提交记录最后更新时间
init 4 年前
文档整改,gitee->gitcode Co-authored-by: Lighters_c<zyh13227@163.com> # message auto-generated for no-merge-commit merge: !7469 merge ffffix into master 文档整改,gitee->gitcode Created-by: addsubmuldiv Commit-by: Lighters_c Merged-by: ascend-robot Description: ## Motivation Please describe the motivation of this PR and the goal you want to achieve through this PR. ## Modification Please briefly describe what modification is made in this PR. ## Self-test (Optional) If modifications to this PR may cause/fix function/accuracy/performance DTSs/issues, a self-inspection record needs to be attached. ## BC-breaking (Optional) If there are compatibility issues, such as dependencies on cann/torch_npu versions, they need to be explained in the PR. ## Checklist **Before PR**: - [ ] The new code needs to comply with the Clean Code specification. - [ ] The PR content is self-checked, and the expression can be clear and the writing standardized **After PR**: - [ ] CLA has been signed and all committers have signed the CLA in this PR. - [ ] The ci-pipeline is passed, Code Check is passed. See merge request: Ascend/ModelZoo-PyTorch!74695 个月前
!5097 [众智][PyTorch离线推理][nlp] Bert类模型支持UnPad方案 * doc: add description to use fastertransformer * feature: support npy format for postprocess 2 年前
!3931 [众智][PyTorch离线推理][NLP] roberta补充不同seq_length精度/性能 * Roberta: update performace/acc for mul seq * Roberta: add opt process 3 年前
!3931 [众智][PyTorch离线推理][NLP] roberta补充不同seq_length精度/性能 * Roberta: update performace/acc for mul seq * Roberta: add opt process 3 年前
!5055 新增bert,albert,roberta的unpad方案onnx改图脚本 * 增加bert,albert,roberta的unpad方案onnx脚本 2 年前
!5891 [众智][PyTorch离线推理][nlp][roberta]模型静态场景下的精度与性能问题修复 * fix: 修复静态模型精度问题与性能问题 * fix: 修复静态模型精度问题与性能问题 2 年前
!4051 [众智][PyTorch离线推理][nlp] roberta添加精度配置文件 * roberta: add precision config file 3 年前
!5891 [众智][PyTorch离线推理][nlp][roberta]模型静态场景下的精度与性能问题修复 * fix: 修复静态模型精度问题与性能问题 * fix: 修复静态模型精度问题与性能问题 2 年前
!5322 [众智][PyTorch离线推理][nlp] BERT类模型补充Unpad方案性能 * [RoBERTa] 修复推理流程问题 * [RoBERTa] 补充unpad性能 * [Albert] 补充unpad性能 * [bert hugging face] 修复requirements中的名称错误 * [bert hugging face] 补充unpad性能 2 年前
README.md

RoBERTa模型-推理指导

概述

RoBERTa 属于BERT的强化版本,也是BERT模型更为精细的调优版本。RoBERTa 模型是BERT 的改进版(从其名字来看,A Robustly Optimized BERT,即简单粗暴称为强力优化的BERT方法)。主要在在模型规模、算力和数据上,进行了一些改进。

  • 参考实现:

    url=https://github.com/pytorch/fairseq.git
    mode_name=RoBERTa
    hash=c1624b27
    

输入输出数据

  • 输入数据

    说明:原仓默认的seq_length为70

    输入数据 数据类型 大小 数据排布格式
    src_tokens INT64 batchsize x seq_len ND
  • 输出数据

    输出数据 数据类型 大小 数据排布格式
    output FLOAT32 batchsize x num_class ND

推理环境准备

  • 该模型需要以下插件与驱动:

    表 1 版本配套表

    配套 版本 环境准备指导
    固件与驱动 23.0.RC2 Pytorch框架推理环境准备
    CANN 6.3.RC2 -
    Python 3.7.5 -
    PyTorch 1.5.0+ -
    说明:Atlas 300I Duo 推理卡请以CANN版本选择实际固件与驱动版本。 \ \

快速上手

获取源码

  1. 获取源码。

    git clone https://gitcode.com/ascend/ModelZoo-PyTorch.git        # 克隆仓库的代码
    git checkout master         # 切换到对应分支
    cd ACL_PyTorch/contrib/nlp/roberta              # 切换到模型的代码仓目录
    
  2. 安装依赖。

    pip3 install -r requirements.txt
    git clone https://gitcode.com/ascend/msadvisor && cd msadvisor && git checkout master
    cd auto-optimizer && python3 -m pip install .
    cd ../..
    

    安装模型依赖:

    git clone https://github.com/pytorch/fairseq.git fairseq_workspace
    cd fairseq_workspace
    git checkout c1624b27
    patch -p1 < ../roberta-infer.patch
    pip3 install --editable ./
    

准备数据集

本模型使用 SST-2官方数据集,解压到 ./data 目录,如 ./data/SST-2 ,目录结构如下:

```
├── data
|   ├── SST-2
|   |    ├── test.tsv
│   |    ├── dev.tsv
│   |    ├── train.tsv
│   |    ├── original/
```

执行预处理脚本:

# 使用代码仓自带脚本下载&&完成部分前置处理工作
bash fairseq_workspace/examples/roberta/preprocess_GLUE_tasks.sh data/ SST-2
若提示下载失败,则修改preprocess_GLUE_tasks.sh中wget部分代码
将:
 wget -N 'https://dl.fbaipublicfiles.com/fairseq/gpt2_bpe/encoder.json'
 wget -N 'https://dl.fbaipublicfiles.com/fairseq/gpt2_bpe/vocab.bpe'
 wget -N 'https://dl.fbaipublicfiles.com/fairseq/gpt2_bpe/dict.txt'
修改为:
 wget -N 'https://dl.fbaipublicfiles.com/fairseq/gpt2_bpe/encoder.json' --no-check-certificate
 wget -N 'https://dl.fbaipublicfiles.com/fairseq/gpt2_bpe/vocab.bpe' --no-check-certificate
 wget -N 'https://dl.fbaipublicfiles.com/fairseq/gpt2_bpe/dict.txt' --no-check-certificate
 

# 生成om推理所需预处理数据
python3 RoBERTa_preprocess.py --data_path ./data/SST-2-bin --pad_length 70
  • 参数说明:

    • --data_path: 数据集所在路径,输出数据保存在其下层目录下

    • --pad_length: 模型输入seq长度

生成预处理数据在 ./data/SST-2-bin/roberta_base_bin_70

模型推理

  1. 模型转换。

    获取权重文件:RoBERTa模型pth权重文件,密码: x248。

    解压后将checkpoint.pt文件放至 ./checkpoints 目录下(如没有则新建该目录)。

    1. 导出onnx文件。

      1. 使用以下脚本导出onnx文件:

        # 以bs1为例
        python3 RoBERTa_pth2onnx.py --checkpoint_path checkpoints/ --checkpoint_file checkpoint.pt --data_name_or_path ./data/SST-2-bin --onnx_path outputs --batch_size 1 --pad_length 70
        
        • 参数说明:

          • --checkpoint_path:权重文件所在目录

          • --checkpoint_file:权重文件名

          • --data_name_or_path: 数据集路径

          • --onnx_path: 输出onnx文件所在目录

          • --batch_size: 模型batchsize

          • --pad_length: 模型输入seq长度

        获得roberta_base_seq70_bs1.onnx文件。

      2. 优化ONNX文件。

        静态模型修改:

        # 以bs1为例
        python3 -m onnxsim outputs/roberta_base_seq70_bs1.onnx outputs/roberta_base_seq70_bs1_sim.onnx
        # 输入参数: {原始模型} {修改后的模型路径} {batch_size} {seq_length}
        python3 opt_onnx.py outputs/roberta_base_seq70_bs1_sim.onnx outputs/roberta_base_seq70_bs1_opt.onnx 1 70
        

        获得roberta_base_seq70_bs1_opt.onnx文件。

        动态模型修改:

        # bs: [4, 8, 16, 32]
        # seq: 128
        python3 -m onnxsim outputs/roberta_base_seq128_bs${bs}.onnx outputs/roberta_base_seq128_bs${seq}_sim.onnx
        # 输入参数: {原始模型} {修改后的模型路径} {batch_size} {seq_length}
        python3 opt_onnx.py outputs/roberta_base_seq128_bs${bs}_sim.onnx outputs/roberta_base_seq128_bs${bs}_opt.onnx ${bs} 128
        python3 fix_onnx2unpad.py --input_file outputs/roberta_base_seq128_bs${bs}_opt.onnx --output_file outputs/roberta_base_seq128_bs${bs}_unpad.onnx
        
    2. 使用ATC工具将ONNX模型转OM模型。

      1. 配置环境变量。

        source /usr/local/Ascend/ascend-toolkit/set_env.sh
        # 使能transformer加速库:动态Unpad方案必需
        source ${ASCENDIE_HOME}/set_env.sh
        
      2. 执行命令查看芯片名称(${chip_name})。

        npu-smi info
        #该设备芯片名为Ascend310P3 (自行替换)
        回显如下:
        +-------------------|-----------------|------------------------------------------------------+
        | NPU     Name      | Health          | Power(W)     Temp(C)           Hugepages-Usage(page) |
        | Chip    Device    | Bus-Id          | AICore(%)    Memory-Usage(MB)                        |
        +===================+=================+======================================================+
        | 0       310P3     | OK              | 15.8         42                0    / 0              |
        | 0       0         | 0000:82:00.0    | 0            1074 / 21534                            |
        +===================+=================+======================================================+
        | 1       310P3     | OK              | 15.4         43                0    / 0              |
        | 0       1         | 0000:89:00.0    | 0            1070 / 21534                            |
        +===================+=================+======================================================+
        
      3. 执行ATC命令。

        静态模型转化:

        # bs1为例
        atc --framework=5 --model=./outputs/roberta_base_seq70_bs1_opt.onnx --output=./outputs/roberta_base_seq70_bs1 --input_format=ND --input_shape="src_tokens:1,70" --log=debug --soc_version=${chip_name} --op_precision_mode=precision.ini
        
        • 参数说明:

          • --model:为ONNX模型文件。
          • --framework:5代表ONNX模型。
          • --output:输出的OM模型。
          • --input_format:输入数据的格式。
          • --log:日志级别。
          • --soc_version:处理器型号。
          • --op_precision_mode: 指定部分算子采用特定精度模式。

          运行成功后生成模型文件roberta_base_seq70_bs1.om。

        动态模型转化:

        # bs32为例
        atc --framework=5 --model=./outputs/roberta_base_seq128_bs32_unpad.onnx --output=./outputs/roberta_base_seq128_bs32_unpad --input_format=ND --input_shape="src_tokens:-1,128" --log=debug --soc_version=${chip_name}
        
        • 参数说明:

          • --model:为ONNX模型文件。
          • --framework:5代表ONNX模型。
          • --output:输出的OM模型。
          • --input_format:输入数据的格式。
          • --log:日志级别。
          • --soc_version:处理器型号。

          运行成功后生成模型文件roberta_base_seq128_bs32_unpad_${os}_${arch}.om。

  2. 开始推理验证。

    1. 使用ais-bench工具进行推理。

      请访问ais_bench推理工具代码仓,根据readme文档进行工具安装。

    2. 执行推理。

      静态模型推理:

      # 以bs1为例
      mkdir -p results/bs1
      python3 -m ais_bench --model outputs/roberta_base_seq70_bs1.om --input ./data/SST-2-bin/roberta_base_bin_70 --output results/ --output_dirname seq70_bs1 --device 1 --batchsize 1
      
      • 参数说明:

        • --model:om文件路径。
        • --input:输入文件。
        • --output:输出目录。
        • --device:NPU设备编号。
        • --batchsize: 模型对应batchsize。

      推理后的输出默认在当前目录results/seq70_bs1下。

      动态模型推理:

      # 以bs32为例
      python3 -m ais_bench --model outputs/roberta_base_seq128_bs32_${os}_${arch}.om --input ./data/SST-2-bin/roberta_base_bin_128 --output results_dynamic/ --output_dirname seq128_bs32 --device 1 --outfmt NPY --dymShape "src_tokens:32,128" --outputSize 1000000
      
      • 参数说明:

        • --model:om文件路径。
        • --input:输入文件。
        • --output:输出目录。
        • --device:NPU设备编号。
        • --outfmt: 模型输出格式。
        • --dymShape: 模型输入shape。
        • --outputSize: 模型输出bufffer大小。

      推理后的输出默认在当前目录results_dynamic/seq128_bs32下。

    3. 精度验证。

      调用脚本与GT label,可以获得精度数据:

      # 以bs1为例
      python3 RoBERTa_postprocess.py --res_path=./results/seq70_bs1/ --data_path=./data/SST-2-bin
      
      • 参数说明:

        • --res_path:为生成推理结果所在路径

        • --data_path:为标签数据所在目录

模型推理性能&精度

调用ACL接口推理计算,性能参考下列数据。

默认seq_length为70的精度/性能如下:

基准精度:ACC: 94.8%

芯片型号 Batch Size 数据集 精度 性能
300I Pro 1 SST-2 Acc: 94.0% 205 fps
300I Pro 4 SST-2 - 817 fps
300I Pro 8 SST-2 - 1244 fps
300I Pro 16 SST-2 - 1463 fps
300I Pro 32 SST-2 - 1473 fps
300I Pro 64 SST-2 - 1206 fps

其他seq_length下部分精度性能如下(仅展示bs1/最优bs):

模型方案 seq_length Batch Size 数据集 基准精度 300I PRO精度 300I PRO性能
静态 16 1 SST-2 Acc: 86.7% Acc: 86.6% 602fps
静态 16 64 SST-2 - - 8649fps
静态 32 1 SST-2 Acc: 93.8% Acc: 93.2% 508fps
静态 32 64 SST-2 - - 4718fps
静态 64 1 SST-2 Acc: 94.7% Acc: 94.1% 405fps
静态 64 32 SST-2 - - 2413fps
静态 128 1 SST-2 Acc: 94.7% Acc: 94.1% 418fps
静态 128 32 SST-2 - - 1100fps
动态 128 4 SST-2 Acc: 94.7% Acc: 94.7% 487fps
动态 128 8 SST-2 Acc: 94.7% Acc: 94.7% 906fps
动态 128 16 SST-2 Acc: 94.7% Acc: 94.7% 1277fps
动态 128 32 SST-2 Acc: 94.7% Acc: 94.7% 1715fps
动态 128 64 SST-2 Acc: 94.7% Acc: 94.7% 1895fps