日本語対応の無料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と比較して、あまり役に立たないと感じていたものが多かった中、このモデルは日常的に使える印象を受けました。
以下は生成された結果の一部ですが、これほど自然な出力が可能になるのは本当に驚異的です。
実際、修正は必要ですが、非常に自然ですね。
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+が有効ですね。
現時点では、ローカル環境で運用できるとはいえ、一般的なユーザーには使いにくいかもしれません。将来的な進化に期待ですね。
この記事が気に入ったらサポートをしてみませんか?