🖥

ABCIの大規模言語モデル分散学習ハッカソンを振り返る

2023/08/14に公開

7月6日〜14日の9日間、ABCIの主催で 第1回大規模言語モデル分散学習ハッカソン が開催されました。自分はいいだしっぺチューターとして参加したのですが、今回のイベントは個人的な学びも多かったし、なにより楽しかったので、忘れないうちに振り返っておこうと思います。

いいだしっぺというのは、3月に上記の tweet をしたら NVIDIA の @sfuruyaz さんが拾って諸々進めてくれた、という話です。自分はイベント内容の案をだしたり、技術検証やサンプルプログラムを作成したりしました。

イベント概要

イベント概要は以下の通りです

  • 期間: 2023/07/06 - 2023/07/14 (9日間)
  • 場所: オンライン(初日・最終日はオフラインとのハイブリッド開催)
  • 参加数: 20チーム
  • 提供リソース: Vノード(1000 ABCIポイント)
  • サポート: チューター(言語モデルや機械学習、GPUの専門家)11名によるサポート
  • ハッシュタグ: #ABCILLM

ABCI(AI Bridging Cloud Infrastructure)とは産総研の構築・運用する人工知能処理向け計算インフラストラクチャ、要するにAI用のスパコンのことです。大学や研究機関だけでなく、日本国内の一般企業も利用することができます。今回のハッカソン では、参加者に ABCI を利用した大規模言語モデル(LLM)の訓練(主にファインチューニング)を体験してもらいました。

大規模言語モデルの訓練には数十G〜数百GのGPUメモリが必要であり、少しハードルの高いものとなっています。そこでABCIのようなスパコンを利用することになるのですが、スパコンはスパコンで知見を持っている人が少ない。**じゃあ、興味のありそうな人にABCIを使ってもらおう!そうしたら、スパコンに慣れてくれて大規模言語モデルの訓練のハードルも下がるし、知見もSNSとかで共有できるじゃん!**というのが今回のイベントの趣旨です(※ これは個人の見解が含まれています)

ABCIの利用はポイント制となっていて、今回はチーム毎に1000ポイント付与されました。1000ポイントというのは、V100が4基積んであるVノードを1000時間、つまりV100を4000時間利用できるポイント数です。

チューターにはSlack等で(初日と最終日は物理でも)気軽に質問でき、詰まったポイントを一緒に考えてくれます。チューター陣はお世辞ではなく豪華で、特にNVIDIAの中の人に分散処理のあれこれを質問できて、一緒に問題解決に取り組んでもらえる機会はなかなかないのではないかと思います。実は(大規模言語モデルではないですが)スパコンを使った同種のイベントは過去に何度か開催されており、自分もチューターとして参戦[1]していますが、自分以外のチューターから色々学べて楽しいというのがモチベーションになっています。

取り組みテーマ

今回のイベントでは、チーム毎にテーマを考えてもらって取り組んでもらいました。独自データでファインチューニングにチャレンジするチーム、マルチモーダル言語モデルに取り組むチーム、とにかく大きなモデルをABCIのパワーを使って訓練させるチームなど、チーム毎に個性があって楽しかったです。

成果の公開は必須としていませんでしたが、いくつかのチームは結果を公開してくれました

https://www.mi.t.u-tokyo.ac.jp/blog/event/大規模言語モデル分散学習ハッカソンに参加して/
上の記事では、DeepSpeed や Megatron-LM(Megatron-DeepSpeed) を使って分散学習に取り組んだ結果を、ライブラリ毎にまとめてくれています

https://zenn.dev/turing_motors/articles/ce20c5202e107e

Turing さんは、BLIP2(画像とテキストを入力として、説明文を生成するモデル)を改造して動画に対応させ、走行動画を説明する言語モデルを作成されていました。さらに 20台のVノード(=80基のV100) で分散学習してみたりと、やりたいほうだいでした

https://github.com/shunk031/abci-llm-distributed-training-hackathon-01
上のリポジトリでは、@shunk031さんが LLM Foundry を使って巨大なモデル(MPT-30B)の訓練に取り組んだときのコードを共有してくれています。

企画からイベント開催までの時系列

きっかけとなった tweet が 3/22 で、開催が 7/6〜7/14 なので、ざっくり3ヶ月ほどかかったことになります。自分がイベントを開催するときは大体2ヶ月くらい前から準備(1か月前までに登壇者と調整、3週間前目処に参加者を募集開始する)をすれば間に合うのですが、今回は事前検証や調整、本業との兼ね合いもあり、3ヶ月でもあまり余裕はありませんでした。
もちろん開催を後ろ倒しにするという選択肢もありましたが、ABCIの利用状況やLLMを取り巻く状況などを考慮して、後ろ倒しにするよりは準備を頑張って早めに開催するほうがよい、という結論にいたりました。

