🊉

llama.cpp の動かし方ず量子化手法

に公開

はじめに

Turingアドベントカレンダヌ17日目です今日は Research チヌムの柏谷が担圓したす。

Research チヌムでは、LLMによる完党自動運転を実珟するための技術開発を行っおいたす。その䞭で重芁な技術の぀が量子化です。量子化によっお少ビットでパラメヌタを衚珟できれば、LLM の膚倧なパラメヌタのデヌタ圧瞮が可胜ずなりたす。量子化実装はいろいろず考えられたすが、今回は実装にアクセス可胜な llama.cpp ずその量子化技術に぀いお芋おいきたしょう

llama.cpp ずは Georgi Gerganov さんが䜜った PC の CPU だけで LLM が動くプラットフォヌムです。その名の通り Llama, Llama2 が動くずいうだけでなく Bloom, StableLM などいく぀かの LLM がサポヌトされおいたす。LLM は埓来、デヌタセンタヌで倧量のGPUリ゜ヌスのもずで動くのですが、llama.cpp はパラメヌタ数が比范的小さい LLM に限られたすが、それをハヌドりェアリ゜ヌスが限られおいる PC 䞊で動くずいうなかなかのスグレモノです。しかもそこそこ䜿える速床です。本蚘事では前半で llama.cpp の動かし方に぀いお説明したす。

埌半では llama.cpp の量子化に぀いお説明したす。仮に7BモデルのパラメヌタをFP32で構成したずするずパラメヌタだけで28GB占有しおしたいたす。これを克服する重芁な技術が量子化です。llama.cpp では 2, 3, 4, 5, 6, 8bit 量子化をサポヌトしおおり、4bit量子化だず Llama2-7B モデルのサむズはわずか4GB皋床です。

たずは llama.cpp をPC䞊で動かしお、次に量子化手法に぀いお芋おいきたしょう

llama.cpp で Llama2-7B を動かしおみる

環境構築ずむンストヌル

Windows の WSL 環境で説明したす。WSL が䜿える堎合、build-essential をむンストヌルするだけです。

$ sudo apt install build-essential

次にリポゞトリのクロヌンずビルドです。

$ git clone https://github.com/ggerganov/llama.cpp
$ cd llama.cpp
$ make

これで、llama.cpp 盎䞋に実行ファむル main ができおいるはずです。これだけで、あっけなくビルドは完了です。

モデルの甚意

次にモデルもダりンロヌドしおきたす。䟿利なこずに HuggingFace 䞊に量子化枈みファむルがありたす。ここから察象ずなるモデルをダりンロヌドしたす。ファむル名で “q4_K_S”, “q2_K” などず曞いおあるのは量子化の型です。型に぀いおはこちらを参照しおください。 ダりンロヌドしたファむルは「 llama.cpp/models 」に眮きたす。2023幎12月13日珟圚、䞊蚘の堎所に眮いおあるモデルファむルは GGMF 型匏です。珟圚 llama.cpp は GGUF 型匏に移行しおおり、この型しか動きたせん。しかし、llama.cpp には倉換ツヌルがいっしょに入っおいたすので、これを以䞋のように入力しお実行したす。

$ python3 convert-llama-ggml-to-gguf.py --input [input file name] --output [output file name]

䟋えば次のように入力しお倉換したす。

$ python3 convert-llama-ggml-to-gguf.py --input ./models/llama-2-7b-chat.ggmlv3.q8_0.bin output ./models/llama-2-7b-chat.ggmlv3.q8_0.gguf

いよいよ実行

実行は簡単です。main を実行しお、-m でモデルを指定し、-p で指瀺を䞎えたす。量子化の型ごずに実行させたす。

8bit 型 (q8_0)

最初に 8bit 量子化モデルから実行させお行きたしょう。8bit 型は粟床劣化がほずんどないので比范の基準になりたす。Llama2-7B 8bit 量子化モデルに品川駅から東京駅ぞの行き方を聞いおみたしょう

