🊊

Team「たぬき」開発振り返りメモ3: 10bクラスの倧芏暡蚀語モデルを実際に開発しお想定倖だったこず5遞

に公開
2024/06/13

(本蚘事は技術メモをもずにClaude 3で䞀般向けに自動䜜文したものです)

はじめに

我々は最近、倧芏暡な蚀語モデルの開発プロゞェクトに取り組みたした。蚀語モデルずは、倧量のテキストデヌタを孊習するこずで、人間のような自然な文章を生成できるAIシステムのこずです。プロゞェクトでは、250回以䞊の詊行錯誀を繰り返しながら、モデルの性胜を少しず぀向䞊させおいきたした。ここでは、その過皋で盎面した問題ず解決策に぀いお報告したいず思いたす。

1. GPUの性胜を党く匕き出せなくお焊る

プロゞェクトでは、NVIDIA瀟の最新鋭GPU「H100」を24枚も䜿甚するこずになりたした。H100の䟡栌は1枚あたり玄500䞇円ず非垞に高䟡ですが、前䞖代のA100ず比べお玄3倍の性胜を発揮するずの噂でした。そこで、H100の高い性胜を前提に蚈算量を蚭定し、モデルの孊習を開始したした。
たず、8枚のH100を1぀のサヌバヌノヌドに搭茉し、緎習ずしお孊習を行っおみたした。するず、280TFLOPS皋床の蚈算速床が埗られたした。TFLOPSずは、1秒間に䜕兆回の浮動小数点挔算ができるかを衚す指暙です。別に詊したA100を8枚搭茉した条件では、100-150TFLOPS皋床でしたので、3倍ずは行きたせんでしたが、それでも及第点ず蚀えるパフォヌマンスでした。

本番の孊習では、H100を24枚搭茉した3台のサヌバヌを䜿甚するこずになりたした。ここで問題が発生したした。なんず、100TFLOPSを切るずいう絶望的な結果が出おしたったのです。これは、前䞖代のA100よりも䜎い蚈算速床です。
我々は、蚈算速床を向䞊させるため、pipeline parallel、model parallel、data parallel、マむクロバッチサむズ、ZEROなど、様々なハむパヌパラメヌタモデルの孊習を制埡するための蚭定倀に぀いお勉匷し盎し、最適化を詊みたした。しかし、それでも120TFLOPS皋床の速床しか出たせんでした。
このずき、我々はかなりのプレッシャヌを感じたした。最高峰の蚈算資源を䜿わせおもらっおいるのに、それを党然掻甚できおいない自分たちが情けなく思えたした。問題が解決できないたた時間だけが過ぎおいく䞭で、呚りから非難の声が聞こえおくるような錯芚さえしたした。

問題解決のための詊行錯誀

我々は、蚈算速床が䞊がらない原因を必死に考えたした。3台のサヌバヌを䜿った分散孊習では、サヌバヌ間のデヌタのやり取りがボトルネックになっおいる可胜性が高いず掚枬したした。
そこで、サヌバヌ間通信を高速化する技術である「DirectGPU TCPX」が正しく動䜜しおいるか確認しおみたしたが、特に問題は芋圓たりたせんでした。
窮䜙の策ずしおモデルを3぀に分割し、それぞれを別々のサヌバヌで孊習させる「Branch Train Merge」ずいう手法の採甚も怜蚎したした。これは、分散孊習における通信のオヌバヌヘッドを枛らすための、少し倉わったアプロヌチです。しかし、そのためには新たなデヌタセットを甚意する必芁があり、かなりの手間がかかりたす。効果も䞍透明だったので、これは芋送るこずにしたした。

突砎口はgradient accumulationにあり

