记录BERT复现Squad1.1

使用github中的bert库,尝试复现其中一个,顺便观察采用cpu配置的运算效率.

1.基本配置

1.使用bert当前库的代码
2.使用BERT-Base,Uncased预训练模型
3.使用SQuAD1.1进行训练,文件包括train-v1.1.json,dev-v1.1.json,evaluate-v1.1.py三个文件
4.训练硬件配置:
dell r420系统
    cpu:e5-2418lv2
    ram:10G ddr3 1066
    rom:stat3.5
    OS:proxmox中的Ubuntu18虚拟机,支持AVX指令
5.训练代码:
'''
python /home/tensorflow/bert/run_squad.py \
  --vocab_file=/home/tensorflow/baseun12/vocab.txt \
  --bert_config_file=/home/tensorflow/baseun12/bert_config.json \
  --init_checkpoint=/home/tensorflow/baseun12/bert_model.ckpt \
  --do_train=True \
  --train_file=/home/tensorflow/squad1/train-v1.1.json \
  --do_predict=True \
  --predict_file=/home/tensorflow/squad1/dev-v1.1.json \
  --train_batch_size=12 \
  --learning_rate=5e-5 \
  --num_train_epochs=2.0 \
  --max_seq_length=128 \
  --doc_stride=128 \
  --output_dir=/home/tensorflow/squad/
'''
6.squad是问答系统,即针对问题猜答案型的语言理解,本次训练没有修改bert_config.json的任何参数.

2.训练过程

由于bert出现的距离较近,网上对使用CPU训练的测评相对较少,在硬件紧缺的情况下,主要想测试训练负荷,以便日后使用.

刚开始尝试Squad v2.0进行训练,使用BERT-large,发现速度非常慢(12个小时无法完成1000次checkpoints),于是放弃,改为训练v1.1版本.

本次训练采用纯CPU的方法,耗时约120个小时,最后没有错误全部跑完,并得到predictions.json文件.

本次训练完成后使用以下代码进行评估:
python /home/tensorflow/squad1/evaluate-v1.1.py /home/tensorflow/squad1/dev-v1.1.json /home/tensorflow/squad/predictions.json

得出的结果如下:
{"f1": 86.29033189483464, "exact_match": 78.76064333017976}

这个结果比预计的88.5%左右要低,仅有86.29%,但这样的成绩已经相对来说算是很优秀的.

3.结果分析

本次虽然训练时间较长[按照100w的平均功率,耗电约12°,约6.3元],但好在基本复现了预期结果,没有出错,但由于硬件配置较低,特别是内存,导致train_batch_size和max_seq_length两个参数设置的较小,这应该是影响准确度的原因所在.根据分析结果,主要结论如下:

  1. train_batch_size和max_seq_length两个参数的设置,不仅影响内存使用量,而且影响准确率.训练的过程中,12和128的参数几乎将10G内存耗完,使得ssh无法流畅使用,可以说该参数几乎达到了极限(不动用swap).此外这个参数与推荐的24和384相差较多,结果差异尚且不大,但效率差异非常大.
  2. 训练过程中,如果上述两个参数调节过大,使得内存溢出,使用swap转储的情况下,效率会降低50倍以上,意味着训练的时间将增加两个数量级,所以在训练个过程中应该尽量避免此类情况的出现.
  3. Bert算法可以有目的的理解语言,特别是精准问题的解答,准确率达到85%以上,未来可以考虑将其与搜索引擎结合,从而找到并梳理出可信的检索结果.
  4. 使用CPU训练,当作学习了解还可以,几乎无法部署到生产环境使用,效率太低.

ddzzhen

发表评论