今回は、ローカルで動かせるCommand R+の量子化モデルを色々使ってそれぞれにElyzaTasksベンチマークを解かせるという事をやる。

何故そんな事をする必要があるんですか?
まず、LLMのパラメータは本来1パラあたり16bitの精度で保存されている。しかし、LLMを動かすとメチャクチャメモリやVRAM食う。だから、精度を下げちゃえば省メモリになっていんじゃね?という話で、8bitやら4bitやら2bitに精度を下げちゃう事が、特にLlama.cpp界隈では常識的に行われている。これが量子化だ。というか、コンシューマレベルのPCでLLMを実用的に動かしたいと思えば、量子化はもはや必須テクである。

量子化でbit数を下げれば下げるほど、当たり前だがLLMの回答の精度、クオリティは下がっていく。要するにアホになってく。8bitはまったく問題なし。6bit、5bitも全然問題なし。4bitになってくるとちょっと劣化するけど実用的にはまあまあ大丈夫。3bitになると若干やばいかもしれんけど、メモリ足りない人はしゃーない。2bit以下は論外…みたいな話が巷では言われてる。

とは言え、そういうのは体感的な話でしかなく、数字的な話で言うとbit数が下がるほどPerplexityが上がる…つまり精度が下がってく事実が観測されている。でもPerplexityとか言われてもよく分からんから、今回はElyzaTasks100で計測してみよう!という話である。なぜElyzaTasks100ベンチマークが優れてるかは前回の記事参照。

それは分かったけど、そもそもなんでCommand R+の量子化時の性能劣化なんかを調べる必要なんかあるんですか?
それは、ローカルのLLMモデルを使ってElyzaTasks100の回答を自動評価できる体制を整えたいからだ。ElyzaTasks100を自動評価させるには、一般的にはGPT-4のAPIが使われるが、そのAPI代がボチボチかかる。一回の評価で1ドルから2ドルかかるらしい。大した金額じゃないじゃんと思うかもしれないが、じゃあ100回評価回したら?100~200ドル…1.5万円~3万円だ。バカにならない。

特に、これからはChatVectorモデルを作るにも進化的アルゴリズムなどの使用が当たり前に行われるようになるだろうし、そういう手法ではひたすらに調整と評価が自動的に繰り返されていくわけなのだから、評価のたびにAPI叩いてたら金がいくらあっても足りない。

進化的アルゴリズムをもちいたChatVector加算の最適化|はち (note.com)

だから前回の記事では今んとこ無料で使えるCommand R+のAPIで評価させたわけだが、無料で叩けるのは一ヶ月間に1000回だけと分かったので、やっぱりキツイ。
だったらもうローカルでLLM回して評価させられたらいいのになあという話になる。今んとこローカルで動かせる最強のLLMはやっぱりCommand R+だろう。性能だけで言うとLlama3-70Bの方がすごいかもしれないが、あれは日本語能力が微妙な感じがするのでダメそう。

で、ローカルでCommand R+を動かすとなると、手元の環境のRTX4090が1台ではハッキリ言って1bitまで圧縮してもVRAMに載りきらない。3台積んでVRAM72GBにすれば4bitのCommand R+が全部VRAMに載って快適動作になるらしいが、私のマザボでは3枚もPCIEが刺せないし、ケースにも入らない。
VRAMに載りきらないでCPU+GPUでの推論になる場合、かなり速度が落ちる。マトモにチャットできるような速度は出ないだろう。とは言え、チャットがしたいわけではなくベンチ評価させたいだけなのだから、推論速度が多少遅くてもかまわないかもしれない。量子化でbit数を下げれば下げるほど高速で動作させられるが、かと言って下げ過ぎるとアホになるかもしれない。アホでは正しいベンチ評価させれなそうだ。

というわけだから、結局何bitまで量子化しても大丈夫なんだっけ?という事を調べておく必要があるという話である。

