見出し画像

Google Colab で ELYZA-japanese-Llama-2-7b を試す

「Google Colab」で「ELYZA-japanese-Llama-2-7b」を試したので、まとめました。


1. ELYZA-japanese-Llama-2-7b

ELYZA-japanese-Llama-2-7b」は、東京大学松尾研究室発・AIスタートアップの「ELYZA」が開発した、日本語LLMです。Metaの「Llama 2」に対して日本語による追加事前学習を行なっています。

2. ELYZA-japanese-Llama-2-7bのモデル

「ELYZA-japanese-Llama-2-7b」では、次の4種類のモデルが公開されています。

ELYZA-japanese-Llama-2-7b : MetaのLlama-2-7b-chatに約180億トークンの日本語テキストで追加事前学習したモデル。
ELYZA-japanese-Llama-2-7b-instruct : 指示に従い様々なタスクを解くことを目的とした、ELYZA-japanese-Llama-2-7bに事後学習したモデル。
ELYZA-japanese-Llama-2-7b-fast : MetaのLlama-2-7b-chatに日本語の語彙を追加し、約160億トークンの日本語テキストで追加事前学習したモデル。約1.82倍高速に推論。
ELYZA-japanese-Llama-2-7b-fast-instruct : 指示に従い様々なタスクを解くことを目的とした、ELYZA-japanese-Llama-2-7b-fastに事後学習を行したモデル。

既に130億、700億パラメータのモデルの開発にも着手しており、それらのモデルについても公開を検討しているとのことです。

3. Colabでの実行

Colabでの実行手順は、次のとおりです。

(1) パッケージのインストール。

# パッケージのインストール
!pip install transformers accelerate bitsandbytes

(2) トークナイザーとモデルの準備。
今回は、高速な指示モデル (elyza/ELYZA-japanese-Llama-2-7b-fast-instruct) を利用しています。

from transformers import AutoModelForCausalLM, AutoTokenizer
import torch

# トークナイザーとモデルの準備
tokenizer = AutoTokenizer.from_pretrained(
    "elyza/ELYZA-japanese-Llama-2-7b-instruct"
)
model = AutoModelForCausalLM.from_pretrained(
    "elyza/ELYZA-japanese-Llama-2-7b-instruct", 
    torch_dtype=torch.float16,
    device_map="auto"
)

(3) 推論の実行。

# プロンプトの準備
prompt = """<s>[INST] <<SYS>>
あなたは誠実で優秀な日本人のアシスタントです。
<</SYS>>

まどか☆マギカでは誰が一番かわいい? [/INST]"""

# 推論の実行
with torch.no_grad():
    token_ids = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt")
    output_ids = model.generate(
        token_ids.to(model.device),
        max_new_tokens=256,
        pad_token_id=tokenizer.pad_token_id,
        eos_token_id=tokenizer.eos_token_id,
    )
output = tokenizer.decode(output_ids.tolist()[0][token_ids.size(1) :], skip_special_tokens=True)
print(output)
まどか☆マギカに登場するキャラクターの中で、誰が一番かわいいか、私の意見を述べます。

私は人間である冬木高校の暁美ほむらが一番かわいいと考えます。

ほむらは物語の冒頭、幼い頃に事故で両親を亡くし、兄の憂木凛と二人で暮らしています。彼女は明るく元気な性格で、周りの人からも愛されています。しかし、彼女は自分の運命を変えるため、魔法少女になるための試練に挑むことを決意します。

ほむらは魔法少女になるために、魔法少


プロンプトの書式は、「Llama 2」と同様です。

<s>[INST] <<SYS>>
{システムメッセージ}

<</SYS>>

{ユーザーメッセージ} [/INST]

4. ストリーミング出力

ストリーミング出力するには、TextIteratorStreamerを使います。

from transformers import TextIteratorStreamer
from threading import Thread

# ストリーミング出力
with torch.no_grad():
    streamer = TextIteratorStreamer(tokenizer)
    token_ids = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt")
    generation_kwargs = dict(
        input_ids=token_ids.to(model.device),
        max_new_tokens=256,
        pad_token_id=tokenizer.pad_token_id,
        eos_token_id=tokenizer.eos_token_id,
        streamer=streamer, 
    )
    thread = Thread(target=model.generate, kwargs=generation_kwargs)
    thread.start()

# 出力
for new_text in streamer:
    print(new_text.replace(" ", ""), end="")

5. ELYZA Tasks 100

日本語LLMの性能評価を行うための、多様な日本語タスクからなるデータセットも提供されています。

6. 公式解説記事



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