Llama 3.1 SwallowをOllamaで使えるようにする|ローカルLLM

79 アクセス

はじめに

この記事では、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モデルのインストール
を行う

Git LFSとはGit Large File Storageのことで、gitの大容量ファイル用の拡張機能のこと
git lfsが入っているかどうかは以下のコマンドで確認できる

インストール済みならバージョンが表示される

サイズが32GBほどあるので、ダウンロード時間もそれなりにかかる
ネットワーク環境によると思うが、昼食を食べるくらいの時間はあった

2. ggufモデルへの変換

gguf形式にしてLlama.cppで扱えるようにする
今回はOllamaまで行きたいのでこれはただの通過点

llama.cppの準備

モデルの変換にllama.cpp(https://github.com/ggerganov/llama.cpp.git)を用いる
llama.cppが既に入っている人はスキップ

gitでクローンして、makeでビルド

次にPython仮想環境を準備する
今回はvenvを使用した
仮想環境を作成し、起動、必要なライブラリのインストールを行う

f16 ggufモデルへの変換

llama.cppにあるconvert_hf_to_gguf.pyを実行する

引数変換する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を選択した

実行コマンドは以下

第一引数変換するggufファイルのパス
第二引数出力ファイル
第三引数量子化の種類

数分ですぐ終わった
これでファイルサイズは4GBほどまで小さくなった

4. Ollama Modelfileの作成

ファイルの中には以下を記述する

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からモデルを作成するコマンド

-fオプションでモデルファイルを指定する

以下のコマンドでLlama-3.1-Swallow-8B-Instruct-v0.1_Q4_K_Mが表示されたら無事終了

実行

これで日本語でやり取りができる

おわりに

今後は、Ollamaライブラリを用いてPythonから利用する方法を勉強したい

参考にしたサイト

Tags:

Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です