株式会社サイバーエージェントの商用可能な独自日本語LLM「CyberAgentLM3」を Google Colaboratory で動かす

## はじめに

株式会社サイバーエージェントが公開した CyberAgentLM3-22B-Chat (CALM3-22B-Chat) を Google Colaboratory 上で動かします

https://www.cyberagent.co.jp/news/detail/id=30463

> LLMの日本語能力を評価するNejumi LLM リーダーボード3においては、700億パラメータのMeta-Llama-3-70B-Instructと同等の性能となっており、スクラッチ開発のオープンな日本語LLMとしてはトップクラスの性能となります（2024年7月現在）。

225 億パラメーターで 700 億パラメーターと同等の性能ということで、精度が高いのはもちろん、かなりコスト効率が高いと言えます

基本的には前回 ELYZA 社のモデルで実行したのと同じ手法になりますが、 temperature などのオプションは Hugging Face の Usage に書かれているものを使用します

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

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

https://qiita.com/RyoWakabayashi/items/d02a2be5d3851a524c6b

ブラウザから簡単に試せるデモも用意されているので、自分で動かすのは難しい、という方はこちらからどうぞ

https://huggingface.co/spaces/cyberagent/calm3-22b-chat-demo

## モデルの取得元

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

https://huggingface.co/cyberagent/calm3-22b-chat

モデルのダウンロードに 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 のランタイム

以前、 ELYZA 社のモデルを試したときには L4 GPU を使用しましたが、それだと足りないので A100 GPU を使用します

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

実は A100 でも足りないので以下のメッセージが表示され、動作が遅くなってしまうのですが、なんとか使えるレベル（30秒まって10文字出てくるくらいの速度）なので妥協します

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

## ノートブックの設定

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

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

![スクリーンショット 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)

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

![スクリーンショット 2024-07-11 17.59.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/6ec7d229-c380-80e3-b081-15a0c10fdbc9.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, TextStreamer
```

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

## モデルのロード

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

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

```python
model_name = "cyberagent/calm3-22b-chat"
```

```python
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype="auto",
    device_map="auto",
)
streamer = TextStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True)
```

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

![スクリーンショット 2024-07-11 17.39.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/911cf20b-9c19-9ff4-7005-330130b7b68b.png)

今回の場合は A100 の 40GB でも足りていません

## 生成

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

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

TextStreamer を利用しているため、全文が揃わなくても生成されたところまでを順次表示してくれます

```python
DEFAULT_SYSTEM_PROMPT = "あなたは親切なAIアシスタントです。"
text = "美味しいおにぎりの具を教えてください"

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

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

with torch.no_grad():
    output_ids = model.generate(
        token_ids,
        max_new_tokens=1024,
        temperature=0.5,
        streamer=streamer,
    )
```

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

```
美味しいおにぎりの具はたくさんありますが、いくつか定番とおすすめの具を紹介します。

1. 梅干し: 酸味と塩味がご飯によく合います。
2. 鮭（シャケ）: 焼いた鮭は香ばしく、ご飯との相性が抜群です。
3. 昆布: 塩昆布や刻み昆布は、旨味が強く、ご飯によく合います。
4. たらこ: ピリ辛のたらこは、大人の味わい。
5. ツナマヨ: 子供にも人気。ツナとマヨネーズのコンビネーションが絶妙です。
6. おかか（鰹節）: 醤油で味付けした鰹節は、シンプルながら美味しいです。
7. 天かす: サクサクとした食感が楽しめます。
8. 明太子: ピリ辛の明太子は、大人向けの味わい。
9. しそ昆布: しその風味がご飯に染み込みます。
10. 焼き鳥: 甘辛いタレがご飯とよく合います。
11. 唐揚げ: お肉のジューシーさが楽しめます。
12. 焼き肉: 焼肉のタレでご飯が進む一品。
13. エビマヨ: プリプリのエビとマヨネーズの組み合わせ。
14. 塩辛: 大人の味。ご飯と一緒に食べると美味しいです。

これらの具材を使って、自分好みのおにぎりを作ってみてください。また、具材の組み合わせ次第で新しい味を発見するのも楽しいですよ。
```

前回の Llama-3-ELYZA-JP-8B より、更に自然な回答になっているように感じます

たらこと明太子がほぼ同じ文章になっている以外は、いい感じではないでしょうか

## UI付きで実行

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

https://www.gradio.app/

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

```python
def chat(input):
    messages = [
        {"role": "system", "content": DEFAULT_SYSTEM_PROMPT},
        {"role": "user", "content": input},
    ]
    token_ids = tokenizer.apply_chat_template(
        messages, add_generation_prompt=True, return_tensors="pt"
    ).to(model.device)
    with torch.no_grad():
        output_ids = model.generate(
            token_ids,
            max_new_tokens=1024,
            temperature=0.5,
            streamer=streamer,
        )
    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-11 18.07.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/0f0edf0a-457d-d673-f7ba-47b0f0b06002.png)

相変わらず認識してもらえない宮崎、、、

## 問答集

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

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

回答

