[Salesforce Research論文]自然言語からコードを生み出す”CodeGen”を試してみた

皆さん、こんにちは。hotoke_neko改めてクルトンです。 今回は今年arXivに投稿されたSalesforce Researchの論文で紹介されているモデルCodeGenを実際に動かします。
2022.08.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

皆さん、こんにちは。hotoke_neko改めてクルトンです。 クルトンを大量に食べてたら社内で呼ばれ始めましたので、改名しました。 今後ともよろしくお願いいたします。

さて、今回はタイトルにもある通りSalesforce Researchが出している論文"A Conversational Paradigm for Program Synthesis"のモデルCodeGenを動かしてみました。

CodeGenは自然言語からPythonのコードが生み出せるモデルです。

今回の実行環境はGoogleColabでランタイムにはGPUを使用しています。

サンプル実行

こちらにある公式のコードを動かしてみます。

pip install

まずは必要なライブラリを使えるようにするためGitHubからリポジトリから取得します。

!pip install git+https://github.com/huggingface/transformers.git

ライブラリをインポート

必要なライブラリのインポートを行います。この時、set_default_tensor_typeメソッドで処理対象のデータがcuda(GPU上)のもので処理するよう先に設定しておきます。

なお、他の型も設定できますのでご興味おありなら、こちらの公式ドキュメントご参照ください。

import torch
torch.set_default_tensor_type(torch.cuda.FloatTensor)
from transformers import AutoTokenizer, AutoModelForCausalLM

トークナイザ読み込み

トークナイザを読み込みます。トークナイザとは一言で言うと、自然言語をモデルへ入力できるようにデータを加工するためのものです。

tokenizer = AutoTokenizer.from_pretrained("Salesforce/codegen-2B-mono")

モデルを読み込み

モデルを読み込みます。 from_pretrainedメソッドは、Hugging Face Hubに置かれているモデルへのパスを入れます。

model = AutoModelForCausalLM.from_pretrained("Salesforce/codegen-2B-mono")

トークナイザで入力データ取得

トークナイザを使用して、モデルへ入力するためのデータを取得します。 トークナイザの引数に自然言語(英語)を入れます。 もう一つの引数return_tensorsですが、PyTorchやTensorFlow、Numpy型が選べます。今回はPyTorchで処理をしているので"pt"を渡します。

return_tensorsなどの引数の設定について、詳しくは公式ドキュメントをご覧ください。

inputs = tokenizer("# this function prints hello world", return_tensors="pt").to(0)

コード生成

この一文で実際にコードをの生成を行なっています。

sample = model.generate(**inputs, max_length=128)

生成内容を確認

次のコードで生成したものを確認します。

print(tokenizer.decode(sample[0], truncate_before_pattern=[r"\n\n^#", "^'''", "\n\n\n"]))

CodeGenの実行結果画像

これで自然言語からコードが生成できる事を確認できました!

色々と試してみた

せっかくサンプルコードが一通り実行できましたので、少し内容を変えてみます。

"this function return x+y"

return文に引数で渡された'x'と'y'を足し算しています。

"check prime number or not"

「流石にコード生成できるとはいえ、素数を確認する処理は出来るのだろうか」と気になったので生成しました。 結果は予想以上にしっかりしたコードが生成されてました。

"this function solve fizz buzz"

有名問題である「fizz buzz」はどのように処理するのか確認しました。

なるほど、最初に15の倍数を処理したのちにそれぞれの倍数で処理していますね。有名問題とはいえ、問題の内容を知らないといけないのですが、しっかりとコードを生成してくれました!(おまけで処理を確認するprint文付きです。)

終わりに

今回は自然言語からコードを生成するCodeGenについて紹介しました。 このようにコードの生成ができるものが簡単に実行できて確認できるので、是非興味を持たれた方はご確認ください!

事例として3つの英文を実行しましたが、他の文章でも面白そうなコードが作成できそうです。その際にはよければ、こちらの記事を参考にしてくだされば幸いです。

今回はここまで。

それでは、また!