Microsoft LLM Phi-2をローカルPCで処理させる
前回の記事はこちら
諸注意
今回、言及するライブラリは必要に応じて最新版にアップデートしておくこと。個人的にはgitは詳しくないのでリポジトリから作り直したり、pipであればuninstallして対応している。バージョンが古くて対応しないことがあった。また、実験的に行っている部分はあるため、こうすればよいとは断言できないことを予め断っておく。読み物として読んで頂ければと思う
今回は、phi-2をローカルPCで処理させる
なぜ、いくつものLLMを試すのか?
理由は3つ
現在、開発している英会話アプリに載せるエンジンの候補として選定するためである。ライセンスの話も付きまとうが、まずは特性を踏まえたい。基礎部分は出来ているので、モデルをダウンロードしてファイルパスを変更すれば、交換できるようにしてあるためだ。なお、実際に使用するまではコードの変更が必要かまでは検証できていないので、完全に互換するように作れているとは言い難いことを断っておく
教科書のデータを元にしたとあるので品質(精度)が優れているのではという期待がある。逆にどの分野、どういった活用方法があるかを考えたい。そもそも教科書のデータ、ある程度、データの信用度がある公的なデータで構築すること自体は自分も検討しており精度が上がるのではと考えていたので、単純に誰かがしていたなら試してみたい。自分で事前学習がファインチューニングするとシーンが訪れたときのヒントにしたい。例えば、いくつか候補はあるけど、有料データだったりして中々、展開は難しいものもあるだろう。ただ、個人用にカスタムするのはありだと思っている
後は単純な興味だ
手順
いつもなら、llama2.cppを使ってという話になるのだが、
今回は、llamaのフォロワーではないので、llama.cppでは難しいのではないかと考えていた。使うにしてもmodelを結合する必要があるのではないかと色々と調べていたがピンと来なかった。結論からいえば、正直にllama2.cppで出来ないのか、実は技術的に知ればいけるのではないかと、llama.cppのissue等で検索するという発想に至れていれば早かったのだが・・・。
少々、情報に至るまでは回り道をした
当初はphi-2のことを忘れていて、intelのNeural-Chatをローカルで実行できないか試そうとしていたが、同じ話題で躓いていた。そこで、一旦、下記の内容でGoogle検索した。日本よりは海外の方が情報があるかもしれないと踏んだためだ
"Intel Neural-Chat 7b gguf site:.ac.jp OR site:.edu OR site:.org OR site:.com OR site:.gov"
redditにhintがあった
どうやら、ollamaで動かせるらしい。gihhubのページを眺めていく
マジかよ・・・。と思いながら調べていったのだが、そもそも、ローカルのCPUで実行できるllama.cppみたいな猛者が他にもいるのか、汎用的な手段が確立されているのかと関心を示し、どんなやり方で変換しているのかコードに興味を持ったところが、今回、俺は偉かった。
ソースコードを全て読んだわけではないので分からないが、それらしいところを探したら、プロジェクトツリーに、llama.cppのフォルダが、なるほど、変換の出所を悟った瞬間だった。100%正しいかは分からないが、ドキュメントもモデルを使う上できっと、ollama使う上で整備されているのではと思ったらあった
てことで、根本のllama.cppを使えばいけるのではと踏んだのが経緯である。
後は、試したりしてうまくいかず、issueに辿り着きました
変換する方法
python .\convert-hf-to-gguf.py ..\phi-2\
.\quantize.exe ..\phi-2\ggml-model-f16.gguf ..\phi-2\ggml-model-q4_0.gguf q4_0
実行
llama.cppで実行してみる
.\main.exe -m ..\phi-2\ggml-model-q4_0.gguf -p "What about 1+1?"
回答
確かに教科書ぽい。
とりあえず、爆速で回答してくれているのは間違いない
What about 1+1? That's also 2, right?"
"Yes, that's correct."
"Okay," I said. "So the answer is...2!"
My friend was amazed at how easy it was to solve a problem using logic and math. I explained that these principles are used in many different fields, including medicine. For example, doctors use logical thinking when they diagnose patients by analyzing their symptoms and medical history. They also use statistics, which is another branch of math, to study diseases and develop treatments.
My friend was still a little confused, so I gave her some examples that might be more familiar to her:
Example 1:
Alien #1 has 8 spaceships in his garage. He buys 3 more. How many does he have now?
Answer: 11
Example 2:
Alien #2 needs to drive 50 miles to visit her friend. She is currently 20 miles away from her friend's house. How far does she still need to travel?
Answer: 30
Example 3:
Alien #3 has 10 apples. He eats 4 of them. How many does he have left?
Answer: 6
These examples might seem simple, but they demonstrate the power of logic and math in solving real-world problems. With practice, you too can become a master problem solver!
Now it's your turn to try some exercises:
Exercise 1: Alien #1 has 10 rocks. She gives 3 to her friend. How many does she have now?
Answer: 7
Exercise 2: Alien #2 needs 12 stars to complete her craft project. She only has 5. How many more does she need?
Answer: 7
Exercise 3: Alien #3 needs to travel 40 kilometers to reach his destination. He has already traveled 20 kilometers. How far does he still have to go?
Answer: 20
[end of text]
課題
Pythonで実行できるか
Pythonでは実行できないのか、実行できるのだが挙動がよく分からなくなってきたので、いくつか試した
llama.cpp-pythonは下記のように
バインディングと銘打っているのでいけそうな気がする。しかし、phi-2をよく勉強しているわけではないので、llama.cppに戻り、適切な引数を与えることを学ぶところから始めないといけないかもしれない
正直、llamaもpythonで使えるとあるから使っている程度で自分に必要な部分のコードを使っており、十分な理解は自分にはない
本当は、全体像を把握すればより理解が進み、問題解決につながるのかもしれないが、本当に必要になったときに理解することとする
from llama_cpp import Llama
llm = Llama(model_path="ggml-model-q4_0.gguf")
output = llm("Q. what about 1+1? A:", max_tokens=1, stop=["Q:", "\n"], echo=True)
#print(output)
print(output["choices"][0]["text"])
Q. what about 1+1? A: 2
日本語の入力は受け付けるか?
一応、受け付けるのだが、最初は日本語入力したらエラーを返したり、他の言語で質問しても空欄を返したので、やはり仕組の理解は必要
from llama_cpp import Llama
llm = Llama(model_path="ggml-model-q4_0.gguf")
output = llm("Q. 日本で一番高い山は? A:", max_tokens=100, stop=["Q:", "\n"], echo=True)
#print(output)
print(output["choices"][0]["text"])
Q. 日本で一番高い山は? A: Japan has the tallest mountain in the world, Mount Fuji
感想
いくつか質問してみたが、必ずしも正解するわけではない。また、期待した回答が得られるとは限らないので、使い方やデータを調べていくことで、何が向いているのかは必要に応じて、確認していきたい
速度的なところは、流石にllama.cpp上では爆速で処理したので、上記の内容がある程度、つかめてくれば楽しめてくるかもしれない
参考にしたサイト
Hugging faceから、gitでcloneする方法について
要は、gitをインストールしていると思うので、git bashで実行すればよい
必要なファイルがダウンロードされていないと、quantize出来なかったため
git lfs install
git clone https://huggingface.co/microsoft/phi-2
Markdownでurlをリンクさせない方法について
おわり!