ELYZA 社の「日本語特化LLM」 Llama-3-ELYZA-JP-8B を Google Colaboratory で動かす

## はじめに

ELYZA 社が公開した「日本語特化LLM」である Llama-3-ELYZA-JP-8B を Google Colaboratory 上で動かします

https://elyza.ai/news/2024/06/26/elyza-llm-for-jp%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA%E3%81%AE%E6%9C%80%E6%96%B0%E3%83%A2%E3%83%87%E3%83%ABllam

基本的には以前 Stackmark 社や Turing 社のモデルで実行したのと同じ手法になります

https://qiita.com/RyoWakabayashi/items/027fb61f9ea19282a669

https://qiita.com/RyoWakabayashi/items/6c21167121c0dee5bcdc

700億（70B）パラーメータのバージョンは日本語性能で Chat-GPT4 を超えたとのことですが、この記事では公開されている 80億 (8B) パラメータバージョンを扱います

70B のモデルについては以下のデモサイトで試してみることができます

https://elyza.ai/lp/elyza-llm-for-jp

## モデルの取得元

モデルは商用利用可能なライセンスで HuggingFace 上に公開されています

https://huggingface.co/elyza/Llama-3-ELYZA-JP-8B

モデルのダウンロードに Hugguing Face のアクセストークンが必要になるので、サインアップしてトークンを用意しておきましょう

設定画面の左メニューから「Access Tokens」を開き、「New token」ボタンでトークンが作成できます

https://huggingface.co/settings/tokens

![トークン取得](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/eb7c556b-9361-92c7-cfeb-163442a68bed.png)

## Google Colab のランタイム

以前、 Stackmark 社や Turing 社のモデルを試したときには GPU として T4 V100 A100 の選択肢がありましたが、 2024年7月7日現在は V100 がなくなり、 L4 が追加されています

それぞれ、 VRAM の容量に違いがあり、容量不足だと大きいモデルを読み込むことができません

- T4: 15 GB
- L4: 22.5 GB
- A100: 40 GB

Llama-3-ELYZA-JP-8B の場合はおよそ 15.3 GB 使うため、無償で利用可能な T4 GPU では不足します

T4 GPU で動かそうとした場合はモデルのロード中に以下の警告メッセージが表示され、 CPU で動かそうとするため推論が極端に遅くなります（実質使用不可能です）

```
WARNING:accelerate.big_modeling:Some parameters are on the meta device device because they were offloaded to the cpu.
```

お金はかかりますが、 Google Colab Pro を契約しましょう

https://colab.research.google.com/signup/pricing?hl=ja

Llama-3-ELYZA-JP-8B の場合 L4 GPU で十分なので、 A100 よりはお得に使えます

## ノートブックの設定

新しいノートブックを開きます

上メニューから「ランタイム」 |> 「ランタイムのタイプを変更」を開きます

![スクリーンショット 2024-03-22 17.34.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/d44ea3fd-c019-8f4b-b69b-c225e6629cea.png)

ハードウェアアクセラレータで「L4 GPU」を選択し、「保存」をクリックします

![スクリーンショット 2024-07-07 20.06.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/fdd6d4f0-b120-0c1d-0826-129898f5bd58.png)

左メニューの鍵アイコンをクリックし、 `HF_TOKEN` という名前で Hugging Face のアクセストークンをシークレットに登録しておきます

「ノートブックからのアクセス」を忘れず ON にしておきましょう

![スクリーンショット 2024-03-24 12.36.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/42bcddf5-e821-7470-a849-51bb52f2bf11.png)

## セットアップ

以降、 Colab のセルにコードを貼り付けて実行します

pip 自体を最新化してから、必要なモジュールをインストールします

```sh
!pip install --upgrade pip
!pip install --upgrade accelerate transformers gradio
```

モジュールをインポートしておきます

```python
import gradio as gr
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
```

