安くLLM+RAGを構築するための構成です。
LLM は大規模言語モデルのことで、AI が ChatGPT のような文章を作ってくれます。無料で使えますが、業務で使えるとかなり難しいことがありますし、データの漏洩とか含めて困りますね。のローカルでLLMを作る際のおすすめ構成をお知らせします。
まず、LLMを作るには、マザーボード、CPU、メモリ、SSD、電源、ケース、そしてGPUが必要です。ソフトウェアやOSはすべて無料で手に入りますので、心配入りません。
まず、ケースにマザーボード、CPU、メモリ、SSD、電源をセットします。このあたりは標準的な構成をお勧めします。
肝心なのはGPUで、VRAMのサイズが搭載できるLLMの性能を左右します。パラメータ数7Bのモデルが標準的に使われていますので、
14GB程度のVRAMが必要です。
そこで、よく使われるがおそらく安価でVRAMが豊富なNVIDIA RTX3060 12Gです。日本円で40000~50000円程度で12G使えますので、2枚買って8~10万円程度で合計24GB確保できます。 LLMでは、VRAMの合計値でうまく計算してくれますので、これでもいけます。3090や4090のマシンは20-30万円程度ですので、これだけでもかなり節約できました。
OSにはubuntuを入れます。これは無料です。
ソフトウェアはすべてpythonで無料ですので、python経由で色々入れます。
全部の構成でもけちれば12万円前後でできるのではないかと思います。
最低限使うには、トランスフォーマーと加速を入れればOKです。
こちらを実行しました。
from transformers import AutoTokenizer, pipeline
import torch
import time
model_id = "mistralai/Mistral-7B-Instruct-v0.2"
tokenizer = AutoTokenizer.from_pretrained(model_id)
pipe = pipeline("text-generation", model=model_id, tokenizer=tokenizer, device_map="auto", max_new_tokens=300, torch_dtype=torch.float16,)
query = '量子コンピュータとは?'
start = time.time()
answer = pipe(query)
print(time.time()-start)
print(answer)
ここは、気になるので3種類のGPUでベンチマークを選びました。
3060×2枚:16秒
3090×1枚:7秒
4090×1枚:6秒
という結果になりました。すべてお店で手に入るGPUです。この中で一番安いのはたぶん3060 x2枚です。
生成されるまでに時間がかかります。
2~3倍程度の時間がかかるので、かなり多かったように思います。
3060 x 2枚は3090や4090などの高性能GPUで動くようなLLMを動かせるものすごい安い構成かと思いました。マシンの構成によって速度が上がることはあると思います。
ここで、やはり速度が気になる場合、AIにテキストストリーミングと言うと、文章をできた順に出力する機能があります。
上記のベンチマークは全ての生成が終わるまで時間を出しましたが、通常人間は文章を前から順番に読みます。
その読む時間も考慮して、すぐに出た順に文章を徐々に出すことによって、体感速度をかなり改善することができます。
from transformers import AutoTokenizer, pipeline, TextStreamer
import torch
import time
model_id = "mistralai/Mistral-7B-Instruct-v0.2"
tokenizer = AutoTokenizer.from_pretrained(model_id)
streamer = TextStreamer(tokenizer, skip_prompt=True)
pipe = pipeline("text-generation",
model=model_id,
tokenizer= tokenizer,
torch_dtype=torch.bfloat16,
device_map="auto",
max_new_tokens = 512,
do_sample=True,
top_k=10,
num_return_sequences=1,
streamer=streamer,
eos_token_id=tokenizer.eos_token_id
)
query = '量子コンピュータとは?'
start = time.time()
answer = pipe(query)
print(time.time()-start)
print(answer)
3060でもまだマラソンでも3090や4090に劣るのですが、ギリギリ我慢できるかな?って感じでした。