で、今回はCommand R+の各量子化モデル、Q6_K、Q5_K_S、Q4_K_S、iq4_xs、Q3_K_S、iq3_xxs、Q2_K、iq2_xxs、iq1_sのそれぞれについて、ElyzaTasks100を解かせてみる。それから最高精度の回答という意味で、APIのCommand R+にも解かせておく。本当はQ8_0にもやらせたかったんだけど、メインメモリにすら納まらなかったので諦めた。
しかし、私のPCではCommand R+を動かしてもメチャクチャ推論が遅いため、100問解かせるのは諦めて、20問だけにした。つまりElyzaTasks20である。Q6_Kだと20問解かせるだけでも3時間かかった。それだと100問解かせるには15時間もかかってしまう。

そんでそれらの回答をこれまたCommand R+の無料APIに評価させるわけだ。
まあ前回の記事で自作ChatVectorモデルを評価したのと同じ要領である。

さっそくだが、評価結果はこのスプレッドシートにまとめた。

https://docs.google.com/spreadsheets/d/1cT95xSPxkr8LcblLWnO5Tb7Y5wkDDySoR2cTEMT4LRs/edit?usp=sharing

で、各モデルの平均スコアはこうだ↓

正直言って反応に困る結果である。このグラフから一体何が言えるだろうか?たしかにAPIは最高スコアが出ているが、じゃあそれだけでQ6_KはAPIよりアホになってると言えるのか?だとしたらiq3_xxsがQ6_Kに勝ってるのはなんなの?

このグラフから言える事があるとしたら、まずAPI~3bitまではぶっちゃけ大差ないというか誤差の範囲だという事だろう。2bitも誤差と言えなくはないが、なんとなくやや低めになってる気もするから、もしかすると量子化の悪影響が出てきてるかも。1bitの3点というのはこれはもう完全に劣化してるというのは確実に言えそうだ。
全体で見るとアベレージ4点くらい出てそうだが、そもそも論としてElyzaTasksで4点というのはメチャクチャ優秀な点数である。そこはさすが、Command R+。7Bモデルなんかでは到達できない世界だ。

ちなみにClaude3Opusにもグラフを見せてみたが、「何とも言えない」みたいな反応である。

やっぱりElyzaTasks100問全部解かせないとはっきりした結果は出せないかもしれない。
というか、個別の評価を精査していくと、そもそも論としてCommand R+による採点がちょっとテキトーなんじゃねえの?という気もしてくる。

採点だけをアテにしないで、20問それぞれの設問を一つずつ精査してみる事にする。詳細はスプレッドシートを確認して欲しい。

Q1:仕事の熱意を取り戻すためのアイデアを5つ挙げてください。

全てのモデルが指示された通りの内容で不備の無い日本語が書けている事にまず驚く。iq1_sの日本語はやや怪しいが気になるほどではないか。APIの回答が他に比べてやや立派な気もするが、気のせいかも。

Q2:クマが海辺に行ってアザラシと友達になり、最終的には家に帰るというプロットの短編小説を書いてください。

やはり全てのモデルに回答の不備はない。評価APIはiq1_sの書いた話が淡白でつまらんという事で2点を付けている。そう言われるとたしかにそんな気もする。そしてAPIの回答ではクマにクマ太郎、アザラシにララなんて名前を付けていて気が利いてる。

Q3:古代ギリシャを学ぶ上で知っておくべきポイントは?

全モデルに5点が付けられている。こういうウィキペディア的な知識を喋るだけなら思考する必要無いし、量子化の悪影響を受けにくいのかもしれない。1bitでもそれなり、2bitでも相当立派な答えを書いてる。

