📖

楽天AI 2.0 miniを試してみた

2025/03/12に公開

SMLとは

SML (Small Language Model) とは、LLM(大規模言語モデル)を小型化したものです。クライアントサイドでも生成AIを使用できるように設計されており、オフライン環境でも動作可能などのメリットがあります。

実行環境

MacBook pro 2020
cpu i7(10世代)
メモリ 32g
GPU cpu内蔵

環境構築

pythonをインストール

3.11.8を使用しました。
⚠️3.13 だとPyTorchが対応していなかったため、エラーが出ました(intelcpuの場合)

必要パッケージ

accelerate==1.3.0
blobfile==3.0.0
certifi==2025.1.31
charset-normalizer==3.4.1
colorama==0.4.6
filelock==3.17.0
fsspec==2025.2.0
huggingface-hub==0.28.1
idna==3.10
Jinja2==3.1.4
lxml==5.3.1
MarkupSafe==2.1.5
mpmath==1.3.0
networkx==3.3
numpy<2
packaging==24.2
pillow==11.0.0
protobuf==5.29.3
psutil==7.0.0
pycryptodomex==3.21.0
PyYAML==6.0.2
regex==2024.11.6
requests==2.32.3
safetensors==0.5.2
sentencepiece==0.2.0
sympy==1.13.1
tiktoken==0.9.0
transformers==4.48.3
torch==2.2.2
torchaudio==2.2.2
torchvision==0.17.2
tqdm==4.67.1
typing_extensions==4.12.2
urllib3==2.3.0

をrequirements.txtとして保存してください

venv作成

python -m venv venv

有効化

source venv/bin/activate

パッケージインストール

pip install --upgrade pip
pip install -r requirements.txt

main.py

import time
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

# モデルとトークナイザーのロード
MODEL_PATH = "Rakuten/RakutenAI-2.0-mini-instruct"
tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH)
model = AutoModelForCausalLM.from_pretrained(
    MODEL_PATH, torch_dtype=torch.float16, device_map="auto"
)
model.eval()

SYSTEM_PROMPT = (
    "人間のユーザーと人工知能アシスタントのチャット。\n"
    "アシスタントはユーザーの問いかけに対し、役に立つ丁寧な回答を提供します。"
)

def chat(msg: str) -> str:
    """ ユーザーの入力に対してモデルから応答を生成する """
    chat_history = [
        {"role": "system", "content": SYSTEM_PROMPT},
        {"role": "user", "content": msg},
    ]

    input_ids = tokenizer.apply_chat_template(
        chat_history, tokenize=True, add_generation_prompt=True, return_tensors="pt"
    ).to(device=model.device)

    attention_mask = input_ids.ne(tokenizer.pad_token_id).long()

    print("\n生成中...", end="", flush=True)
    start_time = time.time()

    tokens = model.generate(
        input_ids,
        max_length=2048,
        do_sample=False,
        num_beams=1,
        pad_token_id=tokenizer.eos_token_id,
        attention_mask=attention_mask,
    )

    elapsed_time = time.time() - start_time
    print(f"\n推論時間: {elapsed_time:.2f} 秒")

    return tokenizer.decode(tokens[0][len(input_ids[0]):], skip_special_tokens=True)

def main():
    """ ユーザーとの対話ループ """
    print("Chatbot 起動 - メッセージを入力してください(Enter で終了)")
    try:
        while True:
            msg = input(f"\n{'#' * 50}\nメッセージを入力: ")
            if not msg.strip():
                break
            response = chat(msg)
            print(f"\n🗨️ AIの応答:\n{response}\n")
    except KeyboardInterrupt:
        print("\n💡 終了しました。")

if __name__ == "__main__":
    main()

実行

python3 main.py

Discussion