在这个教程中,我们所做的任务为MRPC数据上的文本匹配,因为在BERT中,文本匹配本质是一个双句文本分类,因此下面代码用文本分类的方法进行任务。本次教程依托PAI-PyTorch上开发的EasyNLP,用户仅需要配置好相关命令参数,改动少量代码就可以在PAI上跑BERT文本分类任务。

1. 用户自定义模式

跑脚本

  1. cd EasyNLP/examples/self_defined_examples/
  2. sh run_user_defined_local.sh

下载数据

  1. export CUDA_VISIBLE_DEVICES=0
  2. # Local training example
  3. # cur_path=/tmp/EasyNLP
  4. cur_path=/home/admin/workspace/EasyNLP/
  5. cd ${cur_path}
  6. if [ ! -f ./tmp/train.tsv ]; then
  7. wget http://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/tutorials/classification/train.tsv
  8. wget http://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/tutorials/classification/dev.tsv
  9. mkdir tmp/
  10. mv *.tsv tmp/
  11. fi

跑训练脚本

这里预训练模型是: bert-small-uncased

  1. DISTRIBUTED_ARGS="--nproc_per_node 1 --nnodes 1 --node_rank 0 --master_addr localhost --master_port 6009"
  2. python -m torch.distributed.launch $DISTRIBUTED_ARGS \
  3. examples/self_defined_examples/main.py \
  4. --mode train \
  5. --tables=tmp/train.tsv,tmp/dev.tsv \
  6. --input_schema=label:str:1,sid1:str:1,sid2:str:1,sent1:str:1,sent2:str:1 \
  7. --first_sequence=sent1 \
  8. --second_sequence=sent2 \
  9. --label_name=label \
  10. --label_enumerate_values=0,1 \
  11. --checkpoint_dir=./tmp/classification_model/ \
  12. --learning_rate=3e-5 \
  13. --epoch_num=3 \
  14. --random_seed=42 \
  15. --logging_steps=1 \
  16. --save_checkpoint_steps=50 \
  17. --sequence_length=128 \
  18. --micro_batch_size=10 \
  19. --app_name=text_classify \
  20. --use_amp \
  21. --user_defined_parameters='pretrain_model_name_or_path=bert-small-uncased'

2. AppZoo模式

下面以BERT 文本分类/匹配为例子,测试AppZoo功能。BERT 文本分类/匹配采用BERT类模型训练模型,输出分类标签。在easynlp 命令中选择 text_classify 即可调用这个模型。
其他功能详见:https://www.yuque.com/easyx/easynlp/kkhkai

首先可以下载 训练集评估集,其中 train.csv , dev.csv 是用\t 分隔的 .csv 文件。

  1. wget http://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/easytexminer/tutorials/classification/train.tsv
  2. wget http://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/easytexminer/tutorials/classification/dev.tsv

模型训练

  1. easynlp \
  2. --mode=train \
  3. --worker_gpu=1 \
  4. --tables=train.tsv,dev.tsv \
  5. --input_schema=label:str:1,sid1:str:1,sid2:str:1,sent1:str:1,sent2:str:1 \
  6. --first_sequence=sent1 \
  7. --second_sequence=sent2 \
  8. --label_name=label \
  9. --label_enumerate_values=0,1 \
  10. --checkpoint_dir=./classification_model \
  11. --learning_rate=3e-5 \
  12. --epoch_num=3 \
  13. --random_seed=42 \
  14. --save_checkpoint_steps=50 \
  15. --sequence_length=128 \
  16. --micro_batch_size=32 \
  17. --app_name=text_classify \
  18. --user_defined_parameters='
  19. pretrain_model_name_or_path=bert-small-uncased
  20. '

模型评估

  1. easynlp \
  2. --mode=evaluate \
  3. --worker_gpu=1 \
  4. --tables=dev.tsv \
  5. --input_schema=label:str:1,sid1:str:1,sid2:str:1,sent1:str:1,sent2:str:1 \
  6. --first_sequence=sent1 \
  7. --second_sequence=sent2 \
  8. --label_name=label \
  9. --label_enumerate_values=0,1 \
  10. --checkpoint_path=./classification_model \
  11. --micro_batch_size=32 \
  12. --sequence_length=128 \
  13. --app_name=text_classify

模型预测

easynlp \
    --mode=predict \
    --worker_gpu=1 \
    --tables=dev.tsv \
    --outputs=dev.pred.tsv \
    --input_schema=label:str:1,sid1:str:1,sid2:str:1,sent1:str:1,sent2:str:1 \
    --output_schema=predictions,probabilities,logits,output \
    --append_cols=label \
    --first_sequence=sent1 \
    --second_sequence=sent2 \
    --checkpoint_path=./classification_model \
    --micro_batch_size=32 \
    --sequence_length=128 \
    --app_name=text_classify

参数说明:

  • output_schema:需要输出的结果类型,默认有四种:predictions(预测结果),probabilities(预测的概率),logits(预测的logits,即softmax之前的值),output(输出值)
  • append_cols:需要append的输入数据的column,多个column可以用逗号分隔