【無料】ローカルPCで動く日本語LLM(ELYZA-japanese-Llama-2-7b-instruct)
はじめに
ローカルPCで動くLLM(大規模言語モデル)にはまっています。
ローカルPCといっても「高価なGPUを搭載していないと動かないのでは?」と以前は思っていましたが、llama.cppによってCPUだけでも十分動きました。
精度や速度はGPUに比べたら劣るのかもしれませんが、ゲーミングPCのような高いPCを買わなくても、手元のローカルPCでLLMが動くのは感動です。
とはいえ、ふつうのLlama2などは日本語が苦手なようで、あまりいい回答をしてくれませんでした。
何か日本語でみっちりトレーニングされたモデルが無いか探していたところ、ELYZAにたどり着きました。
Llama2をベースに日本語でトレーニングされているので日本語は得意そうです。
そこで、実際どうなのか? を試してみました。
ELYZAとは?
ELYZA-japanese-Llama-2-7bとは?
今回は低スペックなローカルPCを使う関係で7bを使いました。
2024/3/17現在、10倍の70bまで公開済みのようです。
ELYZA-japanese-Llama-2-7bの始め方
CPUで動かすためにllama.cppを使います。
llama.cppとは?
もともとは、従来高スペックなGPUがないと動かないLlama2をMacで動かすモチベーションで作られたようです。
今ではLlama2に限らず、いろんなOSSのLLMに対応しています。
Supported models:
Typically finetunes of the base models below are supported as well.
LLaMA 🦙
LLaMA 2 🦙🦙
Mistral 7B
Mixtral MoE
Falcon
Chinese LLaMA / Alpaca and Chinese LLaMA-2 / Alpaca-2
Vigogne (French)
Koala
Baichuan 1 & 2 + derivations
Aquila 1 & 2
Starcoder models
Refact
Persimmon 8B
MPT
Bloom
Yi models
StableLM models
Deepseek models
Qwen models
PLaMo-13B
Phi models
GPT-2
Orion 14B
InternLM2
CodeShell
Gemma
Mamba
Command-R
Multimodal models:
LLaVA 1.5 models, LLaVA 1.6 models
BakLLaVA
Obsidian
ShareGPT4V
MobileVLM 1.7B/3B models
Yi-VL
llama.cppのセットアップは以下にあった手順も参考にしました。
llama.cppセットアップ
git clone https://github.com/ggerganov/llama.cpp.git
cd llama.cpp
make -j
モデルダウンロード
wget https://huggingface.co/mmnga/ELYZA-japanese-Llama-2-7b-instruct-gguf/resolve/main/ELYZA-japanese-Llama-2-7b-instruct-q4_K_M.gguf
GGUFとは?
実行
makeした後、カレントディレクトリにmain実行ファイルがありますので、それを」実行します。
-mで先ほどダウンロードしたモデル名を指定します。
./main -m './ELYZA-japanese-Llama-2-7b-instruct-q4_K_M.gguf' -n 256 -p '[INST] <<SYS>>あなたは誠実で優秀な日本人のアシスタントです。<</SYS>>AIの未来のロードマックを体系的にMarkdownで出力してください[/INST]'
結果
Log start
main: build = 2348 (82cb31eb)
main: built with cc (Debian 10.2.1-6) 10.2.1 20210110 for x86_64-linux-gnu
main: seed = 1710605652
llama_model_loader: loaded meta data with 21 key-value pairs and 291 tensors from ./models/ELYZA-japanese-Llama-2-7b-instruct-q4_K_M.gguf (version GGUF V2)
llama_model_loader: Dumping metadata keys/values. Note: KV overrides do not apply in this output.
llama_model_loader: - kv 0: general.architecture str = llama
llama_model_loader: - kv 1: general.name str = ELYZA-japanese-Llama-2-7b-instruct
llama_model_loader: - kv 2: general.source.hugginface.repository str = elyza/ELYZA-japanese-Llama-2-7b-instruct
llama_model_loader: - kv 3: llama.tensor_data_layout str = Meta AI original pth
llama_model_loader: - kv 4: llama.context_length u32 = 4096
llama_model_loader: - kv 5: llama.embedding_length u32 = 4096
llama_model_loader: - kv 6: llama.block_count u32 = 32
llama_model_loader: - kv 7: llama.feed_forward_length u32 = 11008
llama_model_loader: - kv 8: llama.rope.dimension_count u32 = 128
llama_model_loader: - kv 9: llama.attention.head_count u32 = 32
llama_model_loader: - kv 10: llama.attention.head_count_kv u32 = 32
llama_model_loader: - kv 11: llama.attention.layer_norm_rms_epsilon f32 = 0.000001
llama_model_loader: - kv 12: tokenizer.ggml.model str = llama
llama_model_loader: - kv 13: tokenizer.ggml.tokens arr[str,32000] = ["<unk>", "<s>", "</s>", "<0x00>", "<...
llama_model_loader: - kv 14: tokenizer.ggml.scores arr[f32,32000] = [0.000000, 0.000000, 0.000000, 0.0000...
llama_model_loader: - kv 15: tokenizer.ggml.token_type arr[i32,32000] = [2, 3, 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, ...
llama_model_loader: - kv 16: tokenizer.ggml.bos_token_id u32 = 1
llama_model_loader: - kv 17: tokenizer.ggml.eos_token_id u32 = 2
llama_model_loader: - kv 18: tokenizer.ggml.unknown_token_id u32 = 0
llama_model_loader: - kv 19: general.quantization_version u32 = 2
llama_model_loader: - kv 20: general.file_type u32 = 15
llama_model_loader: - type f32: 65 tensors
llama_model_loader: - type q4_K: 193 tensors
llama_model_loader: - type q6_K: 33 tensors
llm_load_vocab: special tokens definition check successful ( 259/32000 ).
llm_load_print_meta: format = GGUF V2
llm_load_print_meta: arch = llama
llm_load_print_meta: vocab type = SPM
llm_load_print_meta: n_vocab = 32000
llm_load_print_meta: n_merges = 0
llm_load_print_meta: n_ctx_train = 4096
llm_load_print_meta: n_embd = 4096
llm_load_print_meta: n_head = 32
llm_load_print_meta: n_head_kv = 32
llm_load_print_meta: n_layer = 32
llm_load_print_meta: n_rot = 128
llm_load_print_meta: n_embd_head_k = 128
llm_load_print_meta: n_embd_head_v = 128
llm_load_print_meta: n_gqa = 1
llm_load_print_meta: n_embd_k_gqa = 4096
llm_load_print_meta: n_embd_v_gqa = 4096
llm_load_print_meta: f_norm_eps = 0.0e+00
llm_load_print_meta: f_norm_rms_eps = 1.0e-06
llm_load_print_meta: f_clamp_kqv = 0.0e+00
llm_load_print_meta: f_max_alibi_bias = 0.0e+00
llm_load_print_meta: n_ff = 11008
llm_load_print_meta: n_expert = 0
llm_load_print_meta: n_expert_used = 0
llm_load_print_meta: pooling type = 0
llm_load_print_meta: rope type = 0
llm_load_print_meta: rope scaling = linear
llm_load_print_meta: freq_base_train = 10000.0
llm_load_print_meta: freq_scale_train = 1
llm_load_print_meta: n_yarn_orig_ctx = 4096
llm_load_print_meta: rope_finetuned = unknown
llm_load_print_meta: model type = 7B
llm_load_print_meta: model ftype = Q4_K - Medium
llm_load_print_meta: model params = 6.74 B
llm_load_print_meta: model size = 3.80 GiB (4.84 BPW)
llm_load_print_meta: general.name = ELYZA-japanese-Llama-2-7b-instruct
llm_load_print_meta: BOS token = 1 '<s>'
llm_load_print_meta: EOS token = 2 '</s>'
llm_load_print_meta: UNK token = 0 '<unk>'
llm_load_print_meta: LF token = 13 '<0x0A>'
llm_load_tensors: ggml ctx size = 0.11 MiB
llm_load_tensors: CPU buffer size = 3891.24 MiB
..................................................................................................
llama_new_context_with_model: n_ctx = 512
llama_new_context_with_model: freq_base = 10000.0
llama_new_context_with_model: freq_scale = 1
llama_kv_cache_init: CPU KV buffer size = 256.00 MiB
llama_new_context_with_model: KV self size = 256.00 MiB, K (f16): 128.00 MiB, V (f16): 128.00 MiB
llama_new_context_with_model: CPU input buffer size = 10.01 MiB
llama_new_context_with_model: CPU compute buffer size = 70.50 MiB
llama_new_context_with_model: graph splits (measure): 1
system_info: n_threads = 4 / 4 | AVX = 1 | AVX_VNNI = 0 | AVX2 = 1 | AVX512 = 0 | AVX512_VBMI = 0 | AVX512_VNNI = 0 | FMA = 1 | NEON = 0 | ARM_FMA = 0 | F16C = 1 | FP16_VA = 0 | WASM_SIMD = 0 | BLAS = 0 | SSE3 = 1 | SSSE3 = 1 | VSX = 0 | MATMUL_INT8 = 0 |
sampling:
repeat_last_n = 64, repeat_penalty = 1.100, frequency_penalty = 0.000, presence_penalty = 0.000
top_k = 40, tfs_z = 1.000, top_p = 0.950, min_p = 0.050, typical_p = 1.000, temp = 0.800
mirostat = 0, mirostat_lr = 0.100, mirostat_ent = 5.000
sampling order:
CFG -> Penalties -> top_k -> tfs_z -> typical_p -> top_p -> min_p -> temperature
generate: n_ctx = 512, n_batch = 512, n_predict = 3256, n_keep = 1
[INST] <<SYS>>あなたは誠実で優秀な日本人のアシスタントです。<</SYS>>AIの未来のロードマックを体系的 にMarkdownで出力してください[/INST] AIの未来のロードマップは以下のようになります。
# 2020-2023: 人工知能の基盤研究 (基本技術の開発)
## 2025年以降のAI実現に向けた研究課題の抽出とその戦略
### 1. 人間の知的活動を再現する (Cognitive AI)
### 1.1 自然言語処理、意思決定、プランニングなど
### 1.2 認知・学習のメカニズムの理解と再現
### 2. 人間以上の知的活動を実現する (Artificial General Intelligence)
### 2.1 人間類以上の知能をもつロボットの研究開発
### 2.2 多様な問題解決に対する高度な応用力と判断力の獲得
### 3. AIを通じた社会課題の解決へ (AI for Social Good)
### 3.1 人間生活に役立つ情報の取得、分類および利用の支援
### 3.2 AIを通じた公平で持続可能な社会の実現への貢献
### 4. 安全性と倫理性の確保 (Trustworthy AI)
### 4.1 機械学習モデルの可視化および予測変数の特定
### 4.2 AIの開発、使用および管理に関する倫理的な指針の提示と実装支援
### 5. 社会へのAI導入の促進 (Wide Adoption of AI)
### 5.1 AIを活用した新ビジネスの創出および拡大
### 5.2 学校教育へのAIの組み込みと人材育成の促進
### 5.3 研究開発やビジネス活動におけるAI導入の支援および社会課題解決へのAI導入の促進 [end of text]
llama_print_timings: load time = 808.54 ms
llama_print_timings: sample time = 437.88 ms / 669 runs ( 0.65 ms per token, 1527.82 tokens per second)
llama_print_timings: prompt eval time = 14063.64 ms / 71 tokens ( 198.08 ms per token, 5.05 tokens per second)
llama_print_timings: eval time = 165405.08 ms / 668 runs ( 247.61 ms per token, 4.04 tokens per second)
llama_print_timings: total time = 180168.75 ms / 739 tokens
Log end
日本語の回答は、まずまずのようです。
プロンプト修正
以下のようにニュース記事の一部を貼り付けて、株価の変動を予測してもらいましょう。
./main -m './ELYZA-japanese-Llama-2-7b-instruct-q4_K_M.gguf' -n 512 -p '[INST] <<SYS>>あなた は誠実で優秀な日本人の投資家アシスタントです。<</SYS>>次のニュースから株価が伸びそうな日本の企業名を3社挙げてください。その3社に対して株価の伸びを100点満点中何点か教えてください。###ニュース\n\n AdobeFireflyAppleVisionProAdobeが、AppleVision用画像生成AIアプリ「AdobeFirefly:G
enerativeAI」を、AppStoreにて配信を開始して... [/INST]'
Log start
main: build = 2348 (82cb31eb)
main: built with cc (Debian 10.2.1-6) 10.2.1 20210110 for x86_64-linux-gnu
main: seed = 1710671116
llama_model_loader: loaded meta data with 21 key-value pairs and 291 tensors from ./models/ELYZA-japanese-Llama-2-7b-instruct-q4_K_M.gguf (version GGUF V2)
llama_model_loader: Dumping metadata keys/values. Note: KV overrides do not apply in this output.
llama_model_loader: - kv 0: general.architecture str = llama
llama_model_loader: - kv 1: general.name str = ELYZA-japanese-Llama-2-7b-instruct
llama_model_loader: - kv 2: general.source.hugginface.repository str = elyza/ELYZA-japanese-Llama-2-7b-instruct
llama_model_loader: - kv 3: llama.tensor_data_layout str = Meta AI original pth
llama_model_loader: - kv 4: llama.context_length u32 = 4096
llama_model_loader: - kv 5: llama.embedding_length u32 = 4096
llama_model_loader: - kv 6: llama.block_count u32 = 32
llama_model_loader: - kv 7: llama.feed_forward_length u32 = 11008
llama_model_loader: - kv 8: llama.rope.dimension_count u32 = 128
llama_model_loader: - kv 9: llama.attention.head_count u32 = 32
llama_model_loader: - kv 10: llama.attention.head_count_kv u32 = 32
llama_model_loader: - kv 11: llama.attention.layer_norm_rms_epsilon f32 = 0.000001
llama_model_loader: - kv 12: tokenizer.ggml.model str = llama
llama_model_loader: - kv 13: tokenizer.ggml.tokens arr[str,32000] = ["<unk>", "<s>", "</s>", "<0x00>", "<...
llama_model_loader: - kv 14: tokenizer.ggml.scores arr[f32,32000] = [0.000000, 0.000000, 0.000000, 0.0000...
llama_model_loader: - kv 15: tokenizer.ggml.token_type arr[i32,32000] = [2, 3, 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, ...
llama_model_loader: - kv 16: tokenizer.ggml.bos_token_id u32 = 1
llama_model_loader: - kv 17: tokenizer.ggml.eos_token_id u32 = 2
llama_model_loader: - kv 18: tokenizer.ggml.unknown_token_id u32 = 0
llama_model_loader: - kv 19: general.quantization_version u32 = 2
llama_model_loader: - kv 20: general.file_type u32 = 15
llama_model_loader: - type f32: 65 tensors
llama_model_loader: - type q4_K: 193 tensors
llama_model_loader: - type q6_K: 33 tensors
llm_load_vocab: special tokens definition check successful ( 259/32000 ).
llm_load_print_meta: format = GGUF V2
llm_load_print_meta: arch = llama
llm_load_print_meta: vocab type = SPM
llm_load_print_meta: n_vocab = 32000
llm_load_print_meta: n_merges = 0
llm_load_print_meta: n_ctx_train = 4096
llm_load_print_meta: n_embd = 4096
llm_load_print_meta: n_head = 32
llm_load_print_meta: n_head_kv = 32
llm_load_print_meta: n_layer = 32
llm_load_print_meta: n_rot = 128
llm_load_print_meta: n_embd_head_k = 128
llm_load_print_meta: n_embd_head_v = 128
llm_load_print_meta: n_gqa = 1
llm_load_print_meta: n_embd_k_gqa = 4096
llm_load_print_meta: n_embd_v_gqa = 4096
llm_load_print_meta: f_norm_eps = 0.0e+00
llm_load_print_meta: f_norm_rms_eps = 1.0e-06
llm_load_print_meta: f_clamp_kqv = 0.0e+00
llm_load_print_meta: f_max_alibi_bias = 0.0e+00
llm_load_print_meta: n_ff = 11008
llm_load_print_meta: n_expert = 0
llm_load_print_meta: n_expert_used = 0
llm_load_print_meta: pooling type = 0
llm_load_print_meta: rope type = 0
llm_load_print_meta: rope scaling = linear
llm_load_print_meta: freq_base_train = 10000.0
llm_load_print_meta: freq_scale_train = 1
llm_load_print_meta: n_yarn_orig_ctx = 4096
llm_load_print_meta: rope_finetuned = unknown
llm_load_print_meta: model type = 7B
llm_load_print_meta: model ftype = Q4_K - Medium
llm_load_print_meta: model params = 6.74 B
llm_load_print_meta: model size = 3.80 GiB (4.84 BPW)
llm_load_print_meta: general.name = ELYZA-japanese-Llama-2-7b-instruct
llm_load_print_meta: BOS token = 1 '<s>'
llm_load_print_meta: EOS token = 2 '</s>'
llm_load_print_meta: UNK token = 0 '<unk>'
llm_load_print_meta: LF token = 13 '<0x0A>'
llm_load_tensors: ggml ctx size = 0.11 MiB
llm_load_tensors: CPU buffer size = 3891.24 MiB
..................................................................................................
llama_new_context_with_model: n_ctx = 512
llama_new_context_with_model: freq_base = 10000.0
llama_new_context_with_model: freq_scale = 1
llama_kv_cache_init: CPU KV buffer size = 256.00 MiB
llama_new_context_with_model: KV self size = 256.00 MiB, K (f16): 128.00 MiB, V (f16): 128.00 MiB
llama_new_context_with_model: CPU input buffer size = 10.01 MiB
llama_new_context_with_model: CPU compute buffer size = 70.50 MiB
llama_new_context_with_model: graph splits (measure): 1
system_info: n_threads = 4 / 4 | AVX = 1 | AVX_VNNI = 0 | AVX2 = 1 | AVX512 = 0 | AVX512_VBMI = 0 | AVX512_VNNI = 0 | FMA = 1 | NEON = 0 | ARM_FMA = 0 | F16C = 1 | FP16_VA = 0 | WASM_SIMD = 0 | BLAS = 0 | SSE3 = 1 | SSSE3 = 1 | VSX = 0 | MATMUL_INT8 = 0 |
sampling:
repeat_last_n = 64, repeat_penalty = 1.100, frequency_penalty = 0.000, presence_penalty = 0.000
top_k = 40, tfs_z = 1.000, top_p = 0.950, min_p = 0.050, typical_p = 1.000, temp = 0.800
mirostat = 0, mirostat_lr = 0.100, mirostat_ent = 5.000
sampling order:
CFG -> Penalties -> top_k -> tfs_z -> typical_p -> top_p -> min_p -> temperature
generate: n_ctx = 512, n_batch = 512, n_predict = 512, n_keep = 1
[INST] <<SYS>>あなたは誠実で優秀な日本人の投資家アシスタントです。<</SYS>>次のニュースから株価が伸 びそうな日本の企業名を3社挙げてください。その3社に対して株価の伸びを100点満点中何点か教えてください。###ニュース\n\n AdobeFireflyAppleVisionProAdobeが、AppleVision用画像生成AIアプリ「AdobeFirefly:GenerativeAI」を、AppStoreにて配信を開始して... [/INST] 承知しました。AdobeFireflyの件から株価が伸びそうな日本の企業3社とその運営会社の株価の可能性を提示します。
1. アドビシステムズ (Adobe Systems Incorporated) :100点
2. ファイヤーフライ エンターテイメント (Firefly Entertainment) :50点
3. アップル ヴィジョン プロダクツ (Apple Vision Products) :75点
上記はあくまで推察であるため、参考になれば幸いです。 [end of text]
llama_print_timings: load time = 775.18 ms
llama_print_timings: sample time = 122.90 ms / 195 runs ( 0.63 ms per token, 1586.60 tokens per second)
llama_print_timings: prompt eval time = 38555.02 ms / 194 tokens ( 198.74 ms per token, 5.03 tokens per second)
llama_print_timings: eval time = 47286.63 ms / 194 runs ( 243.75 ms per token, 4.10 tokens per second)
llama_print_timings: total time = 86038.55 ms / 388 tokens
Log end
回答抜粋
「Apple Vision Products」という会社は、たぶん無いと思いますが、Adobeが100点なので、まぁ間違ってはないのかもしれません。
投資の予測はあくまでも予測であって、予測が100%当たるのであれば苦労しません。
とりあえず、何らかの参考にはできそうです。
負荷状況
top - 01:01:46 up 6:37, 3 users, load average: 2.12, 0.69, 0.66
Tasks: 241 total, 2 running, 239 sleeping, 0 stopped, 0 zombie
%Cpu0 : 97.7 us, 1.0 sy, 0.0 ni, 1.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 97.7 us, 1.3 sy, 0.0 ni, 1.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu2 :100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu3 : 98.0 us, 1.0 sy, 0.0 ni, 1.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 16154844 total, 225912 free, 1176828 used, 14752104 buff/cache
KiB Swap: 8191996 total, 7369980 free, 822016 used. 14629232 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
12591 root 20 0 4443440 4.1g 3.8g R 394.0 26.5 2:47.14 main
実メモリ4GB程度でした。
しかもGPUなしです!
さっきの回答も1分程度で回答してくれます!
早いうえに4GBメモリで十分動きます!
OSSのLLMもここまで進化しているとは驚きです。
しかも、無料なので1日中何か処理させるのには最適です。
回答内容は、ぱっとしないかもしれませんが、日本語としてはちゃんと文章を組み立ててくれるので、回答内容自体はRAGなど別の手段で取得して、文章だけを生成させれば結構使い物になるかもしれません。
まとめ
回答の内容自体は、まだまだChatGPTのほうが良い回答の印象はありますが、日本語自体はちゃんとした回答をしてくれました。
おそらく全く知らない分野の回答では、本当か嘘かわからないレベルの日本語で回答してくれそうです。
あとは、自前のデータはRAGで回答するようにしておけば、自分専用のLLMができそうです。
ローカルPCで動く株価予測専用のLLMにしてもよさそうですね。