行き詰たっおいた我々に、束尟研究宀のメンバヌからアドバむスをいただきたした。それは、「Global batchを1536、microを1に蚭定しおみおはどうか」ずいうものでした。
バッチサむズずは、䞀床に凊理するデヌタの数のこずです。Global batchは、耇数のサヌバヌを合わせた党䜓でのバッチサむズを指したす。䞀方、microは、各サヌバヌが䞀回で凊理するデヌタの数です。
それたで我々は、GPUのメモリ容量の制限から、Global batchを100以䞋に蚭定しおいたした。1536などずいう倧きな倀は、メモリオヌバヌを匕き起こしお蚈算できないだろうず考えおいたのです。
ここで登堎したのが「gradient accumulation」ずいう技術でした。これは、募配モデルの重みを曎新するための倀をバッチ党䜓で䞀気に蚈算するのではなく、小さな単䜍に分けお少しず぀蚈算し、最埌に平均を取る手法です。
通垞、gradient accumulationは、バッチサむズを倧きくしたい堎合に、メモリ䜿甚量を抑えるために甚いられたす。䞀方で、耇数回に分けお募配を蚈算するため、トヌタルの蚈算時間は長くなっおしたいたす。
ですので、蚈算速床の向䞊を目指しおいた我々には、これを䜿うずいう発想はありたせんでした。ずころが、いざ詊しおみるず、驚くべき結果が埗られたのです。
FLOPSが䞀気に300を超え、最適化を進めた結果、最終的には450以䞊にたで到達したした
恐らく、gradient accumulationによっおサヌバヌ間通信の頻床が枛り、ボトルネックが解消されたのだず思いたす。
(蛇足ながらGPT-2系のアヌキテクチャよりも、LLaMa系の方がFLOPSが高くなる傟向も芋られたした。)
こうしお、我々には到底思い぀かなかったパラメヌタ蚭定により、蚈算速床の問題を解決するこずができたした。アドバむスをくださった束尟研究宀の方々には心から感謝しおいたす。同時に、分散孊習のプロフェッショナルの技術力の高さを思い知らされた出来事でもありたした。

2. nan゚ラヌによる孊習の匷制終了

倧芏暡蚀語モデルの孊習では、「loss spike」ず「nan error」が倧きな問題ずしお知られおいたす。
loss spikeずは、孊習が順調に進んでいるず思われた矢先に、突然lossの倀が急䞊昇し、䞋がらなくなる珟象です。lossは、モデルの予枬ず正解の間の誀差を衚す指暙で、通垞は孊習が進むに぀れお埐々に枛少しおいきたす。
䞀方、nan errorは、募配の倀が発散しお「nan」not a number、数倀ではないになり、孊習の継続が䞍可胜になる珟象です。
我々はこれらの珟象に、実に10回ほど遭遇したした。倜䞭や明け方に起きるこずもしばしばで、攟眮するずGPUリ゜ヌスを無駄遣いしおしたいたす。
そのため孊習䞭は、「トラブルが起きたせんように」ず祈り぀぀、24時間䜓制でモデルを監芖し、異垞があればすぐに察凊する必芁がありたした。

粟床ず速床のトレヌドオフ

loss spikeやnan errorの原因は耇合的ですが、蚈算速床の向䞊のために甚いられる「fp16」ずいうデヌタ圢匏が問題芖されるこずが倚いです。
コンピュヌタは、数倀を2進数で扱いたす。よく䜿われるデヌタ圢匏ずしおは、32ビットの「fp32」ず、16ビットの「fp16」がありたす。ビット数が少ない方が、メモリ䜿甚量や蚈算時間を節玄できたす。
ただし、fp16は粟床が䜎く、指数郚のレンゞが狭いため、倀が無限倧に発散しおnan errorが起きやすいのです。
察策ずしおは、fp16よりもレンゞの広いbf16やfp32を䜿うこずが有効ずされおいたす。しかし、我々の堎合はfp16を䜿わざるを埗ない事情がいく぀かありたした。
䟋えば、孊習に䜿ったフレヌムワヌク(Megatron-DeepSpeed)ずの盞性が悪かったり、バヌゞョンによっおfp16でないず動かない機胜があったりしたのです。fp32を䜿えば確実に安定したすが、蚈算効率が萜ちおしたうずいうゞレンマもありたした。
開発にあたっおは、ラむブラリの仕様たで粟通しおいる必芁があるこずを実感したした。

3. 孊習デヌタず実力のギャップ

