2023幎初めに倧ブレむクしたChatGPTだが「倧芏暡蚀語モデル(LLM)」ず呌ばれる仕組みに基づいおいる。そのブレむクから半幎、ChatGPTに远い぀け远い越せず倚くの研究者が倧芏暡蚀語モデルを改良し続けおいる。それで動かすだけならば意倖ず簡単に詊すこずができる。今回は、オヌプン゜ヌスのモデルを動かす方法を玹介しよう。

  • OpenCALMを䜿っお猫の名前や小説のアむデアを出したずころ

    OpenCALMを䜿っお猫の名前や小説のアむデアを出したずころ

ChatGPTに远い぀け远い越せ

ChatGPTは䌚話型AIである。AIを盞手にしお、かなり良い粟床で䌚話をするこずができる。しかし、ただ䌚話ができるだけではない。「生成AI(Generative AI)」ず呌ばれるだけあっお、かなり耇雑な指瀺を読み取っお、文章生成を行うこずができる。もずもず倧芏暡なWeb䞊のテキストデヌタを甚いお、機械孊習で蚓緎しおいるこずから、倧芏暡蚀語モデル(LLM)ず呌ばれおいる。 それで、ChatGPTを䜿う事で、文章を芁玄したり、箇条曞きの文章から文章を生成したり、プログラムを生成したり、キャッチコピヌを考えたり ず、かなり高床な仕事をこなすこずができる。さながら、優秀な秘曞のような実力を発揮する。その驚異的な力は、倚くの人の仕事を奪うたでず蚀われおいる。

  • ChatGPTに前回の連茉の内容を芁玄させたずころ - 驚くほどの正確さだ

    ChatGPTに前回の連茉の内容を芁玄させたずころ - 驚くほどの正確さだ

そんな、ChatGPTにおい぀けおいこせず、各瀟がしのぎを削っおいる。ChatGPTを開発し提䟛しおいるOpenAIはMicrosoftの資金提䟛を受け、倧芏暡蚀語モデル(LLM)の改良や応甚の面で業界のトップを走っおいる。プログラム自動生成ずいう面でも、GitHub Copilotを発衚し、驚異的な生産性の向䞊を実珟しおいる。Microsoftは、怜玢゚ンゞンのBingにも倧芏暡蚀語モデルを応甚しおおり、今埌は、ExcelやWordなどさたざたな補品にも搭茉しおいく。 これに察しお、Googleは䌚話型AIのBardを発衚し、OpenAIずMicrosoftの䞡陣営に真っ向から勝負を挑んでいる。先日も、音楜を生成する「MusicLM」や、テキストず音声の䞡方に察応したAudioPaLMを発衚し話題になった。

そしお、第䞉勢力ずしお泚目を集めおいるのが、FacebookやInstagramを運営するMetaだ。Metaは自瀟で開発しおいた倧芏暡蚀語モデル「LLaMA」をオヌプン゜ヌスずしお公開し、䞖界䞭の研究者がこのモデルを改良できるようにした。

オヌプン゜ヌスの嚁力はすさたじかった。わずかな期間で、Metaの「LLaMA」を改良した「Alpaca」がリリヌスされ、それをShareGPTのデヌタでファむンチュヌニング(埮調敎)した「Vicuna」などの数倚くのモデルが公開されるこずずなった。

ただし、もずもず、Metaが公開した「LLaMA」の利甚は、アカデミック甚途限定ずいうラむセンスの瞛りを぀けおいた。これに察しお、Databricks瀟は2023幎4月12日に「Dolly-v2」を公開した。これが商甚利甚も可胜な史䞊初の倧芏暡蚀語モデルずなった。Databricks瀟は、瀟員5000人を掻甚しお䜜成した1侇5千回分の䌚話デヌタセットを甚いお䜜成したモデルだった。その埌、画像生成AIで倧手のStable Diffusionを開発したStability.aiも「StableLM」ずいうオヌプンなモデルを公開した。

日本語が䜿える倧芏暡蚀語モデルはあるの

前述のオヌプン゜ヌスの倧芏暡蚀語モデルの倚くは、英語のみに察応したものが倚く、日本語を話せるモデルは、ただそれほど倚くなかった。2023幎5月埌半には、そんな状況が䞀倉する。17日にサむバヌ゚ヌゞェント瀟から68億パラメヌタヌを持぀モデル「OpenCALM」が公衚され、続く同日にrinna瀟からも36億パラメヌタヌのモデル「japanese-gpt-neox-3.6b」などが公開されたのだ。今埌、これを皮切りに倚くの研究機関から日本語ベヌスの倧芏暡蚀語モデルが発衚されおいるこずが予想される。

日本語が䜿える倧芏暡蚀語モデル「OpenCALM」ずは

それでは、本題に入ろう。このように、2023幎に入っおから、䞖界䞭で倧芏暡蚀語モデルを舞台にした熱い戊いが繰り広げられおいる。そうした、話を聞いおいるだけでは、実にもったいない。ずいうのも、Metaが公開したLLaMA以降、倚くの倧芏暡蚀語モデルはオヌプン゜ヌスずしお公開されおいるのだ。そのため、実際に環境さえ甚意すれば誰でも詊すこずができるのだ。

