BERT のメモ (2019 年 10 月 27 日時点)

# 背景

vtuber になるため, 顔認識, Speech 認識, text-to-speech, vtuber レンダリングとかはだいたい理解したので, 最後(?)のかなめである文脈解析とか自然言語処理とかの理解を極めたい.

CMU SARA でいう reasoning の部分, みたいな?

SARA: the Socially Aware Robot Assistant
http://articulab.hcii.cs.cmu.edu/projects/sara/

昨今では BERT が有名っぽいので BERT を調べる.

## 用語

* Attention : 日本語直訳では「注意」であるが, アテンションでいいのではないだろうか, 実質的には確率分布のようなもの
* Transformer(s) : 変形するロボットアニメ(or 映画)では「無い」. Encoder/Decoder みたいなもの
* BERT : Bidirectional Encoder Representations from Transformers(BDPT: Bi-Directional Path Tracing みたいな響のもの https://graphics.stanford.edu/courses/cs348b-03/papers/veach-chapter10.pdf )
* GELU : Gaussian Error Linear Units (GELUs).  https://arxiv.org/abs/1606.08415

## 必要知識

Transformer(Attention) をまず理解しておく必要があります.

作って理解する Transformer / Attention
https://qiita.com/halhorn/items/c91497522be27bde17ce

このあと, BERT 論文とか Qiita の BERT 解説記事よめばだいたい BERT 理解できます.

## 発展

Cross-lingual Language Model Pretraining(XLM)
https://github.com/facebookresearch/XLM/


XLNet: Generalized Autoregressive Pretraining for Language Understanding
https://arxiv.org/abs/1906.08237

Large Batch Optimization for Deep Learning: Training BERT in 76 minutes
https://arxiv.org/abs/1904.00962

LAMB と呼ぶ large batch optimization により, バッチを増やしすつつ精度を落とさずに学習時間をスケーラブルに短縮している. 学習に 3 日かかるのを 76 分に短縮(時間として 64 倍で, 利用した TPUs も 16 -> 1024 個と 64 倍になっている)

### ERNIE

Baidu’s Optimized ERNIE Achieves State-of-the-Art Results in Natural Language Processing Tasks
http://research.baidu.com/Blog/index-view?id=121

https://github.com/PaddlePaddle/ERNIE

PaddleLite https://github.com/PaddlePaddle/Paddle-Lite で ERNIE 推論動いたりしないかしらん

## 最適化(高速化)とか

一から pre-train 学習ですとなかなか計算量の多いものなので, いろいろな方が最適化や軽量化などを提案しています. ありがたいですね.

RoBERTa: A Robustly Optimized BERT Pretraining Approach
https://arxiv.org/abs/1907.11692


NVIDIA Achieves 4X Speedup on BERT Neural Network
https://news.developer.nvidia.com/nvidia-achieves-4x-speedup-on-bert-neural-network/

(PyTorch の nn.Transformer は NVIDIA による CUDA 最適化が施してあるのかしらん?)


NVIDIA Clocks World’s Fastest BERT Training Time and Largest Transformer Based Model, Paving Path For Advanced Conversational AI
https://devblogs.nvidia.com/training-bert-with-gpus/

Tesla V100(32GB mem) で 1,024 枚で 1 時間程度で学習しています. 

Megatron-LM
https://github.com/NVIDIA/Megatron-LM

BERT の大規模学習用?
64 x Tesla V100(32 GB?) で BERT Large を 3 日で学習


### 軽量化とか

* [ ] Compressing BERT for faster prediction https://blog.rasa.com/compressing-bert-for-faster-prediction-2/
* [ ] Q8BERT, a Quantized 8bit Version of BERT-Base https://www.intel.ai/q8bert/
  * [x] Quantized transformer http://web.stanford.edu/class/cs224n/reports/custom/15742249.pdf 1bit quantized も試している. OpenNMT 利用.
* [ ] transformers.zip: Compressing Transformers with Pruning and Quantization http://web.stanford.edu/class/cs224n/reports/custom/15763707.pdf
* [ ] ALBERT: A Lite BERT for Self-supervised Learning of Language Representations https://arxiv.org/abs/1909.11942
* [ ] TinyBERT: Distilling BERT for Natural Language Understanding https://arxiv.org/abs/1909.10351
* [ ] DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter https://arxiv.org/abs/1910.01108
* [ ] MIGraphX での quantized BERT https://github.com/ROCmSoftwarePlatform/AMDMIGraphX/wiki/Getting-started:-using-the-new-features-of-MIGraphX-0.4 ただしこれは計算グラフを最適化&forward実行だけなので, 学習させる場合はまた別途いろいろ書かないといけない.

### 実装とか

🤗 Transformers: State-of-the-art Natural Language Processing for TensorFlow 2.0 and PyTorch. 
https://github.com/huggingface/transformers

いろいろ実装があります. ありがとうございます 🤗

NeMo : https://github.com/NVIDIA/NeMo



### モバイルで動かしたい...

CoreML については huggingface が対応していますね.

Swift Core ML implementations of Transformers: GPT-2, BERT, more coming soon!
https://github.com/huggingface/swift-coreml-transformers

huggingface のモデルは TorchScript 対応で, libtorch(C++) で, PC でモデルのトレースとロードまではできたので, 少なくとも Android では動きそう.

tflite 版が最近でてました(量子化してモデルサイズは 96 MB くらい).

https://github.com/tensorflow/examples/tree/master/lite/examples/bert_qa/android

pretrained tflite model のありかは, `app/download.gradle` のスクリプトに URL があります
(Gradle でファイルダウンロードする機能あるのですね) 

ASUS ZenFone Max (M2) (Snapdragon 632. 手元にあるもので一番ロースペックな端末)でも 1, 2 秒くらいで推論ができて, それなりにスムースに動きました. モバイルで NLP もこれから実用的に使えていきそうですね.

## pre-training のコスト

ABCI で Tesla V100(16GB) x 4 なノードが 200 円/時くらいで借りることができます.
 
https://abci.ai/ja/

TPUv3 は preemptible でも USD 2.4/hour でお高いので, ABCI を使うのを考えてみます.

NVIDIA の Tesla V100(32GB) 1,024 枚で 1 時間少しで学習したのに当てはめてみると, ABCI のはメモリが 16GB なので, 二倍の 2,048 枚かかるとすると, 1 回の pre-train は (2048/4) * 200 で税込でおよそ ~12 万円くらいでしょうか.

学習 1 回 10 万円というのは少しハードル高いですが, 期末予算消化したいとか, 小規模でまずは動かし, 数回だけでうまく行く見込みがあるなら借りて実行がいいかもしれません.

あとはもう少しまてば ALBERT のようにパラメータ削減して学習時間を短縮し, 4 GPUs で 1 日で学習できるなどの手法が出てくると思われますのでそれを待つという手も考えられます.

もしくは, 水力発電や太陽光発電と組み合わせて GPU ファームを建造し, 学習につかっていないときはレイトレーシングやマイニングをして費用を賄うかでしょうか.

### Quantized

8bit でもそれなりにいい結果が出ているので, OpenCL や OpenGL/Vulkan compute shader で学習してみたい. 最近は Vulkan には fp16 や int8 型のまま演算する `VK_KHR_shader_float16_int8` 拡張が定義されている.

https://blogs.igalia.com/itoral/2018/12/04/vk_khr_shader_float16_int8-on-anvil/

(ストレージとしての fp16, int8 対応は以前からある模様)

## 考察

BDPT(双方向パストレ)のアルゴリズムが NLP にも応用できたりしないだろうか? e.g. Matrix Bidirectional Path Tracing https://www.ci.i.u-tokyo.ac.jp/~hachisuka/mbdpt.pdf