はじめに
この記事では、Llama 3.1 SwallowをOllamaで使えるようにするまでの手順を紹介する(MacOS)
Llama 3 Swallowで行われている方の記事(MacのOllama環境でLlama-3-Swallow-8Bを使ってみた)を参考に、Llama 3.1バージョンを構築した。
その際に詰まった箇所も記す。
Llama 3.1 Swallowとは
2024年10月に公開された、Llama3.1をベースに日本語の能力を強化したLLM
8Bと70Bでそれぞれベースモデルと指示チューニング済みモデルがある
Llama3 Swallow 8Bに比べて、日本語の指示に英語で応答する傾向がなくなったそうだ
サイト→https://swallow-llm.github.io/llama3.1-swallow.ja.html
実行環境
- マシン:MacBook Air
- チップ:Apple M3
- メモリ:16GB
- Python 3.12.7
- Ollama 0.4.0
Ollama, Python, Git LFSがある前提で話を進める
ストレージに60GBくらいは空きがあると安心
手順
- Transformerモデルのダウンロード
- ggufモデルへの変換
- モデルの量子化
- Ollama Modelfileの作成
- Ollama createの実行
最終的なディレクトリ構成
LocalLLMというディレクトリを作り、その中で作業していく
全手順を完了したとき、ディレクトリは以下の通り(一部簡略化)
LocalLLM
├── llama.cpp
│
├── models
│ ├── Llama-3.1-Swallow-8B-Instruct-v0.1
│ ├── Llama-3.1-Swallow-8B-Instruct-v0.1_Q4_K_M.gguf
│ ├── Llama-3.1-Swallow-8B-Instruct-v0.1-f16.gguf
│ └── Modelfile_Llama-3.1-Swallow-8B-Instruct-v0.1_Q4_K_M
│
└── venv
1. Transformerモデルのダウンロード
LocalLLMディレクトリ内で以下のコマンドを実行し、
1. modelsディレクトリの作成
2. Transformerモデルのインストール
を行う
$ mkdir models
$ cd models
$ git lfs install
$ git clone https://huggingface.co/tokyotech-llm/Llama-3.1-Swallow-8B-Instruct-v0.1
Git LFSとはGit Large File Storageのことで、gitの大容量ファイル用の拡張機能のこと
git lfsが入っているかどうかは以下のコマンドで確認できる
$ git lfs version
インストール済みならバージョンが表示される
サイズが32GBほどあるので、ダウンロード時間もそれなりにかかる
ネットワーク環境によると思うが、昼食を食べるくらいの時間はあった
2. ggufモデルへの変換
gguf形式にしてLlama.cppで扱えるようにする
今回はOllamaまで行きたいのでこれはただの通過点
llama.cppの準備
モデルの変換にllama.cpp(https://github.com/ggerganov/llama.cpp.git)を用いる
llama.cppが既に入っている人はスキップ
gitでクローンして、makeでビルド
$ git clone https://github.com/ggerganov/llama.cpp.git
$ cd llama.cpp
$ make
次にPython仮想環境を準備する
今回はvenvを使用した
仮想環境を作成し、起動、必要なライブラリのインストールを行う
$ python3 -m venv venv
$ source venv/bin/activate
$ pip3 install -r ./llama.cpp/requirements.txt
f16 ggufモデルへの変換
llama.cppにあるconvert_hf_to_gguf.pyを実行する
$ python3 ./llama.cpp/convert_hf_to_gguf.py ./models/Llama-3.1-Swallow-8B-Instruct-v0.1/ --outfile ./models/Llama-3.1-Swallow-8B-Instruct-v0.1-f16.gguf --outtype f16
引数 | 変換するtransferモデル |
–outfileオプション | 出力ファイルの名前 |
–outtypeオプション | 形式 |
しかし、ここでエラーが発生
File ".../LocalLLM/llama.cpp/gguf-py/gguf/gguf_writer.py", line 882, in _pack_val
kv_data += encoded_val
TypeError: can't concat list to bytearray
調べてみると、同様のエラーが報告されていた→https://github.com/ggerganov/llama.cpp/pull/9807
llama.cpp/gguf-py/gguf/metadata.pyの460行目あたりを変更すると良いらしい
if self.license is not None:
# 461行目をコメントアウト
# gguf_writer.add_license(self.license)
# 代わりに以下の4行を追加
if isinstance(self.license, list):
gguf_writer.add_license(",".join(self.license))
else:
gguf_writer.add_license(self.license)
これで再び実行すれば、ファイルサイズ16GBほどのggufファイルが出力される
実行時間は数十秒程度
3. Q4_K_M量子化
量子化をすることで、モデルを小さく、高速化する(精度は低下する)
実は、量子化せずに先ほどのggufファイルでOllamaを動かすことも試してみたが、自分のPC(メモリ16GB)では激重になり不可能だった
量子化にはllama.cpp/llama-quantizeを実行する
量子化の種類はさまざまなので、色々試すのが良いのだろうが、今回は調べていて一番無難そうだったQ4_K_Mを選択した
実行コマンドは以下
$ ./llama.cpp/llama-quantize ./models/Llama-3.1-Swallow-8B-Instruct-v0.1-f16.gguf ./models/Llama-3.1-Swallow-8B-Instruct-v0.1_Q4_K_M.gguf q4_K_M
第一引数 | 変換するggufファイルのパス |
第二引数 | 出力ファイル |
第三引数 | 量子化の種類 |
数分ですぐ終わった
これでファイルサイズは4GBほどまで小さくなった
4. Ollama Modelfileの作成
$ touch Modelfile_Llama-3.1-Swallow-8B-Instruct-v0.1_Q4_K_M
ファイルの中には以下を記述する
FROM ./Llama-3.1-Swallow-8B-Instruct-v0.1_Q4_K_M.gguf
TEMPLATE "{{ if .System }}<|start_header_id|>system<|end_header_id|>
{{ .System }}<|eot_id|>{{ end }}{{ if .Prompt }}<|start_header_id|>user<|end_header_id|>
{{ .Prompt }}<|eot_id|>{{ end }}<|start_header_id|>assistant<|end_header_id|>
{{ .Response }}<|eot_id|>"
PARAMETER num_keep 24
PARAMETER stop <|start_header_id|>
PARAMETER stop <|end_header_id|>
PARAMETER stop <|eot_id|>
5. Ollama createの実行
最後にモデルを作成する
ollama createコマンドはModelfileからモデルを作成するコマンド
$ ollama create Llama-3.1-Swallow-8B-Instruct-v0.1_Q4_K_M -f Modelfile_Llama-3.1-Swallow-8B-Instruct-v0.1_Q4_K_M
-fオプションでモデルファイルを指定する
以下のコマンドでLlama-3.1-Swallow-8B-Instruct-v0.1_Q4_K_Mが表示されたら無事終了
$ ollama list
実行
$ ollama run Llama-3.1-Swallow-8B-Instruct-v0.1_Q4_K_M
これで日本語でやり取りができる
おわりに
今後は、Ollamaライブラリを用いてPythonから利用する方法を勉強したい
コメントを残す