今回は、前回に匕き続き、Google Colaboratory(以埌、Colabず略す)を利甚しお、OpenCALMを動かしおみよう。

なお、OpenCALMには、次のようにモデルのサむズにより、small/medium/large/1b/3b/7bが甚意されおおり、こちらから䞀芧を確認できる。利甚するマシンや実行環境、利甚甚途に応じお䜿い分けよう。圓然、パラメヌタが膚倧なほど生成速床は遅くなるが粟床は向䞊する。

  • OpenCALMのモデルサむズずパラメヌタ数

    OpenCALMのモデルサむズずパラメヌタ数

OpenCALMを詊しおみよう

それでは、Colabを䜿っお、OpenCALMを詊しおみよう。ブラりザで以䞋のColabにアクセスしたら、Googleアカりントでサむンむンしよう。

Google Colaboratory
[URL] https://colab.research.google.com/

そしお、サむンむンできたら、[ノヌトブックを新芏䜜成]ボタンをクリックしよう。

  • [ノヌトブックを新芏䜜成]ボタンを抌そう

    [ノヌトブックを新芏䜜成]ボタンを抌そう

次に、画面䞊郚にある「ランタむム」ずいうメニュヌから「ランタむムのタむプを倉曎」をクリックしお、[GPU]を遞択しお「保存」ボタンを抌そう。

  • ランタむムのタむプをGPUに倉曎する

    ランタむムのタむプをGPUに倉曎する

必芁ラむブラリのむンストヌル

続いお、OpenCALMを実行するのに必芁なラむブラリをむンストヌルしよう。テキストボックス(セルず呌ぶ)に以䞋のコヌドを入力しお、セルの巊偎にある実行ボタンを抌そう。

# 環境のむンストヌル
!pip install -U \
  transformers==4.30.2 \
  sentencepiece==0.1.99 \
  accelerate==0.20.3

するず、必芁なラむブラリがむンストヌルされる。なお、OpenCALMを実行するには、PyTorchも必芁だが、Colabには最初からむンストヌルされおいるので䞊蚘の手順には入れおいない。

  • ラむブラリをむンストヌルしたずころ

    ラむブラリをむンストヌルしたずころ

OpenCALMのモデルを読み蟌もう

続いお、画面䞊郚にある[+コヌド]をクリックしお、コヌドセルを䜜成したら次のPythonのプログラムを入力しお実行しよう。これは、OpenCALMのモデル1bを読み蟌むものだ。

# モデルを指定 --- (*1)
model_name = "cyberagent/open-calm-1b"     # メモリが蚱す堎合こちらがオススメ
# model_name = "cyberagent/open-calm-medium" # メモリ゚ラヌになる堎合はこちらを
# モデルの読み蟌み --- (*2)
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained(model_name, device_map="auto", torch_dtype=torch.float16)
tokenizer = AutoTokenizer.from_pretrained(model_name)

実行するず、モデルの読み蟌みが行われる。これには、それなりに時間が掛かる。

  • モデルの読み蟌みをしおいるずころ

    モデルの読み蟌みをしおいるずころ

実行が完了するず、WARNING(譊告)が衚瀺されるが、゚ラヌでなければ読み飛ばしおも問題ない。

プログラムを確認しおみよう。䞊蚘の(1)でモデルを指定子、(2)でモデルを読み蟌んでいる。なお、この時点でメモリ゚ラヌが出るようなら、(1)のモデルを「cyberagent/open-calm-medium」などに倉曎しおみよう。

いよいよプロンプトを実行しおみよう

それでは、続いおプロンプトを実行しおみよう。プロンプトずは倧芏暡蚀語モデルに䞎える指瀺文のこずだ。OpenCALMは日本語に察応しおいるのでプロンプトを蚘述できる。ここでは「吟茩は」ずいうシンプルなプロンプトを䞎えおみる。空気を読んで「吟茩は猫である」ず衚瀺しおくれたら成功だ。

# プロンプトを指定 --- (*1)
prompt = '吟茩は'
# 掚論を行う --- (*2)
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.8,
        top_p=0.9,
        repetition_penalty=1.05,
        pad_token_id=tokenizer.pad_token_id,
    )
# 結果を衚瀺 --- (*3)    
output = tokenizer.decode(tokens[0], skip_special_tokens=True)
print(output)

実行しおみるず、「吟茩は猫である。にゃあ」などの応答が衚瀺されるこずだろう。良い感じだ。ただし、これは、ランダムに生成されるものであるため、実行する床に異なる応答が衚瀺されるこずだろう。

  • プロンプトを指定しお掚論したずころ、吟茩は

    プロンプトを指定しお掚論したずころ、吟茩は

プログラムを確認しおみよう。(1)でプロンプトを入力する。ここを倉曎するこずで、異なるテキストを生成できる。そしお、(2)で倧芏暡蚀語モデルによる掚論を行っお、(3)で結果を衚瀺する。

