OpenCALM_CyberAgent_LLMを試してみた(オフラインチャットAI！？)

# ■ CyberAgent LLMを試してみた
OpenAI ChatGPTやGoogle Bardで、チャットAIが公開されており、既にAPI等での接続が可能となっている。しかし、現在OpenAI ChatGPTやGoogle Bardもオンラインでのアクセスが必要で、オフラインで利用するには、LLM(Large Language Model:大規模言語モデル)が必要で、オフラインでの利用が難しい状況であった。

だが、2023/05/17に、CyberAgent様が、日本語LLMを『CC BY-SA 4.0』ライセンスにて一般公開を開始し、チャットAIのオフライン利用に希望の光が灯った。
本稿では、CyberAgentの日本語LLMをどの環境でも試せるように『CPU(without GPU)』で、『簡易API』からアクセスできるように設定する方法を記載する。

# ■ 環境
・物理マシンGPU : <b>なし</b>
・物理マシンCPU : Intel Core i7-1255U
・物理マシンRAM : 32GB
・仮想環境 : Hyper-V
・仮想マシンOS : Ubuntu 20.04 LTS
・仮想マシンCPU : 6コア
・仮想マシンRAM : 22GB

# API起動コマンドとAPI呼び出しコマンド
## ■ ① API起動コマンド(ターミナル1)
```bash
cd ~
git clone https://github.com/hirok-to-i/CALM_CA_LLM_CPU_API.git
cd CALM_CA_LLM_CPU_API
bash build_docker_calm3b.sh #Build Docker
bash start_docker_calm3b.sh #Start Docker
```

## ■ ② API呼び出しコマンド(ターミナル2)
```bash
time curl localhost:8000/ -XPOST -d '{"message":"株式とは、"}'
```

# 実行例
## ■ ① 起動結果(ターミナル1)
`INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)`が表示されれば、APIの起動は完了している。

```bash
root@localhost:~# cd ~
root@localhost:~# git clone https://github.com/hirok-to-i/CALM_CA_LLM_CPU_API.git
Cloning into 'CALM_CA_LLM_CPU_API'...
remote: Enumerating objects: 20, done.
remote: Counting objects: 100% (20/20), done.
remote: Compressing objects: 100% (16/16), done.
remote: Total 20 (delta 4), reused 14 (delta 3), pack-reused 0
Receiving objects: 100% (20/20), 4.12 KiB | 4.12 MiB/s, done.
Resolving deltas: 100% (4/4), done.
root@localhost:~# cd CALM_CA_LLM_CPU_API
root@localhost:~/CALM_CA_LLM_CPU_API# bash build_docker_calm3b.sh #Build Docker
[+] Building 895.0s (11/11) FINISHED
 => [internal] load .dockerignore                                          0.0s
 => => transferring context: 2B                                            0.0s
 => [internal] load build definition from Dockerfile                       0.0s
 => => transferring dockerfile: 429B                                       0.0s
 => [internal] load metadata for docker.io/library/ubuntu:20.04            3.5s
 => [1/7] FROM docker.io/library/ubuntu:20.04@sha256:db8bf6f4fb351aa7a26e  0.0s
 => => resolve docker.io/library/ubuntu:20.04@sha256:db8bf6f4fb351aa7a26e  0.0s
 => => sha256:b795f8e0caaaacad9859a9a38fe1c78154f8301fdaf0872 424B / 424B  0.0s
 => => sha256:88bd6891718934e63638d9ca0ecee018e69b638270f 2.30kB / 2.30kB  0.0s
 => => sha256:db8bf6f4fb351aa7a26e27ba2686cf35a6a409f6560 1.13kB / 1.13kB  0.0s
 => [2/7] RUN apt-get update -y                                            8.0s
 => [3/7] RUN apt-get upgrade -y                                           4.3s
 => [4/7] RUN apt-get install -y python3 python3-pip                      47.6s
 => [5/7] RUN pip install prompt_toolkit numpy torch tokenizers          790.4s
 => [6/7] RUN pip install transformers accelerate sentencepiece colorama   9.3s
 => [7/7] RUN pip install fastapi "uvicorn[standard]"                      4.9s
 => exporting to image                                                    26.9s
 => => exporting layers                                                   26.9s
 => => writing image sha256:117dc38d5ab727e4066be5f2dcfed413948ac4d805800  0.0s
 => => naming to docker.io/library/ubuntu:CALM_CA_LLM_CPU_API              0.0s
root@localhost:~/CALM_CA_LLM_CPU_API# bash start_docker_calm3b.sh #Start Docker
Downloading (…)lve/main/config.json: 100%|██████| 611/611 [00:00<00:00, 118kB/s]
Downloading pytorch_model.bin: 100%|███████| 5.70G/5.70G [07:39<00:00, 12.4MB/s]
Downloading (…)neration_config.json: 100%|█████| 116/116 [00:00<00:00, 94.8kB/s]
Downloading (…)okenizer_config.json: 100%|██████| 323/323 [00:00<00:00, 333kB/s]
Downloading (…)/main/tokenizer.json: 100%|█| 3.23M/3.23M [00:01<00:00, 3.21MB/s]
Downloading (…)cial_tokens_map.json: 100%|██████| 129/129 [00:00<00:00, 153kB/s]
INFO:     Started server process [7]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
{
  "message": "\u682a\u5f0f\u3068\u306f\u3001"
}
CPU: 株式とは、会社がその事業のために保有している有価証券のことを言います。
例えば、会社としては、「この会社は銀行業、保険業の事業を行っている」という認識がある場合には、銀行業や保険業に関する有価証券、さらに、会社の経営者が個人として保有する株式(議決権)、株式を保有する会社の資産と、銀行業や保険
INFO:     172.17.0.1:43170 - "POST / HTTP/1.1" 200 OK
```

