LLM(大規模言語モデル)を使ってみる

Yoshikawa Takeshi
2023-10-18
2023-10-18

流行りの LLM(大規模言語モデル)を使ってみようということで試してみました。

今回は、rinna株式会社さんがオープンソースで公開されているモデルを、再インストールした直後のWindowsで動くように環境構築する実験を行ってみました。

◆ rinna、日英バイリンガル大規模言語モデルをオープンソースで公開
https://rinna.co.jp/news/2023/07/20230731.html

質問して回答をもらう形で使ってみたいので、対話言語モデルとして提供されている「rinna/bilingual-gpt-neox-4b-instruction-sft」を利用します。

・配布サイト
https://huggingface.co/rinna/bilingual-gpt-neox-4b-instruction-sft

・作業PCのスペック
Windows 11 pro / INTEL 12100 / GeForce3060(12G) / Memory 16GB

以下、作業手順の記録です。

(1) Python をインストール

まずは、Python をインストール
今回は、Micorosft Store で提供されている Python 3.11 をインストールしました。

(2) Microsoft Visual C++ のランタイムパッケージをダウンロード

https://learn.microsoft.com/ja-jp/cpp/windows/latest-supported-vc-redist?view=msvc-170
こちらのURLから、x86 用をダウンロードしてインストールします。

Python に、パッケージを追加インストールするとき要求されるので、先にインストールしときます。

(3) PIP で、追加のPython パッケージをインストール

# pip install --upgrade pip
# pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
# pip install transformers
# pip install sentencepiece

とりあえず、私の環境では、上記の Python パッケージをインストールしたら質問に答えてくれるようになりました。

(4) python コードを実行

https://huggingface.co/rinna/bilingual-gpt-neox-4b-instruction-sft

Hugging Face の配布サイトに記述してもらってるコードを、そのまま転記して実行します。


import torch
from transformers import AutoTokenizer, AutoModelForCausalLM

prompt = [
    {
        "speaker": "ユーザー",
        "text": "日本のおすすめの観光地を教えてください。"
    },
    {
        "speaker": "システム",
        "text": "どの地域の観光地が知りたいですか?"
    },
    {
        "speaker": "ユーザー",
        "text": "渋谷の観光地を教えてください。"
    }
]
prompt = [
    f"{uttr['speaker']}: {uttr['text']}"
    for uttr in prompt
]
prompt = "".join(prompt)
prompt = (
    prompt
    + ""
    + "システム: "
)
print(prompt)

tokenizer = AutoTokenizer.from_pretrained("rinna/japanese-gpt-neox-3.6b-instruction-sft", use_fast=False)
model = AutoModelForCausalLM.from_pretrained("rinna/japanese-gpt-neox-3.6b-instruction-sft")

if torch.cuda.is_available():
    model = model.to("cuda")

token_ids = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt")

with torch.no_grad():
    output_ids = model.generate(
        token_ids.to(model.device),
        do_sample=True,
        max_new_tokens=128,
        temperature=0.7,
        pad_token_id=tokenizer.pad_token_id,
        bos_token_id=tokenizer.bos_token_id,
        eos_token_id=tokenizer.eos_token_id
    )

output = tokenizer.decode(output_ids.tolist()[0][token_ids.size(1):])
output = output.replace("", "\n")
print(output)

モデルの読み込みに、結構時間がかかりましたが、回答までの時間は短かったです。(GPU が使えたからかも?)

モデルの読み込み時間を短縮するには、以下の記事のコードのように、モデルを読み込んだ後、何度も質問できるようになっていたほうが実用的かもしれません。

◆ 自宅PCで「rinna」の日本語言語モデルを試用、メモリ32GBあればCPUだけでも動くぞ!
https://internet.watch.impress.co.jp/docs/column/shimizu/1503707.html

というわけで、今回は、LLM(大規模言語モデル)を動かすところまで試すことができました。