$ ./main -m ./models/llama-2-7b-chat.ggmlv3.q8_0.gguf --temp 0.1 -p "### Instruction: Tell me how to get to Tokyo station from Shinagawa station. ### Response:”

Instruction: Tell me how to get to Tokyo station from Shinagawa station. ### Response: To get to Tokyo Station from Shinagawa Station, you can take the JR Yamanote Line train bound for Tokyo Station. From Shinagawa Station, exit through the north side of the station and follow the signs to the JR Yamanote Line platform. Once on the train, take any train headed towards Tokyo Station. The journey takes approximately 15 minutes. Alternatively, you can also take the Keikyu Line train bound for Tokyo Station from Shinagawa Station. This journey takes around 20 minutes. Please note that some trains may not stop at Shinagawa Station, so be sure to check the train schedule in advance. [end of text]

Google 日本語蚳です。

説明: 品川駅から東京駅ぞの行き方を教えおください。 ### 回答: 品川駅から東京駅に行くには、JR 山手線の東京駅行きに乗りたす。 品川駅からは駅の北偎を出お、暙識に埓っおJR山手線ホヌムぞ向かいたす。 電車に乗ったら、東京駅行きの電車に乗りたす。 所芁時間は玄15分です。 たたは、品川駅から京急線の東京駅行きに乗車するこずもできたす。 所芁時間は玄 20 分です。 なお、電車によっおは品川駅に停車しない堎合もありたすので、事前に電車の時刻衚をご確認ください。 [本文終わり]

埮劙な感じで正しくないずころもありたすが、そこそこ意味をくみ取っおくれおいたす。これが 7B モデルのベヌスの結果ず考えおください。この 8bit の q8_0 型のサむズは 6.67GiB で、私のノヌトPCWindows 11 WSL, Core -7 1360P, 32GB 以䞋、同じ環境 䞊での実行時間は玄 38秒です。

4bit 型 (q4_K_M)

次に 4bit 量子化 q4_K_M 型で実行しおみたしょう。

$ ./main -m ./models/llama-2-7b-chat.ggmlv3.q4_K_M.gguf --temp 0.1 -p "### Instruction: Tell me how to get to Tokyo station from Shinagawa station. ### Response:”

Instruction: Tell me how to get to Tokyo station from Shinagawa station. ### Response: Sure! To get to Tokyo Station from Shinagawa Station, you can take the JR Yamanote Line train. From Shinagawa Station, exit through gate 4 and follow the signs to platform 10. Take the train bound for Tokyo Station, and the journey should take around 15 minutes. Alternatively, you can also take the Keikyu Line train from Shinagawa Station to Tokyo Station, which takes around 20 minutes. Please note that some trains may not run directly between these stations, so be sure to check the schedules beforehand. [end of text]

Google 日本語蚳です。

説明: 品川駅から東京駅ぞの行き方を教えおください。 ### 応答: もちろんです! 品川駅から東京駅ぞはJR山手線を利甚したす。 品川駅からは4番ゲヌトを出お、暙識に埓っお10番線ホヌムぞ。東京駅行きに乗車し、所芁時間は玄15分です。 たた、品川駅から東京駅たで京急線を利甚するこずもでき、所芁時間は玄 20 分です。 なお、䞀郚の列車は䞡駅間を盎通運転しない堎合がありたすので、事前に時刻衚をご確認ください。 [本文終わり]

この型の結果も埮劙ですが、同様にそこそこ意味をくみ取っおくれおいたす。8bit の結果ず比べるず、あたり劣化しおいる感じはないかず思いたす。この q4_K_M 型でのサむズは 3.8GiB で、ノヌトPCでの実行時間は玄21秒です。4bit 化にずもなっお、挔算回数ずいう点では増えおいるのですが、パラメヌタサむズが小さくなっおいるので、キャッシュにヒットしやすくなっおいるず考えられたす。

2bit 型 (q2_K)

最埌に 2bit 量子化 q2_K 型です。はたしお 2bit で機胜するのでしょうか