以下、かいつまんで準備内容を説明します。

  1. GCPでの事前検証
    ABCIで検証する(検証用にポイントを発行してもらう)には企画が通っていないといけませんでした。そこで、事前検証としてGCP上で実際に大規模言語モデルの訓練をおこない、イベントでどの程度のことができそうかを見積もることにしました。ABCIで利用できるGPU(V100)とメモリサイズを合わせるため、GPUにはT4を4枚利用しました(A100やV100も試したのですが、経済的な理由や入手しやすさの観点からT4に落ち着きました)
  2. ABCIでの検証
    無事検証用のポイントを発行してもらった後は、ABCI上で検証を続けました。GCPでの事前検証で作成したコードはだいたい動くだろうと予想していたのですが、細かいハマりポイントが複数あって割と時間がかかりました。といっても、実質的に手を動かしていたのは平日の早朝、子供が起きてくる前の時間だけなので、工数に換算すると2〜3日くらいだったかな、という印象です。
  3. サンプル作成
    検証に利用したコードを整理して、README.mdをつけてサンプルコードとしました。本当は2週間くらい前には提供しておきたかったのですが、結局当日の早朝に完成して配布することになりました。

振り返り

よかったこと

  1. Slack上での参加者同士のやりとりが活発だった
    今回のイベントで一番良かったなと思ったのは、Slack上での参加者同士のやり取りが活発だったことです。Slack 上で自分がハマった点や得られた知見を共有してくれたり、別チームの質問に回答してくれたりしました。
    過去の同種のイベントでは、参加者が Slack 上で質問を投げ、それをチューターがみてアドバイスする、というやり取りばかりになることが多かったのですが、チューターも教えてばかりだとやっぱり疲れてしまいます。チューターは基本的にボランティアなので、やっぱりイベントを通じて何かしらを得たいんです。
    今回は自分も知見の無いような内容であっても参加者同士でバンバン議論してくれていて、スレを眺めているだけでも勉強になりました。また、サンプルコードのバグを見つけてくれたり、修正してPRを送ってくれたりもしました。

    今回参加者同士のやりとりが活発だった要因はいくつかあると思いますが、パッと思いつくのは以下の4つです。

    1. 事前連絡にも Slack を利用した
      • 事前にSlack チャンネルへの参加をお願いし、スライドの依頼や連絡事項はSlack上で行いました。そのため、多くのチームがイベント開始以前にSlack上で一度は発言していたため、Slackへの書き込みの心理的なハードルが下がったのでは無いかと思います
    2. Slack上での盛り上げ役がいた
      • 盛り上げ役というか、カジュアルに発言してくれる参加者がいると、Slack へ書き込みやすくなるだろうと思います
    3. サンプルコードを提供した
      • せっかく一週間あるのに環境構築に手間取るともったない、ということで、今回はサンプルコードを用意して、とりあえずコピペすれば複数GPUを使った訓練はできるようにしました
      • 結果、複数のチームが同じコードを改修する形で進んだので、お互いにアドバイスしやすかったんだろうと思います。逆にいうと、チーム毎にコードベースが異なるとハマるポイントもばらばらだし、別チームのコンテクストを理解しているわけでもないので、参加者同士での問題解決は非常にハードルが高いものになっていただろうと想像できます。
    4. イベントの趣旨を「大規模言語モデルの訓練」に絞っていた
      • サンプルコードの件と同じですが、それぞれのチームが似た目標に取り組んでいるということで、チーム毎のコンテクストの理解が容易だった、というのもありそうです
  2. サンプルコードが活用された
    深層学習に取り組んだことがある方はわかると思いますが、一番ハマりやすいのは環境による違いです。特に今回のようにGPUを使う場合は、環境の微妙な違いによって挙動がかわってしまったりします。せっかく9日間限定のABCIポイントを配布するのだから、環境構築周りでハマると勿体無い。少なくともスタート地点までは一瞬でたどりついてもらってポイントを有効活用してもらおうと思い、ABCIで動作確認したサンプルコードを作成して配布することにしました。
    その結果、ほとんどのチームが複数GPUもしくは複数ノードでの訓練にたどり着き、それぞれ独自のテーマに取り組むことができました。もちろん、サンプルコードがなくてもできたかもしれません。ただ、サンプルプログラムの作成時に自分がいろんなところにハマりまくったことを考えると、少なくとも時間の大幅な短縮には貢献できたと信じています。また上述の通り、参加者同士のコミュニケーションのハードルを下げるのにも貢献できたと思います。
    https://github.com/ohtaman/abci-examples/tree/main/202307

  3. NVIDIA勢の圧倒的なサポートがあった
    イベント概要でも触れた通り、毎度のことながらNVIDIAの布陣が豪華でした。自分は機械学習・深層学習のアルゴリズム周りのことはサポートできますが、GPUの細かい挙動や NVIDIA の最新の技術についてはサポートできません。特にABCIのパワーを引き出そうとするとGPU周りの知識は必須なので、とても心強かったです。

  4. V100でもなんとかなった
    ABCIで利用可能なGPUにはA100とV100があります。今回利用できたのはV100でした。V100は古い世代のGPUでメモリも少なめ(16G)です。A100であればOSSになっている言語モデルはだいたいGPUのメモリに収まるので、ほどほどの大きさの言語モデルであれば特に工夫することなく単一のGPUでも訓練することができます。一方V100で訓練しようとすると、最低限複数GPUを利用する必要があり、ハードルが上がります。そのため、最悪半分くらいのチームが訓練できずに終わってしまうのではないか、と心配していました(それもあって今回はサンプルコードを提供することにしました)が、それは杞憂であることがわかりました。もちろんA100が使えるに越したことはないのですが、V100でも工夫次第で面白いことができることがわかりました。

