前回の記事で書いた通り、機械学習環境を構築したので何か動かしてみたくなった。適当にいいものがないかを探したところ、以下のような本を見つけた。
「作りながら学ぶ! LLM自作入門」というもので、GPT2モデルのサンプルプログラム(jupyter形式)が付属しているという素晴らしい付録付き。
早速、サンプルプログラムをインストールして動かしてみた。ただ、さすがにVRAM 1GBでは少なすぎたのでgt710 2GBを入手し差し替えた。
LLMの実装の超適当ざっくり説明
この本のサンプルプログラムは、約1億2000万パラメータ(0.12B)からなるGPTモデルを実装し、openAIが公開しているGPT2の重みを読み込めるものとなっている。モデルの実装をざっくり説明すると、
- トークナイザーによる単語(厳密にはトークン)の切り分けとID付与
- トークンIDごとに任意の次元の数値のセットを作成(トークンごとにベクトル作成)
- アテンションメカニズム(任意繰り返し)
トークンとは、単語とは少し違う切り分け方をしていて、日本語なら例えば、単語の先頭に来る「新」「元」「再」「副」などを切り分けたほうがよいといった感じに、単語をさらに分解したほうが学習効率が上がる工夫をしたものである。
アテンションメカニズムには、欲しい単語の後に続く単語を学習時に反映させないためのマスク、過学習を防ぐための間引きマスク、学習時に前の層にちゃんと減衰せずに値を接続するためのショートカットなども実装している。
ちなみに、gptの核心的部分であるアテンション(Multi-Head Attention)については、以下のサイトが本当に参考になった。
ローカルマシンで学習させてみる
サンプルプログラムをCPUで学習させてみた。
| CPU | Intel(R) Core(TM) i5-6400 CPU @ 2.70GHz |
| メモリ容量 | 16GB |
5章にあるサンプルプログラムの学習にかかった時間は約7時間であった。
次に、GPUを使ってやってみた(gt710 2GB)が、初期設定条件ではメモリがオーバーしてしまった。
VRAMメモリを超えない程度にパラメータ数を調整(約3300万:0.03B)し、不要なテンソルをVRAMメモリから削除するロジックを加え、CPUとGPUでの処理速度を比較してみる。
調整したパラメータ
| 学習時に一文に含まれる単語の量(context_length) | 256 |
| 単語ベクトル次元数(emb_dim) | 384 |
| アテンションヘッド数(n_heads) | 8 |
| トランスフォーマー数(n_layers) | 8 |
これ以外は初期値のままで、3300万パラメータに調整した。ちなみに、この本のパラメータ初期値は、GTP2-smallのもので、GTP4についてはGTP4自身にパラメータ数を聞いてみたところ、数千億以上とのことだった。ざっと数千~数万倍といったところ。
CPU vs GPU 速度比較
5章にあるサンプルプログラムの学習にかかった時間は以下の通り。
- CPU:2時間11分20秒(7880秒)
- GPU:2分45秒(165秒)
7880÷165=47倍
gt710 2GB恐るべし。めちゃくちゃ早くなっている。予想以上。
感想
アテンション機構を活用し、単語列の傾向から次の単語を予測するが、そこでは人間が普通に感覚として持っている文脈を、パラメータから生み出させることになる。大量のパラメータを用意して文章の傾向を重みに学習させた構造で、重みの中に文章内(切り出す単語数より外の文章との関係はさらに)の文脈として内在している論理の階段(因果律)の法則性が内在しているかどうかが興味をそそるところ。
因果律といっても、一般的に多くの人が共通して持つ常識的ルートや自然科学など理論として確定したルート、はたまた個人の価値観や感情に左右されるルートなど、さまざまあるので難しいとは思うが、学習データを増やしてゆけば、そこに当然多く含まれる一般的なルートは押さえられるのではないかとも思った。
現在進化しているLLMはGPUを大量に投入してリアルタイムに学習させて、パラメータを大量に増やし、世界中のネット上のすべてに書き込まれた文字列パターンを記録する勢いの、新しい形の大規模ストレージの検索技術、といった印象。ただし、因果律が内在、蓄積されていれば、今までのデータの蓄積の組み合わせを超えて論理を進ませる、それこそ研究や創造的作業、気を利かせて先回りするといった作業など可能になる可能性がある。
あと…….今回の実験で実感したがGPUの効果はすごい。が、やっぱりVRAM2GBは少なすぎる。まずはこの書籍のデフォルト値設定でのGPTを動かしたい。安くいきたいのでマシン自作に初挑戦してみるか…。

コメント