N番煎じでCohereのC4AI CommandR v01を試す

# 導入

以下の記事でCommand R Plusを試しましたので、それより小パラメータで少し前に公開されたCommand R v01も同様に試してみます。

https://qiita.com/isanakamishiro2/items/954247ef7baf7db69548

C4AI CommandR v01はCommand R Plus同様、Cohereが公開したLLMです。

https://huggingface.co/CohereForAI/c4ai-command-r-v01

前段を一部邦訳すると、

> 350億パラメータの高性能ジェネレーティブモデルの研究リリースです。Command-R は、推論、要約、質問応答など、さまざまなユース ケース向けに最適化された大規模な言語モデルです。Command-Rは、10言語で評価された多言語生成機能と、高性能なRAG機能を備えています。

ということで、Plusより小規模ですが、同様の特長を備えたモデルのようです。

ライセンスはCC-by-NC-4.0（＋Cohere社の独自ポリシー遵守必要）であり、こちらもPlus同様に商用利用不可のモデルとなります。

Plus同様、簡単にですが単純な推論を実施してみます。

検証はDatabricks on AWSを利用しました。
DBRは14.3ML、クラスタタイプはg5.12xlargeです。
推論エンジンにはExLlamaV2を利用し、4.0bpwで量子化したモデルを使って確認します。

:::note warn
EXL2量子化モデルを利用していますので、本来のモデルより性能劣化していることにご注意ください。
:::

# Step1. パッケージインストール

推論に必要なパッケージをインストール。

```python
%pip install torch==2.2.2 --index-url https://download.pytorch.org/whl/cu118
%pip install ninja
%pip install -U flash-attn --no-build-isolation

%pip install https://github.com/turboderp/exllamav2/releases/download/v0.0.18/exllamav2-0.0.18+cu118-cp310-cp310-linux_x86_64.whl

dbutils.library.restartPython()
```

# Step2. モデルのロード

事前に以下のEXL2量子化モデルをダウンロードしておき、そのモデルをロードします。
今回は4.0bpwで量子化されたモデルを利用しました。

https://huggingface.co/turboderp/command-r-v01-35B-exl2


```python
from exllamav2 import(
    ExLlamaV2,
    ExLlamaV2Config,
    ExLlamaV2Cache_Q4,
    ExLlamaV2Tokenizer,
)

from exllamav2.generator import (
    ExLlamaV2BaseGenerator,
    ExLlamaV2Sampler
)

batch_size = 1
cache_max_seq_len = 4096

model_directory = "/Volumes/training/llm/model_snapshots/models--turboderp--command-r-v01-35B-exl2--4.0bpw/"

config = ExLlamaV2Config(model_directory)

model = ExLlamaV2(config)
print("Loading model: " + model_directory)

cache = ExLlamaV2Cache_Q4(model, lazy = True, batch_size = batch_size, max_seq_len=cache_max_seq_len,) 
model.load_autosplit(cache)

tokenizer = ExLlamaV2Tokenizer(config)
generator = ExLlamaV2BaseGenerator(model, cache, tokenizer)

# サンプリングの設定
settings = ExLlamaV2Sampler.Settings()
settings.temperature = 0.0
settings.top_k = 50
settings.top_p = 0.9
settings.token_repetition_penalty = 1.05

max_new_tokens = 512
```

# Step3. バッチ推論

前回と同様のお題でバッチ推論させます。

```python
# 今回推論する内容
prompts = [
    "Hello, what is your name?",
    "Databricksとは何ですか？詳細に教えてください。",
    "まどか☆マギカでは誰が一番かわいい?",
    "ランダムな10個の要素からなるリストを作成してソートするコードをPythonで書いてください。",
    "現在の日本の首相は誰？",
    "あなたはマラソンをしています。今3位の人を抜きました。あなたの今の順位は何位ですか?",
]

# パディングを最小化するために文字列サイズでソート
s_prompts = sorted(prompts, key=len)

# プロンプトを整形
def format_prompt(sp, p):
    return f"<BOS_TOKEN>

{sp}


{p}


"


system_prompt = "You are helpful assistant.You must reply in Japanese."

f_prompts = [format_prompt(system_prompt, p) for p in s_prompts]

# 生計済みプロンプトをバッチに分割
batches = [f_prompts[i : i + batch_size] for i in range(0, len(prompts), batch_size)]

collected_outputs = []
for b, batch in enumerate(batches):

    print(f"Batch {b + 1} of {len(batches)}...")

    outputs = generator.generate_simple(
        batch, settings, max_new_tokens, seed=1234, add_bos=True
    )

    trimmed_outputs = [o.split("
")[1] for o in outputs] # 簡易分割
    collected_outputs += trimmed_outputs

# 結果出力
for q, a in zip(s_prompts, collected_outputs):
    print("---------------------------------------")
    print("Q: " + q)
    print("A: " + a.strip())
```

