日本語 LLM (CyberAgent OpenCALM-7B) を OCI Data Science 上で動かしてみた

# はじめに

日本オラクルでは、2023年8月2日にサイバーエージェント様をお招きして「AIインフラ最前線―サイバーエージェントのAI技術革新を支える最先端の AIインフラストラクチャー技術」
と題したセミナーを開催させていただきましたが、その中でサイバーエージェント様が最大68億パラメータの日本語 LLM (大規模言語モデル) を提供しているお話をされました。このモデルは [CC BY-SA 4.0ライセンス](https://creativecommons.org/licenses/by-sa/4.0/) のもとで公開されています。

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

ということで、さっそくこのLLMを試してみたいと思います。

※セミナーの動画は2023年9月頃の公開を予定しているそうです。
oracle.com/goto/ocws-jp-ondemand

# 手順

+ データ・サイエンス プロジェクトの作成
+ ノートブック・セッション の作成
+ ノートブック環境の準備
  + ライブラリのインストールと設定
+ LLM の実行
+ ノートブック・セッションの非アクティブ化


# データ・サイエンス プロジェクトの作成

OCI コンソール 左上のハンバーガーメニューから「アナリティクスとAI」を選び、さらに右に出てくるサービス一覧から「データ・サイエンス」を選びます。
プロジェクトを作成する前に「データ・サイエンスの前提条件」を確認し、必要な VCN、サブネット、動的グループ、ポリシー等の準備を行って下さい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/431d0f8e-1530-61cb-02db-e8c4c4a27492.png)

準備が整ったらプロジェクトを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/f3c96115-e7a7-d4f2-c838-fa56c9c6244a.png)

プロジェクトが作成されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/1c7ce898-9207-edee-9555-1543dc4a14eb.png)


# ノートブック・セッション の作成

プロジェクトが作成されたら、その配下に「ノートブック・セッション」を作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/8f555b3e-a348-9f88-6f2c-1e09d981e18a.png)

コンピュート・シェイプには GPU シェイプ を選択します。 ここで指定している VM.GPU3.1 は NVIDIA V100 搭載の一番小さい VM シェイプになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/26f7da38-325d-da89-8519-86074fc110b0.png)

しばらくすると、コンピュートが起動しノートブック・セッションがアクティブになります。

# ノートブック環境の準備

では、次にノートブックで LLM を使用するための準備を行います。Python の仮想実行環境を新規に作成し、必要なライブラリをインストールし、さらに初期設定を行います。
「開く」を押してノートブックにログインして下さい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/4494f779-7bcc-3162-4548-287bb2841148.png)

"Launcher" のタブが開かれています（「ファイル」メニューからも開けます）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/9a9f5bd5-2f16-3e05-461e-2bc3b890dfaf.png)

"Environment Explorer" をクリックすると、作成可能な Python 仮想環境のリストが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/1ae730e8-a307-dcc3-4bdf-b74845eebc98.png)

"PyTorch 1.10 for GPU on Python 3.8" を探して メニューを右クリックして "install" を選択して下さい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/7c446dbd-cde3-d415-e02c-b53089578e1a.png)

コンソールのタブが自動的に開いて、環境が作成されます（しばらく時間がかかります）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/2b175a03-dc4b-7d64-647d-785906b60fd6.png)

"launcher" タブに戻ると、新しいカーネルが作成されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/d57f0180-b7f8-5d83-cd99-6e6d36ab7fb4.png)

これを右クリックして "Start Console" を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/27150dfe-7383-c976-2d18-8f0da23c4702.png)

そうすると、新しいコンソールのタブが現れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/56d50253-bfb9-6eac-9e14-c9e362ad20d7.png)


## ライブラリのインストールと設定

LLM の実行に必要な追加のライブラリのインストールと設定を行います。
コンソールの下にあるコマンドラインに次のコマンド＆スクリプトを入力して Shift+Enter を押して実行して下さい。

```
%conda install -c conda-forge transformers
```
```
%conda install -c conda-forge accelerate
```
```
from accelerate.utils import write_basic_config; write_basic_config(mixed_precision='fp16')
```

コンソールの最後の出力が以下のようになっているか確認してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/04c4505e-e5cd-dfd0-8860-502b2e8a7a7f.png)

# LLM の実行

今回利用する LLM はこちらです。OpenCALM にはいろいろなサイズのモデルがありますが、今回は一番パラメータ数の大きい (6.8B = 68億) OpenCALM-7B を試してみます。

https://huggingface.co/cyberagent/open-calm-7b

このページの Usage に書かれている Python スクリプトをコピペして実行してみたいと思います。

```
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

model = AutoModelForCausalLM.from_pretrained("cyberagent/open-calm-7b", device_map="auto", torch_dtype=torch.float16)
tokenizer = AutoTokenizer.from_pretrained("cyberagent/open-calm-7b")

inputs = tokenizer("AIによって私達の暮らしは、", return_tensors="pt").to(model.device)
with torch.no_grad():
    tokens = model.generate(
        **inputs,
        max_new_tokens=64,
        do_sample=True,
        temperature=0.7,
        top_p=0.9,
        repetition_penalty=1.05,
        pad_token_id=tokenizer.pad_token_id,
    )
    
output = tokenizer.decode(tokens[0], skip_special_tokens=True)
print(output)
```

では、Launcher から 新しいノートブックを開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/0e7b4e75-eddc-2050-79d3-902dfa3adfe2.png)

新しいノートブックが開きました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/8d1b913c-e8cf-106f-055e-cf4cfe0f0d8d.png)

では、スクリプトを実行してみたいと思います。
ノートブックのセルに先ほどのスクリプトを入力（ペースト）して、実行ボタンを押します。
**"AIによって私達の暮らしは、"** に続く文章が出力されるハズ...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/bf50644d-ca19-99b5-551a-d73668f8433d.png)

**AIによって私達の暮らしは、もっと快適で楽しいものになっていくはずです。
そして日本はIT分野だけでなく、自動車やロボットの分野でも世界をリードする技術を持つ国です。この技術をいかにビジネスに活かしていくのかを考えることが今後の日本にとって大切になってくるのではないかと思います。**

と出力されました。
(実行毎に出力される内容は変化します)

# ノートブック・セッションの非アクティブ化

利用が終わったら、ノートブック・セッションを非アクティブ化しましょう。非アクティブ化によってコンピュート・インスタンスが停止しコンピュートの課金が止まります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/6b1c12b0-97a6-09c6-d0b6-c5ec9f6b040c.png)

# 補足：GPU の状態を確認する

Launcher からターミナルを起動して `nvidia-smi` を実行できます。

```
(base) bash-4.2$ nvidia-smi
Thu Aug  3 15:30:36 2023       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 510.108.03   Driver Version: 510.108.03   CUDA Version: 11.6     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  Tesla V100-SXM2...  Off  | 00000000:00:04.0 Off |                    0 |
| N/A   38C    P0    49W / 300W |   2477MiB / 16384MiB |     40%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
```


# 最後に

思ったより簡単に動かせました。まだサンプルを動かしただけですので、もう少し時間をかけて触ってみようと思います。

参考リンク
+ [OCI データ・サイエンス ドキュメンテーション](https://docs.oracle.com/ja-jp/iaas/data-science/using/data-science.htm)
+ [Accelerate ドキュメンテーション](https://huggingface.co/docs/accelerate/index)