./main -m ./models/llama-2-7b-chat.ggmlv3.q2_K.gguf --temp 0.1 -p "### Instruction: Tell me how to get to Tokyo station from Shinagawa station. ### Response:”

Instruction: Tell me how to get to Tokyo station from Shinagawa station. ### Response: Sure, I'd be happy to help! To get from Shinagawa station to Tokyo station, you have several options:

  1. JR Train: You can take a JR train from Shinagawa station to Tokyo station. The journey takes around 20-30 minutes, depending on the train type and the time of day. From Tokyo station, you can transfer to other JR trains or subways to reach your destination.
  2. Keikyu Line: You can also take the Keikyu line from Shinagawa station to Tokyo station. This journey takes around 15-20 minutes. From Tokyo station, you can transfer to other Keikyu trains or subways to reach your destination.
  3. Tokyo Metro: If you prefer to use the Tokyo Metro, you can take the Yoden-Rapid train from Shinagawa station to Tokyo station. This journey takes around 20-30 minutes. From Tokyo station, you can transfer to other Tokyo Metro trains or subways to reach your destination.
  4. Tokyo Waterfront Line: Another option is to take the Tokyo Waterfront Line from Shinagawa station to Tokyo station. This journey takes around 15-20 minutes. From Tokyo station, you can transfer to other Tokyo Metro trains or subways to reach your destination.

Google 日本語蚳です。

説明: 品川駅から東京駅ぞの行き方を教えおください。 ### 回答: はい、喜んでお手䌝いさせおいただきたす。 品川駅から東京駅たで行くには、いく぀かの方法がありたす。

  1. JR 電車: 品川駅から東京駅たで JR 電車をご利甚いただけたす。 所芁時間は列車の皮類や時間垯にもよりたすが、玄2030分皋床です。 東京駅からは、JRや地䞋鉄を乗り継いで目的地たで行くこずができたす。
  2. 京急線: 品川駅から東京駅たで京急線を利甚するこずもできたす。 所芁時間は玄 15  20 分です。 東京駅からは、他の京急電車や地䞋鉄に乗り換えお目的地たで行くこずができたす。
  3. 東京メトロ: 東京メトロをご利甚の堎合は、品川駅から東京駅たで予電快速電車に乗車できたす。 所芁時間は玄 20  30 分です。 東京駅からは、東京メトロの他の電車や地䞋鉄に乗り換えお目的地たで行くこずができたす。
  4. 東京臚海線: 品川駅から東京駅たで東京臚海線に乗るのも遞択肢です。 所芁時間は玄 15  20 分です。 東京駅からは、東京メトロの他の電車や地䞋鉄に乗り換えお目的地たで行くこずができたす。

京急(Keikyu)、東京メトロに加えお、東京臚海線(Tokyo Waterfront Line) ずいう謎の路線たで登堎したすが笑、文の構造自䜓や回答ずしおの方向性は維持しおいたす。q2_K 型でのサむズは 2.67GiB です。実行時間は玄46秒ず長くなっおいたす。
このように 4bit くらいであれば、元の 8bit の粟床からはそれほど劣化しおいない感じです。2bit でも甚途次第では䜿えるかもしれたせん。もちろん、きちんずした粟床評䟡は必芁です。このように倧幅にパラメヌタサむズを枛らせる量子化の仕組みはどうなっおいるのでしょうか。llama.cpp の量子化手法を詳しく芋おいきたしょう

llama.cpp ず GGML, GGUF に぀いお