```
桃太郎のお供の動物として有名なのは、犬、猿、そしてキジです。これらの動物は、それぞれ異なる特技や性格を持っており、桃太郎の冒険において重要な役割を果たします。

犬は忠誠心が強く、勇敢な存在として描かれます。猿は賢く、器用で、特に道具を使うのが得意です。キジは空を飛ぶことができ、偵察や警戒の役割を担います。

この三匹の動物は、桃太郎にとって信頼できる仲間であり、一緒に鬼退治を成し遂げるために協力します。
```

完璧な回答です

動物の種類だけでなく、特徴まで答えてくれました

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

回答

```
温泉に入る際には、以下の点に注意すると良いでしょう。

1. 体調の確認:
   - 体調が悪い場合や病気がある場合は、温泉に入る前に医師に相談してください。
   - 妊娠中や高血圧、心臓病などの持病がある場合も注意が必要です。

2. 水分補給:
   - 温泉に入る前に十分な水分を補給し、入浴後もこまめに水分を摂るようにしましょう。
   - 特に長時間の入浴や高温の温泉では、脱水症状に注意が必要です。

3. 入浴前の準備:
   - 体をよく洗い、清潔に保ちましょう。温泉は公共の場なので、他の訪問者への配慮も大切です。
   - 髪や体を乾かすタオルを持参すると便利です。

4. 入浴時間:
   - 初めての温泉や高温の湯に入る際は、短時間から始めて徐々に体を慣らしましょう。
   - 一般的に、10分から15分程度の入浴が適しています。

5. 湯温の確認:
   - 温泉の湯温を確認し、自分に合った温度を選びましょう。
   - 高温の温泉は、心臓に負担がかかる場合があるので、注意が必要です。

6. 呼吸法:
   - 温泉に入る際には、ゆっくりと深呼吸をしてリラックスしましょう。
   - 急に立ち上がるとめまいや立ちくらみを起こすことがあります。

7. 温泉の効能とリスク:
   - 温泉にはさまざまな効能がありますが、逆にアレルギー反応や肌のトラブルを引き起こす場合もあります。
   - 自分の体質や肌の状態に合わせて、適切な温泉を選びましょう。

8. 他の利用者への配慮:
   - 大声で話したり、泳いだりしないようにしましょう。
   - 他の利用者がリラックスできる環境を保つよう心がけてください。

9. 緊急時の対応:
   - 万が一、体調が悪くなった場合はすぐに温泉から出て、涼しい場所で休憩しましょう。
   - 意識がない場合や重大な症状がある場合は、速やかに救急車を呼ぶなどの対応が必要です。

これらの注意点を守ることで、温泉をより安全に、そして快適に楽しむことができます。
```

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

回答

```
小学生に人気のあるアニメの主人公は、時代や流行によって変わることがありますが、以下のようなキャラクターが特に人気があります：

1. 鬼滅の刃（きめつのやいば） - 竈門炭治郎（かまどたんじろう）：
   「鬼滅の刃」は、家族を守るために戦う少年・炭治郎の物語で、友情、勇気、自己犠牲のテーマが描かれています。

2. 僕のヒーローアカデミア - デク（緑谷出久）：
   この作品では、無個性だった少年デクが最高のヒーローを目指して成長していく姿が描かれており、努力と友情が強調されています。

3. 名探偵コナン - コナン（工藤新一）：
   高校生探偵が子供の姿になってしまうというストーリーで、推理とアクションが魅力です。

4. ワンピース - ルフィ：
   大海賊を目指すルフィとその仲間たちの冒険を描いた作品で、友情や夢を追いかける姿勢が人気です。

5. ポケットモンスター（ポケモン） - サトシ：
   ポケモンマスターを目指して旅をするサトシとその仲間たちの物語で、冒険心と友情がテーマです。

6. 呪術廻戦 - 虎杖悠仁（いたどりゆうじ）：
   超常的な力を持つ呪霊と戦う少年たちの戦いを描く作品で、迫力あるバトルシーンや深い人間関係が特徴です。

これらのキャラクターは、それぞれ異なる魅力を持ち、多くの小学生にとって憧れの存在となっています。
```

コナン = 新一 まで出てくるとは

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

回答

```
もちろんです！こんなのはどうでしょうか？

「昨日、冷蔵庫を開けたら『冷やし中華始めました』って書いてあったんだ。でも、まだ寒いからやってないみたい。」

楽しんでいただけたら嬉しいです！
```

やはりお笑いは苦手のよう

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

回答

