Fugaku-LLMをUbuntuで動かす!ollamaでローカルLLM構築

Takuya Kobayashi⛰
2024.05.18

2024/05/10にスーパーコンピューター富岳によって計算された純国産LLM「Fugaku-LLM」が公開されました。

これをUbuntu 22.04 LTS上のOllamaで動かしてみたいと思います。
Windows10以降の環境ではWSLで同じことができます。

筆者の環境:
Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz
GTX1050Ti 4GB
RAM: 8GB

Ollamaをインストール

OllamaとはLLMモデルを動かすための無料ツールです。

インストールには次のコマンドを実行します。

sudo apt install curl
curl -fsSL https://ollama.com/install.sh | sh

何をやっているのかというと、curlというコマンドでサイト上に上がっているシェルスクリプト「install.sh」をダウンロードし、パイプでシェルに渡しています。
これによって、自動でインストールコマンドが実行されます。

Fugaku-LLMをダウンロード

Fugaku-LLMをダウンロードするにはまず、
HuggingFaceに会員登録してログインする必要があります。

ログインしたら次のリンクから「Fugaku-LLM-13B-instruct-0325b.gguf」をダウンロードします。

https://huggingface.co/Fugaku-LLM/Fugaku-LLM-13B-instruct-gguf/tree/main

容量が27GBもあるのでダウンロードにとても時間がかかります。
精度を犠牲にしても良いなら量子化で小さくなっている「q5_k_m」などを選択しましょう。

Ollamaに読ませるためのモデルファイルを作成

モデルファイルにパラメーターや初期のプロンプトを記述します。
こちらを参考にしました。

FROM ./Fugaku-LLM-13B-instruct-0325b.gguf

PARAMETER repeat_penalty 1.0
PARAMETER temperature 0.1
PARAMETER top_k 0
PARAMETER top_p 1.0
PARAMETER stop "<EOD|LLM-jp>"

TEMPLATE """{{ if .System }}{{ .System }}{{ end }}{{ if .Prompt }}

### 指示:
{{ .Prompt }}{{ end }}

### 応答:
{{ .Response }}<EOD|LLM-jp>"""
SYSTEM """以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。"""

上記をmodelfile.txtに保存します。

OllamaにFugaku-LLMをロードして起動する

次のコマンドでmodelfile.txtをollamaに読ませます。
「fugaku」の部分は任意の名前が指定可能です。

ollama create fugaku -f modelfile.txt

完了したら次のコマンドで実行させます。

ollama run fugaku

こんなふうに質問を投げかけることができます。

13Bもパラメーター数があると、流石にGTX1050Ti 4GBでは重たい。たったこれだけの出力に数分かかりました。

後からパラメータを変更する

ollama run中にPARAMETERやSYSTEMを変更することができます。

例:

/set parameter temperature 1
/set parameter num_ctx 4096
/set parameter num_predict -2
/set system "長門有希になりきってください"

temperature:出力の多様性を成業する値で、数値が低いほど保守的、数値が大きいほどクリエイティブになります。(デフォルト:0.8)

num_ctx:言語モデルが一度に処理できるトークンの総数(デフォルト:2048)

num_predict:生成モデルが一度に生成する出力トークンの最大数(-1:無制限、-2:文脈が完了するまで)

その他パラメーターについてはこちらに詳しくあります:
https://github.com/ollama/ollama/blob/main/docs/modelfile.md#parameter

system:モデルの振る舞いや応答のスタイルを制御。

ollama-uiで扱いやすくする

ターミナル上での動作も渋くてかっこいいですが、ウェブブラウザでアクセスできるようになる「ollama-ui」があるので使ってみます。

sudo apt install git
git clone https://github.com/ollama-ui/ollama-ui
cd ollama-ui
make

上記コマンドを実行したら、ウェブブラウザで http://127.0.0.1:8000 にアクセスします。
プルダウンメニューでモデルを選択できたり、チャットの履歴を保存できたりなかなか便利です。

ollama-ui タイトルは筆者の気分で改変済み

Fugaku-LLMに「LLMとは何かかんたんに説明して」と質問したところ、1時間かけて出力された回答が上の画像です。流石に13Bは重たすぎて筆者の環境では1時間では出力が完了しません。ちなみに他の7Bのモデルに同じ質問をすると2分ほどで回答が完了しました。

Pythonでollamaを使う

ollamaパッケージをインストール

pip install ollama

ollama・PyPI:https://pypi.org/project/ollama

次のコードで推論結果を出力できます。

import ollama
response = ollama.chat(
    model="fugaku",
    messages = [
        {
            "role": "user",
            "content": "こんにちは。自己紹介してください。",
        },
    ]
)
print(response["message"]["content"])

次のコードでは色んな処理を追加してチャットができるようにしてみました。
「messages」にユーザーとAIの文章を入れることで、チャットの文脈をnum_ctxの値くらい理解してくれます。

#!/bin/python3
import readline #input()を使う時は必須!
import sys
import json
import ollama
from datetime import datetime

modelfile='''
FROM fugaku
PARAMETER temperature 1
PARAMETER num_predict -2
PARAMETER num_ctx 4096
'''
ollama.create(model='aichat', modelfile=modelfile)

def ai_thinking(messages):
    response = ollama.chat(
        model = "aichat",
        messages = messages,
        stream = True, #パラパラッと表示する
    )
    print("\n")
    response_text = ''
    for chunk in response:
        response_text += chunk['message']['content']
        print(chunk['message']['content'], end='', flush=True)
    print("\n")
    return response_text

def ai_session(messages):
    while True:
        user_input = input(">>> ")
        if user_input.lower() == 'exit':
            break

        messages.append({"role": "user", "content": user_input})
        
        ai_output = ai_thinking(messages)

        messages.append({"role": "assistant", "content": ai_output})

    with open(logfile, "w", encoding="utf-8") as file:
        json.dump(messages, file, ensure_ascii=False, indent=4)

def load_messages_from_file(filename):
    try:
        with open(filename, "r", encoding="utf-8") as file:
            return json.load(file)
    except FileNotFoundError:
        return []

if len(sys.argv) > 1:
    logfile = sys.argv[1]
else:
    now = datetime.now()
    logfile = "aichat-"+now.strftime('%Y%m%d%H%M%S')+".log"

messages = load_messages_from_file(logfile)

if not messages:
    messages = [
        {
            "role": "system",
            "content": "ここは自由なチャットルームです。",
        },
    ]

ai_session(messages)

チャットログを指定してインポート・追記できます。

./aichat.py aichat.log

引数なしだと日付のチャットログ(“aichat-“+now.strftime(‘%Y%m%d%H%M%S’)+”.log”)を出力します。

./aichat.py
>>> exit

コメントを残す

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