## ■ ② 実行結果(ターミナル2)
```bash
root@localhost:~# time curl localhost:8000/ -XPOST -d '{"message":"株式と は、"}'
{"message":"株式とは、","output":"株式とは、会社がその事業のために保有している有価証券のことを言います。\n例えば、会社としては、「この会社は銀行業、保険業の事業を行っている」という認識がある場合には、銀行業や保険業に関する有価証券、さらに、会社の経営者が個人として保有する株式(議決権)、株式を保有する会社の資産と、銀行業や保険"}
real    2m0.885s
user    0m0.010s
sys     0m0.000s
root@localhost:~#
```


# ■ 出力サンプル
以下が、『OpenCALM CyberAgent_opencalm-3b』と『ChatGPT gpt-3.5-turbo』の出力比較となる。
内容は、AIによる生成のため、誤っている可能性がありますので、ご注意ください。

出力を見てみると、ほぼほぼ日本語として読める文章が出力できていることがわかる。

短すぎるワード(F16等)は、『ChatGPT gpt-3.5-turbo』と比較し、誤った出力をしていることを確認できるが、今回利用した『CyberAgent_opencalm-3b』ではなく、『CyberAgent_opencalm-7b』では改善される可能性がある。


<table>
<caption>CyberAgent_opencalm-3bとChatGPT gpt-3.5-turbo出力サンプル</caption>

<thead><tr><th>#</th><th>お題</th><th>CyberAgent_opencalm-3b</th><th>ChatGPT gpt-3.5-turbo</th></tr></thead>

<tr><td>1</td><td>台風情報</td><td>台風情報とは、気象庁が発表する最新の気象情報のことです。 気象庁が発表する1時間ごとのタイムラインを見ることで、今現在の天気、最高気温や最低気温、台風の接近などいち早く台風の様子を把握できるため、台風による大雨などの災害発生の可能性がある時には、気象庁ホームページにて台風情報をご確認ください。 1時間ごとの台風情報のタイムラインは</td><td>台風情報とは、台風に関する最新の気象情報を提供するサービスである。台風の進路や強さ、発生源などの情報を配信し、災害を未然に防ぐための情報源として役立っている。台風情報は、テレビやラジオ、ウェブサイト、スマートフォンアプリなど、様々なメディアで配信されている。</td></tr>