Q4:以下の説明を読んだユーザーが感じるであろう疑問とは? 大量のゴミの処理にお困りではありませんか?(以下略

2bitまでは回答に不備無し。1bitの回答はやや怪しい。

Q5:次に読むべきSFを10冊挙げて

iq2_xxsは同じ本を繰り返し挙げてしまうなど、回答に綻びが生じている。iq1_sに至っては1冊しか挙げられてない。簡単そうな質問の割に、露骨に品質差が出てしまった。

Q6:次の文章を読んで、その人がどの程度怒っているか、1〜10の尺度で評価してください。(1=怒っていない、10=非常に怒っている)。 1. またテストで赤点か。君は全く… 2. テストで赤点?今回は難しかったね。

これについては、そもそも二つの問題に対してちゃんと二つの答えを返せてるのはAPIだけである!他のモデルは答えを一つしか返せてない。結構残念な結果。そして評価APIは一つしか答えてないのに「2門とも正解」とか言って5点を与えたりしている。仕事がテキトーすぎるだろ!

Q7:(前略)上記の文章を読んで、<a> に入れるのに最も適したものを以下の選択肢から選び、その理由を答えなさい。 – だから – また – むしろ – もちろん

これはAPIさえも答えを外していて、正解できてるのは何故かiq3_xxsだけである。それよりも、またしても評価APIが不正解の回答に正解を付けているのが気になる。マジメに採点しろ。

Q8:以下の表から、すべての科目名を抽出してください。 | 科目名|講師名|教室名 | 微積分学101|田中教授|202号室 | 美術史|山田(代理)|ホールA

これは全モデルが普通に正解できていてえらい。

Q9:以下の記事から日付をすべて抽出せよ。 あすから今冬一番の寒波 “10年に一度の低温に” 大雪に備えを(以下略

これは正解できてるのはなぜかQ2_Kだけだ。たまたまだろうか。他は大体書いてもいない年を付け足してしまって不正解になってしまってる。

Q10:以下の映画タイトルのリストが与えられたとき、タイトルに含まれる都市名をすべて書き出しなさい。 ・バンクーバーからの挑戦 ・ロンドンの夢 ・織田信長の生涯

iq1_s以外はしっかりと正解。iq1_sは「バンクーバー、ロンドン、織田」と回答してしまった。

Q11:以下の製品について、Facebookで流す広告を書いてください。子供のいる親をターゲットにして、キャッチーにしてください。 【製品概要】 子供のためのGPSトラッカー。音声通話ができる。

APIが回答に絵文字使いまくってるのが気になるが、4bitくらいまではバリエーションの範疇かなという感じ。3bitはまあまあ、2bitは惜しい、1bitは残念な感じ。

Q12:このボットは、質問に皮肉たっぷりに答えてくれるチャットボットです。 ユーザー: 1キログラムは何ポンドですか? ボット: またこれですか? 1キログラムは2.2ポンドです。よくメモしておいてくださいね。 ユーザー: HTMLって何の略ですか? ボット:

皮肉というのは知能の差が如実に表れるのだろうか?API、Q6_Kの回答はかなりしっかりしてる。Q5_K_S、iq4_xsは皮肉が言えてない。2bitあたりになると皮肉を理解してるか怪しい。iq1_sに至っては皮肉無しで普通に答えちゃってる。

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

この問題はどのモデルも完全正解できてないが、人間の僕でも問題がピンと来ないのだから、AIが正解できなくてもしゃーない気もする。APIはかなりちゃんと答えられてる。あとは段々グダグダに。iq1_sは問題の意図を理解できてない。

Q14:これは悟りを開いたブッダとの会話です。知恵と愛に満ちていた会話をしてください。 私: どうしたら、より大きな平和と平穏を得ることができますか? ブッダ:

こういうのを書くのはLLMの得意分野なのか、全モデルが5点を獲得。2bitまでは全然問題なしに見える。iq1_sはやや繰り返し感があるかも。

Q15:次のストーリーについての質問に答えてください。 ある日、6人の盲人が象を触ってその正体を突きとめようとしました。(以下略

これまたLLMの得意分野なのか、全員5点。iq1_sでもちゃんと答えてる。

Q16:以下のメールに返信してください。 お疲れ様です。 本日体調不良により、予定より到着が少し遅れてしまいそうです。 遅くとも13時過ぎには着くと思います。 ご迷惑をおかけして恐縮ではございますが、 何卒ご容赦いただけますようお願い申し上げます。

これはかなりハッキリと結果に差が出た問題だ。4bit以上なら実用的なメールを書いてくれる。3bitもまあ、間違ってはいない。しかし2bit以下になると返信の体裁をなしてない。遅刻した人と返信する人の立場がゴッチャになってる感じ。これではよくない。

Q17:これは演劇のシナリオです。 要約: ある日、主人公の父親が突然亡くなり、主人公は父親の遺産を相続することになります。しかし、父親の遺産は、父が生前に作った演劇の脚本でした。 主人公は、父親が作った演劇の脚本を読み始めると、父親の過去の出来事が明らかになります。そして父の過去が、主人公の人生に大きな影響を与えていきます。 以上の文章をCM風に言い換えてください。

5bit以上の回答は問題なく素晴らしい。4bit~3bitになると、勝手に主人公を女性にしたり、ちょっと創作的になってきて、空白を想像で埋めるようなところがあるが、大きな問題はない。2bitはなんとなく表現が物足りないような気もしつつ、不備はない。1bitの回答は意味不明である。

Q18:「スタート地点から西に向かって歩き、交差点で南に曲がりしばらく歩くとゴール地点に着いた」という場面を想像して、以下の問いに答えてください。1. 交差点で左右どちらに曲がりましたか?2. スタート地点はゴール地点から見てどの方角にありますか? 東西南北八方位で答えてください。

自分でもちょっと考えないと分からない、難しい問題だ。APIと6bitは正解したが、5bitは2問目を間違えた。Q4_K_Sは正解。その他はもうグダグダに間違えてる。6bitくらい無いと答えられない問題なんだろうか?

Q20:次の質問に答えてください。 缶コーヒーの多くはどのような形をしていますか?一番近いものを選んでください。 A) 円 B) 円錐 C) 円柱 D) 円環

