llama.cpp:Importance Matrix による新しい量子化手法を試す

  • 年明けにllama.cppに実装された「Importance Matrix(重要度行列?)」を使用したgguf量子化について調べてみました。
  • Importance Matrixは、llama.cppのikawrakow氏が取り組んでいる一連の量子化精度改善の中心的なアイディアのようで、特に2-3bitの極端な量子化においてモデルの劣化を大きく抑制する効果があるようです。

github.com

  • 例によって技術的な仔細はわかりませんが、GPTQ量子化などと同じように量子化時にトレーニングデータセットを使うことで量子化の精度を改善する手法のようです。
  • llama.cppにおけるImportance Matrix 計算の手順については上記リンク先に説明がありますが、すでにImportance Matrixを使って量子化済みのモデルも多数アップされています。
    • Mixtral 8x7Bなど主要モデルについてはikawrakowさんのRepoにまとめてアップされています。
    • それ以外のモデルについては、最近Nexesenexさんという方が熱心にHuggingFaceにアップしてくれているようです(TheBloke氏の量子化モデルの更新は途絶えている?)。

Mixtral 8x7Bにおける新旧比較

  • こちらはikawrakowさんがまとめているMixtral 8x7Bにおける新旧量子化の比較表です。

  • Perplexity(PPL)が高いほど、量子化によるモデルの変質(量子化誤差)が大きいことを示唆します。
  • 必ずしも「PPLが上がる=実際の性能が下がる」と解釈すべきでないらしく、わずかなPPL上昇であればパフォーマンスに影響が見られないことも多いです。
    • 個人的な感覚ではQ8~Q5あたりの量子化だとまず違いがわかりません。
  • とはいえ(従来の)Q3~Q2量子化にみられるような極端なPPL上昇については、モデルの質的劣化を伴っていると考えて間違いないと思います。
  • この表を見ると、new quants(Importance Matrixによる量子化)では全般的にPPLが改善していて、特にQ2量子化では大幅な差を生んでいます。

Mistral 7BにおけるImportance Matrixの効果

  • さて自分がふだん使っているのはMistral 7B系のモデルなので、Mistral 7B instruct v0.2を使って一通りImpotance Matrixで量子化しPerplexityを測ってみました。
  • 青線が従来の量子化モデル、橙線がImpotance Matrix量子化モデルです。
    • IQ3XXSは従来のQ3KSとQ2Kの間くらいのクラスで、おそらく性能的にはこれ位が実用ぎりぎりのラインかなと思っています。

  • Mixtral 8x7Bと同じように、極端な量子化ほどiMatrixによる改善が大きく見られます。
  • どうやら4bit量子化~3bit量子化の間でPPL上昇が加速するようなので、このあたりのクラスだけさらに細かく調べてみました

  • やはりiMatrix量子化のほうが一貫してPPLが低いですが、どちらの量子化でもQ4KS→Q3KLでPPLが倍以上になっています。
  • Mistral 7Bでは「Q4K_S」あたりだとサイズと性能のバランスが良さそうです。

日本語によるiMatrix量子化とPerplexity測定

  • ところでllama.cppのiMatrix計算では基本的にPerplexity測定と同じくWikiTextが使われているので、上記もそれに倣っています。
  • ただ、iMatrix計算にどのようなデータセットが適しているかは色々と議論があるようで、ikawrakowさんも「チャットモデルならチャットスタイルのデータセットの方が良い結果が得られるかもしれない」等とコメントしています。
  • さらに、例えば日本語での使用を想定したモデルであれば、日本語テキストを使ってiMatrix計算をしたほうがベターでは?という点も当然考えられます。
  • ひとまず確認として「英語のWikiTextでiMatrix量子化したモデル」を使って「日本語のWikipediaデータセットによるPPL」を測ってみます。元モデルは同じくMistral 7B instruct v0.2です。

  • Q6~Q4ではiMatrix量子化による目立った改善はありませんが、Q3以下では一定の効果がみられます。
    • 全体に日本語PPLのほうが英語に比べて量子化による上昇が著しいです。
    • 先ほどの英語PPLと同様にQ4→Q3でPPL上昇が加速します。
  • 少なくともこのモデルでは、英語のWikiTextを使ってiMatrix量子化した場合も、日本語PPLの上昇を抑える効果が期待できるようです。
  • 次に「日本語のWikipediaデータセットでiMatrix量子化したモデル」の日本語PPLも確認してみます。

  • 大きな違いはありませんが、極端な量子化になると日本語によるiMatrix量子化の効果は出てきそうな気配です。
  • なお今回使った日本語WikipediaデータセットはHuggingFace上にあったものをお借りして適当に抜粋したものなので、素人が雑に測定した数値であることは念のため強調したいと思います。