見出し画像

キャリブレーションデータにもっと気を配ろうの話

量子化とキャリブレーション

モデルを試したいとき、GPTQやAWQで量子化されたモデルを使う人が多いです。
量子化されたモデルは、モデルの推論に必要なリソースを削減できるほか、(量子化ライブラリによりますが)量子化されていないモデルに比べ推論速度を向上させることができます。

この量子化で重要な役割を担っているのが、キャリブレーションデータセットです。
GPTQやAWQのような量子化手法は、モデルの重みをより小さいビット数に変換します。つまり、変換された重みは初期の重みとは異なります。
では、重みの変換は、モデルのパフォーマンスに対してどの程度の影響があるのでしょうか?
キャリブレーションデータセットを用いて、それを調べるのです。

補足:
AWQでは、キャリブレーションデータを使用してモデルの重みのうち重要な部分を特定します。
GPTQでは、重みを変更した影響を調べるためにキャリブレーションデータを使用しますが、AWQでは量子化前の段階で保護する重みを調べるためにキャリブレーションデータを使用します。
このようにGPTQとAWQではキャリブレーションデータの使い方が異なります。

なお、どの量子化モデルがどのデータセットを使用してキャリブレーションを行っているかは大抵簡単に調べることができます。
例えば、TheBloke氏が公開している各種量子化モデルのラインナップを見ると、以下のように「Alpaca Japanese」を使用していることが分かります。

TheBloke/Swallow-70B-instruct-GPTQ

キャリブレーションデータ

キャリブレーションデータの重要性は、特に指示チューニング済みのモデルにおいて顕著です。
これらのモデルは、特定の入出力フォーマットや口調などの特性を反映するように、トレーニングされています。
したがって、本来想定されているモデルの挙動をもとにキャリブレーションを行うために同様のフォーマットのデータを用いることが推奨されます。
キャリブレーションデータの適切な選択が行われなければ、量子化されたモデルの応答が元のモデルから大きく変化してしまう可能性があります。

このように、どのようなデータを用いてキャリブレーションをしたかというのは、量子化されたモデルを利用するうえで重要な要素となるのです。

この記事を書いたきっかけ:
AIアイネスの量子化

ムキムキアイネス

AIアイネスでは4bitに量子化したモデルを推論に使用しているのですが、
そこでキャリブレーションデータによる性能劣化が確認されました。

たとえば、以下は量子化前のモデルの出力です。

そしてこちらが、AWQを使用して4bitに量子化したモデルの出力です。
なんということでしょう。ムキムキになってしまっています。
さらに、フォーマットの関係で見づらくなっていますが、トレーナーの質問「ライバルについてはどう思う?」に対して、応答が終了した後に、新しい会話「トレーナーにとって一番大事なものは何だと思う?」が勝手に生成されてしまっています。

これらの応答はAWQを使用して量子化した途端に発生しました。

AWQのキャリブレーションデータの取り扱い

AWQでは、量子化実行時に以下のステップに従ってキャリブレーションデータを作成します。

  1. 提供されたデータ(List[str]とする)をそれぞれトークン化し、トークン数が512以下のものでフィルタリングする

  2. 全てのシーケンスを1つにまとめる
    つまり、シーケンス長256の4つのデータ[256, 256, 256, 256]を与えると、ここでは[1, 1024]のテンソルに変換されます。

  3. 1つにまとめたシーケンスを、指定されたサイズで分割する
    デフォルト値は512で、[1, 1024]が[[1, 512], [1, 512]]のように分割されます。

私はAWQを使用して量子化した際の性能劣化がシーケンスをまとめた後に
分割していることによって引き起こされたのではないかと考えています。
このとき、私は会話の終了時にモデルが特別なトークンを出力するように
プロンプトのフォーマットを変更したばかりでした。

キャリブレーションに使用する会話データが分割・結合され、モデルがトレーニングされた際のデータの分布から外れたことにより、量子化後のモデルの性能が下がってしまったのだろうということです。

GPTQのキャリブレーションデータの取り扱い

一方、GPTQはAWQと異なり、キャリブレーションデータとして渡したシーケンスはトリミングされることはありません。(バッチサイズにより最長のシーケンスに合わせてパディングされることはあります。)

したがって、GPTQなら問題が起きないと思い実験したところ、問題なく動作しました。
生成時のパラメータが異なるので正確な比較にはなりませんが、とりあえず元のキャラクター性を保ったまま量子化することができたということを確認していただければ十分です。

ということでAIアイネスでは、GPTQを採用しています。
AWQのほうが量子化の精度が高いとはいえ、それほど差が開いているわけでもないので、GPTQを使用しても問題が無いと判断しました。

以上、量子化モデルのキャリブレーションデータセットについてまとめました。また、指示チューニング済みモデルを量子化する際にAWQの場合は注意が必要であることも示しました。
自分でモデルを量子化する場合や、既に量子化されたモデルを使用する場合は、キャリブレーションに使用するデータについて一度考えてみることを
お勧めします。

それでは。

この記事が気に入ったらサポートをしてみませんか?