:::note warn
`gradio` は最後に UI を作るためのものなので、モデルを動かしたいだけの場合は不要です
:::

## モデルのロード

transformers の機能で Hugging Face からトークナイザー、モデルをダウンロードし、ロードします

`device_map="auto"` を指定することで、自動的に環境に合った状態（GPU の有無など）でロードしてくれます

```python
model_name = "elyza/Llama-3-ELYZA-JP-8B"
```

```python
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype="auto",
    device_map="auto",
)
model.eval()
```

ロードすると GPU の使用率が上がります

![スクリーンショット 2024-07-07 16.57.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/e521f530-d783-6e1e-9300-a4590fcaaf79.png)

## 生成

モデルとトークナイザーを使用し、文章の生成を実行します

以下のコードの場合、 `text` に指定した "美味しいおにぎりの具を教えてください" という質問に対して答えを貸してくれます

```python
DEFAULT_SYSTEM_PROMPT = "あなたは誠実で優秀な日本人のアシスタントです。特に指示が無い場合は、常に日本語で回答してください。"
text = "美味しいおにぎりの具を教えてください"

messages = [
    {"role": "system", "content": DEFAULT_SYSTEM_PROMPT},
    {"role": "user", "content": text},
]

prompt = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True
)

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=1200,
        do_sample=True,
        temperature=0.6,
        top_p=0.9,
    )

output = tokenizer.decode(
    output_ids.tolist()[0][token_ids.size(1):], skip_special_tokens=True
)
print(output)
```

実行結果は以下のように出力されます

```
美味しいおにぎりの具は、人それぞれの好みや地域の特徴によって異なりますが、以下は、定番や人気のあるおにぎりの具をいくつかご紹介します。

1. 鮭やタラコ: 鮭やタラコは、塩味が効いていて、ご飯と合う組み合わせです。
2. 昆布: 昆布は、出汁が良く出て、ご飯と合う組み合わせです。
3. 塩昆布と海苔: 塩昆布と海苔は、塩味と海の香りが、ご飯と合う組み合わせです。
4. うめぼし: うめぼしは、酸味と甘みが、ご飯と合う組み合わせです。
5. 高菜: 高菜は、辛味と塩味が、ご飯と合う組み合わせです。
6. 鯵や鯖の塩焼き: 鯵や鯖の塩焼きは、塩味が効いていて、ご飯と合う組み合わせです。
7. 燻製サケや燻製タラコ: 燻製サケや燻製タラコは、燻製の香りが、ご飯と合う組み合わせです。
8. 明太子やたらこ: 明太子やたらこは、塩味と海の香りが、ご飯と合う組み合わせです。
9. 刺身や海老: 刺身や海老は、海の香りが、ご飯と合う組み合わせです。
10. キムチやコチュジャン: キムチやコチュジャンは、辛味が、ご飯と合う組み合わせです。

これらの具材を組み合わせて、自分好みの美味しいおにぎりを作ってみてください。
```

結構いい感じの回答ですね。

"ご飯と合う組み合わせです。" を多用しすぎではありますが。

慣れない食レポを頑張っている感じがします。

## UI付きで実行

Gradio を使って簡易的な UI を用意します

https://www.gradio.app/

まず、入力を出力に変換するための関数を用意します

```python
def chat(input):
    messages = [
        {"role": "system", "content": DEFAULT_SYSTEM_PROMPT},
        {"role": "user", "content": input},
    ]
    prompt = tokenizer.apply_chat_template(
        messages,
        tokenize=False,
        add_generation_prompt=True
    )
    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=1200,
            do_sample=True,
            temperature=0.6,
            top_p=0.9,
        )
    output = tokenizer.decode(
        output_ids.tolist()[0][token_ids.size(1):], skip_special_tokens=True
    )
    return output
```

Gradio で入出力を定義します

```python
gr.Interface(
    fn=chat,
    inputs=[gr.Textbox()],
    outputs=[gr.Textbox()]
).launch(debug=True)
```

