*GitHubで公開されているライブラリとしてのbitsandbytes [#d43e076b]
**概要 [#z952cf5a]
-GitHubページ:https://github.com/TimDettmers/bitsandbytes
-略語は「bnb」
-sd-scriptsで学習する際、8bitオプティマイザーを使うときに必須なライブラリ。
-その他、NF4量子化についてもこのライブラリに由来する。
-bits and bytesの名の通り、fp32から品質を落とさずに軽量な8bit行列・4bit行列に変換するのに使う。

>
-混合精度分解を使用した 8 ビット行列乗算
-LLM.int8() 量子化
-NF4(NormalFloat) 正規分布を利用した4ビット量子化
-8 ビット オプティマイザー: Adam、AdamW、RMSProp、LARS、LAMB、Lion (メモリを 75% 節約)
-安定した埋め込み層: 初期化と正規化の改善により安定性が向上しました。
-8 ビット量子化: 分位数、線形量子化、および動的量子化
-高速分位値推定: 他のアルゴリズムより最大 100 倍高速
#br
背景論文:https://arxiv.org/abs/2110.02861 , https://arxiv.org/abs/2305.14314

**量子化手法 [#x932da31]
#shadowheader(3, BnBの8ビット量子化)
8ビット量子化に適さない外れ値を検出し、外れ値だけfp16で持って精度を保つ方式

#shadowheader(3, NF4量子化)
LLMのパラメータが正規分布しているという観察に基づく手法
4ビット整数の取りうる16個の値それぞれに決め打ちで正規分布の分位点をあてて非線形変換する
NF4=NormalFloat、NはNormal Distribution(正規分布)のN

-4ビットで表せるのは16通りだが、そのうち1点を0にあてると残りは奇数になる為、NF4は正の値が負の値より一つ多い
-LUT は /bitsandbytes/csrc/cpu_ops.cpp に基づく。小数点以下3桁で丸めた
-[[fp4(e2m1)>浮動小数点]]はレンジ±6だが、ここでは比較しやすいように6で割った表記
||NF4|fp4|h
|RIGHT:|||c
|15|+1.000|+1.000|
|14|+0.723|+0.667|
|13|+0.563|+0.500|
|12|+0.441|+0.333|
|11|+0.334|+0.250|
|10|+0.246|+0.167|
|9|+0.161|+0.083|
|8|+0.080|+0|
|7|±0|-0|
|6|-0.091|-0.083|
|5|-0.185|-0.167|
|4|-0.284|-0.250|
|3|-0.395|-0.333|
|2|-0.525|-0.500|
|1|-0.696|-0.667|
|0|-1.000|-1.000|

**バージョン情報 [#o2792416]
※降順表示

***0.41.1 [#cec23140]
-sd-scriptsでは'23/10/2現在このバージョンが推奨されている。
オプション扱いなので、該当するオプティマイザーを使わない場合は、インストールしなくても良い。
-sd-scriptsのfull_fp16オプションを使う場合は、
このVer.以降を使用する必要がある。

***0.36~0.41.0 [#t1187e09]
sd-scriptsにおいて不具合報告((https://github.com/TimDettmers/bitsandbytes/issues/659))があり、回避推奨

***0.35 [#kc3ba6e3]
sd-scriptsで使われていたバージョン。