改善できそうなこと

  1. サンプルコードの事前提供ができなかった
    元々は、時間的な余裕もあるし、サンプルコードを徐々に拡充していきながらブログみたいな感じで定期的に発信していこうと考えていたのですが、案外時間を取ることができず、定期的な発信どころか当日までコードを提供できませんでした。また、初日の講義資料を作る時間すら取れず、README.me を資料代わりとすることになってしまいました。思いつく要因は以下の3点です。

    1. 本業との兼ね合いでイベント準備に使える時間が限られていた
    2. 3ヶ月という期間を甘く見ていた
    3. (想像していた通りですが)色々なハマりポイントがあった。サンプルプログラムという都合上原因をきちんと把握して、必要に応じて解説コメントを書く必要があり、想像以上に時間がかかった

    今回はゼロからサンプルプログラムを構築したので時間がかかりましたが、例えば第2回を企画する場合はサンプル作成の工数が大幅に削減されるはずなので、何とかなりそうです

  2. 余裕をもった告知や事前連絡ができなかった
    上でも何度か書いていますが、今回は初回で事前検証が必要だったこともあり、3ヶ月という準備期間は何だかんだで短かったです。そのため、イベント告知や参加者への事前連絡、サンプルコードの提供も後手後手に回ってしまった印象がありました。改善できそうではありますが、今回はあえて早めに開催するという選択肢を選んだので、仕方がなかったと思います。

個人として良かったこと

  1. とりあえずつぶやいてみたらイベントに繋がった
    とりあえず発信しておくのは大事だな、と思いました。準備期間中、NVIDIA の方にも何度か「まさかこんなことになるなんて思ってなかったでしょ」と言われましたが、実はこういったイベントにつながる可能性は1割くらいあるだろうと思っていました。というのも、以前に TensorFlow World というイベントの参加レポート で「今度NVIDIAの方を捕まえて、絶対日本でやってもらおう。」と書いたところ、本当に実現した ことがあったからです。NVIDIAの方々のフットワークの軽さは知っていたので、とりあえずつぶやいておいて、あとでNVIDIAのかたにお声がけしてみようかなと思っていたら、声をかける前に企画が進んでいった、というのが真相です。
  2. チューターとしても楽しめた
    サンプルコード作成やチューターとしてのサポートに加え、Slack 上での活発な議論や最終日の成果発表会など、個人として学ぶことが多く、チューターとしても楽しいイベントでした。
  3. 手を動かして感覚を掴むことができた
    最近LLMが流行っているし、ChatGPT や VertexAI の API を叩いてキャッキャするのも自分は好きなんだけど、それらの基礎になっている部分もちゃんと把握しておきたい、でもできていない。という思いがありました。そもそもOSSの基盤モデル、どれくらいのことができるんだっけ?APIではなくてOSSのモデルを独自に運用するメリットはどこにあるんだろう?複数ノードでの訓練はどれくらいハードルが高いんだろう?訓練にどれくらい時間かかるんだろう?適切なデータ量は?など、気になることはたくさんあるものの、手を動かす時間がなかなか取れないでモヤモヤしていました。
    サンプルコードの作成を通じて、多分自分が一番たくさん地雷を踏んでハマったこともあり、何となくどれくらいの規模のモデルでどれくらいのことができて、どれくらい時間が掛かって...といった点の感覚を掴むことができたのが一番の収穫だったと思います。

まとめ(というか雑感)

いいだしっぺ兼チューターとして参加した第1回大規模言語モデル分散学習ハッカソン について、自分視点でざっと振り返ってみました。ここ数年、コロナの影響で物理開催するイベント・勉強会が減りました。それによって、主催者のメリットが減ってしまったと感じています。自分はイベント後の懇親会でいろんなジャンルの人と話すのが楽しかったのですが、オンラインではなかなかそうはいきません。登壇する場合も、オンラインだと聴衆の反応がわからず、ただ情報を提供して終わりになりがちです。情報を提供する側と受ける側に分断されてしまうと、提供側のメリットが少ないなぁと(少なくとも自分はつらいなと)感じていました。今回のように参加者が活発にやりとりをしてくれると、企画側も得られるものがあるし、また企画しようというモチベーションにもつながります。今まさに物理イベントが徐々に増えてきていますが、企画する側にも参加者にもメリットのあるイベント企画を心がけたいなと思いました。

脚注
  1. ABCI(産総研), TSUBAME(東工大), 不老(名古屋大), Reedbush/Wisteria(東大) など ↩︎

Discussion