メインコンテンツへスキップ
見出し画像

gemma3 量子化で動かしてみた N100 CPUでも許容レベル!? ~llama-cppでCPU推論(GPUは爆速…)~

    こんにちはRcatです。
    今回は大規模言語モデルの話です。
    今までは新しいモデルが出てきた時に、そのままGPUで推論という形で試していきましたが、今回は量子化されたモデルを試していこうと思います。

    次回はこちら
    今回使ったテストスクリプトをローカルAIサーバー化します


    はじめに

    利用規約

    情報や作品の活用時は事前に利用規約をご確認ください。

    コメントについて

    利用規約のガイドラインを確認の上コメントしてください。
    則っていないコメントは削除します。


    概要

    いきなりどうしたの?

    つい最近、Edge GalleryというAndroidスマートフォン向けのエッジAIのアプリを見つけたんですが、このアプリスマートフォンのCPUを使ってLLMを動かすというもので、マジかよと思いちょっと使ってみました。
    その結果、それなりに遅いものの普通に使える…。

    なんでスマートフォンで動くのか調べたところ、量子化によってモデルをだいぶ削減していることがわかりました。今まで普通のパソコンでも3BをGPUで動かすので限界だったのにスマートフォンで4Bが動くんです。

    じゃあ、パソコンで同じことしたら、もう普通に使えるレベルなのではということで試してみることにしました。

    量子化とは

    量子化とはパラメーターのビット数を削減することで軽量化する手法です。これにより精度を犠牲にすることで、大幅なメモリの削減や推論速度の向上が見込まれます。

    例えば、いままでGPUでは16bitの浮動小数点でしたが、今回試すのはintの4ビットまで削減したものになります。
    ビット数で言えば1/4。さらにintにしてしまうので、演算コストも大幅に下がります。


    実際に動かしてみる

    使用するライブラリ

    今回はllama-cppを使用します。Pythonのライブラリなので、今まで通りの感覚で使うことができます。

    使用するモデル

    googleのgeminiと同じ基盤で開発されているオープンソースのgemma-3を使います。
    スマホ版のアプリで実際に動かしてすごいなと思ったので、そのままパソコンでも使ってみたかったためです。
    あと、普段の自動化の作業は全部geminiにやらせているので、統系列のモデルであれば、今までと似たような回答を返してくるのではないかという期待もあります。

    なお、公式ではllama-cppに対応しているggif形式が無かったので、変換済みの他の提供者のモデルを使用します。
    今回は以下の物から選ばせてもらいました。

    https://huggingface.co/unsloth/gemma-3-4b-it-qat-GGUF/tree/main

    モデルの選び方がよくわからなかったので、AIに聞いたところ、次のような回答を得ました。

    たくさんのファイルがあって迷ってしまいますよね!はい、モデル本体は通常1つのGGUFファイルで構成されています。 他のファイルは、量子化のレベルが異なるバリエーションや、関連する設定ファイル、あるいはマルチモーダル機能のための補助ファイルなどです。
    
    このリストの中から、ノートPCのCPUで使うことを前提に、性能とファイルサイズのバランスが最も良いと思われるGGUFファイルを選んでいきましょう。
    
    あなたが選ぶべきGGUFファイル
    おすすめは、以下のファイルです。
    
    gemma-3-4b-it-qat-Q4_K_M.gguf
    サイズ: 2.49 GB
    理由:
    前回の説明で推奨した Q4_K_M 量子化レベルです。これは、ファイルサイズとモデルの出力品質のバランスが非常に優れていると広く認識されています。
    qat (Quantization-Aware Training) モデルなので、量子化による性能劣化が最小限に抑えられていることが期待できます。
    ノートPCのCPUでも、このサイズであれば十分に動作する可能性が高いです。
    他のファイルの解説と選ばない理由
    gemma-3-4b-it-qat-BF16.gguf (7.77 GB):
    
    これは「BF16」(BFloat16)形式で、量子化されていない、オリジナルの精度に近いモデルです。最も高品質ですが、ファイルサイズが非常に大きく、ノートPCのCPUで動かすには重すぎます。メモリも大量に必要とします。
    gemma-3-4b-it-qat-Q2_K.gguf (1.73 GB), Q3_K_S.gguf (1.94 GB), Q3_K_M.gguf (2.1 GB) など、より小さいファイル:
    
    これらはさらに強く量子化されており、ファイルサイズは小さく、読み込みも速くなります。しかし、その分、モデルの出力品質(応答の正確性や流暢さ)が低下する可能性があります。まずは Q4_K_M を試してみて、もしパフォーマンスがどうしても足りない場合に、これらのより軽量なモデルを検討すると良いでしょう。
    gemma-3-4b-it-qat-Q5_K_M.gguf (2.83 GB), Q6_K.gguf (3.19 GB), Q8_0.gguf (4.13 GB) など、より大きいファイル:
    
    これらは Q4_K_M よりも精度が高い可能性がありますが、その分ファイルサイズも大きくなり、ノートPCのCPUで動かす際のメモリ消費と推論速度に影響が出やすくなります。まずは Q4_K_M を試してみて、もし品質に不満があり、かつPCの性能に余裕があると感じた場合に、これらのより高精度のモデルを検討すると良いでしょう。
    gemma-3-4b-it-qat-IQ4_NL.gguf (2.36 GB), gemma-3-4b-it-qat-IQ4_XS.gguf (2.26 GB) など IQ で始まるファイル:
    
    これらは「I-Quantization (Importance Quantization)」と呼ばれる、比較的新しい量子化手法です。一部のテストでは Q4_K_M と同等か、特定の状況下でより良いパフォーマンスを示すこともあります。Q4_K_M でうまくいかない場合や、さらに試してみたい場合に選択肢となりますが、まずは最も標準的で安定している Q4_K_M から始めるのが無難です。
    UD- で始まるファイル (例: gemma-3-4b-it-qat-UD-IQ1_M.gguf):
    
    これは「User Defined」または特定の用途に最適化された量子化バージョンである可能性があります。通常の用途では推奨されません。
    mmproj-*.gguf ファイル (例: mmproj-BF16.gguf):
    
    これらは「マルチモーダルプロジェクター」の重みファイルです。Gemma 3は画像とテキストの両方を扱えるマルチモーダルモデルですが、llama-cpp-python でテキスト生成のみを行う場合は、通常このファイルは不要です。画像を扱うような複雑なアプリケーションを構築しない限り、ダウンロードする必要はありません。
    .gitattributes, README.md, config.json, imatrix_unsloth.dat:
    
    これらはモデルのメタデータ、説明、設定ファイル、または量子化に関する補助データであり、モデル本体のGGUFファイルではありません。ダウンロードする必要はありません。
    結論
    ダウンロードすべきファイルは、gemma-3-4b-it-qat-Q4_K_M.gguf です。

    というわけで教えてもらったファイルをダウンロードします。なお、他にベンチマークもしたいので、最終的には以下のファイルで比較をしました。

    • gemma-3-4b-it-qat-Q4_K_M.gguf
      一番おすすめされたミディアムなモデル

    • gemma-3-4b-it-qat-IQ4_NL.gguf
      パラメータの重要度で量子化されたモデルらしい

    • gemma-3-4b-it-qat-Q3_K_M.gguf
      3bitまで落としたモデル。

    • gemma-3-4b-it-qat-UD-Q2_K_XL.gguf
      2Bitも試してみる

    • gemma-3-4b-it-qat-UD-Q4_K_XL.gguf
      2Bitとと同じ系列の4Bit

    • gemma-3-4b-it-qat-UD-Q3_K_XL.gguf
      同上

    ソースコード

    初めて使うものなので、とりあえずgeminiに丸投げした後、自分で少々書き加えました。
    この関数は、ブロックとストリーム(画面に文字が随時表示される)に対応し、処理にかかった時間を返します。
    ストリーム時は最初のトークンが出るまでにかかった時間も返すことができます。

    画像

    使用するデータ

    本活動の目的は、以下の記事で使っている投稿分析を自分のパソコンで行うことなので、掲示板から取得したコメント情報を使います。
    投稿が多すぎて、最近1日1000回以上APIを叩いてるので、いくらか自分で肩代わりしないとマジで制限がかかる…。

    ちなみに入出力はこんな感じです。
    コメントをAIに食わせて3段階で役に立つかどうか評価させるだけです。
    SNS情報が早いのはいいんですが、どうでもいい書き込みが7割以上あるんですよね…。そういうのを時間の無駄なので、こうしてAIで効率化しているわけですね。

    画像

    ちなみにgemini2.0 flash liteは大体5秒程度で応答します。

    動作テスト

    推論にはCPUを使用し、Ryzen5 3600です。

    テストのソースはこんな感じ。
    上の方でコメントを定義しているのですが、そこは出してもモザイクなので省略。
    全部で3掲示板から、6コメントずつ持ってきていて、それぞれの推論時間や正誤をチェックします。anserは私基準でフラグを付けた場合の値です。
    時間は、3掲示板を推論して平均を出しています。

    画像

    プロンプト

    ここでは非公開とします。
    ざっと説明すると、投稿を3段階に分けて、jsonで出力してくださいという指示になっています。

    結果

    結果は以下のようになりました。
    bitを下げてもあまり早くならないどころか遅い時もあります。この感じだと普通にQ4 MKでいいんじゃ…
    正答率は…私の指示が悪いんでしょうね。ただ、どのモデルでもあまり変わらないので、早く動くのを選べばいい気がします。

    {
      "gemma-3-4b-it-qat-IQ4_NL.gguf": {
        "time": "29.4",
        "first": "7.7",
        "score": "24.074074%"
      },
      "gemma-3-4b-it-qat-Q3_K_M.gguf": {
        "time": "25.5",
        "first": "7.0",
        "score": "24.074074%"
      },
      "gemma-3-4b-it-qat-Q4_K_M.gguf": {
        "time": "26.5",
        "first": "4.3",
        "score": "24.074074%"
      },
      "gemma-3-4b-it-qat-UD-Q2_K_XL.gguf": {
        "time": "32.8",
        "first": "10.3",
        "score": "22.222222%"
      },
      "gemma-3-4b-it-qat-UD-Q3_K_XL.gguf": {
        "time": "32.9",
        "first": "9.8",
        "score": "22.222222%"
      },
      "gemma-3-4b-it-qat-UD-Q4_K_XL.gguf": {
        "time": "29.3",
        "first": "6.0",
        "score": "25.925926%"
      }
    }

    ちなみに3bitを下回ると、出力を見る感じ読解力が足りてない感じがします。10文字以内でといった指示を無視していたりする。

    2Bitの顕著な出力がこんな感じ。

    画像

    期待しているのはこんな感じなので

    画像

    追加実験

    あんまり変わらないなら、もっと大きいのならどうなのかやってみました。
    こっちは速度が落ちましたね。出力の方は期待通りになっているので、読解力は上がってきていますが、最初のトークンが出るまでの時間が長くなっているのであえて使おうとは思わない感じですね。

    {
      "gemma-3-4b-it-qat-Q4_K_M.gguf": {
        "time": "26.6",
        "first": "4.4",
        "score": "24.074074%"
      },
      "gemma-3-4b-it-qat-Q5_K_M.gguf": {
        "time": "33.5",
        "first": "9.1",
        "score": "25.925926%"
      },
      "gemma-3-4b-it-qat-Q6_K.gguf": {
        "time": "33.9",
        "first": "8.0",
        "score": "25.925926%"
      }
    }

    GPUだとどうなのか

    llamma cppですが、インストール時にひとあじ加えることでGPU版をインストールできるみたいです。
    詳しくはこちら

    ビルド

    ビルド済みのがあるみたいですが…なんとCUDAが12.6が入っており使えませんでした。
    なので自分でビルドします。

    画像

    そもそもCUDAない or 分からない方はこちらからインストール
    ※もちろんNVIDA GPUの場合ですが。
    ROCmのもあるみたいなので、AMD GPUでも行けるのかも??

    途中上手く行かなくて色々調べて、最終的に下記コマンドを打ちこんで成功しました。tmpの下りは要らないかもだけど、やってもセッション中だけなので別にOK

    set FORCE_CMAKE = 1
    set CMAKE_ARGS=-DGGML_CUDA=on
    set TEMP=C:\temp
    set TMP=C:\temp
    pip install llama-cpp-python --force-reinstall --no-cache-dir

    30分くらいビルドに時間がかかってインストール終了。

    実行結果

    1000文字を15秒で出力しました…。これRTX2060なんですよ…。
    LinuxのサーバーにGPUついてれば一部のタスクは完全にローカルに移行できそうなレベルです…
    thunderboltが無いのでeGPUも使えないので撃沈ですが…。


    まとめ

    今回は量子化LLMを試してみました。
    今までは精度が下がるのはなぁと思って素通りしてましたが、全然そんなことはないですね。
    パラメータの精度を下げてもその分大きなモデルを試せますし、floatがintになっているので大きくても全然苦になりません。

    ローカルLLMサーバーが欲しくなってきましたが、GPU有のPCに差し替えるのかあるいは最近出てきたNPUに手を出してみるのか…
    それではまたお会いしましょう。


    リンク集

    Ryzen AI MAX+395 Radeon8060Sで爆速LLM

    Pythonのインストール方法

    ミニPCにLinuxをインストール


     
     
    モノづくりが趣味。 "売ってないなら自分で作ればいいじゃない"をコンセプトに、機械/電気/AI/プログラム/ネットワーク 全部やります。 記事執筆はAI不使用。 ご連絡や利用規約はプロフィール記事参照。

    あなたへのおすすめ