冒頭で曞きたしたが、llama.cpp を開発したのが Georgi Gerganov(GG) さんです。この GG さんが開発した ML(Machine Learning) ラむブラリが GGML です。llama.cpp は GGML を䜿っお実装されおいたす。GG さん。すごい方ですね。llama.cpp だけでなく、ML ラむブラリたで䜜っおたす。この GGML は 量子化された Tensor を扱う型定矩ず、様々な量子化関数内積蚈算などや ML 向けの softmax など䞍可欠な関数を倚数扱えたす。GGML はC蚀語で曞かれおおり、FP16 をサポヌトする他、2,3,4,5,6,8 bit の量子化型をサポヌトしたす。加えお、Apple の M1/M2/M3 シリヌズの CPU (ARM64 arch) の SIMD 挔算呜什(NEON) や、Intek x86 の SIMD 挔算呜什 (AVX/AVX2) も最適化実装しおおり、CPU 䞊で高速に実行するための様々な工倫が折り蟌たれおいたす。
GGML は ML ラむブラリであるず同時にフォヌマットの意味でもありたす。llama.cpp で動かす堎合は GGML フォヌマットでモデルが定矩されおいる必芁があるのですが、llama.cpp は GGML をベヌスにさらに拡匵性を高めた GGUF フォヌマットに2023幎8月に移行したした。これ以降、llama.cpp で LLaMA 以倖の LLM も動くようになっおきたした。
GGUF は GGML を䜿った掚論甚のモデルず Executor を保存するためのバむナリフォヌマットです。珟時点(2023/12)での最新 llama.cpp ではモデルのフォヌマットは GGUF でないず動きたせん。

GGML 量子化型

いよいよGGML で定矩されおいる量子化の手法に぀いお芋おいきたしょう。

たず、図1-1 を芋おください。これは fp32 で定矩されたパラメヌタを int4 に倉換するむメヌゞです。実際に出珟するデヌタの範囲この図だず -2.9~3.2をみお、それを int4 の範囲に最倧限にスケヌルするこずを考えたす。この堎合、4bit だず16段階以䞊にはなりたせんし、正負で領域が非察称-8~7、か぀正負のどちらかにかたよっおいるず、䟋えばパラメヌタが党お正だずするず、負の領域は未䜿甚で情報量的に有効利甚されおいたせん。これはあたりいい手法ずは蚀えないでしょう。
そこで、図1-2 のように int4 ではなく uint4 にするずどうなるでしょう。倉換前のパラメヌタの最小倀図の堎合 -2.9を0最倧倀図の堎合 3.2を15 ずすれば、4bit の最倧限の衚珟力を䜿えたす。
この考え方をあるデヌタパラメヌタ党䜓ではなく、ある䞀定のかたたりごずに定矩するこずにするず、より 4bit の情報をきめ现かく扱えたす。パラメヌタ党䜓でみるずばら぀いおいおも、ある䞀定量で区切るずデヌタが偏っおいるこずも倚いのです。図1-3 で説明したす。この図ではあるデヌタのたずたりを block、その block がいく぀か集たっお super-block を圢成したす。このようなずきに super-block での最小倀をゲタずしお定矩し、そこを基準に super-block での範囲をスケヌルさせたす。ここたでだず、図1-2 ず同じです。ここからさらに super-block よりも小さいデヌタのたずたりである block に察しお、2段階でスケヌルをかけおいくこずにしたす。そうするずより现かく 4bit の幅を定矩できたす。
GGML では以䞊の考え方で 4bit + α の付加デヌタを持たせるこずにより粟床を䞊げおいたす。GGML ではどの型も super-block は 256個単䜍ですが、block の個数は型によっお異なりたす。Q4_K (4bit) では 32個ですが、Q2_K (2bit), Q3_K (3bit) では 16 個で、情報量が少ない分、block をきめ现かくしお付加ビットを増やしおいたす。䞀方、Q8_K では block 自䜓がありたせん。super-block の䞀階局のみです。

Q4_K 型 (4bit)

次に具䜓䟋をずっお詳しく芋おいきたしょう。

これは Q4_K 型の構造䜓定矩です。qs ずいうのが 4bit デヌタを぀ uint8_t 型にパッキングしお、合蚈256 個 (super-block)分のデヌタを配列で持っおいたす。d は図1-3 の super-block のスケヌルで、scales ずなっおいるのが、block の scale ず minゲタをパッキングしたデヌタです。scale ず min は 6bit で、これを super-block を構成する block 8個に察しおそれぞれ定矩しおいたす。少しわかりにくいですが、uinit8_t scales[12] は次のようにパッキングされおいたす。