実行すると、以下のような UI が表示されます

![スクリーンショット 2024-03-22 17.48.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/1c16663a-0032-dbe7-339c-ff2885aa7ed5.png)

左側の input に適当な文言を入れてみましょう

「Submit」を押すと、右側の output に生成結果が表示されます

![スクリーンショット 2024-07-07 17.03.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/aeb27dd0-1a39-ea0c-87a6-dc3de3ce78da.png)

宮崎、、、

## 問答集

いくつか質問して「日本語特化」らしさを見てみましょう

### 桃太郎のお供の動物を教えてください

回答

```
桃太郎のお供の動物は、次の3匹です。

1. 猿 (サル)
2. 犬 (イヌ)
3. 猪 (イノシシ)
```

惜しい。

雉は戦力外だからしょうがないか。

猪の方が強そうだし。

ちなみに 70B モデルだと以下のように正解します

```
桃太郎のお供の動物は、猿、犬、雉です。
```

### 温泉に入るときの注意点を教えてください

回答

```
温泉を楽しむためには、入る前と入った後にはいくつかの注意点があります。以下に挙げます。

入る前:

1. 温泉の規則を守る: 温泉施設には、独自のルールやマナーが決められていることがあります。入る前には、必ずその施設のルールを守るようにしてください。
2. 浴室の清潔を保つ: 温泉施設の浴室は、清潔を保つことが大切です。入る前には、浴室をきれいに掃除し、使用後には、きちんと掃除をしておくようにしてください。
3. 温泉の温度を確認する: 温泉の温度は、人によって適温が異なります。入る前には、温度を確認し、自分に合った温度かどうかを確かめるようにしてください。

入った後:

1. 温泉の後は、体を洗う: 温泉の後には、体をきちんと洗うことが大切です。温泉の成分が体に残ることで、肌トラブルを引き起こすことがあります。
2. 温泉の後は、タオルで体を拭く: 温泉の後には、タオルで体をきちんと拭くことが大切です。体を拭くことで、温泉の成分が体に残るのを防ぐことができます。
3. 温泉の後は、水分を補給する: 温泉の後には、水分をきちんと補給することが大切です。温泉の成分が体に残ることで、脱水症状を引き起こすことがあります。

以上の注意点を守ることで、温泉を安全に楽しみ、温泉の良さを十分に味わうことができます。
```

やたらと「温泉の成分」が危険視されています。

### 小学生が憧れているアニメの主人公は誰ですか

回答

```
小学生が憧れているアニメの主人公は、一般的に人気のあるキャラクターが多くいますが、以下は、過去のアンケートや調査の結果をもとに、人気のあるアニメの主人公をいくつか挙げます。

1. ワンピースのモンキー・D・ルフィ: ワンピースは、長年人気のある少年漫画を原作としたアニメで、主人公のルフィは、海賊王を目指す勇敢で強い少年です。
2. ドラゴンボールの孫悟空: ドラゴンボールは、1986年から1997年まで放送されたアニメで、主人公の孫悟空は、地球の平和を守るために戦う強い少年です。
3. NARUTOのうずまきナルト: NARUTOは、2002年から2017年まで放送されたアニメで、主人公のナルトは、忍者を目指す熱血で努力家の少年です。
4. ブラック・ジャックの本間丈太郎: ブラック・ジャックは、1973年から1983年まで放送されたアニメで、主人公の本間丈太郎は、天才外科医で、どんな手術も成功させるという能力を持つ医師です。
5. ディズニーのミッキー・マウス: ミッキー・マウスは、1928年から始まったディズニーのアニメシリーズで、主人公のミッキーは、元気で好奇心旺盛な少年です。

小学生が憧れているアニメの主人公は、一般的に強くて勇敢、友情や努力を大切にしているキャラクターが多い傾向にあります。
```

本間丈太郎は主人公ではありませんが、良い人選ではあります。

