Paperspace Gradient で OpenCALM-7B を動かす
本日5月17日にサイバーエージェント社が一般公開した、巷で話題の「OpenCALM-7B」をPaperspace Gradientで動かしてみました。
OpenCALM
OpenCALMとはサイバーエージェント社が一般公開した日本語LLM(大規模言語モデル)です。StableLMやRWKVと違う点は日本語に特化していることで、オープンな日本語データで学習したモデルであることが特徴です。商用利用可能なCC BY-SA 4.0ライセンスで提供されており、2023年5月17日時点では日本国内における公開モデルにおいて最大級のモデルです。ChatGPTのようなファインチューニング済みのモデルではないので、実際の利用時にはファインチューニングが必要です。
OpenCALMはサイズ別に6つのモデルが公開されています。今回動かすOpenCALM-7Bは68億パラメータのモデルで、サイズ感としてはギリギリクラウドGPUサービス(GradientやColabなど)で動かしたりファインチューニングできるぐらいのサイズ感。
Paperspace Gradientで動かす
各所の報告ではOpenCALM-7Bの実行に14.7GBほどのGPUメモリが必要だったとのことで、動かすだけであれば14.7GB以上のGPUを選択すればOKだと思います。今回はたまたまA100が空いていたので、A100を選択しました。
デフォルトで立ち上がるスペースでは各種ライブラリが古いのでアップデートしておきます。また、accelerateライブラリも一緒にインストールします。
!pip install -U transformers torch
!pip install accelerate
あとは以下のサンプル通りのコードを入力するだけ。
まずはモデルとトークナイザをロード。
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")
プロンプトを投げ込むための関数を作っておき・・・
def calm(user_input: str, max_token: int = 64, temperature: float = 0.7):
inputs = tokenizer(user_input, return_tensors="pt").to(model.device)
with torch.no_grad():
tokens = model.generate(
**inputs,
max_new_tokens=max_token,
do_sample=True,
temperature=temperature,
pad_token_id=tokenizer.pad_token_id,
)
output = tokenizer.decode(tokens[0], skip_special_tokens=True)
return output
プロンプトを引数に入力すれば動作します。インストラクションチューニングされていないモデルなので、質問形式ではなく補完形式でプロンプトを作成しないと、違和感のある出力になります。
以下がそれぞれの出力の違いの例です。
calm("生成AI全盛のこの世の中でプログラマーはこの先生きのこれるか?", 64, 0.5)
calm("生成AI全盛のこの世の中でプログラマーは", 64, 0.5)
最大トークンを64に設定し、A100(80GB)で100回試行した際のパフォーマンスは以下の通りでした。大体3秒ほど。
関連情報
所感
まず英語ベースで出力されるところを日本語で返すように微調整するところからがスタートラインだったものが、まず日本語が返るところからがスタートラインになったのは意義深い。また私たちの眠れない夜が始まる。
現場からは以上です。