# TinyBERT ["TinyBERT: Distilling BERT for Natural Language Understanding"](https://arxiv.org/abs/1909.10351)论文的实现 ## 1. 依赖 - Python 3.6 - oneflow-cu101 0.1.10 完整的环境可以通过以下命令安装: ```bash conda create -n tinybert python=3.6 ``` ```bash python3 -m pip install --find-links https://oneflow-inc.github.io/nightly oneflow_cu101 --user ``` > 注:以下操作时,根目录为`model_compress/distil` ## 2. 通用蒸馏 (General Distillation,可选) 通用蒸馏阶段使用预训练得到的 BERT-base 为教师模型,在大规模文本语料上进行知识蒸馏得到通用的TinyBERT。 这个操作可以让TinyBERT学习到通用的语义表示,提高了模型的泛化能力,也为随后针对特定任务的蒸馏提供了一个很好的初始化。 通用蒸馏包含两步: (1)语料预处理 (2)通用蒸馏 ### 2.1 语料预处理 准备大规模语料,比如[WikiText-2 dataset](https://blog.einstein.ai/the-wikitext-long-term-dependency-language-modeling-dataset/)。可以用过如下命令下载: ``` cd data wget https://s3.amazonaws.com/research.metamind.io/wikitext/wikitext-103-raw-v1.zip unzip wikitext-103-raw-v1.zip rm wikitext-103-raw-v1.zip ``` 执行以下命令,进行训练数据预处理 - CORPUS_RAW:大规模语料,比如说Wikipedia - BERT_BASE_DIR:教师模型类型 - OUTPUT_DIR: 处理过的语料保存路径 直接执行 ```bash bash run_pregenerate_training_data.sh ``` 或者 执行 ```bash CORPUS_RAW='./data/wikitext-103-raw/wiki.train.raw' BERT_BASE_DIR='bert-base-uncased' OUTPUT_DIR='./data/pretrain_data_json' python pregenerate_training_data.py \ --train_corpus $CORPUS_RAW \ --bert_model $BERT_BASE_DIR \ --do_lower_case \ --epochs_to_generate 3 \ --output_dir $OUTPUT_DIR ``` ### 2.2 通用蒸馏 将Pytorch的通用TinyBERT模型转为OneFlow的模型格式: Pytorch版通用tinybert -> tensorflow版通用tinybert -> OneFlow版通用tinybert #### Step1: - 从[TinyBERT页面](https://github.com/huawei-noah/Pretrained-Language-Model/tree/master/TinyBERT)下载已经训练好的通用TinyBERT模型: - 利用我们提供的convert_bert_pytorch_checkpoint_to_original_tf.py脚本,将其转为tensorflow模型格式。转换过程如下: ``` python convert_bert_pytorch_checkpoint_to_original_tf.py --model_name='./models/2nd_General_TinyBERT_4L_312D' --pytorch_model_path='./models/2nd_General_TinyBERT_4L_312D/pytorch_model.bin' --tf_cache_dir='./models/2nd_General_TinyBERT_4L_312D_tf' ``` - 再利用我们提供的convert_tf_ckpt_to_of.py脚本,将其转为oneflow模型格式。转换过程如下: ``` cd ./models/2nd_General_TinyBERT_4L_312D_tf/ cat > checkpoint <学生模型acc 91.3% - 模型尺寸:教师模型110M -> 学生模型 14.5M (↓7.5x) - 推理耗时:教师模型4.04s -> 0.65s (↓6.2×)