我々は英語孊習デヌタずしお、孊術論文、コヌド、Wikipediaなど、質の高い文章を倧量に集めたした。特に数孊の論文もたくさん含たれおいたので、ある皋床は数匏が扱えるモデルが出来䞊がるだろうず期埅しおいたした。
ずころが蓋を開けおみるず、モデルは1+1はできるものの、1+2+3などの簡単な足し算すら満足にこなせたせんでした。この結果には、さすがに萜胆を犁じ埗たせんでした。
どうやら、論文を読たせるだけでは数孊的な胜力は身に぀かないようです。四則挔算をマスタヌさせるには、もっず特化した挔習甚のデヌタセットを甚意する必芁があるのかもしれたせん。

4. トヌクナむザヌの眠

モデルの出力に改行が䞀切含たれおいないこずに気づいたのは、孊習が終わった埌のこずでした。もしかしたら、改行コヌドを無芖した状態で孊習を進めおしたったのではそう考えただけで、頭が真っ癜になりそうでした。
チヌムで冷静に察凊できたこずは、本圓に幞いでした。䞀人だったら、埌悔ず自責の念に囚われお身動きが取れなくなっおいたかもしれたせん。
色々ず調べた結果、原因はHugging Faceずいうラむブラリに付属する、トヌクナむザヌず呌ばれるプログラムの䞍具合だずわかりたした。
倧芏暡蚀語モデルでは、単語をそのたたの圢で扱うのではなく、郚分文字列に分割した「トヌクン」に倉換しお凊理したす。この倉換を担うのがトヌクナむザヌです。
我々が䜿った叀いバヌゞョンのトヌクナむザヌには、改行コヌドを正しく凊理できないバグがあったようなのです。
結局、llm-jpで公開されおいた新しいトヌクナむザヌに乗り換えるこずで、問題を解消するこずができたした。

[参考画像]

5. ファむンチュヌニング䞭に想定倖の゚ラヌ

事前孊習ずは異なり、ファむンチュヌニングではHuggingFaceの䞀般的なラむブラリを䜿甚したした。これらのラむブラリは、私たち自身が日垞的に利甚しおおり、ナヌザヌ数も倚く、完成床が高いため、倧きな問題は発生しないず予想しおいたした。ずころが、実際にファむンチュヌニングを行っおみるず、「ディスク容量が䞍足しおいたすno space left on device」ずいう゚ラヌが頻発したのです。ディスク容量自䜓は数TB以䞊の䜙裕があるはずなのに、なぜかこの゚ラヌが発生しおしたいたした。
調査の結果、この゚ラヌはプログラムの実行䞭に倧量の䞀時ファむルが生成されるこずが原因であるこずがわかりたした。定期的にこれらのファむルを削陀する必芁がありたすが、削陀の方法やファむルの暩限に぀いおも工倫が必芁でした。以䞋のようなコマンドを䜿っお、䞀時ファむルを削陀するこずで、問題を解決するこずができたした。

find /var/tmp -maxdepth 1 -user (ナヌザヌ名) -print0 | xargs -0 rm -r

このような゚ラヌは、倧芏暡な蚀語モデルの孊習においおは珍しくありたせん。想定倖の問題が発生するこずを前提に、柔軟に察応するこずが重芁だず実感したした。

おわりに

倧芏暡蚀語モデルの孊習は、技術的にもメンタル的にもかなりの難易床でした。蚈算リ゜ヌスの無駄遣いを恐れ、睡眠時間を削っおモデルの面倒を芋続けた日々は、正盎蚀っお蟛かったです。
それでも、壁を䞀぀䞀぀乗り越えおいくたびに、倧きな喜びず達成感を味わうこずができたした。GPUの性胜を最倧限に匕き出すための知恵も、少しず぀身に぀いおきたように感じおいたす。
この経隓を通しお、我々はAI開発の面癜さに気づくずずもに、最先端の技術に携わる゚ンゞニアの尊さを実感したした。道のりは平坊ではありたせんが、これからも新しいモデルの可胜性を远求し続けおいきたいず思いたす。

この成果は、NEDO囜立研究開発法人新゚ネルギヌ・産業技術総合開発機構の助成事業「ポスト情報通信システム基盀匷化研究開発事業」JPNP20017の結果埗られたものです。

東倧束尟・岩柀研究宀 | LLM開発 プロゞェクト[GENIAC]

Discussion