見出し画像

日本語対応の無料LLMで小説の種を量産:C4AI Command R+をGoogle Colabで動かす

少し時期が過ぎた話題ですが、ローカル環境で動作可能な、そしてChatGPT-4を超えると言われるLLM(大規模言語モデル)を利用した結果をこの記事ではまとめています。(最近はこれがマイブームで、ずっと触っていました。)

しかし、自分のローカル環境(Mac)ではこのLLMの実行が現実的ではなかったため、Google Colabを使用する方法に切り替えました。
また、参考にしたサイトやコード、情報を基に、コピー&ペーストしやすいように加工したコードを使用しています。このコードはすべて本記事で公開しています。


参考にした情報

コード

まず使用感ですが、コードを実行すると入力ダイアログが表示されます。これにより、コードの内容を都度書き換える必要がなく、作業が楽になります。ただし、これについてはユーザーによって評価が分かれるかもしれません。
また、再実行時のGPUメモリ不足を防ぐ工夫もしています。

プロンプト入力エリア

実行結果は以下のようになります。
実行後、入力されたプロンプトとそれに対する出力が別のテキストエリアに表示されます。これにより、出力結果のみを容易に全選択し、コピーすることができます。特にダークモード使用時でも、Evernoteなど他のアプリケーションへの転記が容易で、書式の調整も不要になります。

出力イメージ
!pip install -U 'git+https://github.com/huggingface/transformers.git' bitsandbytes accelerate
import os
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig
from IPython.display import display, HTML

# 環境設定
os.environ['TORCH_SHOW_CPP_STACKTRACES'] = '1'
os.environ['PYTORCH_CUDA_ALLOC_CONF'] = 'expandable_segments:True'

# モデルとトークナイザーの設定
model_id = "CohereForAI/c4ai-command-r-v01-4bit"
tokenizer = AutoTokenizer.from_pretrained(model_id)
bnb_config = BitsAndBytesConfig(llm_int8_enable_fp32_cpu_offload=True, load_in_4bit=True)
model = AutoModelForCausalLM.from_pretrained(
    model_id,
    low_cpu_mem_usage=True,
    quantization_config=bnb_config,
    offload_folder="offload",
    offload_state_dict=True
)

# GPUリソースの管理
def clear_cuda_cache():
    torch.cuda.empty_cache()

try:
    user_input = input("入力してください:")
    messages = [{"role": "user", "content": user_input}]

    with torch.no_grad():  # 勾配計算を無効化
        input_ids = tokenizer.apply_chat_template(messages, tokenize=True, add_generation_prompt=True, return_tensors="pt")
        gen_tokens = model.generate(
          input_ids,
          max_new_tokens=4000,
          do_sample=True,  # サンプリングモードを有効にする
          temperature=0.5,  # ランダム性を高める
          top_k=50,  # トップkサンプリングを使用
          top_p=0.9,  # トップpサンプリングを使用
        )
        gen_text = tokenizer.decode(gen_tokens[0])

    # 生成テキストの解析
    parts = gen_text.split("<BOS_TOKEN>")
    prompt = parts[0].strip() if len(parts) > 1 else "No prompt found"
    output = parts[1].strip() if len(parts) > 1 else "No output found"

    # 入力テキストを出力から除去
    output_cleaned = output.replace(user_input, "").replace("<|START_OF_TURN_TOKEN|><|USER_TOKEN|><|END_OF_TURN_TOKEN|><|START_OF_TURN_TOKEN|><|CHATBOT_TOKEN|>", "").replace("<|END_OF_TURN_TOKEN|>", "").strip()

    # テキストエリアで表示
    display(HTML(f"<textarea readonly style='width:100%; height:100px;'>プロンプト: {user_input}</textarea>"))
    display(HTML(f"<textarea readonly style='width:100%; height:300px;'>出力結果: {output_cleaned}</textarea>"))

except Exception as e:
    print(f"エラーが発生しました: {str(e)}")

finally:
    # メモリ解放
    del model, tokenizer, input_ids, gen_tokens
    clear_cuda_cache()  # GPUキャッシュのクリア

初回実行では、最初のコマンドで1分、次のコードで4分かかりました。2回目以降は、2番目のコードのみを実行する必要があり、通常は約1分で結果が得られます。
(上記コードはChatGPT-4と、Claude 3と協力して参考にした情報をベースとして作成しました。)

注意点

Google Colabを使用する際、大量のGPUメモリが必要です。具体的には20GB以上を要求し、現状ではA100 GPUの利用が不可欠です(他のGPUではメモリが不足します)。

実行中のリソース

実行コストについて

