0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

導入

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

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

前段を一部邦訳すると、

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で量子化したモデルを使って確認します。

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

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

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

%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で量子化されたモデルを利用しました。

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. バッチ推論

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

# 今回推論する内容
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><|START_OF_TURN_TOKEN|><|SYSTEM_TOKEN|>{sp}<|END_OF_TURN_TOKEN|><|START_OF_TURN_TOKEN|><|USER_TOKEN|>{p}<|END_OF_TURN_TOKEN|><|START_OF_TURN_TOKEN|><|CHATBOT_TOKEN|>"


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("<|CHATBOT_TOKEN|>")[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社と連携して採用していく企業が増えるのではないでしょうか。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?