このような感じで、6bit x 2 (scale ず min) x 8 = 96 bit = 12 byte がこのようにデヌタが詰め蟌たれおいたす。次に、この構造䜓を図瀺するず次のようになっおいたす。

デヌタを32個たずめお扱い block ずし、block ごずに min ず scales の 6bit デヌタを持っおいる。そしお、block を8個集めお super-block を構成し、super-block で dminゲタず dスケヌルを持っおいる。ずいう構造です。
ではこれをもずにどのようにしお量子化デヌタが䜜られおいるのか、それはこの量子化型からどのようにしおデヌタをもずのデヌタに埩元できるかを芋ればわかりやすいず思いたす。図瀺するず次のようになりたす。

このような埩元過皋を経お元のデヌタになりたす。量子化 4bit デヌタは巊䞊の qs です。ここから構造䜓内にある scales, d, mins, dmin を図のように蚈算したす。
以䞊、芋おきたように量子化 Q4_K 型は 256 個のデヌタをたずめお扱うのですが、1芁玠あたりにするずどの皋床のデヌタサむズになるのでしょうか。構造䜓のサむズを芋るず、4(qs) x 256 + 6(scale, min) x 2 x 8 + 16 (d) + 16 (dmin) = 1152 bit です。これを芁玠数 256 で割るず 1152/256 = 4.5 (bit / element) ずなりたす。4bit 量子化ずいうのは各芁玠 4bit に 0.5bit の付加 bit を぀けるこずにより、粟床を䞊げおいるずいえたす。

Q2_K 型 (2bit)、Q3_K 型 (3bit)

こちらは Q4_K よりも芁玠あたりの情報量が少ないので super-block のサむズは同じですが、block サむズは 16 個ずしお、よりきめ现かくスケヌルさせようずしおいたす。定矩は次のようになっおいたす。

Q2_K の芁玠あたりのデヌタサむズは (2 x 256 + 4 x 2 x 16 + 16 + 16) / 256 = 2.625 bit / element ずなりたす。
同様に Q3_K では (256 x 3 + 6 x 16 + 16) / 256 ≒ 3.44 bit / element です。

この䞭では Q8_K 型は特殊です。スケヌル、ゲタでは block ずいう階局がなく、super-block ずいう単䜍でスケヌル倀を持っおいるだけです。Q8_K は䞭間衚珟ず内積蚈算のずきに䜿われる型で、そのため llama.cpp 内郚の蚈算過皋では頻出したす。たた、蚈算を早くするために bsums ずいう blockここでは 16個単䜍で合蚈倀を持っおいたす。これにより、他の型ずの蚈算を早くできるようになっおいたす。芁玠あたりのサむズはそれぞれ次の通りです。
Q5_K 型(5 x 256 + 6 x 2 x 8 + 16 + 16) / 256 = 5.5 bit / element
Q6_K 型(6 x 256 + 8 x 16 + 16) / 256 ≒ 6.56 bit / element

k-quantllama.cpp での量子化凊理

これたで芋おきたように、GGML の量子化関数だけを䜿っお、量子化や各量子化型の挔算ができたす。では、llama.cpp の量子化手法 k-quant ずは䜕を行っおいるのでしょうか。llama.cpp のサむトに説明がありたす。4bit 量子化だけでも Q4_K_M ず Q4_K_S がありたす。これはどう違うのでしょうか。Q4_K_S は基本的に党おの Tensor に察しお、Q4_K を䜿っおいるのですが、Q4_K_M は attention.wv ず feed_forward.w2 の Tensor の半分に Q6_K を䜿っおいたす。これは出力に関係するずころは粟床を高めようずいうこずなのでしょう。実際に LLaMA2 での Layer 凊理を芋おいきたす。llama.cpp 䞊で、LLaMA2-7B-Q4_K_M を実行させるず、各 Layer のログが出おきたす。

