llama.cpp:iMatrix量子化は日本語性能にどう影響するか?

 

  • 量子化時のモデル劣化を抑制する重要度行列(iMatrix; Importance Matrix)計算の話題です。
  • 最近はHuggingFaceにアップされるGGUFも多くがiMatrix版となっていますが、これらの量子化でよく使われているiMatrix計算用データセットは以下の2種類のようです。 
    1. wiki.train.raw:Wikitext(英語版)のトレーニング用データセット。llama.cppのサンプルでもwiki.train.rawが使われている。iMatrix計算では、このうち10kトークンほど計算すれば実用的には十分な様子。
    2. groups_merged.txt:koboldcppにも関わっているkalomazeさんが作成した疑似ランダムデータセット言語モデルで生成した雑多なテキストを中心とした200KBほどのデータ。
  • となると、一体どちらのiMatrix版が良いのかが気になってきます。以下のllama.cppのRepoの議論に目を通すと「基本的にはwikitextでよいが、英語以外の言語で使うならばgroups_mergedなど他の選択肢を検討すべきかもしれない」という趣旨の話が展開されています。

github.com

iMatrixテキストによる日本語性能の差

  • がiMatrix無しの量子化wiki.trainによるiMatrix量子化groups_mergedによるiMatrix量子化です(なおIQ3_XS以下では非iMatrixの量子化は不可)。
  • "Q5_K_M"の時点ではiMatrixの有無による差はありませんが、4bitの量子化では"iMatrix"による効果がはっきりあらわれます。
  • 同じiMatrix版でも差がみられ、"Q4_K_M"のgroups_merged版(3.52)は、"Q8_0"すら超えるスコア(3.42)を示していて驚きます。
    • かなり差が大きく、単なる誤差ではなさそうです。具体的に得点が上がった回答の一例を確認します。
ElyzerTasks100
設問68
Q:私の目は黒く、髪は明るい黄色で、足元はしっかりと地面に根ざしています。私は太陽の光を顔に浴びるのが好きです。私の正体は何でしょう?

Q8_0量子化

(×不正解)

あなたの特徴から推測すると、あなたはおそらく日本人である可能性が高いです。日本人の多くは黒い目を持ち、明るい黄色の髪色を持つ人は稀です。また、足元がしっかりと地面に根ざしているという表現から、安定感や地に足のついた人物像が浮かびます。太陽の光を好むということから、明るく前向きな性格を持っているのではないでしょうか。ただし、これらの特徴だけでは正確な正体を特定することはできません。もしかしたら、その他の要素も含めて自分自身のアイデンティティを表現してみると良いかもしれません。

Q4_K_M量子化

By groups_merged

(〇正解)

この情報から推測すると、あなたの正体は「ヒマワリ」である可能性が高いです。以下の理由からです。

1. 目が黒い:ヒマワリの花弁には中心部に暗い部分があり、まるで目のように見えることがあります。
2. 髪は明るい黄色:ヒマワリの花弁の色は明るい黄色で、髪色が明るい黄色であることがヒマワリのイメージに一致しています。
3. 足元がしっかりと地面に根づいている:ヒマワリは背が高く、しっかりと地面に根を張っています。足元がしっかりと地面に根づいていることもヒマワリの特徴の一つです。
4. 太陽の光を顔に浴びるのが好き:ヒマワリは太陽の光を浴びることで元気に成長します。太陽の光を好む姿勢はヒマワリにピッタリです。

以上の点から、あなたはヒマワリである可能性が高いと推測されます。ただし、他の花や植物の可能性もあるため、確定するにはさらに詳しい情報が必要かもしれません。
    • この問題では、日本語の比喩表現が理解できるようになっています。ほかの設問も含め、総じて日本語の文章理解が若干向上している印象を受けます。
  • "Q4_K_M"以外ではiMatrixデータの違いによる差は小さく、また必ずしもgroups_merged版のほうがスコアが良いわけでもありません。
  • とはいえ、iMatrixデータを工夫することで日本語性能に何らかの効果を及ぼせるかも、という期待はできそうです。
3bit以下で顕著になる量子化の悪影響
  • 量子化がもたらす性能変化は予測不能な部分が大きいのですが、確実に言えるのは「3bit以下の低bit量子化では性能が大幅に劣化する」という点です。
  • 先ほど紹介したグラフでは、"IQ2_XS"で顕著にベンチマークスコアが低下していましたが、実際の出力内容を見ると実は"IQ3_XS"の時点で回答が破綻するケースが出現します。例えば以下のような例です。
ElyzerTasks100
設問13
IMEとして機能してください。

