🐥

ローカルPCでLINEの日本語大規模言語モデル3.6bを動かして遊んでみた

2023/08/17に公開

先日LINEが公開した日本語大規模言語モデルが面白いという噂を聞いたので、ローカルPCで動かして、いろいろ遊んでみます。

line-corporation/japanese-large-lm-3.6b をggmlに変換

ローカルPCで大規模言語モデルを動かすには、llama.cppやggmlを使う方法があります。ここでは、ggmlを使います。

Colabを使ってggmlに変換

Google Colab Proを使って、T4のハイメモリを選択。以下をセルで実行。

# ライブラリのインストール
! pip install torch transformers accelerator numpy sentencepiece accelerate
# ggmlをコンパイル
! git clone https://github.com/ggerganov/ggml.git
! cd ggml && mkdir -p build && cd build && cmake .. && make -j
# LINEのモデルをclone
! git clone https://huggingface.co/line-corporation/japanese-large-lm-3.6b ./jp-large-lm-3.6b
# ggmlに変換
! python ggml/examples/gpt-neox/convert-h5-to-ggml.py ./jp-large-lm-3.6b 1
! cp ./jp-large-lm-3.6b/ggml-model-f16.bin ./ggml-line-jp-3.6b-f16.bin

そして、ggml-line-jp-3.6b-f16.bin をダウンロードします。なお、サイズが大きいため、Colab上ではダウンロードできず、一度Google Driveにコピーしてからダウンロードする必要があるかも。

なお、ggmlの他の言語モデルを含めたコンパイルと、モデルの変換については、以下にメモしました。note.comは、一般的な文章を書くのは良い感じなのですが、ソースコードやLLMの実行結果を貼り付けるとき、どうもサクサクメモできなかったので、こちらに続きをメモすることにしました。

https://note.com/kujirahand/n/nd273e1edcb1f

ローカルPCにggmlをインストール

ローカルPCで動かすために、以下のコマンドを実行して、ggmlをインストールします。なお、cmakeを使うので、環境によってはcmakeをインストールする必要があります。

# ggml のclone
git clone https://github.com/ggerganov/ggml.git
# ggml をビルド
cd ggml
mkdir build && cd build
cmake ..
make -j

japanese-large-lm-3.6bを実行する

うまく変換したモデルが動くかテストしてみます。上記でColab上でggmlとして変換したggmlのbinファイルを、ggml-line-jp-3.6b-f16.binという名前でmodelsに保存したと仮定します。

build/bin/gpt-neox \
  -m models/ggml-line-jp-3.6b-f16.bin \
  --temp 0.4 --top_p 0.8 \
  -p "世界で一番高い山は"

すると、以下のように表示されました。

世界で一番高い山はエベレストで、標高は8848メートル。富士山は3776メートル。富士山は、エベレストより、1000メートル以上低い。富士山は、エベレストより、1000メートル以上高い。富士山は、エベレストより、1000メートル以上低い。富士山は、エベレストより、1000メートル以上高い。富士山は、エベレストより、1000メートル以上低い。富士山は、エベレストより、1000メートル以上高い。富士山は、エベレストより、1000メートル以上低い。富士山は、エベレストより、1000メートル以上高い。富士山は、エベレストより、1000メートル以上低い。富士山は、エベレストより、1000メートル以上高い。富士山は、エベレストより

実行に掛かった時間は、20秒ほど。うまく動いています。

main: mem per token =   363292 bytes
main:     load time =  3175.65 ms
main:   sample time =    29.01 ms
main:  predict time = 15377.38 ms / 75.75 ms per token
main:    total time = 20805.14 ms

なお、以下の普通のコマンドのように「-h」でマニュアルが表示されます。

./build/bin/gpt-neox -h

いろいろ質問できるよう簡単なスクリプトを組む

手軽に質問できるように、簡単なPythonのコマンドを作ってみました。

line.py
#!/usr/bin/env python3
import subprocess, os
# プロンプトを指定 ------ (*1)
prompt_text = '''
世界で一番高い山は
'''
# ---------------------
# パスを指定
root = os.path.dirname(__file__)
path_gpt_neox = os.path.join(root, 'build', 'bin', 'gpt-neox')
path_model = os.path.join(root, 'models', 'ggml-line-jp-3.6b-f16.bin')
# 実行
def exec(prompt):
    prompt = prompt.strip()
    p = subprocess.run([
        path_gpt_neox,
        '-m', path_model,
        '--temp', '0.7',
        '--n_predict', '100',
        '-p', prompt
        ],
        stdout=subprocess.PIPE,
        encoding='utf-8')
    print(p)
    p = p.stdout.strip()
    p = p.replace('<0x0A>', '\n')
    return p