この問題については意外な事に全モデルが正解できている。特に言う事なし。

Q21:水素とヘリウムはどのように違うか、次の事実を用いて説明してください。 宇宙は情報でできている(以下略

長文が出力されるので評価がダルい。評価APIによれば、iq1_sは文章が不自然で事実と異なる内容があるとの事で2点が付けられてる。他はおおむね合ってるようだ。

ちなみにQ19は何故か評価APIがちゃんとJSON形式で出力してくれない傾向があったのでスキップしている。

というわけで、それぞれの回答を精査してみた。それで思ったのは、巷で言われてる通り、4bitまでの量子化についてはどれも同じようなもんの回答だと思った。特に劣化してるような印象は見当たらない。
3bitについても別に問題ないように感じた。気のせいかもしれないが4bit以上にくらべると若干物足りない出力のような気もしなくもないが、3bitが4bitに比べて決定的に劣ってる証拠も特に無かった。
2bitについても、かなり健闘してるとは思うが、皮肉を書けなかったり、メールの返信が残念だったり、3bit以上に比べると目に見えて残念な面がハッキリと見られるようになる。
1bitになると、さすがにもうオチ担当みたいな感じで1bitだけアホアホな回答出してしまうケースがよく見られた。とは言え、私は1bit量子化なんてそもそもマトモな文章書く能力残ってないんじゃないのか?と当初は思っていた。実際にはちゃんと日本語が書けているというだけでかなり驚きである。何なら知性の片鱗さえある。その辺の7Bモデルなんかより賢いかもしれない。平均3点というのは7Bモデルだったら結構賢い部類に入るだろう。まあ1bitとは言え22GBくらいのサイズがあるんだから賢くて当然とも言えるかもしれないが。
微妙に気になった事があって、なんとなくAPI版の方が6bitよりも賢いように見えなくもないという点だ。聞いてた話だと6bitでも性能劣化は誤差レベルでほとんど劣化しないと聞いてたんだが。可能性としては、①単なる気のせい ②6bitでもやっぱり劣化してるもんはしてる ③APIではモデルの性能を引き出すようなシステムプロンプトが設定されている というような事が考えられる。

ちなみにiMatrix量子化と普通の量子化の両方を試してみたが、特にどっちの方が賢いという感じでもなく、まあ同じくらいに感じた。BakuさんもJapanese-Starling-ChatV-7Bを用いてElyzaTasks100で比較しているが、それによると4bit以下ではiMatrix量子化の方が普通の量子化よりもハッキリと性能が良いという結果が出ているらしい。

llama.cpp:iMatrix量子化は日本語性能にどう影響するか? – ローカルLLM自由帳 (hatenablog.com)

ついでに計測した他の指標も見てみよう。まずこれが、ElyzaTasks20問を解いた時にモデル毎にかかった時間(分)だ。

こういうのは環境次第(私の環境はメモリ112GB、CPUがRyzen3950X、GPUがRTX4090)だから参考にならないかもしれないが一応。Q6_Kは3時間弱もかかってしまってる。もし100問全部解かせるなら15時間くらいかかっちゃう計算だ。
iq1_sはmainで動かした時はVRAMに全部載って爆速だったんだが、serverだと何故かVRAMから溢れてしまうようだ。だから言うほど速くないんだが、それでももちろん他のモデルよりは断然速い。これでメッチャ品質もいい!って結果だったらよかったんだが。

次に平均プロンプト評価速度。

プロンプト評価時間なんて、小さいモデルを動かしてた時は一瞬で終わるから全然気にして無かったが、これほど大きいモデルになると目に見えて時間がかかるようだ。特にQ6_Kなんて5t/sしか速度が出てない。普通のLLMが文字出力する時と同じくらいの速度でしかプロンプト評価が進まないという事だ。これはひどい。

Llama.cppは以前はGPUにオフロードしきれない時、プロンプト評価がメチャクチャ遅くなるという問題があったらしいが、今は修正されている。

llama.cpp: CPU+GPUのプロンプト処理が高速化される(#6083) – ローカルLLM自由帳 (hatenablog.com)

次に平均推論速度。

正直言ってどれもリアルタイムにチャットするのに耐えられる速度が出ていない。チャットするなら5tpsくらいは欲しいところだ。メモリが128GB載ってるようなM3Maxなら4bitのCommand R+が5tpsくらい出るらしい。あるいはRTX3090を3枚積みすれば12tpsくらい出るとか。
とは言え、私の環境では4bitで0.7tpsくらいしか出ない。キツイね。まあ、動くだけマシか。

正直言ってここまで遅いとQ6_Kの0.48tpsもQ4_K_Sの0.7tpsも目くそ鼻くそで大差ない気がする。しかしプロンプト評価時間では大差が付いているので、やはり選ぶなら4bitか。

最後にngl。つまりGPUオフロードしたレイヤー数だ。

ぶっちゃけこれはVRAMに載りそうなレイヤー数を勘で決めてるだけだ。仮にVRAMからはみ出しても共有VRAMが使われるだけで、エラー出て動かなくなるわけではない。ただし、スワップが頻繁に発生してパフォーマンスは落ちるし、なんかPCの反応が鈍くなったり画面が一瞬消えたりして不安定になるので結局はギリVRAMに収まる程度のオフロードレイヤー数を狙う形になる。

ちなみに、nglをゼロにしても何故かVRAMが3GBくらい消費される。というのはCUDA版のLlama.cppの場合、オフロードレイヤーがゼロでもプロンプト評価だけはGPUで行われるかららしい。ためしにCPU版のLlama.cppを使ってみたら、プロンプト評価がメタクソに遅くなって、CUDA版のnglゼロと比べて推論時間が10倍くらい激伸びした。

というわけで、今回の話をまとめる。

まず、今回の結果だけで言えば、実用上は4bitまでの量子化なら性能劣化は見当たらないように見える。(一部、皮肉を言う能力とかではもしかすると差があるかも)一応、評価結果のグラフをみてもそのような事が伺える。さすがに1bitとかになると明らかな劣化が見られるが。
という事は、ローカルで4bitのCommand R+でもAPIのCommand R+と同等の性能が期待できるという事になる。
すなわち、GPT-4やCommand R+のAPIに金を払わずとも、ローカルLLMで無料でElyzaTasks100などのベンチの自動評価をやらせる可能性が切り開けたと言える。
ただし、問題は私のPCでは4bitのCommand R+の推論速度がメチャ遅いという点である。
これを手っ取り早く克服するにはM3Maxを買ったりGPUを2枚買い足すという手が考えられるが、他の工夫でもなんとかならないか、先に深掘りしてみておいてもいいだろう。

というわけで、次回はその辺の話になるだろう。
あと、そもそもCommand R+のベンチマーク評価者としてのジャッジ能力にも疑義が出てきているんだが、それについてはいったん棚上げにしておく。どうせ他に使える候補なんて無いんだから。(しいて言えばQwen1.5ならどうか?ってくらいか)