😄

weblab-10bは自宅PCでも動かせるのか!?試してみた

2023/08/19に公開

8月18日に東京大学松尾研究室から100億パラメータのLLM「weblab-10B」がオープンソースで公開されましたね!日本発のLLMオープンソースは複数ありますが、100億というのは現時点で最大級ではないでしょうか。
https://huggingface.co/matsuo-lab/
LLMをPCで動かすにはパラメータが多くなればなるほどより高いPCスペックが要求されますが、weblab-10bは自宅PCでも動かせるのでしょうか!?試してみました。

PCスペック

CPU:core i7 12世代
GPU:RTX 3060 VRAM:12GB
RAM:32GB 5世代
Cドライブ:NVME M.2 SSD 500GB
LLMを動かすには(笑)かもしれませんが、一般向けPCとしては上の低位と思います!値段は購入後色々いじっていますがトータル25万円位になると思います。

早速動かしてみた!

weblab-10Bにはweblab-10b-instruction-sftという指示用にfine tuningされたmodelもあるようです。今回は無印の方を使っていきます。
hugging faceに公開されているコードは下記になります。

import torch
from transformers import AutoTokenizer, AutoModelForCausalLM

tokenizer = AutoTokenizer.from_pretrained("matsuo-lab/weblab-10b")
model = AutoModelForCausalLM.from_pretrained("matsuo-lab/weblab-10b")

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

text = "吾輩は猫である。"
token_ids = tokenizer.encode(text, add_special_tokens=False, return_tensors="pt")

with torch.no_grad():
    output_ids = model.generate(
        token_ids.to(model.device),
        max_new_tokens=100,
        do_sample=True,
        temperature=0.6,
        top_p=0.9,
        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])
print(output)

実行するとmodelのダウンロードが始まります。サイズは21GBでした。rinna36億パラメータは7GB、cyber agent70億パラメータは12GBなので100億パラメータは伊達じゃないです。

実行結果は下記でした!

私のPC環境ではそのままのコードでは実行できませんでした・・・
他LLMで実行した際の軽く動かすためのtipsを流用します。
(あまり詳しくないので詳細な説明は出来ないです・・・)

import torch
from transformers import AutoTokenizer, AutoModelForCausalLM

tokenizer = AutoTokenizer.from_pretrained("matsuo-lab/weblab-10b", use_fast=False)
model = AutoModelForCausalLM.from_pretrained("matsuo-lab/weblab-10b",device_map="auto",torch_dtype=torch.float16)
model.tie_weights()

text ="""以下はAIと人間の会話です。
人:こんにちは。
AI:こんにちは。
人:熊本のおすすめ観光地を教えてください。
AI:"""

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

with torch.no_grad():
    output_ids = model.generate(
        token_ids.to(model.device),
        max_new_tokens=128,
        do_sample=True,
        temperature=0.6,
        top_p=0.9,
        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])
print(output)

eos_token_idは指定するとエラーになるのでコメントアウトしています。
また、実行すると下記のメッセージが出ます。device_mapに関するメッセージと思いますが、特に問題ないので無視して大丈夫です。

The model weights are not tied. Please use the `tie_weights` method before using the `infer_auto_device` function.

 
プロンプトは下記です。熊本のおすすめ観光地について聞いてみました!

text ="""以下はAIと人間の会話です。
人:こんにちは。
AI:こんにちは。
人:熊本のおすすめ観光地を教えてください。
AI:"""

非チャットモデルとのことですが、会話形式で出力するよう指定しています。

AI:熊本のおすすめ観光地は阿蘇山です。
人:阿蘇山ですか。
AI:はい、阿蘇山は世界で最も活発な火山の一つで、世界で最も美しい景色の一つです。
人:阿蘇山はどこにあります  #上限トークンで終了

結構良い感じですね!回答は大体5分位かかりました。
もちろんこの時間はPCスペック、出力を指定するパラメータによって違います。
 
因みに他LLMではどのような回答なのか、殆ど同じ設定にして試してみました。

riina chat model(36憶パラメータ)

AI:熊本は美しい自然の景観や、歴史ある街並みで知られる人気の観光地です。代表的な観光スポットには、阿蘇山や水前寺成趣園などがあります。

cyber agent open-calm(70憶パラメータ)

AI:そうですね、阿蘇はどうかしら? 自然がいっぱいで歴史もあって...それから温泉もね。
人:そうですよね。私も大好きです。他にも黒川温泉や杖立温泉といった温泉街があるんだけど、どこがお好きですか?
AI:そうねえ、そうだなあ...。うーん、やっぱり山かな。景色がいいところが好きです。あとは海にも行きたいですね。天草ってご存知ですか? あそこの海がいいですよね。ああ、そういえば最近行かれたんですか?
人:ええ、先日行ったばかりです。ちょうど今の時期だとカキのシーズンなんですよ。新鮮でおいしいのがたくさんあって、もう大満足でした。ほかにもいろいろあるんですけど、それはまた今度ご紹介します  #上限トークンで終了

どちらも大体1分位で回答をくれます。

今回の回答内容はあくまで参考としてください!回答はチャットモデルが非チャットモデルか、プロンプトの内容、パラメータの設定等によって全く違ってきますのでご自身で色々調整して確かめるのが一番良いと思います。

 
個人的には回答の内容、スピードからrinna chatモデルが気に入っています。
weblab-10bは回答は結構良いと思いますが私のPCスペックでは時間がかかりすぎですね・・・
ただ間違いなく良いモデルと思いますので、これからもっと使ってみたいと思います!
皆さんもぜひ使った感想を教えてください!

Discussion