« 最近利用したEX予約についての雑感 | トップページ | Intel Mac上でllama.cppのサーバ機能を使って日本語LLMを使ってみる »

2023.11.07

Intel Mac上でllama.cppを使って日本語LLM(ELYZA & Stabilityai beta)を使ってみる

以前、Intel Mac miniでLLMをローカルで動かす記事を書きました。GPUを使わずCPUのみでの実行にはなりますが、LLM を試すことは可能です。
Intel MacでGPUを使わずに大規模言語モデルと戯れてみた
Intel MacでLlama 2モデルと戯れてみる
この記事を書いた時には、日本語のLLMのrinnaなど36億パラメータや40億パラメータのモデルが提供されていましたが、ここにきて、70億〜100億パラメータ、さらに700億バラメータのモデルが出てきました。正確には日英バイリンガルモデルだそうです。

システム構成は次のとおり
Mac mini Late 2018
3.2GHz 6 cores Intel Core i7
64GB 2667MHz DDR4
Sonoma 14.1

ここでは、ggerganovさんによるllama.cppを利用して、モデルとしてELYZA-japanese-Llama-2-7bとStabilityaiのjapanese-stablelm-instruct-betaの7b, 70bバージョンをIntel MacでGPUなしでCPUのみで試してみます。

1. HuggingFaceからモデルをダウンロード

Intel MacでGPUを使わずに大規模言語モデルと戯れてみたで作ったコンテナchatllmsshを起動してSSHを使ってログインします。huggingface-hubをインストールします。

$ pip install huggingface-hub

download.pyを作成します。例えば、ELYZA-japanese-Llama-2-7b-instructをダウンロードするならこんな感じ。


from huggingface_hub import snapshot_download
model_id="elyza/ELYZA-japanese-Llama-2-7b-instruct"
snapshot_download(repo_id=model_id, local_dir="ELYZA-japanese-Llama-2-7b-instruct",
local_dir_use_symlinks=False, revision="main")

以下のとおり、先程のPythonコードを実行します。


$ python3 download.py

モデルが大きくてダウンロードの途中で失敗する場合には、Hagging Faceの"Files and versions"タブから個別にファイルをダウンロードしましょう。

2. ggerganov / llama.cppをインストール

Dockerコンテナ上ではなく、Mac上にggerganov/lima.cppをダウンロードしてmakeします。


$ git clone https://github.com/ggerganov/llama.cpp.git
$ cd llama.cpp
$ make -j

私が使ったlima.cppのリビジョンのhashは465219bでしたので、必要があればmakeする前にリビジョンを合わせてください。


$ git checkout 465219b

ただし、Intel Macで実行する場合、オリジナルのMakefileだとMetal前提のコードを作るかもしれません。


# Mac OS + Arm can report x86_64
# ref: https://github.com/ggerganov/whisper.cpp/issues/66#issuecomment-128254678
9
#ifeq ($(UNAME_S),Darwin)
# ifndef LLAMA_NO_METAL
# LLAMA_METAL := 1
# endif
#
# ifneq ($(UNAME_P),arm)
# SYSCTL_M := $(shell sysctl -n hw.optional.arm64 2>/dev/null)
# ifeq ($(SYSCTL_M),1)
# # UNAME_P := arm
# # UNAME_M := arm64
# warn := $(warning Your arch is announced as x86_64, but it seems to actually be ARM64. Not fixing that can lead to bad performance. For more info see: https://github.com/ggerganov/whisper.cpp/issues/66\#issuecomment-1282546789)
# endif
# endif
#endif

私は上の箇所をコメントアウトしました。最新バージョンではどうなのか試してません。

3. ダウンロードしたモデルをGGUFフォーマットに変換

コンテナchatllmsshにログインして以下の手順を実行します。
Tutorial: How to convert HuggingFace model to GGUF format #2948が参考になりました。


$ pip install -r llama.cpp/requirements.txt
$ python3 llama.cpp/convert.py [先ほどダウンロードしたELYZA-japanese-Llama-2-7b-instructのディレクトリ]

変換が成功しますと、ELYZA-japanese-Llama-2-7b-instructディレクトリの中に変換されたggufファイルができています。

ただし、 ELYZA-japanese-Llama-2-7b-fast 及び Japanese-StableLM-Instruct-JAVocab-Beta は、日本語データでtokenizerを拡張したモデルですが、上のコンバーターで素直に変換できませんでした(私が分かっていないだけかもしれませんが)。
momongaさんが変換済みデータを提供されていますので、上で変換したモデルを含めてここからダウンロード可能です。

4. 量子化

ggufファイルへの変換が成功すれば後は簡単です。コンテナ上ではなく、Mac上で先程makeしたquantizeを使います。


$ ./quantize [先程生成したggufファイル] [type]

引数を指定せずにquantizeを実行すると変換可能なtype一覧が表示されますので、その一覧からtypeを指定してください。

5. 言語モデルを試す

次のようなShell scriptを作ってLLMへ指示してみます。


#!/bin/sh

prompt='[INST] <<SYS>>あなたは役立つアシスタントです。\n<</SYS>>\n\n'
prompt+=$1
prompt+='[/INST]'
[Path to /]main -m [Path to /]japanese-stablelm-instruct-beta-7b-[type].gguf -n 4096 -t 10 -p "$prompt"

-tのパラメータはスレッド数ですので、CPUに合わせて調整してください。
こんな感じで指示を与えてみます。


$ ./chat-c4.sh 次の質問に適切に答えなさい。\\n\\n日本の高い山のリストを名前と標高を含めて作りなさい。

stabilityaiの70Bモデルも、かなり遅いですが自分の環境では動きました。実用的な速度で使うなら7Bモデルかなと思います。

|

« 最近利用したEX予約についての雑感 | トップページ | Intel Mac上でllama.cppのサーバ機能を使って日本語LLMを使ってみる »

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




« 最近利用したEX予約についての雑感 | トップページ | Intel Mac上でllama.cppのサーバ機能を使って日本語LLMを使ってみる »