時間あたりのコンピューティングユニットの使用量が非常に大きいです。
現在のレートで計算すると、1時間あたり約138.77円がかかります。
これを安いと見るか、高いと見るか🫥

ただ、A100のような高性能機器を購入する費用や、特別に大容量メモリを持つMacを購入するコストと比較すると、比較的リーズナブルかもしれません。
また、電気代も加味すると安上がりかもしれませんね。

湯水のように溶ける溶ける🫠

商用利用の注意

モデル自体は商用利用が禁止されていますのでご注意を。

よくある内容ですが、暴力的な内容、嫌がらせ、性的搾取、機密情報(コレがよくわからないが、モデルからぶっこ抜きNGということでしょうか。)、詐欺、商用目的、が禁止されています。

余談

ときどき、生成された出力が元の学習データから取り出されたもののように見えることがあります。
下記の例で言えばアドレスですが、こちらはアクセスしましたが実在しないものでした。(一応アーカイブも確認しましたがありませんでした。)
こういったアドレスは、LLMの特性でそれっぽく生成されただけの可能性もありますが、そもそもの学習元のソースが危険な場合もあります。
なので、生成されてもアクセスしないほうが良いでしょう。

一応モザイク

C4AI Command R+を使ってみた感想など

しかし、C4AI Command R+は本当に驚くべきものですね!
以前に公開された他のLLMと比較して、あまり役に立たないと感じていたものが多かった中、このモデルは日常的に使える印象を受けました。

以下は生成された結果の一部ですが、これほど自然な出力が可能になるのは本当に驚異的です。

次の指示に従って小説を書いてください。主人公は華奢な女性で高校生です。窓辺で本を読むのが好きで、1人の時間をとにかく愛しています。登場人物の心境や行動、名前などを詳細にして記述してください。

プロンプト

彼女の名前は、小春(こはる)という。高校二年生の華奢な少女だ。身長は低く、薄いピンク色の長い髪が肩まで伸びている。本を読むのが何よりも好きで、いつも校庭に面した窓辺に座って、空を眺めながら読書に没頭していた。小春は、人の多いところがあまり好きではなく、群れることをしない、静かな一人時間が愛おしかった。(中略)本に夢中になっていると、空の青さが彼女に語りかけてくるようで、窓の外に広がる空と雲が、彼女の寂しさを和らげてくれるようだった。

 小春は、自分に自信が持てないでいた。友達はいるが、自分から声をかけることはなく、いつも一人でいる時間が多かった。家族ともあまり話をせず、自分の部屋にこもることが多く、窓辺で本を読んでいるときが一番安らぐ時間だった。そんなある日、彼女に突然の出来事が起きた。転校生の登場だった。黒髪の涼やかな少年、夏目(なつめ)が現れたのだ。小春は、彼の登場に、心がざわめいた。自分に興味を持たない、クールな彼に、小春は興味を持った。
(以下略)

出力結果の抜粋(略、系はこちらで編集)

実際、修正は必要ですが、非常に自然ですね。

Google Colabを使うくらいなら、GPT-4やClaude 3でいいのでは?

もともとは、手持ちのMacBook Pro (M3, メモリ16GB)で運用しようと考えていましたが、メモリスワップが頻繁に発生し、一度の実行で4TBの書き込みと読み込みがあったため、SSDが壊れることを恐れて断念しました。

ディスクの寿命を削る
ただこれを出力しただけ🫥

その後、Google Colabへの切り替えを決めました。
Google Colabの利点として、特にプライバシーとセキュリティが挙げられます。ChatGPT-4やClaude 3は、ユーザーの入力データを利用することを明言していますが、Google Colabではそういった記述が見当たりません。そのため、プライバシー面では多少安心感があります。
ただし、不正行為を検出する自動システムが存在するため、その詳細な監視範囲は不明ですが、Googleの中の人が中身を見るとか、そういうのは無いでしょう。
(許可されていない操作をするほど、エンジニアも暇では無いでしょう。)

しかし、だからといって公序良俗に反する利用をすれば、Googleアカウントが停止されるリスクもあるので注意が必要です。

ほか、ローカル環境で利用可能なモデルを用意しておくことで、将来的にChatGPT系モデルが使用できなくなっても、独自にモデルを運用し続けることができる点は大きなメリットですね。

まとめ

C4AI Command R+は小説のアイデア生成やプロトタイプ作りにも利用できますが、その用途であればGPT-4やClaude 3も十分に機能します。ただし、特定の内容をプライバシーの観点からこれらサービスに共有したくない場合には、C4AI Command R+が有効ですね。

現時点では、ローカル環境で運用できるとはいえ、一般的なユーザーには使いにくいかもしれません。将来的な進化に期待ですね。

この記事が気に入ったらサポートをしてみませんか?