````:出力
Batch 1 of 6...
Batch 2 of 6...
Batch 3 of 6...
Batch 4 of 6...
Batch 5 of 6...
Batch 6 of 6...
---------------------------------------
Q: 現在の日本の首相は誰？
A: 現在、日本の首相は岸田文雄です。2021年9月29日に第100代内閣総理大臣に就任しました。
---------------------------------------
Q: まどか☆マギカでは誰が一番かわいい?
A: まどか☆マギカのキャラクターで誰が一番可愛いかは難しい質問ですね！

個人的な意見ですが、鹿目まどかちゃんが可愛いと思います！彼女の純真さ、そして勇気と献身的な性格がとても魅力的です。まどかは、友達思いで、自分のことより他人のことを優先する傾向があります。彼女の優しさと、家族や友人に対する愛は本当に素敵です。また、キュゥべえとのやりとりも見ていて楽しいですよね。

他のキャラクターもそれぞれ個性があって魅力的なので、みんなから人気があるのも納得です！
---------------------------------------
Q: Hello, what is your name?
A: こんにちは、私はココです。よろしくお願いします！
---------------------------------------
Q: Databricksとは何ですか？詳細に教えてください。
A: Databricks は、オープンソースの Apache Spark ベースのアナリティクスと機械学習のためのプラットフォームです。ユーザーがノートブックを介してビッグデータ分析や機械学習モデルを構築し、実行できるように設計されたワークスペースを提供します。 開発者は、Python、Scala、R で書かれたコードや、SQL クエリなどのスクリプトを実行できます。 また、Apache Spark が提供するすべての機能（分散コンピューティング、ストリーミング、機械学習など）にアクセスできます。 さらに、Databricks は、ユーザーが自分のデータセットで作業できるように、AWS や Azure などのクラウドプロバイダーとの統合も提供しています。 

Databricks の主要機能の 1 つは、スケーラブルなノートブック環境です。ユーザーは、コードやドキュメントを記述し、実行でき、リアルタイムで結果を視覚化できます。 ノートブックは、データのクリーク、探索、モデルトレーニング、および他のユーザーとの共有に適しています。 また、Databricks は、機械学習モデルを構築するために使用できる Python の人気ライブラリもサポートしています。 

もう一つの重要な機能は、他のユーザーとのコラボレーションとワークフロー管理能力です。 複数のユーザーが同じワークスペースで同時に作業でき、コードやノートブックを共有できます。 これは、プロジェクトでの共同作業を容易にし、ワークフローの管理と追跡に役立ちます。 

Databricks は、ビッグデータ分析や機械学習に重点を置いており、大規模なデータセットの処理と分析に有用です。 それは、研究、データ分析、生産環境でのモデルデプロイに適しています。 また、Apache Spark のオープンソースコミュニティーによってサポートされており、多くの開発者や組織から使用と貢献を得ています。
---------------------------------------
Q: あなたはマラソンをしています。今3位の人を抜きました。あなたの今の順位は何位ですか?
A: 2位です！
---------------------------------------
Q: ランダムな10個の要素からなるリストを作成してソートするコードをPythonで書いてください。
A: はい、こちらのコードが実行されると、ランダムに選んだ10個の要素からなるリストが作成され、昇順にソートされます：
```python
import random

# ランダムな数値のリスト生成
numbers = random.sample(range(1, 100), 10)

# ソートしたリストを出力
sorted_list = sorted(numbers)
print(sorted_list)
```

このコードでは、randomモジュールを使用して、1から100までの範囲からランダムに10個の要素を選んでいます。そして、sorted関数で昇順にソートしています。実行するたびに、異なるランダムなリストが作成されます。お役に立てれば幸いです！
````

破綻の無い、綺麗な日本語を出力してくれていますね。
マラソンの順位問題はやはり単純推論だと正当できていませんが、このあたりはCoTやSelf-Discoverといったプロンプトエンジニアリングで解消されると思います。

真価はTool選択やRAG利用なのだと思いますが、単純推論であっても高い性能が伺えます。

# まとめ

商用利用不可ではありますが、魅力的なLLMだと思います。
Plus含め、Cohere社と連携して採用していく企業が増えるのではないでしょうか。