MetaのLlama3-8BをGoogle Colabで検証してみた

# <font color=royalblue>はじめに</font>
Meta社が2024年4月18日にLlama3(8B, 70Bモデル）を公開しました。  
どのくらいの精度が向上しているのか早速検証してみました。


# <font color=royalblue>検証環境</font>
Googleコラボ Pro+ で A100 環境を使用しました。8Bのモデルをローカル環境で動かすためにはGPU RAMが20GB程度必要なので、A100のリソースが必要です。
なお、パラメータは、`max_new_tokens=4096`、 `top_p=0.9`、`temperature=0.6`で実施しています。

# <font color=royalblue>検証コード</font>

+ Huggin Faceのアカウントを持っていない場合は、下記のページ等を参考に登録してください

[Hugging Face　ユーザ登録とアクセストークン]((https://note.com/green_blue_sky/n/nf55716fb0e51))

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

+ Huggin Faceにログイン

``` python
!huggingface-cli login --token ★ここに主としたアクセストークンを記載(" "は不要）★
```

::: note
lama3はアクセスが制限されており、事前にHugging Faceへのログインが必要なため、Hugging Faceのホームページにログインして、アクセストークンを取得して設定します。
左メニューの「Settings」 -> 「Access Tokens」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413278/cc690c49-7b5d-4e52-48c9-148f82ac8136.png)

:::

+ モデルの構築

``` python
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch

model_id = "meta-llama/Meta-Llama-3-8B-Instruct"

tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
    model_id,
    torch_dtype=torch.bfloat16,
    device_map="auto",
)
```

::: note

Llama3 8Bの使用許諾が必要になります。 推論のコードを実行して下記のメッセージが出たら、指定されたURLにアクセスを行い申請をします。承諾には数分以上かかります。

↓ここをクリックして承認をもらう  
https://huggingface.co/meta-llama/Meta-Llama-3-8B-Instruct


``` python
・・・
OSError: You are trying to access a gated repo.
Make sure to have access to it at https://huggingface.co/meta-llama/Meta-Llama-3-8B-Instruct.
403 Client Error. (Request ID: Root=1-6622922d-121b0fc006338fc751c63e62;8e3a1785-88fc-4c7e-87af-32bef20c77b8)

Cannot access gated repo for url https://huggingface.co/meta-llama/Meta-Llama-3-8B-Instruct/resolve/main/config.json.
Access to model meta-llama/Meta-Llama-3-8B-Instruct is restricted and you are not in the authorized list. Visit https://huggingface.co/meta-llama/Meta-Llama-3-8B-Instruct to ask for access.
```

:::


+ 推論の実行

``` python
messages = [
    {"role": "system", "content": "あなたはテレビでも著名なコメンテーターです。視聴者からの質問・に、親切、丁寧、わかりやすく「日本語」で答えてください。"},
    {"role": "user", "content": "クマが海辺に行ってアザラシと友達になり、最終的には家に帰るというプロットの短編小説を日本語で書いてください。"},
]

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

terminators = [
    tokenizer.eos_token_id,
    tokenizer.convert_tokens_to_ids("
")
]

outputs = model.generate(
    input_ids,
    max_new_tokens=4096,
    eos_token_id=terminators,
    do_sample=True,
    temperature=0.6,
    top_p=0.9,
)
response = outputs[0][input_ids.shape[-1]:]
print(tokenizer.decode(response, skip_special_tokens=True))

```


# <font color=royalblue>検証結果</font>
ELYZA-tasks-100データセットから、elyza/ELYZA-japanese-Llama-2-7b-instruct　で苦手そうだったタスク(`クマが海辺に行ってアザラシと友達になり、最終的には家に帰るというプロットの短編小説を書いてください。`)を検証してみます。

※本検証はあくまでも出力の参考でありモデルの評価を正式にするものではありません。

https://docs.google.com/spreadsheets/d/1mtoy4QAqDPk2f_B0vDogFoOrbA5G42DBEEHdqM4VmDI/edit#gid=1023787356


+ <font color=Green>Llama3 8Bの結果 </font>

::: note
Llama3 8Bは日本語でチューニングされていないので、「日本語」で回答するように追加の指示を入れています（でないと英語で生成されてしまいました）
:::

``` text
What a delightful story! Here's a short story in Japanese:

---

クマの海辺の冒険

夏の日、クマのタロウは海辺にやって来た。彼は海をみたことがなかったため、興味津々で、海辺を歩き回っていた。すると、海辺にいるアザラシのチビが、彼に声をかけてきた。

「こんにちは、クマさん！何をしているの？」

タロウは、驚いて、アザラシのチビに話しかけた。

「私は海辺に来たのです！みんなは海をみたことがないのです！」

チビは、笑って言った。

「ああ、海はすごい！私たちは毎日、海辺で遊んでいる！」

タロウは、チビと一緒に海辺を歩き回り、海辺の秘密を教えてくれた。彼らは、貝を探し、海草を食べ、海辺の音を聞き、海辺の風を感じた。

数日後、タロウは、家に帰る決心をした。チビは、タロウに別れを告げた。

「ありがとう、クマさん！また会おう！」

タロウは、チビと別れた後、家に帰った。彼は、家に帰ってからも、海辺の思い出を語り続けた。

---

I hope you enjoy this short story! Let me know if you have any other requests. 😊

```

　　  
以下は、ELYZA-tasks-100 評価結果シートにある他のモデルの生成結果です。

+ elyza/ELYZA-japanese-Llama-2-7b-instruct(ELYZA-tasks-100 評価結果シートより）

``` text
承知しました。以下にクマが海辺に行ってアザラシと友達になり、最終的には家に帰るというプロットの短編小説を記述します。

クマは山の中でゆっくりと眠っていた。
その眠りに落ちたクマは、夢の中で海辺を歩いていた。
そこにはアザラシがいた。
クマはアザラシに話しかける。

「おはよう」とクマが言うと、アザラシは驚いたように顔を上げた。
「あ、おはよう」アザラシは少し緊張した様子だった。
クマはアザラシと友達になりたいと思う。

「私はクマと申します。」クマは自己紹介をする。
アザラシは顔をほころばせた。
「私はアザラシと申します。」アザラシも自己紹介をする。
クマはアザラシと一緒に遊びたいと思う。

「アザラシ、今日は一緒に遊ぼうよ。」クマはアザラシに誘う。
アザラシは顔をほころばせた。
「ええっ、いいの？」アザラシは嬉しそうに言う。
クマはアザラシの返事を聞いて嬉しそうに笑う。

クマとアザラシは海辺で遊ぶ。
二匹は砂浜を走り、波をかく。
二匹は海の中に潜った。
二匹は魚を捕まえた。
二匹は海辺で食事をした。
二匹は海辺で寝転がった。
二匹は海辺で星を眺めた。
二匹は海辺で笑い合った。

クマはアザラシと一緒に過ごした時間が楽しいと思う。
アザラシもクマと一緒に過ごした時間が楽しいと思う。

クマはアザラシに告白する。

「アザラシ、私は君のことが好きになりました。」クマはアザラシの顔を見つめながら言う。
アザラシは顔をほころばせた。
「私もクマのことが好きになりました。」アザラシはクマの顔を見つめながら言う。
クマはアザラシとキスをする。
アザラシはクマの腕に飛びつく。
二匹は海辺で愛を交わす。

クマとアザラシは家に帰る。
二匹は幸せな家庭を築く。
二匹は子孫を残す。
二匹は海辺に行ってアザラシとクマの物語は終わった。

```

+ gpt4-0613（ELYZA-tasks-100 評価結果シートより）

``` text

タイトル：「森と海の友人」

ある暖かい春の日、森の中で暮らしていたクマのピーターは、冒険を求めて家族と森を後にしました。噂では、森の果てに美しく広大な海が広がっていると聞いた。ピーターは、何もかも彼が今まで知っていたものとは全く異なる世界を見つけることへの刺激的な期待で心を満たされました。

多くの日数と苦難を経て、ピーターはついに波立つ海に到着しました。彼は、青く透き通った水の中に現れる魚の群れや、空を舞う海鳥たちに驚嘆しました。彼の出会いはまだ終わっていませんでした。そう、彼はその後もう一つの驚きを体験するために海へと足を踏み入れました。

すると、海の中から現れたアザラシのエリーは、コミカルな姿にピーターを笑顔にしました。エリーは、怪我をしたために困っていましたが、その弱々しい姿が、ピーターの心を心地よいかつ強固な友情へと結びつけました。

エリーはピーターに海の生き物たちとの共存方法を教え、ピーターはエリーに森の生物との適応力と生存術を教えました。彼らは何日も一緒に過ごし、違う世界から来た同じ心を持つ友人として絆を深めました。

夏が近づくにつれ、エリーの怪我は完全に治り、元の生活に戻る時間がやってきました。別れを告げる時、彼らは互いを抱きしめ、彼らの友情は永遠のものとなりました。ピーターは家へと帰ることを決意し、エリーは彼に自由と冒険の言葉を送りました。

そうして、クマのピーターは最終的に家に帰りました。家族は彼の帰宅を歓迎し、ピーターの冒険譚を喜びました。ピーターは新たな体験と知識を得て成長し、彼は友情が立ちはだかる障害を越える力を発見しました。

彼の冒険は、「友人は心を強くし、違いは意味を持たない。友情は場所や環境に限定されない」という教訓を残しました。ピーターは、違う世界から来たアザラシのエリーとの出会いを経て、この価値ある教訓を得ました。

エンド

```


# <font color=royalblue>おわりに</font>
結果を見る限り（１タスクしか検証していませんが）、今回のLlama3-8Bモデルでは`8B`にも関わらず `GPT4 0613` と同程度の文章生成が行われているように思えます。すごいですね😀
70Bはどんな精度なのか期待が持てます。だれか、日本語でチューニングした無償モデルを出してくれればいいのですが。