こんにちは。量子化をして軽量化したいですよね。見てみます。
我々は量子コンピューターやっていますが、今回の量子化と言うのは量子コンピュータとは関係がありません。
本日は量子化をざっくり知るために解説記事を探してみました。
まずはディープラーニングの軽量化の手法として、
ディープラーニングを軽量化する「モデル圧縮」3手法
laboroさんの記事を見ると、三種類あるようです。
・枝刈り
・量子化
・蒸留
枝刈りはネットワークを切って負荷を減らす、量子化はパラメータの精度を落とす、蒸留は大きなモデルから小さなモデルに結果を移す手法のようです。今回話題の量子化は三大軽量化手法のうちの一つのようです。ちなみに我々は1番目の枝刈りをテンソルネットワークを利用して行っています。
次の記事は、
深層学習モデル軽量化技術まとめ
https://qiita.com/Nurkic/items/a382fc84a34fd0ae9400#3-%E8%92%B8%E7%95%99
こちらも量子化特化ではなく、軽量化についてまとめていますが、その中の量子化はちょっと詳しく解説されていました。こちらでは学習後のパラメータを軽量化する量子化について注目されていました。量子化は、
X = f(s * g(X0) + z)
でできるようです。gには種類があるようですが、ここでは触れません。また、静的量子化と動的量子化があるみたいで、推論途中で動的に精度を下げるということでしょうか。。。個人的には動的に量子化するというのがイメージがあまりつきませんが。。。*これについては事前に決まらない中間層を見るようです。納得しました。
また、関数gに関してはmin-max法とmax-abs法があるようで、後者は0の位置を中心に正負で同じだけ値の範囲をとって、前者は全部の範囲のmin/maxから変換するのでしょうか。変換コストは符号を含めてとなると多少は速度に影響がありそうです。
もちょい他の記事も見てみます。
深層学習ライブラリと量子化
https://lab.mo-t.com/blog/quantization-frameworks
ここでは、量子化は以前QLoRAの論文で見たような式を使っていました。
q = offset + round(x / scale)
と四捨五入していますね。ここでは、整数化を量子化と呼んでいるようです。また、0を中心に対称・非対称についてなど触れられていました。今回初めて出てきたテーマとして、
テンソル全体を量子化する際の量子化パラメータと、テンソルのチャンネルごとに量子化する量子化パラメータという考え方も出てきました。基本的に細かく量子化パラメータを決めれば精度は上がると思いますので、この辺りはQLoRAでも出てきましたね。
ここでも、静的・動的量子化が出てきました。重みに関しては確かに事前に量子化するようです。問題はactivationと呼ばれる中間層で、最初から決めてしまうと不都合な部分に関しては静的に行うのか動的に行うかは確かに検証の余地がありそうです。
あとは、量子化を考慮した学習として、推論方向は量子化されたパラメータを使って、学習では浮動小数点を使うなどもあるようですが、みなさんすごい工夫しますね。。。
その他ツール類に関しても言及がありましたが、2020年の記事だったので、ツールはもちょい最新の記事を探してみたいと思います。
次の記事は、
深層学習の量子化に入門してみた 〜理論編〜
https://tech.retrieva.jp/entry/20220128
こちらも大体同じような内容でしたが、より詳しい内容に触れていました。元の0を維持するかしないかで変換が変わり、0を0にするほうがコストが低く速いというのはそうだと思います。
あとは、量子化する際の区間についても多少紹介がありました。こちらはQLoRAの論文では外れ値が問題になるということで、block-wiseというブロックに変換して外れ値の影響を減らすというものでしたが、色々手法があるようです。ということが論文に載っているようです。
同様に静的・動的量子化についても紹介されていました。3種類の動的・静的・量子化を想定した訓練が紹介されていました。正直実践で使ってみないとわからないので細かいことは飛ばします。。。
こちらの記事はかなり詳しく、一番最初に読んでればこれで済んだ気もしますが、ちょっとずつ学べたので記事が読めたというのもあるかもしれません。
次は、
PyTorchの量子化をかるく動かしてみる【Quantization】
こちらは量子化の実装記事です。PyTorchで実装されてます。
どうやらPyTorchに量子化のページがあるようです。
https://pytorch.org/docs/stable/quantization.html
便利ですね。。。なんか面白そうなのですが、今回は理論を追って次回別の機会にPyTorchのページを見ていたいと思います。
最後二つの解説記事は同じ論文をベースとしているようでした、
A Survey of Quantization Methods for Efficient Neural Network Inference
Amir Gholami, Sehoon Kim, Zhen Dong, Zhewei Yao, Michael W. Mahoney, Kurt Keutzer
https://arxiv.org/abs/2103.13630
ディープニューラルネットワークの量子化についてざっくりまとめた
こちらは、これまで見てきたように一般的な量子化の手法をきちんと説明されていました。
これまで出てこなかったのに、Uniform QuantizationとNon-uniform Quantizationがあり、量子化の間隔が一定のものと一定でないものみたいです。確かにQLoRAでもNormal Float 4という正規分布を想定した量子化のデータ型がありました。
その他大体の手法に触れていました。数式を使い過ぎて難しくならず個人的には一番詳しくて読みやすいなと思いました。
ニューラルネットワークの量子化について②
https://zenn.dev/zuoli/articles/96b01be90eee05
こちらは同じ論文ですが、かなりマニアックな手法をいくつか紹介しています。こちらは論文を読む機会があれば紹介したいと思いますが、奥が深そうです。。。
ということで、量子化について調べてみました。いくつかの解説記事を見ましたが結構いい感じでバラけていました。ベースとなる理論がちょっと異なるとアプローチも違うのかなと感じましたが、実際には大体の記事を全部統合すると大体基礎は固まると感じました。
実際に使うとなるとPyTorchのチュートリアルみたいなのが参考になりそうでしたので、実践版も記事を出したいですね。以上です。