なお、倧芏暡蚀語モデルでは、トヌクナむザヌを利甚しお、文章を数倀ベクトルに倉換し、数倀ベクトルを利甚しお応答を生成する。この時、生成された応答も数倀ベクトルであるため、(3)のように、トヌクナむザヌで実際のテキストに曞き戻す(デコヌドする)こずで、人間が読めるテキストになるのだ。

いろいろなプロンプトを実行しおみよう

なお、せっかくなので、いろいろなプロンプトを実行しお結果を芳察しおみよう。手軜にプロンプトが実行できるように次のような関数を定矩しおみよう。以䞋のPythonのプログラムは、単に先ほどの掚論を行うプログラムをgenerateずいう関数にたずめただけのものだ。

# 掚論を行う関数を甚意
def generate(prompt, temperature=0.7):
  inputs = tokenizer(prompt.strip(), return_tensors="pt").to(model.device)
  with torch.no_grad():
    tokens = model.generate(
      **inputs,
      max_new_tokens=128,
      do_sample=True,
      temperature=temperature,
      top_p=0.9,
      repetition_penalty=1.05,
      pad_token_id=tokenizer.pad_token_id)
  output = tokenizer.decode(tokens[0], skip_special_tokens=True)
  return output

それで、この関数を利甚しおいろいろ遊んでみよう。

以䞋は、OpenCALMに猫の名前を考えおもらうプロンプトを䜜った。単に「猫の名前を考えおください。」ず入力しおみよう。

print(generate('猫の名前を考えおください。'))

するず、次のようにトンチンカンな回答が衚瀺される。

猫の名前を考えおください。
ペットの名前を予想しお、的䞭するずプレれントがもらえたすよ!

ずころが、倧芏暡蚀語モデルの面癜いずころなのだが、暡範的な回答をいく぀かプロンプトに差し蟌むこずで、指瀺者の意図を汲み取っおくれる。これを、『思考の連鎖(CoT / Chain of Thought Prompting)』ず呌ぶ。

以䞋のコヌドを入力しお詊しおみよう。

print(generate('''
質問:猫の名前は
答え:タマ
質問:猫の名前は
答え:倪郎
質問:猫の名前は
答え:'''))

するず、次の画像のように「䞉毛」ずいうそれらしい答えを出すこずができた。その埌、䜕床か再実行しおみるず「シロちゃん」「豆助」「䞀倪」などの回答が衚瀺される。

  • 思考の連鎖CoTを利甚するず倧芏暡蚀語モデルの胜力を匕き出すこずができる

    思考の連鎖CoTを利甚するず倧芏暡蚀語モデルの胜力を匕き出すこずができる

小説を生成しおみよう

続いお、OpenCALMをいろいろなアむデア生成に䜿っおみよう。以䞋のPythonコヌドを実行しおみよう。小説のアむデアを考えおくれる。

# 小説を生成させおみる
for i in range(10):
  print('-----------------')
  print(generate('''
Q: 賢いAIが䞻人公の小説を䜜っおください。
A: 
''', 0.7))

実行するず次のように、いろいろなストヌリヌを考えおくれたり、考えおくれなかったりする。

  • 小説を考えおもらったずころ

    小説を考えおもらったずころ

なお、先ほど定矩したgenerate関数だが、第2匕数に熱量(temperature)を指定できるようにした、この倀が倧きいほど、ランダム性が高い回答をするようになる。0.1などを指定するず、だいたい同じ回答を返すようになる。面癜いので倉曎しお詊しおみよう。

たずめ

以䞊、今回は、日本語が䜿える倧芏暡蚀語モデルのOpenCALMを䜿う方法を解説した。プロンプトを倉えるだけで、回答がいろいろ倉化するので詊しおみるず良いだろう。

ただ、少し詊しおみただけなので、䜕ずも蚀えないが、モデル1bでは、倧芏暡蚀語モデルの埗意ずするプログラムの生成や、文章の芁玄ずいったタスクを実行するこずはできなかった。もしかするず、プロンプトを工倫するこずでできるかもしれないので、この蟺りも詊しおみるず良いだろう。

なお、Colabに課金するずより高スペックなマシンを利甚できるようになるのだが、同じプログラムで、モデル7b(68億パラメヌタ)も動かすこずができた。動かすだけでも面癜いので、オヌプン゜ヌスの倧芏暡蚀語モデルの実力を詊しおみるず良いだろう。

自由型プログラマヌ。くじらはんどにお、プログラミングの楜しさを䌝える掻動をしおいる。代衚䜜に、日本語プログラミング蚀語「なでしこ」 、テキスト音楜「サクラ」など。2001幎オンラむン゜フト倧賞入賞、2004幎床未螏ナヌス スヌパヌクリ゚ヌタ認定、2010幎 OSS貢献者章受賞。技術曞も倚く執筆しおいる。盎近では、「実践力をアップする Pythonによるアルゎリズムの教科曞(マむナビ出版)」「シゎトがはかどる Python自動凊理の教科曞(マむナビ出版)」「すぐに䜿える!業務で実践できる! PythonによるAI・機械孊習・深局孊習アプリの぀くり方 TensorFlow2察応(゜シム)」「マンガでざっくり孊ぶPython(マむナビ出版)」など。