NLPerの独り言

勉強・経験したことのログ

Meta AI の大規模言語モデル Open Pre-trained Transformer (OPT) を使ってみた

お久しぶりです。 現在大学院でフルタイムの学生としてNLPの研究をしているものです。

このブログもかなり放置しまっていましたが、面白そうなネタがあったので久しぶりに重い筆を取りました。 そのネタが、Meta AIが2022年5月3日にリリースした大規模言語モデルである Open Pre-trained Transformer (OPT) です。

この記事ではOPTの概要と、実際に使ってみた結果などを報告したいと思います。

概要

大規模言語モデルは、数多のメディア・SNSなどで騒がれている通りNLPにおける革新的な研究です。

Meta AIのOPTでは1.25億から1750億まで様々なサイズのモデルが公開されており、 その中で最も大きいサイズOPT-175Bは話題のGPT-3と精度が同等らしいです。 GPT-3とパラメータ数も一緒で、名前も似てますね。

GPT-3が基本的に有料でAPIのみが提供されているのに対して、それと同等のサイズ・性能のOPT-175Bが公開されるのはなかなかな一大事のように思います。

研究用途に限りモデルそのものをダウンロードして手元で動かせるOPTによって、今後の研究がかなり加速しそうです。

自分も今後はOPTなどを研究に取り入れなければと思ったこともあり、このようなブログを書くに至りました。

もはやNLPに欠かせないhuggingfaceのtransformersライブラリではバージョン4.19.0(執筆当時では最新)から公開されています。

github.com

ただ、誰でもアクセスできるのはOPT-30B(300億のモデル)までで、1750億のOPT-175Bは研究用途に限り?リクエストすれば使えるようです。 リクエストのためのリンクはここにありました。

metaseq/projects/OPT at main · facebookresearch/metaseq · GitHub

使ってみた

Promptからの言語生成

まずは言語モデルにPromptと呼ばれる短いテキストを与えて、モデルにその後に続くテキストを予測させるタスクを試してみます。 大規模言語モデルの最も基本的な使われ方かと思われます。

OPT-175Bは筆者もリクエストをしたばかりなので、とりあえず次にパラメータ数が多いOPT-13BとOPT-30Bを試してみようと思います。

環境

  • OS: Ubuntu
  • GPU: NVIDIA A100
  • CUDA version 11.3
  • NVIDIA driver: 465.19.01
  • ライブラリ
    • torch==1.11.0+cu113
    • transformers==4.19.0

コード (基本的にこちらを参考にしています。)

# ライブラリのインポート
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
# モデル・トークナイザの読み込み
## OPT-13B
model = AutoModelForCausalLM.from_pretrained("facebook/opt-13b", torch_dtype=torch.float16).cuda()
tokenizer = AutoTokenizer.from_pretrained("facebook/opt-13b", use_fast=False)
## OPT-30B
model = AutoModelForCausalLM.from_pretrained("facebook/opt-30b", torch_dtype=torch.float16).cuda()
tokenizer = AutoTokenizer.from_pretrained("facebook/opt-30b", use_fast=False)

モデルを読み込むだけでも数分かかりました。。。

また、この時点でOPT-13BではGPUメモリを26GB程度、OPT-30Bでは59GB程度使用していました。 OPT-30Bを使うだけでも、それなりに大きいメモリのGPUが必要ですね。。。 OPT-175Bは線形に使用メモリが増えるとすると340GB程必要になりそうですが、どうするんでしょうか?

prompt = "Hello, I'm am conscious and"

input_ids = tokenizer(prompt, return_tensors="pt").input_ids.cuda()

# 確率が高いTop 5を生成
generated_ids = model.generate(input_ids, do_sample=True, num_return_sequences=5, max_length=40)

generated_tokens = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)
OPT-13Bの生成結果 Top 5
["Hello, I'm am conscious and aware of my surroundings. I'm also aware of the fact that I'm typing this comment.   I'm also aware that I'm typing this comment in",
 "Hello, I'm am conscious and aware of my surroundings and I'm not a psychopath.\nI'm not a psychopath either. I'm just saying that I have a hard time believing that people",
 "Hello, I'm am conscious and aware of my surroundings. I'm not a fucking zombie.\nI'm not sure if you're aware of this, but zombies are conscious and aware of their",
 "Hello, I'm am conscious and aware of my surroundings.\nI'm aware of my surroundings too. I'm conscious of my surroundings.",
 "Hello, I'm am conscious and aware of my surroundings.\nI'm aware of my surroundings, but I'm not conscious of them."]

若干似たような言い回しの繰り返しが見られますね。 自己回帰言語モデルでよく見られる現象です。

OPT-30Bの生成結果 Top 5
["Hello, I'm am conscious and aware of my actions and I'm not a bad person. I'm just a person who is trying to figure out how to live in this world. I'm not",
 "Hello, I'm am conscious and I'm here to help you.\nI'm not going to hurt you.\nI'm here to help you.\nI'm not going to hurt you.",
 "Hello, I'm am conscious and I'm here to help you.\nI'm not here to hurt you.\nI'm here to help you.\nI'm not here to hurt you.",
 "Hello, I'm am conscious and I'm not dead.\nI'm not dead.\nI'm not dead!\nI'm not dead.\nI'm not dead!\nI'm not",
 "Hello, I'm am conscious and I'm here to help you.\nI'm not sure I can help you.\nI'm not sure I can help myself.\nI'm not sure I"]

13Bよりは流石にいい感じですね。

Few-shot learning QA

文章と質問を与えて回答を予測させる、質問応答タスクを試してみます。

その他参考リンク

公式のテクニカルレポート

arxiv.org

MIT Technology Review

www.technologyreview.jp

おわりに

ここ数年は研究室か自宅に篭って孤独に研究ばかりして論文を書くことに集中していました。 しかし、最新の研究動向や勉強したことをブログで公開することも分野の発展に貢献する一つの方法ではないかと考え始めました。 このようなアウトプットをすると自分の理解が明確になり勉強にもなるので、これからは不定期にこのようなブログを気楽に書いていこうと思います。