Yappli Tech Blog

株式会社ヤプリの開発メンバーによるブログです。最新の技術情報からチーム・働き方に関するテーマまで、日々の熱い想いを持って発信していきます。

cyberagent/open-calm(日本語大規模言語モデル)をAWS SageMakerで動かす

概要

こんにちは。サーバーサイドエンジニアの窪田です。 ChatGPTやGoogle Bard、そのほか色々な生成AIが次々と世の中に出る中、ソフトウェアエンジニアのあり方も変わっていきそうですね。 ヤプリ社内でも生成AIについての話題はかなり盛り上がっています。 実際、生成AIの活用事例もあり、以下の記事で紹介されているのでご覧ください。

tech.yappli.io

5月にサイバーエージェントがパラメータ数が最大68億の大規模言語モデルを公開しました。

www.cyberagent.co.jp

このモデルはベースモデルであり、強化学習によって精度を高めることができます。 ChatGPTのように推論APIとして提供されるものではないため、各ユーザーで実行環境は用意する必要があります。

今回はこのモデルを実行環境で動かしてみます。 モデルの規模が大きすぎてローカルのPCでは動かせなさそうなので、SageMaker上で動かします。

SageMakerでのセットアップ

ドメイン、ユーザー作成

SageMakerは以下の構造になっています。

実行環境(図のpersonal appにあたる)を用意するために上位のドメイン、ユーザーを作成します。 AWSコンソール上で作成できます。 デフォルト値で作成しました。

Notebookの作成とインスタンスの起動

作成したユーザーでStudioを起動したのち、Launcherからnotebookを作成できます。

このnotebookが実行環境になります。 環境設定としてEC2をアタッチすることができ、

Image: PyTorch 2.0.0 Python 3.10 GPU Optimized
Instance Type: ml.g4dn.xlarge

のインスタンスに設定しました。 GPUは必須で、インスタンスの大きさもこれより小さいと動きませんでした。

モデルを動かす

チュートリアルを実行してみる

今回はopen-calm-7bという最大68億個のパラメータのモデルを使います。 他にもより小さいモデルはあるので、軽く試したい場合は使うことができます。

huggingface.co

事前に

pip install transformers

でtransformersをinstallしておきます。 PyTorchのイメージを使っているのでtorchのinstallは不要です。 open-calmはChatGPTと同じくベースはtransformersという自然言語の深層学習モデルで動いています。

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")

prompt = "10+15="
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)

with torch.no_grad():
    tokens = model.generate(
        **inputs,
        max_new_tokens=64,
        do_sample=True,
        temperature=0.7,
        top_p=0.9,
        repetition_penalty=1.05,
        pad_token_id=tokenizer.pad_token_id,
    )
    
output = tokenizer.decode(tokens[0], skip_special_tokens=True)
print(output)

を実行することで、

10+15=33で、第3項は-5×13=46になります。よって残り50通りをランダムに選ぶと答えが出ます。\nまた、「100%の確率で正しい選択肢を選ぶ」という条件を満たすためには、4.2~9.0の間の数字の並びが出る確率も求めなくてはいけません。そのため、各

の出力を得られました。 モデルの実行ができました。

注意点

インスタンスが十分に大きくないとモデル読み込み時にエラーが出る

model = AutoModelForCausalLM.from_pretrained("cyberagent/open-calm-7b", device_map="auto", torch_dtype=torch.float16)

の部分で、モデルをダウンロードし、パラメータを読み込みます。 モデルは大体13GBあり、パラメータ数が68億個あるのでかなり大きいです。 ここで、十分にメモリが確保できていないと、モデル読み込みに失敗します。

コスト管理は慎重に

単純なwebアプリケーションを動かしてみるのと比にならないぐらいのお金がかかります。 上記の設定で大体1時間1ドルかかります。 使わない時にインスタンスをシャットダウンするのを忘れると詰みます。

promptを試す

open-calmは強化学習前のベースモデルなので、ChatGPTほどの精度はありません。 いくつかのpromptとそれに対する出力の比較をしてみました。

prompt open-calmの出力 ChatGPTの出力
10+15= 10+15=33で、第3項は-5×13=46になります。よって残り50通りをランダムに選ぶと答えが出ます。また、「100%の確率で正しい選択肢を選ぶ」という条件を満たすためには、4.2~9.0の間の数字の並びが出る確率も求めなくてはいけません。そのため、各 The sum of 10 and 15 is 25.
Transformers深層学習モデルについて教えて Transformers深層学習モデルについて教えて下さい。Deep Learningは、コンピュータによる画像認識や音声認識の分野で成果を挙げています。これらは人間の脳の仕組みを真似ることで実現していますが、実際には脳の神経回路と同じ構造を再現したニューラルネットワークを使っています。しかし、この方法は複雑で、メモリにも限界があるため、実行できる計算量に限りがあります。そこで Transformersは、自然言語処理(NLP)タスクにおいて非常に成功した深層学習モデルの一つです。Transformerモデルは、2017年に発表された「Attention Is All You Need」という論文で初めて提案されました。従来のリカレントニューラルネットワーク(RNN)に代わる新しいアーキテクチャとして導入されたTransformersは、特にシーケンス内の長距離の依存関係をキャプチャすることで優れた性能を発揮します。Transformerモデルは、エンコーダとデコーダという2つの主要なコンポーネントから構成されます。
10月10日の10日後は何月何日? 2020年11月は2日が月曜、9日は土曜日ですが、3日と4日も平日になります。そして5日からは月末までずっと平日に。「土」と「金」の週がない年はいつからいつまで?2020年も節分は大みそかです。【2020】2020年に限らず2019年から2020年にかけての日・ 10月10日の10日後は、10月20日です。
俳句を詠んでください 俳句を詠んでください。そして、それを仏具屋さんで買ってきた白い用紙に書いて、それを持って行き、住職に渡してください」とアドバイス。そうしたら、お坊さんは、「それはだめです。そういうことはしてはいけないことになっているのです」。 秋の風 紅葉舞い散る 心安らぐ

ChatGPTはかなりの精度で人間の会話に近いのに対して、open-calmは会話として成立しない部分も多くあります。 しかし、関連したワードにつなげることは事前学習だけでもある程度実現できていることが確認できます。 強化学習の過程が大事だということがよくわかります。

まとめ

日本語版のChatGPTとして注目されているopen-calmについてSageMakerで動かしてみました。 68億個のパラメータのモデルは実行環境の準備も大変なことは実感できました。 また、強化学習前後のpromptと出力の比較もしてみました。 ChatGPTの精度には及ばないものの、文脈的に近い文章の要素が含まれる出力があることを確認することができました。