達成tensorflow環境下で定量化し、完全なBERTの軽量Bert_base

環境:

ウィンドウズ10

python 3.5

tensorflow 1.13.1

numpyの1.18.1  

 

1.まず、Googleのオープンソースの良いプレトレーニングモデルをダウンロードしてください。私はこれが(最初の)BERT - ベース、Uncasedで使用します

  BERT-ベース、 Uncased:12は、768-隠された、12層であり、110Mパラメータ・ヘッズで
  BERT-大、Uncased:24レイヤ、1024隠され、16頭、340Mパラメータ
  同棲BERT-ベース、:12は、レイヤです隠された-768、12で-ヘッズ、110Mパラメータ
2参照https://www.zybuluo.com/Team/note/1632532   (  https://zhuanlan.zhihu.com/p/91024786?utm_source=wechat_session&utm_medium=social&utm_oi=1035849572991401984)パートIV。それは以下の図です。

  

 3.オープンは、それらの一部を変換するために、NVIDIAの公式githubのは、パラメータ変更の一部でした。

  https://github.com/NVIDIA/DeepLearningExamples/blob/master/FasterTransformer/v2/sample/tensorflow_bert/ckpt_type_convert.py

  次のようにするコードが実装されている:(機能)FP16にFP32を変換することです

1つの インポートTFとしてtensorflow
 2  インポートnumpyのはNPとして
 3  から tensorflow.contrib.framework.python.frameworkのインポートcheckpoint_utils
 4  から tensorflow.python.opsのインポートio_ops
 5  から tensorflow.python.training.saver インポートBaseSaverBuilder
 6  
7  
8  DEF checkpoint_dtype_cast(in_checkpoint_file 、out_checkpoint_file):
 9      var_list = checkpoint_utils.list_variables(tf.flags.FLAGS.init_checkpoint)
 10  
11      DEF init_graph():
 12         以下のための名前、形状var_list:
 13              VAR = checkpoint_utils.load_variable(tf.flags.FLAGS.init_checkpoint、名)
 14              recon_dtype = tf.float16 場合 var.dtype == np.float32 var.dtype
 15              tf.get_variable(名前、形状=形状、DTYPE = recon_dtype)
 16  
17      init_graph()
 18      セーバー= tf.train.Saver(ビルダー= CastFromFloat32SaverBuilder())
 19      のSESとしてtf.Session()を持つ:
 20          saver.restore(SESの、in_checkpoint_file)
 21          セーバー。 、(SESのを保存"tmp.ckpt ' 22  
23      tf.reset_default_graph()
 24  
25      init_graph()
 26      セーバー= tf.train.Saver()
 27      のSESとしてtf.Session()を持つ:
 28          saver.restore(SESの、' tmp.ckpt ' 29          (out_checkpoint_fileのSES)​​saver.save
 30  
31  
32  クラスCastFromFloat32SaverBuilder(BaseSaverBuilder):
 33      tensorflow.python.training.saver.BulkSaverBuilder.bulk_restoreに基づいて
34      デフbulk_restore(自己、filename_tensor、saveables、preferred_shard、
35                       restore_sequentially):
 36          restore_specs = []
 37           saveable saveables:
 38              のための仕様saveable.specs:
 39                  restore_specs.append((spec.name、spec.slice_spec、spec.dtype))
 40          名、スライス、dtypes =ジップ(* restore_specs)
 41          restore_dtypes = [tf.float32 場合 dtype.base_dtype == tf.float16  DTYPE ため DTYPE dtypes]
 42          印刷情報
43          のためのI における範囲(LEN(restore_specs)):
 44              プリント(名前[i]は、' から'、restore_dtypes [i]は、' ' 、dtypes [I] .base_dtype)
 45          tf.device有する(" CPU:0 " ) :
 46              =回復io_ops.restore_v2(
 47                  filename_tensor、名前、スライス、restore_dtypes)
 48              リターン [tf.cast(R、dt.base_dtype)のために、RをDT ジッパー(復元、dtypes)]
 49  
50  
51  場合 __name__ == '__main__ " 52      tf.flags.DEFINE_string(" fp16_checkpoint "" mrpc_output / fp16_model.ckpt "" FP16チェックポイント・ファイル" 53      tf.flags.DEFINE_string(" init_checkpoint "" bert_base / bert_model.ckpt "" 最初のチェックポイントファイル" 54      checkpoint_dtype_cast(tf.flags.FLAGS.init_checkpoint、tf.flags.FLAGS.fp16_checkpoint)

  前記2つのパラメータの主な機能は変更することができます。最初のモデルは、あなたが最終的な出力を変換したい場所であり、第二は、あなたがダウンロードしたモデルをグーグルのアドレスです。

 

おすすめ

転載: www.cnblogs.com/dhName/p/12628828.html