見出し画像

rinna-3.6B-Instruction-PPOで遊ぶメモ

このメモを読むと

・ローカルでLLMを動かせる

検証環境

・Windows11
・VRAM24GB
・ローカル(Anaconda)
・2023/5/E時点

事前準備

Anacondaを使うメモ|おれっち (note.com)

rinna

こちらの人間によるフィードバック学習済み言語モデルで遊んでみます。

実装

とても簡単です!

1.必要なパッケージをインストール

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

2.コードを書いて実行

import torch
from transformers import AutoTokenizer, AutoModelForCausalLM

# トークナイザーとモデルの準備
tokenizer = AutoTokenizer.from_pretrained(
    "rinna/japanese-gpt-neox-3.6b-instruction-ppo", 
    use_fast=False
)
model = AutoModelForCausalLM.from_pretrained(
    "rinna/japanese-gpt-neox-3.6b-instruction-ppo"
).to("cuda")

# プロンプトの準備
prompt = [
    {
        "speaker": "ユーザー",
        "text": "何かハマる趣味見つけたいんだけど良いのないかな?泳ぎは得意だから、それを活用したい!"
    }
]
prompt = [
    f"{uttr['speaker']}: {uttr['text']}"
    for uttr in prompt
]
prompt = "<NL>".join(prompt)
prompt = (
    prompt
    + "<NL>"
    + "システム: "
)

# 推論の実行
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),
        max_new_tokens=1000,
        min_new_tokens=14,
        do_sample=True,
        temperature=0.8,
        repetition_penalty=1.1,
        pad_token_id=tokenizer.pad_token_id,
        bos_token_id=tokenizer.bos_token_id,
        eos_token_id=tokenizer.eos_token_id,
        no_repeat_ngram_size=2
    )

output = tokenizer.decode(output_ids.tolist()[0])
print(output)

システム: 素晴らしいですね。水中でのサイクリングやスイミングなどの楽しいアクティビティには多くの利点があります。水泳やアクアティックな泳法の練習を積み重ねることで、手や足の協調性が増し、体幹や腕の強化によって持久力と強い抵抗力が生まれます。さらに、水の周りで運動することで、心血管の健康効果や血圧の改善など、さまざまなフィットネス上の利益も得られます! これらの利点に加えて、水中でトレーニングすることは、けがの予防や早期回復にも役立ちますので、定期的な運動が必要な人にとって非常に重要です。</s>

出力

ちょっと変だけどそれなりに話せてる!
生成時のVRAM使用量は17GBくらいでした。

おまけ

# プロンプトの準備
prompt = [
    {
        "speaker": "私",
        "text": "こんにちは!"
    },
    {
        "speaker": "システム",
        "text": "こんにちはー!あなたの名前を教えて?"
    },
    {
        "speaker": "私",
       "text": "おれっちです"
    },
    {
        "speaker": "システム",
        "text": "おれっちさん!何か話したい事あるー?"
    },
    {
        "speaker": "私",
        "text": "ない!俺の名前覚えてる?"
    }
]

システム: ああ、いいよ。おれっっちって呼んでくれれば分かるよ! ところで、今はとても忙しくて、あまり時 間が取れなくてごめんね。でも、定期的に連絡をくれるのは嬉しいんだ。また会えるといいな。じゃあね!</s>

出力
# プロンプトの準備
prompt = [
    {
        "speaker": "私",
        "text": "こんにちは!"
    },
    {
        "speaker": "システム",
        "text": "こんにちはー!あなたの名前を教えて?"
    },
    {
        "speaker": "私",
        "text": "太郎です"
    },
    {
        "speaker": "システム",
        "text": "太郎さん!何か話したい事あるー?"
    },
    {
        "speaker": "私",
        "text": "ない!俺の名前覚えてる?"
    }
]

システム: はい、もちろんです。太郎、さんでいいですか?その通りに呼んでくれますか?それとも、より馴染みのある呼び方があれば教えて ください。またね。良い一日を!</s>

出力

へんな名前だとうまく理解されない。
バニラだと口調までは変更されませんでした。

おわり

たのしい!ローカルLLMの光ですね。

この記事が気に入ったらサポートをしてみませんか?