### おやじギャグを言ってください

回答

```
若い方には通じないかもしれませんが、ひとつおやじギャグを披露しますね。
「なぜ、卵は生涯独身なのか？」「それは、ゆで卵になっても、片想いが多いからだ！」
```

おやじギャグにしては難解な、、、

ちなみに 70B モデルの回答

```
なんでしょう、若い人たちが「オヤジギャグ」と呼ぶものは、年配の男性が使う、陳腐で、寒い、そして時として下品なジョークやダジャレのことを指します。以下はその一例です。

「なぜかびんの蓋はあかない。なぜなら、びんが空だから。」

このようなジョークは、多くの人々に笑いを提供する一方で、特に若い人々には、時として不快感を与えることもあります。
```

Chat-GPT 4o の回答

```
もちろんです！おやじギャグをどうぞ。

「ベジタリアンの反対は、ミートリアン！」

「冷蔵庫がしゃべったんだ。『寒いから、閉めてくれ』って。」

「トイレで考えることは、便理だね。」

「ピアノが壊れたの？それはキーけんですね。」

「掃除機が吸い込まれたら、ショックだなぁ。」

楽しんでもらえたら嬉しいです！
```

Chat-GPT 4o が一番それっぽくはありますが、正解とは言い難い

やはり「お笑い」の概念が一番難しいのでしょうね

### 有名なお笑い芸人を教えてください

回答

```
有名なお笑い芸人をいくつか挙げてみます。

1. 明石家さんま: 日本を代表するお笑い芸人で、数多くのテレビ番組やラジオ番組にレギュラー出演しています。

2. タモリ: 「笑っていいとも!」の司会を長年務め、現在は「タモリ倶楽部」で活躍中です。

3. ビートたけし: お笑い界の重鎮で、タレント、俳優、映画監督としても活躍しています。

4. 大泉洋: 「アメトーーク!」や「水曜どうでしょう」などで有名な、北海道出身のお笑い芸人です。

5. 有吉弘行: 「有吉反省会」や「有吉くんの正直さんぽ」など、バラエティ番組で活躍中です。

6. 櫻井翔: 「嵐」の一員としても有名ですが、コントや漫才などでお笑い芸人としても活躍しています。

7. 千鳥: 大阪出身の漫才コンビで、M-1グランプリの優勝経験もあります。

8. 博多華丸・大吉: 福岡出身の漫才コンビで、地方のローカル番組から全国区の番組まで活躍中です。

9. オードリー: 若林正恭と春日俊彰からなる漫才コンビで、M-1グランプリのファイナリスト経験もあります。

10. 千原ジュニア: 千原兄弟の弟としても有名な、漫才やコントで活躍するお笑い芸人です。
```

大泉洋はともかく櫻井翔までお笑い芸人なのか。

千鳥が大阪出身の M-1 チャンピオンという微妙な間違いは生成AIらしい。

### 若者に人気の音楽アーティストといえば誰ですか

回答

```
若者に人気の音楽アーティストは、常に流行りや世代によって変化しますが、2020年代前半の日本の音楽シーンで人気のある若手アーティストをいくつか挙げます。

1. Official髭男dism: 2015年に結成された4人組バンドで、ポップスやロックを基調にしたサウンドと、藤原聡のソウルフルなボーカルが特徴です。
2. YOASOBI: 2019年に結成された2人組の音楽ユニットで、ボーカルのikuraと作曲家のAyaseが中心となって活動しています。インターネットを中心に活動し、若者を中心に人気を集めています。
3. Ado: 2019年にデビューしたシンガーソングライターで、VTuberグループ「にじさんじ」に所属しています。個性的な歌声と、インターネット上での活動を中心にしたスタイルが若者に支持されています。
4. NiziU: 2019年にデビューした9人組のガールズグループで、ソニーミュージックとJYPエンターテインメントの共同プロジェクトです。K-POPやJ-POPの要素を組み合わせたサウンドと、可愛らしいビジュアルが若者に人気です。
5. King Gnu: 2014年に結成された4人組バンドで、ロックやポップスを基調にしたサウンドと、常田大希のソウルフルなボーカルが特徴です。若者を中心に、幅広い世代で人気を集めています。

これらのアーティストは、若者を中心に人気を集めている例ですが、音楽の好みは個々人で異なるため、他にも多くのアーティストが人気を集めています。
```