```
もちろんです！以下は日本の有名なコメディアン（お笑い芸人）の一部です：

1. ダウンタウン
  - 浜田雅功 (ハマダ・マサシ)
  - 松本人志 (マツモト・ヒトシ)
2. ナインティナイン
  - 岡村隆史 (オカムラ・タカシ)
  - 矢部浩之 (ヤベ・ヒロユキ)
3. ウッチャンナンチャン
  - 内村光良 (ウチムラ・ミツヨシ)
  - 南原清隆 (ナンバラ・キヨタカ)
4. さまぁ〜ず
  - 大竹一樹 (オオタケ・カズキ)
  - 三村マサカズ (ミムラ・マサカズ)
5. バナナマン
  - 日村勇紀 (ヒムラ・ユウキ)
  - 設楽統 (シタラ・トオル)
6. サンドウィッチマン
  - 伊達みきお (ダテ・ミキオ)
  - 富澤たけし (トミザワ・タケル)
7. 東京03
  - 飯塚悟志 (イイヅカ・サトシ)
  - 角田晃広 (カドタ・コウイチロウ)
  - 豊本明長 (トヨモト・アキナガ)
8. おぎやはぎ
  - 小木博明 (オギ・ヒロアキ)
  - 矢作兼 (ヤザキ・ケン)
9. アンタッチャブル
  - 山崎弘也 (ヤマザキ・ヒロナリ)
  - 柴田英嗣 (シバタ・エイジツ)
10. ピース
  - 綾部祐二 (アヤベ・ユウジ)
  - 又吉直樹 (マタヨシ・ナオキ)

これらはほんの一部ですが、日本のお笑い界には多くの才能あるコメディアンがいます。それぞれが異なるスタイルや魅力を持っており、多くのファンに愛されています。
```

詳しすぎる

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

回答

```
若者に人気の音楽アーティストは、時期や地域によって変わることがありますが、2023年時点でしばしば話題に上るアーティストをいくつか紹介します。

1. ビリー・アイリッシュ (Billie Eilish) - 彼女の独特なスタイルと感情豊かな歌詞が若者たちに強く支持されています。

2. ドージャ・キャット (Doja Cat) - ヒット曲「Say So」や「Boss Bitch」などで知られ、独自のファッションセンスも人気の理由です。

3. ラナ・デル・レイ (Lana Del Rey) - エモーショナルでノスタルジックなサウンドが特徴で、多くのファンを持っています。

4. オザナ (Ozuna) - ラテン系のポップシーンで非常に人気があり、「Se Preparate」などの楽曲が特に人気です。

5. チャーリー・プース (Charlie Puth) - 「See You Again」などのヒットソングで知られる彼のメランコリックなメロディラインも若者に愛されています。

6. リル・ナズ・X (Lil Nas X) - 「Old Town Road」で一躍有名になり、その後もユニークな楽曲をリリースし続けています。

7. マネスキン (Måneskin) - イタリア出身のロックバンドで、ユーロビジョン・ソング・コンテスト優勝後、世界的な人気を博しています。

8. ブラックピンク (BLACKPINK) - K-POPガールズグループで、グローバルに活躍しており、そのスタイリッシュなビジュアルとパフォーマンスが人気です。

9. ザ・ウィークエンド (The Weeknd) - R&Bシンガーとして多くの若者の心を掴んでいます。

10. アヴリル・ラヴィーン (Avril Lavigne) - インディーロックからポップパンクまで幅広いジャンルで活躍し、若い世代にも根強い人気があります。

これらのアーティストは、それぞれ異なる魅力を持ち、多様な音楽スタイルで若者の心を捉えています。
```

まさかの洋楽

日本とは指定していないので間違いではないですが、学習内容は必ずしも日本特化ではなさそうです

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

```
「よだきぃん」とは、大分県の方言で「面倒くさい」という意味ですね。何か面倒なことについてどう対処しようかと悩んでいるということでしょうか？以下にいくつかの方法を提案します：

1. タスクを細分化する:
  - 大きなプロジェクトやタスクは、小さなステップに分けると取り組みやすくなります。一つ一つのステップを完了することで達成感を感じられ、モチベーションが維持しやすくなります。

2. 優先順位をつける:
  - 重要度と緊急度に基づいてタスクに優先順位を付けましょう。最も重要なタスクから取り組むことで、効率が上がります。

3. タイムマネジメント:
  - 時間管理ツール（例えば、ToDoリストアプリやカレンダー）を使って、自分のスケジュールを管理しましょう。デッドラインを設定することで、締め切りを守ることができます。

4. リフレッシュする:
  - 短い休憩を取ることでリフレッシュし、集中力を回復させることができます。5〜10分の休憩を取り入れると良いでしょう。

5. サポートを求める:
  - 誰かに助けを求めたり、相談したりすることも有効です。同僚や家族、友人に協力をお願いするのも一つの手です。

6. 自己動機づけ:
  - 目標設定や報酬制度を導入して、自分自身の動機を高めましょう。「これを終わらせたら好きなことをする」などの小さなご褒美を設定すると良いです。

7. 環境を整える:
  - 作業環境が快適だと、やる気が出やすくなります。整理整頓されたデスクや静かな作業スペースを確保しましょう。

どれか試してみてくださいね！他にも具体的なアドバイスが必要であれば教えてください。
```

方言まで完璧に理解しています！

## まとめ

CyberAgentLM3 を Google Colaboratory でなんとか動かすことができました

最高性能の A100 GPU でもメモリ不足で時間がかかってしまいますが、それでも動きはしました

性能は流石で、大分弁まで理解できたのには驚きました

（それでも宮崎県は認識できないのか、、、）