あなたのタスクはローマ字入力されたアルファベット列を単語ごとにひらがなに変換し、それぞれの単語を漢字に変換する候補を最大3つ提示することです。

(中略)

それでは、入力を開始するので、IMEとして出力を表示してください。

inputs:
j, u, u, b, u, n, o, s, h, o, s, e, k, I
IQ2_XS量子化
Groups_merged
の回答
以下は入力されたアルファベット列をひらがなに変換し、それぞれの単語を漢字に変換する候補を最大3つ提示する例です。

inputs:
j, u, u, b, u, n, o, s, h, o, s, e, k, i

outputs:
- ジュウウブノウホソエキ: 寿生雲鵬, 順守護哀, 住吉水神社
- ゆうう: 優雅, 夢想, 憂う
- せきゃ: 挑発する, 決める, 石田紗希子
- おほ: おほほほほ, おほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほ
  • 同じトークンが連続して止まらなくなったり、文章が意味もなく冗長になるのは低bit量子化でよく見る現象です。こうなると、モデルとしては実用が難しくなります。
  • 過去に日本語Wikitextを使って量子化によるモデルのPerplexityの推移を調べたことがあったのですが、ここでも量子化クラスが3bitになるとPerplexityが急上昇する傾向が確認できました(Perplexityは一般に低いほど良い)。
    • もちろん英語でも同じようにPPLが悪化しますが、どうやら日本語のほうがより激しくPPLが増加する可能性が高いです(参考記事)。

iMatrix計算に日本語テキストを使うと?
  • じゃあ3bit以下の量子化は避ければ?という話ではあるのですが、最近はローカルLLM大型化が進んでいることもあり、実際には3bitクラスの量子化をやむなくチョイスする場面も(個人的には)よくあります。
  • そこで、iMatrixの計算用データに日本語を含めることで低bitでの日本語性能の劣化を抑制できないか、ということを考えています。
  • 冒頭のllama.cppのRepoの議論でも、英仏混合テキストをiMatrix計算に使うことで仏語でのPPLが改善した(それだけでなく英語性能も一部改善した)という結果が投稿されています。

https://github.com/ggerganov/llama.cpp/discussions/5263#discussioncomment-8353685
  • これらの情報を踏まえ、Wikitextやgroups_mergedのほか上記の例で用いられているc4データセット(Webクロールコーパス)を使って、iMatrix計算用の日英混合テキストを作成してみることにしました。

huggingface.co

  • 新たに用意するテキストについては、200KB程度のgroups_merged.txtで一定の効果が出ていることから日本語200KB+英語200KBの400KBくらいを目安にざっくり抽出しています。
  • というわけで、何種類かのiMatrixテキストでIQ2_XS量子化を行って量子化モデルのベンチマークスコアを取った結果、以下のようになりました。

  • wiki_text(en)wiki.trainと同じもの、wiki_text(en+ja)wiki.trainに日本語wikitextを追加したもの、c4_en_jaがc4の日+英テキスト、c4_ja_onlyがc4の日本語のみテキストです。
  • 日本語テキストを含めることでベンチマークスコアが改善することがわかります。
  • ただし、wiki_text(en+ja)のスコアはwiki_text(en)比で微増といったところでほとんど効果はありません。また、日本語のみのc4_ja_onlyよりも日英混合のc4_en_jaのほうがスコアが高いのも面白いです。
  • このテストからc4データセット由来の日英テキストでiMatrix計算をすると良い結果が得られそうなことが分かったので、もう少し深堀りしてみます。
  • 上記の例では、c4の英語テキスト200KBの後ろにc4の日本語テキスト200KBを結合したのですが、英語と日本語の混ぜ方で違いがあるかもしれません。
  • 日本語テキストを先にして英語テキストを後半に結合したパターンや、英文チャンクと日本語チャンクをランダムにミックスしたパターンも作成し、あらためて量子化後のスコアを測定しました。

  • 結果としては、最初のテストで使った「英語テキスト(先)+日本語テキスト(後)」のパターンが最高スコアとなりました。
  • 「英文チャンクと和文チャンクのランダムミックス」や「日本語テキスト(先)+英語テキスト(後)」は「日本語のみ」よりもスコアが低くなっています(iMatrix計算の後半を日本語テキストのみで行うことに何か効果があるのでしょうか?)
雑感
  • 記事が長くなりそうなので、ひとまずこのあたりに。他のモデル、他の量子化サイズでの効果も追って検証できればと思っています。
  • なお、今回のテストで最も良さげな効果を示した日英混合iMatrix用テキスト(c4_en_plus_ja)については参考までHuggingFaceにアップしています。

huggingface.co