LLMを取り扱う
なぜ、CPUで処理をするのか
GPUではなくCPUで処理することを前提で書いている
一般ユーザーはよいグラボを持っている人は少ないのではないか
大衆化には程遠いのでCPU処理は重要だと思っている
ChatGPTなどの主流のサービスはプラットフォームとして提供されているため
ユーザー側のPCのスペックはあまり意識しないで済む
一方で、ローカルPCで手軽に実行、開発、配布、使用したい
llama.cppでConvertできたLLM
llamaはconvert.py、phi-2はconvert-hf-to-gguf.pyなどダウンロードしてくるデータによって使い分ける
hfはたぶんhuggingfaceのこと。llama.cppはllamaベースのLLMをコンバートするがphi-2はllamaベースではないが可能だった
- llama2(Meta)
- rinna
- phi-2(Microsoft)
- neural-chat(Intel)
- EvoLLM-JP-A-v1-7B(Sakana AI)
- Gemma(Google)
- llama3(Meta)
ConvertしたLLMにPythonでアクセスする
ちょっとアクセスするだけならば、llama-cpp-pythonが手軽かと
アプリに組み込むならばLangChainの方が良さそうだ
- llama-cpp-python
- LangChain
Streamの出力を変数に格納する
通常のstreamはコンソールに表示されるだけで値を受け取れない
任意のウィンドウに表示することなどを検討したいときには、“._stream”を試してみることをオススメする
この手の話はstreamを取得することで自分のアプリにリアルタイム性を実装することを求めているだろうから、存在だけでも知っておくとよい
from langchain.llms import LlamaCpp llm = LlamaCpp(model_path="/path/to/llama/model") for chunk in llm._stream(prompt="This is a prompt."): # handle the chunk data here print(chunk.text)
何がよいかといえば、streamを任意の変数に格納できること(任意に表示できること)と速度が早いことだ
BaseCallbackHandlerを継承して無理やりtokenを取得する方法を取っていた人もいたが実際に試すと動作が遅い
そのため、速度という点でもこのメソッドで書くことをオススメする
違和感と代替案について
なお、“._stream”と書くことに違和感を感じたため、“.stream”と書けないか試行錯誤した結果、使えることが分かった
# before for chunk in llm._stream(prompt="This is a prompt."): print(chunk.text) # after prompt="This is a prompt." for chunk in llm.stream(prompt): print(chunk)
コメント
どうやら、返す型がclassか、stringであるかの違いであるようだ。
stringで返してくれる方が分かりやすいのでこちらを使用している
推論サーバを作成した
streamに対応する推論サーバを作成した 詳細
LLMを高速化する
LLMのモデルそのものにメスを入れるのは最終手段
- promptの文字数が推論を始めるまでに一番、影響したので短くすれば早くなる
- llama-cpp-pythonはseedが設定できるのか検証をする
- マルチバイト(日本語)の推論は遅いが、実は変換すれば速度が向上する?推論方法(計算方法)を確認したい
- 余談だが、whisperもfp16、int8(?)、verboseなし、without_timestampsなど精度が仮に落ちても状態で試す参考
- 仮説だがLLMはpromptを確定してから読み込ませて処理が遅いのであれば、文字入力中に読み込ませてはどうか
- stream処理はユーザー体験として使用した方がいい、geminiやgroqほどの速度が出るならば別だが爆速のgroqでさえstreamを使用している、全文表示はユーザーの体験上はgeminiのレスポンスが待てても限界ではないか
システムプロンプトの内容は明確に
例えば、下記のシステムプロンプトでは日常会話らしくはならない
<sys>あなたは優秀なアシスタントです。~</sys>
LLMとchatするときには、ほぼ「何かお手伝いすることは出来ますか?」という定型文を返してしまう
これはLLMの反応として正しいと思われるが、目的によってはマッチしない場合がある
所謂、BOTとしては正解でも、コミュニケーションの相手として想定する場合は失敗に終わる
そのため、システムプロンプトにひと手間を加える。
# あなたはハンバーガーショップの店員です。私が注文をするので続けて質問をしてくれますか? <SYS>You are a clerk at a hamburger shop. I'm going to place my order, so could you please continue with your questions?</SYS>[INST] Two burgers please [/INST]
どういう役割で、どういう場面なのか具体的にすることで反応が変わる
# 素晴らしい! それで、ハンバーガーを上手に調理しますか、それとも他のものにしますか? トッピングはいかがですか? レタス、トマト、オニオン、ピクルスなどトッピングも豊富にご用意しております。 Great! So, would you like those burgers cooked to well done or something else? And would you like any toppings on them? We have a wide variety of toppings to choose from, such as lettuce, tomato, onion, pickles, and more.
※llama2(chat)では、日本語でシステムプロンプトを組むと「何かお手伝いできますか?」と返ってくる(同様の問題が起こる)ため、ネイティブな言語でシステムプロンプトは組むこと