print(exec(prompt_text))

(*1)のプロンプトを書き換えて、以下のコマンドで実行できます。

chmod +x line.py
./line.py

いろいろな質問をする

上記の(*1)を書き換えていろいろ試してみました。

最高の人生を尋ねる

最高の人生を送るには

すると、次のような返答がありました。

最高の人生を送るには、自分の性格を変えていく必要があります。自分が幸せを感じるのは、どんなときなのか、どんなときに幸せを感じるのか、自分の幸せのツボを、しっかり押さえておきましょう。あなたが幸せを感じる瞬間は、どんなときですか?幸せを感じる瞬間は、人それぞれです。でも、幸せを感じる瞬間は、どんなときなのか、具体的にイメージすることで、そのイメージに近づくことができます。たとえば、あなたが「幸せだな」と思う瞬間は、どんなときですか?「幸せだな」と思う瞬間は、人それぞれ

しっかり答えてくれています。幸せのツボ、押さえたいですね。

面白いことを言って

また、AIなら無茶振りしても大丈夫でしょうか?

「面白いことを言って」

するとどうでしょうか。

「面白いことを言って」「面白いこと言って」と、要求されます。「面白いこと」は、自分で考えて自分で言うのが、一番面白いのです。誰かが、面白いこと言ったって、面白くない。誰かが、面白いこと言ったって、面白くない。「面白いこと」は、自分で考えて自分で言うのが、一番面白いのです。「面白いこと」は、自分で考えて自分で言うのが、一番面白いのです。他人が、面白いこと言ったって、面白くない。他人が、面白いこと言ったって、面白くない

AIも困ったのか、深い答えが返ってきました!

文章の補完タスクが得意なので、以下のような聞き方に変えてみました。

面白いことを言うので聞いてください。なんと、

すると、次のような返答がありました。

面白いことを言うので聞いてください。なんと、1000万円もらえるのです。1000万ですよ、1000万。で、その1000万円は1年後にもらえるんです。で、その1000万円を5000万円にするには、どうすればいいと思いますか?5000万円って、1000万円が5倍ですよ。

よく分かりませんが、とても面白そうです(謎)

お金持ちになるには

次に、お金持ちになる方法を聞いてみます。

お金持ちになるには

以下の回答がありました。

お金持ちになるには、投資で稼ぐことが近道です。投資で稼ぐには、リスク管理がとても重要になります。投資のリスク管理とは、投資する金額をどのくらいにするか、投資するタイミングをいつにするか、投資する銘柄をどうやって決めるか、などです。投資で稼ぐには、リスク管理が極めて重要になります。投資のリスク管理が不十分だと、投資で稼ぐことはとても難しくなります。投資のリスク管理が不十分だと、投資で稼ぐことはとても難しくなります。

やはり、投資ですか!念のため、もう一度聞いてみます。

お金持ちになるには、まずはお金をたくさん稼ぐこと、そして、稼いだお金でお金を増やすことが大切だと私は考えています。

そうですよね。お金を稼ぐと、お金持ちになれます!大正解です。

注目のアニメは?

次に、注目のアニメを推薦させてみます。

注目のアニメは

次のような答えがありました。

注目のアニメはありません。2016年春アニメは・Re:ゼロから始める〜省略〜

ないそうです。ガッカリです。

それでは、以下のような

明治時代の小説家で好きなのは

すると、次のような答えがありました。

明治時代の小説家で好きなのは、松尾芭蕉、石川<0xE5><0x95><0x84>木、小林一茶、宮沢賢治、与謝野晶子、北原白秋、与謝野鉄幹〜省略〜

一部、漢字が化けてしまいましたが、石川啄木のことでしょう。ただ、松尾芭蕉など、明治時代とは関係ない人が出てきたのは残念です。

何を学習させているのか?

モデルのページを確認してみると、学習用コーパスとして以下のように書かれていました。

Our training corpus consists of the Japanese portions of publicly available corpus such as C4, CC-100, and Oscar. We also incorporated the Web texts crawled by in-house system. The total size of our training corpus is about 650 GB. The trained model achieves 7.50 perplexity on the internal validation sets of Japanese C4.

日本語コーパスとして、よく見かけるもの(C4. CC-100, Oscar)に加えて、独自にクロールしたテキスト合計650GB分とのことです。

まとめ

以上、ローカルPCで大規模言語モデル、line-corporation/japanese-large-lm-3.6bを実行して、遊んでみました。Llamaなどと比較するとパラメータ数としてはかなり小さいのですが、データセットが面白いのか、学習の仕方が秀逸なのか、かなり面白い答えを返してくれます。これからも、このモデルでいろいろ遊んでみようと思っています。

Discussion