名古屋出身ソフトウェアエンジニアのブログ

Japanese StableLM Instruct Alpha 7B v2 のローカル GPU 実行を試す

公開:
更新:

Stability AI より Japanese StableLM Instruct Alpha 7B v2 がリリースされたので、期待を込めてサクッと試しました。

モデルの詳細説明は公式ドキュメントに譲ります。

A parrot able to speak Japanese, ukiyoe, edo period — Stable Diffusion XL

A parrot able to speak Japanese, ukiyoe, edo period — Stable Diffusion XL

今回の環境

  • Ryzen 9 5950X
  • 64GB RAM
  • GeForce RTX 3090 24GB VRAM
  • Windows 11 Pro
  • CUDA 11.6
  • Python 3.10.8

仮想環境を切る

python -m venv venv
.\venv\Scripts\activate

Python パッケージのインストール

先に PyTorch を入れてから transformers, sentencepiece, einops を入れるようにします。

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

実行

公式モデル説明の例を実行してみます。

import torch
from transformers import LlamaTokenizer, AutoModelForCausalLM

tokenizer = LlamaTokenizer.from_pretrained(
    "novelai/nerdstash-tokenizer-v1", additional_special_tokens=["▁▁"]
)
model = AutoModelForCausalLM.from_pretrained(
    "stabilityai/japanese-stablelm-instruct-alpha-7b-v2",
    trust_remote_code=True,
    torch_dtype=torch.float16,
    variant="fp16",
)
model.eval()

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

def build_prompt(user_query, inputs="", sep="\n\n### "):
    sys_msg = "以下は、タスクを説明する指示と、文脈のある入力の組み合わせです。要求を適切に満たす応答を書きなさい。"
    p = sys_msg
    roles = ["指示", "応答"]
    msgs = [": \n" + user_query, ": \n"]
    if inputs:
        roles.insert(1, "入力")
        msgs.insert(1, ": \n" + inputs)
    for role, msg in zip(roles, msgs):
        p += sep + role + msg
    return p

# Infer with prompt without any additional input
user_inputs = {
    "user_query": "与えられたことわざの意味を小学生でも分かるように教えてください。",
    "inputs": "情けは人のためならず"
}
prompt = build_prompt(**user_inputs)

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

tokens = model.generate(
    input_ids.to(device=model.device),
    max_new_tokens=256,
    temperature=1,
    top_p=0.95,
    do_sample=True,
)

out = tokenizer.decode(tokens[0][input_ids.shape[1]:], skip_special_tokens=True).strip()
print(out)

以下が得られた出力のバリエーションです。

このことわざは、一般的に「情けをかけると、その人のためにならない」と訳されます。このことわざの一般的な意味では、「誰かを支援することは、自分自身の利益になる」ということを表します。また、「他人の世話をすることは自分の助けとなる」とも解釈できます。

「情けは人のためならず」とは、「情けをかけることは、巡り巡って、自分のためになる」ということを意味することわざである。

応答比較

前回 Elyza モデルを試したときと同じ質問をしてみます。user_query のみを使って質問しています。

Java と C# はどちらが優れていますか?

C#はJavaよりも若干パフォーマンスが高く、C#は.NET Frameworkの一部であるため、他の .NET および Java プログラミング言語のライブラリ、ツール、フレームワーク、およびサービスを使用できます。 Javaはさまざまなプラットフォームで動作するため、さまざまなプラットフォームをサポートするプログラミング言語が必要な場合に適しています。 Javaを使用すると、Java EE、Java SE、またはJava Desktop アプリケーションの1つを作成できます。

GTA シリーズについて教えて

GTAシリーズには3つの異なるシリーズがあります。それぞれのシリーズには、異なるゲームがあります。それぞれのゲームには独自の特徴があります。それぞれのゲームは他のゲームとは異なる特徴を持っています。 GTAオンラインは、Grand Theft Auto:Onlineです。 GTA:オンラインは、Grand Theft Auto Onlineです。 GTA4は、Grand Theft Auto: San Andreasです。

名古屋市の観光プランを考えて

名古屋市の観光プランですか?名古屋をよくご存知ないので、お手伝いするアイデアが何もないのが残念です。しかし、名古屋市には魅力的で楽しい観光スポットがたくさんあるので、1つ紹介できると思います。私が知っているのは、有名な名古屋城です。日本最大の城であり、100mの天守閣と2本の巨大な石垣が魅力的なスポットです。また、徳川園も有名で、名古屋の美しい池と庭に囲まれた広大な敷地の中に、豪華な家や茶室、伝統的な建物があります。この美しい庭園を訪れたら、きっと素晴らしい時間を過ごすことができます。また、名古屋には美味しい名古屋飯もたくさんあります。味噌煮込みうどんや味噌カツ丼など、ここでしか食べられない魅力的な料理もたくさんあります。名古屋は、見どころがたくさんあり、観光客に人気の目的地の1つですので、きっとあなたの旅にも最適だと思います。以上です。

所感

Elyza Japanese LLaMA 2 の 7b モデルと同程度の性能かなと感覚的には思いました。使用 GPU メモリも同程度で 16GB ぐらいです。