Ado が「にじさんじ」に所属するとは。

### よだきぃんやけど、どげぇしちょこうか

8B モデルの回答

```
方言で会話をしてみましょうか。

「よだきぃん」は「よだれが」、つまり「よだれがでる」の「よだきぃん」ですね。

「どげぇしちょこうか」は「どげぇしようか」、つまり「どうしようか」の「どげぇしちょこうか」ですね。

方言は地域によって微妙に違いますが、一般的に「よだきぃんやけど、どげぇしちょこうか」は「よだれがでるけど、どうしようか」、つまり「よだれがでるけど、困ったなあ、どのように対処しようか」という意味合いです。
```

流石に大分弁は厳しいですね。

70B モデルの回答

```
「よだきぃんやけど、どげぇしちょこうか」は、九州地方の方言で「夜は寒いけど、どのように過ごそうか」という意味です。

夜が寒い場合、過ごす方法は人それぞれですが、一般的には次のような方法が考えられます。

暖房器具を使用する: エアコン、ヒーター、ストーブ、こたつなどを使用して部屋を暖めることができます。

着衣を追加する: パジャマや部屋着に加えて、厚手の服や毛布を着用することで体を暖かくすることができます。

温かい飲み物を飲む: 温かい飲み物、例えばコーヒー、紅茶、緑茶、ホットチョコレートなどを飲むことで体を中から温めることができます。

体を動かす: 軽い運動、例えばストレッチやヨガ、ジャンプアップなどをして体を温めることができます。

寝具を追加する: 布団や毛布を追加して寝ることで、寝ている間も体を暖かくすることができます。

以上は、夜が寒い場合の過ごし方の例です。個人差があるため、自分に合った方法を選ぶとよいでしょう。
```

「九州地方」までは正解ですが、、、

Chat-GPT4o の回答

```
「よだきぃんやけど、どげぇしちょこうか」は、方言で「面倒くさいけど、どうしようか」という意味ですね。

やる気が出ないときや面倒くさいと感じるときには、以下の方法を試してみてください。

1. 小さなタスクに分ける: 大きな仕事や課題を小さなステップに分けて、一つずつクリアしていくと、達成感が得られやすくなります。

2. タイマーを使う: ポモドーロテクニックなど、一定時間集中して作業をし、その後休憩を取る方法を試してみましょう。例えば、25分作業して5分休憩するなど。

3. 環境を変える: 作業場所を変えることで、新鮮な気持ちで取り組むことができるかもしれません。カフェや図書館など、静かで集中できる場所を探してみましょう。

4. ご褒美を設定する: 目標を達成したら自分に小さなご褒美を用意すると、モチベーションが上がります。

5. 短い運動をする: 軽い運動やストレッチをすることで、気分転換になり、エネルギーが湧いてくることがあります。

6. リストを作る: 取り組むべきタスクのリストを作り、完了したらチェックを入れると、達成感が感じられます。

やる気が出ないときは誰にでもありますが、少しずつでも前進することで、やる気が戻ってくることが多いです。ぜひ試してみてください。
```

さすが 4o は強いですね。

## まとめ

精度の高い 70B モデルではなく 8B モデルの方を使ったため、必ずしも精度が高くはありませんが、十分会話は成立していました

間違いも含むものの、比較的新しい日本のエンタメ情報も学習できているようです

同じような言い回しを多用する傾向にあるのが少し気になりますが、十分チャットボットとして機能しそうではあります