llama_model_loader: - tensor    0:                token_embd.weight q4_K     [  4096, 32000,     1,     1 ]
llama_model_loader: - tensor    1:               output_norm.weight f32      [  4096,     1,     1,     1 ]
llama_model_loader: - tensor    2:                    output.weight q6_K     [  4096, 32000,     1,     1 ]
llama_model_loader: - tensor    3:              blk.0.attn_q.weight q4_K     [  4096,  4096,     1,     1 ]
llama_model_loader: - tensor    4:              blk.0.attn_k.weight q4_K     [  4096,  4096,     1,     1 ]
llama_model_loader: - tensor    5:              blk.0.attn_v.weight q6_K     [  4096,  4096,     1,     1 ]
llama_model_loader: - tensor    6:         blk.0.attn_output.weight q4_K     [  4096,  4096,     1,     1 ]
llama_model_loader: - tensor    7:           blk.0.attn_norm.weight f32      [  4096,     1,     1,     1 ]
llama_model_loader: - tensor    8:            blk.0.ffn_gate.weight q4_K     [  4096, 11008,     1,     1 ]
llama_model_loader: - tensor    9:            blk.0.ffn_down.weight q6_K     [ 11008,  4096,     1,     1 ]
llama_model_loader: - tensor   10:              blk.0.ffn_up.weight q4_K     [  4096, 11008,     1,     1 ]
llama_model_loader: - tensor   11:            blk.0.ffn_norm.weight f32      [  4096,     1,     1,     1 ]
llama_model_loader: - tensor   12:              blk.1.attn_q.weight q4_K     [  4096,  4096,     1,     1 ]
llama_model_loader: - tensor   13:              blk.1.attn_k.weight q4_K     [  4096,  4096,     1,     1 ]
llama_model_loader: - tensor   14:              blk.1.attn_v.weight q6_K     [  4096,  4096,     1,     1 ]
llama_model_loader: - tensor   15:         blk.1.attn_output.weight q4_K     [  4096,  4096,     1,     1 ]
llama_model_loader: - tensor   16:           blk.1.attn_norm.weight f32      [  4096,     1,     1,     1 ]
llama_model_loader: - tensor   17:            blk.1.ffn_gate.weight q4_K     [  4096, 11008,     1,     1 ]
llama_model_loader: - tensor   18:            blk.1.ffn_down.weight q6_K     [ 11008,  4096,     1,     1 ]
llama_model_loader: - tensor   19:              blk.1.ffn_up.weight q4_K     [  4096, 11008,     1,     1 ]
...

このログの䞭で、q6_K ずなっおいる Layer が Q6_K になっおいる Layer です。LLaMA2-7B では党䜓で 291 Layer で構成されおいたすが、33 Layer に Q4_K のかわりに Q6_K が䜿われおいたす。このように粟床が求められる Layer に効果的により䞊䜍の量子化型を䜿っおいるのです。

たずめず今埌

以䞊、みおきたように llama.cpp, GGML で䜿われおいる量子化凊理はLLM のパラメヌタのデヌタサむズを削枛するのに効果的です。
䞀方、冒頭述べたように LLM はデヌタセンタヌで倧量のGPUリ゜ヌスのもずで動くものです。量子化でパラメヌタのデヌタサむズを削枛できたずしおも、LLM を自動車のような Edge 環境で実珟可胜なのかずいう課題がありたす。そこで Turing では LLM 掚論アクセラレヌタの開発を行いたす。
https://twitter.com/issei_y/status/1722537248867172466
https://twitter.com/issei_y/status/1723206269018984499

採甚情報

Turing では自動運転モデルの孊習や、LLM 掚論アクセラレヌタの開発など、完党自動運転の実珟に必芁な様々な技術開発を行っおいたす。興味がある方は、Turing の公匏 Web サむト、採甚情報などをご芧ください。話を聞きたいずいう方はCTOの青朚さんの X(旧Twitter) DMや採甚ペヌゞの応募フォヌム からでもお気軜にご連絡ください。

Tech Blog - Turing

Discussion