七難ハック
日本語事前学習済みALBERTモデルを公開した話のアフタートーク
最終更新: 2021/12/20

いやーついにできたって感じでした。

ken11/albert-base-japanese-v1 · Hugging Face
We’re on a journey to advance and democratize artificial intelligence through open source and open science.

これね
これの制作裏話とかアフタートークです
本編はZennでしてます


大きなインスタンスをください

こんなしょうもないツイートをする程度には学習が大変でした。
マジで、今回完全自宅学習という点もすごくないですか?笑
そうなんです、クラウド使わずに自機オンリーで学習しました。ちなみにいま積んでるのは2080Tiと3080Tiの2枚刺しです。

いや、そうなんすよ、この規模の学習するのにクラウド使ってたら破産しちゃうので。
それで仕方なく熱風に炙られながら一生懸命自分のマシンで学習させたんですけど。
騒音もすごくて寝るのも大変で←
というかそれでもすげえ電気代かかるんですよ!
試算したらだいたい3万くらいかかってると思います。
だってドライヤーが24時間動いてるようなもんだし。

はい、なので今回ばかりは言いますが、もし「このモデル便利だな」とか思ってもらえたらわずかでもいいので、気が向いたらいくらか恵んでください。。。

無いと思ってるけど、万が一恵んでもらえたら今後の学習のための設備投資にします(3090Ti欲しい!)

つくった理由と思ってること

そうですね、ありがたいことに本業でもガッツリNLPに携わることができて、この一年はいろいろ思うところがありました。年始にこのブログを始めたわけですが、当初はこんなことやってたなとか思いつつ。

最近よく思うことが2つあって、1つは「BERTはデファクトスタンダードになった」ということ、もう1つは「一方でプロダクションレベルの実例が少ない」ということです。

いろいろNLPのモデルって出続けてますけど、BERTほど愛されてるのもなかなかないんじゃないでしょうか?笑
日本においてそれはひとえに東北大のおかげだと思ってるんですよね。東北大BERTがとっつきやすくできてるから、いろんな人が試しに使ってみていて、その結果ドキュメントが多くなるからみんなBERTに手を出す、みたいな。

一方で、そのBERTがまあまあファットなモデルで、プロダクションレベルで考えるといろいろ悩ましい点も多いんじゃないかって思ってます。
ファットであればメモリサイズは必要になるし、ロードのレイテンシも発生します。PoCでは許容できてもプロダクションで許容できないケースも多々あるのではないか、とか思うんですよね。
そうなったときに、デファクトスタンダードと言っても過言ではないと思えるBERTを使わないという判断はできるのか?
それもまた難しいと思うんですよ。難しいというか、BERTを活かす方がキャッチアップとか早くてよさそうだと思うんです。(キャッチアップ云々でいうと、NLPはもうhuggingfaceに全振りしちゃっていいなって僕は思ってますね)

長くなりましたが、そういうBERTの「ドキュメント量が多くキャッチアップが早そう」という強みを活かしつつ、ファットで取り回しが悪い面を解決できるのが、A Lite BERTことALBERTだと思いました。しかしALBERTの日本語事前学習済みモデルはhuggingfaceだと1件しかなかったので、自分で作ろうと思い立った次第です。

ALBERTの日本語事前学習済みモデルが増えたり広まったりすれば、いまのBERTの勢いをそのままに、様々なシーンでNLP活用が進むのではないか、という思いです。

当初うまくいかなかったこと

これそもそもいつから取り組んでたの?っていうと11月の終わりです。お仕事が一段落したので手を付けた感じでした。
なのでほぼ1ヶ月かかりました。
実は最初、v2のアーキテクチャで作ってたんですが、(それが原因かどうかはわからないけれど)勾配がいなくなっちゃう問題にぶつかりまして…ググると結構出てくるんですが、ALBERTの事前学習って勾配がお出かけしてしまいがちっぽいんですよね。
僕もご多分に漏れずあるところから完全にlossが下がらなくなりました。収束とかではなくシンプルに迷子

そういうこともあって、10日間くらい失ってます、もちろんその分の電気代も一緒に。。
対策として、2回目の学習はアーキテクチャをv1にしたり、学習率とそのスケジュールもいろいろ計算して進めました。雑に学習させてもうまくいかないというのを思い知った←

あと、Tokenizer云々の問題はZennでも書いたとおりですね。
ありがたいことにコメントでアドバイスももらいましたが、それでも解決にはならなかったです。
ただ、根本的にあれはどう考えてもPreTrainedTokenizerクラスの挙動が悪いと思ってる。PullReq出していいすか?

収穫があったこと

1つはもちろん自機で存分に学習ができてうまくいったことですね。クラウドに頼らずこれだけの学習をブン回せる環境が手元にあるって、正直めちゃくちゃ気持ちいいです笑

そしてdeepspeedを使ったのも収穫でした。上述の通り、10日間という時間を虚しく失っていたので、年内にやりきりたいという思いもあって2回目はdeepspeedを投入しました。
正直初めて使ったし、ホントに速くなるのかとかいろいろ不安でしたが無事に学習できてよかったです。一応手元の環境では倍速くらいまで速くなったのでめちゃくちゃ助かりました。
たぶんそのうち「deepspeedめちゃくちゃいいぞ」的な記事もどこかに書くと思います。それくらいよかった。

計算リソースの話

そんな感じで、今回は完全自宅学習で突っ走りましたが、これにはお金以外の理由もあって、まず以て世界の計算リソースが枯渇しているといっても過言ではない状況というのがあります。
AWSのGPU付きインスタンスはもはやスポットでは取れない状態、オンデマンドでも取れない事態が発生している状況です。価格も高いですがそもそも計算リソースの争奪戦が始まっていると感じます。
そんななかアリクラは東京リージョンにA100を積んだインスタンスを投入してくれるようです。
あるいはGCPのTPUを利用する手もあるでしょう。

今後はそういった計算リソースが手に入るクラウドを柔軟に選択して使えるようにしたり、あるいはAWSならTrainiumのような非nVIDIA(非CUDA)環境でも学習ができるように準備を進める必要があると感じてます。

マジで、計算リソースの問題で作りたいモデルが作れなくなるのが一番残念なので、ここは日頃から敏感になっておいたほうがいいなあと思ってます。

今後の話

今回これを出せたことで、2021年の集大成的なアウトプットになったなあと、我ながら結構満足しています。
今年はとにかく「ガッツリとNLPに取り組む」という思いを持って転職したりいろいろしていたので、最終的に現代のNLPタスクの基底となる事前学習済みモデルを作って出せたのはよかったかなと。
来年以降もこうやってプライベーターとしてもモデル作ったり出せたらいいなとは思ってます。ALBERTも、Sentencepieceじゃないものも作れたらいいなとか、考えてます。

僕は口癖が「日本語の自然言語処理に関する問題は日本人しか解決しない」なんですけど、やっぱりまだまだNLPに取り組む人が少ないなと感じてます。
僕は文系ですし日本語自体がとても好きなのでこうやってプライベーターとしていろいろやってますが、そういう人がもっと増えたらいいなと思ってます。
これでも近年はhuggingfaceのおかげでだいぶ増えたなあとか思ってますが、もっと増えるにはやはり積極的にいろんなタスクアプローチを紹介したり、今回みたいに気軽に使えるモデルをオープンにすることが大事ではないでしょうか。

たくさんの人が気軽に自然言語処理に取り組める世界になったらいいなと思うので、1ミリでもその助けになれるようこれからも精進してまいります。