<tr><td>2</td><td>青葉まつり</td><td>青葉まつりとは、この三番町スクエア一帯で行われる、緑と花の祭典です。 市内の各会場ではさまざまなイベントが行われ、街中があたたかな雰囲気に包まれた2日間です。 平成30年5月12日(土)14時から、徳島市中心部の8カ所で阿波おどり公演が行われます。 期間中は、</td><td>青葉祭りは、日本の秋田県で毎年開催される祭りであり、9月に開催されます。この祭りは、秋田県の魅力を世界に伝えるために開催されています。これは、約400年前に始まったと言われています。この祭りには、三種の神器で飾られた神社に向かって行進し、踊りを披露します。青葉祭りは、伝統的な着物を着た若い女性たちが、Ogatamaiと呼ばれる伝統的な踊りを披露することでも知られています。その他のイベントには、花火大会、屋台、市場があります。</td></tr>

<tr><td>3</td><td>ダイハツ</td><td>ダイハツとは、大阪を営業拠点とし、日本各地に販売ショップを展開してるオートバックスグループの会社です。 2014年には、創業70年の歴史を誇る、大阪の日産自動車でも、安心清掃の品質が高いと噂の、クリーンディーゼルの車の買取サービスをおこなうようになりました。 そして2020年9月11日、株式会社S.A.</td><td>ダイハツは、日本の自動車メーカーである。創設は1907年であり、2021年現在、トヨタ自動車グループの一員として活動している。ダイハツは、小型車、軽自動車、商用車を中心に製造を行っており、日本国内だけでなく、海外市場でも展開している。</td></tr>

<tr><td>4</td><td>児童手当</td><td>児童手当とは、0~3歳未満の子どもを養育している家庭に対し、所得額に応じて、子ども一人につき、月額1万5,500円が支給される、国の制度です。公的年金(老齢年金、障害の高さが支給される障害年金)受給世帯が基準となるため、老齢年金と障害年金をもらえてなおかつ、</td><td>児童手当は、国が子どもを持つ世帯に対して、毎月一定額支給する制度です。児童手当は、子育て世帯の負担を少しでも軽くし、子どもたちの健やかな成長を促進することを目的としています。この手当は、子ども一人につき月々1万3千円支給されますが、所得によって支給額が変わります。</td></tr>

<tr><td>5</td><td>F16</td><td>F16とは、各聖パウロ教会の守護、また、その背後にいる聖パウロ会の祈りの中心人物となっています。 聖パウロ教会とは、ヨハネ福音書14:18から始まるガラテヤ人への手紙5:18~28という、小アジア(現在のギリシャ。小アジア)における初期信仰告白に出てくるパウロの宣教活動の基となっている</td><td>F16とは、アメリカ合衆国のロッキード・マーティン社が開発し、アメリカ空軍を中心に世界各国で使用されている戦闘機のことである。F16は、アメリカ空軍での正式名称が「ファイティング・ファルコン（Fighting Falcon）」である。F16は、低空から高空まで幅広い高度での飛行が可能で、様々な任務に対応することができる軽量戦闘機である。</td></tr>

</table>



# ■ まとめ
CyberAgent様の日本語LLMをOpenCALMで実行し、CPUのみで簡易APIアクセスできるように構築を実施した。
実際に、業務利用をする場合は、CPUでは計算時間が長いため、CPUではなく、GPUを利用して、実行するようにする必要があるが、一旦モデルの精度を確認するためには、本環境でも十分かと思う。
こちらのLLMを利用すれば、要件にもよるが、オフラインでのチャットAIの構築が可能となる。

CyberAgent_opencalm-3bをCPUで利用する場合、RAMを11GBほど消費するため、注意が必要である。
※ 今回は、CyberAgent_opencalm-7bを実行するために必要なメモリを積んだマシンを用意できませんでした。申し訳ないです。

ぜひ、CyberAgent様の日本語LLMを試してみてくださいませ。

# ■ 参考資料
1. トレンドワードのChatGPTとOpenCALMでの出力比較サイト : https://wordpress.realcollector.jp/blog/
1. Hugging Face Hub CyberAgent : https://huggingface.co/cyberagent
1. ImpressWatch サイバーエージェント、国内最大級の日本語LLMを公開 : https://www.watch.impress.co.jp/docs/news/1501125.html