🙆

東大LLM開発プロジェクト進捗状況|学習効率化・高速化特化チーム

2024/05/23に公開

第1回:週次報告

開発テーマ・概要

  • PR-MoEのような、MoEの構造のモデルの学習をする
  • 商用利用可能な良質なデータセットの作成

チーム全体の開発状況

データ: wiki40bja
モデル: Mixtral7*8Bのモデルサイズを小さくしたもの, zero3
トークナイザー: 日本語トークナイザー(ja-tokenizer-unigram-v1) May 6, 2024 9:00 AM
wandb
https://wandb.ai/geniac_kumagai/Mixtral-8x7b_wikijp?nw=nwuserkumagai
huggingface
https://huggingface.co/geniacllm/MixtralJauniv1Wikijp

  • Huggingfaceに登録されたモデルからのFinetuningの確認

サブチームからの情報共有

データチーム

  • Ask-LLMとプレ環境の環境構築
    • 進捗状況
      • Ask-LLM論文紹介勉強会を開催(3/17) 参加者10-15名くらい
      • Ask-LLMプロトタイプ実装が完成
      • Ask-LLM論文再現実験
      • プレ環境での環境構築
        • 計算ノードでのJupyterLab環境構築 (→Ask-LLMが実行出来るところまで確認済み)
        • ダウンロード済みCulturaXがロードできるか検証中
  • CulturaXのダウンロード
  • ucllm_nedo_prodのフィルタリングの箇所を調査
  • トークナイザーの学習と連携

次やること

  • モデルチームに仮の日本語データセットの連携
    CulturaXがダウンロード完了したので、ランダムサンプリングして、前処理して連携
  • 前処理方法の検討
  • 最適なトークナイザー探索

モデルチーム

  • 技術調査

    MoEモデルの精度を上げるには、ベースのサイズを大きくする必要がある。

    MegtronDeepspeedでMoEに適応できる並列化の手法が限られている。

    ベースのモデルのサイズが1.3Bまでは、MegtronDeepspeedで対応できるが
    それ以上のサイズにする場合に速度的に問題がある可能性がある

  • 開発方針の決定
    並列化した時の速度的な問題を考慮して以下の3つのモデルに関して、学習コードを作成する

    1. Deepspeed-MoE, ベースモデル GPT 6.7B, 並列化 TP EP
    2. Mixtral 7*8B, 並列化 zero3
    3. Denseモデル 10B (llama2?), 並列化 3D parallelism
  • 開発の進捗

    • Colabでの実験
      1.2.3のモデルサイズを小さくしたものの(3はGPTベース)、事前学習の実行確認
    • 配布環境での実験
      2に関して、wandb、hugginfaceへの登録の確認、標準コードの作成と展開
      3に関して、配布コードの実行確認、wandbまで
  • 次にやること
    学習コードの作成
    パラメータを変えて実験を行い、より良いパラメータを探索する

評価チーム

  • Argilla環境の説明と環境の作成
  • SFTとDPOを行う、SFTとDPOに関する調査
  • GCP環境でのコードの実装方法について確認
  • ORPOという手法に関して調査
  • 開発
    モデルチームから連携されたHuggingfaceの結果にfinetuningができることを確認(Colab)
    日本の首都は?というプロンプトに対して少なくとも国に関する言及は増えたものの、綺麗に都市名を答えるようにはならなかった。

次やること

  • SFT、DPOに関する調査
  • SFT、DPOに関するデータ調査

ディスカッション

  • ニュースデータの提供について、時事通信社様の社長室、NLPに知見のある方とのミーティング
    OSSで公開という点で、データの提供に関して、難しかった。
    日本のニュース系のサイトは、どこもLLMの学習に利用されないようにしている。
    →ニュースのスクレイピングはやめる。
    ライブドアのニュースコーパスは使用の検討を行う

その他

次やること

共有ディスクの運営ルールの策定

第2回:週次報告

チーム全体の開発状況

  • 日本語学習データの前処理
  • トークナイザーの作成とより良いトークナイザーの作り方の調査
  • マルチgpu実験に向けた準備
    • denseモデルのLlama2ベースのコードの作成、動作確認
    • Deepspeed-moeのコードの動作確認
  • モデルの評価の実験
  • DenseモデルでもSFTの実施
  • 事後学習データの作り方の調査

サブチームからの情報共有

データチーム

やったこと

  • トークナイザー
    • 最新のトークナイザー:wiki40bの日本語と英語を混ぜて学習した、Unigramベース。
      形態素解析などの事前処理はしていないので、分割精度はまだ微妙。
      https://huggingface.co/geniacllm/ja-en-tokenizer-unigram-v1
    • 正規化についての調査
    • llm-jp-tokenizerについての調査
  • データ
    • CulturaXの日本語データ前処理
    • CulturaXの英語データ前処理
  • Ask-LLM
    • Otaさんを中心にしつつ、データチームを中心にタスク分担
    • Ask-LLMの推論のためのGPUリソースを利用したい
      • T4インスタンスx1では1週間程度というオーダー
      • →1GPUを専有してもよい

次やること

llm-jp-tokenizerのv3コードを参考にトークナイザーの作成

モデルチーム

やったこと

  • マルチGPU実験に向けた準備
  • Dense10Bモデル
    • wandbグルーブへの接続
      • 接続完了
    • MegatronDeepSpeed解析&実験
      • gpt系:0.35B2000step:wiki40bja&ja-uniトークナイザー
      • HuggingFaceへのアップロード完了
      • llama系0.3?B700step:wiki40bja&ja-uniトークナイザー
        • 学習&checkpoint再学習完了
        • HuggingFaceへの変換コード作成
          • [最後のnorm層の重み]と[softmax前の重み]部分の名称を2箇所修正
  • Deepspeed-MoE
    • wandbグルーブへの接続
      • 接続完了
    • チェックポイントからの再学習、ロールバックしての再学習を確認

次やること

  • HuggingFaceにUpload済みの0.35Bと同じパラメータで、分散学習の動作確認
    • denceモデルに関して、いくつかの並列化の条件で実験、速度の検証
      • tp2、pp2、zero1
      • tp2、pp1、zero3

評価チーム

やったこと

  • 日本語LLMチューニングデータ最前線 - W&B ミートアップ #12 in 東京 参加
    • 指示チューニングも高品質なデータのみを集めた方がパフォーマンスが向
    • 固有表現を含むデータを除外するとハルシネーションを減らせるかもしれない
    • wandbのオートメーションとローンチという機能を使って、学習途中に下流タスクの評価も出来る
  • RakutenAI-7B-chatの調査
    • 商用利用可能 で利用可能
  • SFT
    • LM-Evaluation-Harnessによる評価の実施(エラーが出他ため調査中)
    • モデルチーム作成のDenseモデルのSFT→出力の消失問題発生
    • LLM-jp-1.3BのSFT→max-seq-length=20498にするとLoRAでもA100でメモリ不足
      →分散環境での実行が必要?

次やること

  • 事後学習データに対するAsk-LLM
  • パワープレキシーを試す
  • Ask-LLMのプロンプトの評価のための人手アノテーション
  • 上質な品質データ(MT-Bench向け)を作るための方法の調査

第3回:週次報告

チーム全体の開発状況

  • 事前学習用のデータ準備途中
  • バックアップ用のモデルに関して動作検証概ね終了
  • MegablockベースのMoEのコードを作成中

サブチームからの情報共有

データチーム

  • 事前学習用のデータ準備(マイルストーンを参照)

モデルチーム

  • バックアップ用のdenseモデル
    • 順調に開発が進み、動作確認が概ね完了した
  • MoE用のモデル
    • 以前まで使用していたコードがライセンスの関係上使用が難しくなった
    • Megablockベースのコードを作成、動作が確認できたので、並列化の設定や、追加実装必要な箇所を実装していく

評価チーム

  • SFT用のデータ準備(マイルストーンを参照)

開発のマイルストーン

  • データ準備
    • データチーム:
      • 日本語事前学習データ100Bトークンの準備: 〜4/22
        • データセットの選定: 〜4/15
        • データセットの前処理: 〜4/20
        • データセットのindex処理: 〜4/21
      • 英語事前学習データ150Bトークンの準備: 〜4/22
        • データセットの選定: 〜4/15
        • データセットの前処理: 〜4/20
        • データセットのindex処理: 〜4/21
    • 評価チーム:
      • 事後学習データセットの準備: 〜4/22
        • SFT & DPO 選定: 概ね完了済み
        • SFT & DPO: フィルタリングとArgillaを介した加工 (事後学習データ 10k 程度を想定して加工はLLMと人力を想定)
        • SFT & DPO: ライセンスを加味した上で日本語翻訳(必要なものを対象にLLMの活用を想定)
  • モデル学習コード準備
    • トークナイザー

      • 完成
    • Mixtral(ライブラリ:moe-recipe, 並列化:zero3)

      • 必要な機能は実装済み

      ライセンスが付いていない、ライブラリのため使用が難しい事が判明

    • Llama2(ライブラリ: megatron-deepspeed)

      • 概ね実装済み
      • 並列化の部分が途中
      • 余裕があればskip batchなど取り入れたい
    • Mixtral(ライブラリ: Megablocks, 並列化 3D パラレル ,dmoe , llamaベース )

      • flash attnが反映されていない
      • データ取り込みの部分の精査が必要
      • wandbへのlogの実装が必要
      • huggingfaceチェックポイントへの変換コードの実装が必要
  • シングルGPUでの稼働確認、実績
    • モデルチーム:
      • Mixtral(ライブラリ:moe-recipe, 並列化:zero3)

        • 学習確認
        • 再学習確認
        • wandb連携確認
        • huggingface変換確認

        ライセンスが付いていない、ライブラリのため使用が難しい事が判明

      • Llama2(ライブラリ: megatron-deepspeed)

        • 学習確認
        • 再学習確認
        • wandb連携確認
        • huggingface変換確認
      • Mixtral(ライブラリ: Megablocks, 並列化 3D パラレル )

        • 学習確認
        • マルチGPU動作確認
    • 評価チーム:
      • denseモデルとMoEモデルのLM-Evaluation-Harness評価
        • rinnaモデルで確認済み
        • モデルチーム作成のMoEモデルで確認中(エラーが発生しており対処中)
  • マルチノードでの稼働確認、実績
    • モデルチーム:現在利用できないため停止中
    • 評価・チューニングチーム: 現在利用できないため停止中
  • うまくいきそうか計画の確信度
    • メインで使用していたコードがライセンスが付いていないものを参照していて、困ったがMoEの新しい実装が動き見込みができた

第4回:週次報告

チーム全体の開発状況

サブチームからの情報共有

データチーム

  • トークナイザーの作成
  • LLM-jpと同程度の圧縮率を実現。日本語は1トークンあたり約1.51文字。
    ※本トークナイザは語彙数56,320、LLM-jpは50,570であるため完全に公平な比較ではありません。
  • 工夫したポイント
    • 英日の語彙の割合を6:4に操作
      事前学習のデータの比率に近づけるために英日のトークナイザーを別々に作ってから語彙をマージし、再度、英日混合テキストでunigramのスコアを再推定することで、概ねの語彙の比率を操作した。(参考:llm-jp-tokenizer
      ※英日を5:5で事前学習する予定だが実際には日本語テキストにはかなり英語が混ざっているため6:4にした。
    • 数式やプログラムのテキストからも語彙を取得
      (小規模データだが)数式やプログラムのテキストからも語彙を獲得した。
      頻出する表現を最小限のトークンで処理できるようにする狙い。
    • 日本語を形態素で事前分割する処理
      学習用の日本語テキストは”||||”で事前分割したのちに、SentencePieceのpretokenization_delimiterで分割するようにした。これによって元からある空白を区別して形態素分割した語彙を獲得できた。(参考:Sentencepiece の分割を MeCab っぽくする
    • 日本語の一般語を約10,000件追加
      日本語テキストは単純に学習しただけではカタカナ語が多く、一般的に使われる熟語などが語彙に含まれてこなかったため、wikipedia等から人力で取得した常用語・地名・人名・定型表現などを語彙に追加。
    • 記号や数字を語彙に追加
      よく使われる記号(「」や&や%など)を追加し、漢数字と数字は1桁区切りで語彙に追加した。
    • LlamaTokenizer形式への変換
      事前学習や事後学習のライブラリがLlama系のモデルを想定していることが多いため、T5TokenizerではなくLlamaTokenizer形式にした。
      ※デフォルトではエンコード時に文頭トークンが付くが、文末トークンもつけられるようなカスタムファイルも作っておいた。

モデルチーム

  • dmoeのアーキテクチャを採用

  • 並列化

    • ノード間で、alltoallがあまり行われないように、ノード別にDP、ノードの中でMPになるように設計

    • モデルのサイズとして、mixtral 7*8Bを想定

    • モデル並列8を使用、モデルは8つの部分に分割、各部分はfp16/bf16形式で約10Gのメモリを消費。フォワード/バックワード中に生成される中間アクティベーションを考慮せずに、少なくともモデルパラメータ(fp16/bf16)で10G、勾配(fp32)で20G、オプティマイザーの状態(Adamのbeta1とbeta2で各20G)で40Gのメモリ

      24個のGPUを使用する場合、3つのGPUが同じ部分を担当するので、20Gの勾配と40Gのオプティマイザー状態の負荷が、zero2を通じて各GPUで1/3になり、このサイズで学習できることを想定

  • dmoeの学習モデルのHF変換の作成

  • wandbとの連携

  • 再学習の挙動確認

評価チーム

  • データチーム作業で稼働(4/20(土)まで)
  • Rakuten 7BでSFTをLoRAで実行確認
  • DPOデータセットの準備中

ディスカッション

開発のマイルストーン

  • データ準備
    • データチーム:
      • 日本語事前学習データの準備: 〜4/22
        • データセットの選定: 〜4/15: 完了
        • データセットの前処理: 〜4/20: 完了
        • データセットのトークン量推定: 〜4/20
      • 英語事前学習データの準備: 〜4/22
        • データセットの選定: 〜4/15: 完了
        • データセットの前処理: 〜4/20: 追加の前処理は不要と判断
        • データセットのサンプリング: 〜4/20
    • 評価チーム:
      • 事後学習データセットの準備: 〜4/22
        • SFT & DPO 選定: 概ね完了済み
        • SFT & DPO: フィルタリングとArgillaを介した加工 (事後学習データ 10k 程度を想定して加工はLLMと人力を想定)
        • SFT & DPO: ライセンスを加味した上で日本語翻訳(必要なものを対象にLLMの活用を想定)
  • モデル学習コード準備
    • コード準備完了
  • シングルGPUでの稼働確認、実績
    • モデルチーム:
      • 実行確認
    • 評価チーム:
      • denseモデルとMoEモデルのLM-Evaluation-Harness評価
        • rinnaモデルで確認済み
        • モデルチーム作成のMoEモデルで確認中(エラーが発生しており対処中)
      • denseモデルのSFT FTの確認: 完了
  • マルチノードでの稼働確認、実績
    • 本番環境でテスト
  • うまくいきそうか計画の確信度
    • うまくいかせたいです。

第5回:週次報告

チーム全体の開発状況

  • 本番環境での学習の準備を行いました

サブチームからの情報共有

データチーム

本番環境へのデータのアップロード

データを英日シャッフルさせ学習データとして準備

トークナイザーの改善

モデルチーム

本番環境でのコード動作確認

マルチノードでの速度検証と、モデルサイズの検討

評価チーム

  • データチーム作業で稼働(継続中)
  • Rakuten 7BでSFTをLoRAで実行確認(完了)
  • DPOデータセットの準備中(継続中)
  • SFTデータセットの準備(開始)

ディスカッション

開発のマイルストーン

  • データ準備
    • 評価チーム:
      • 事後学習データセットの準備:
        • SFT & DPO: フィルタリングとArgillaを介した加工
          (事後学習データ 10k 程度を想定して加工はLLMと人力を想定、継続中)
        • SFT & DPO: ライセンスを加味した上で日本語翻訳
          (必要なものを対象にLLMの活用を想定、継続中)
  • モデル学習コード準備
    • 学習コード、HF変換スクリプトなどの一連のものを準備
  • シングルGPUでの稼働確認、実績
    • 本番環境確認済み
    • 評価チーム:
      • denseモデルとMoEモデルのLM-Evaluation-Harness評価完了
  • マルチノードでの稼働確認、実績
    • 本番環境確認済み
    • 速度が遅い問題があったが、ランデブーの設定と、shardingstrategyをfsdpからsdpに変更することで改善した
  • うまくいきそうか計画の確信度
    • モデルサイズが小さくなってしまったが、期間内に学習が終わる目処が立った
    • 評価チーム:
      • SFTのみ学習用ライブラリを変更したので不確実性が少し上がりました
        • SFTはLlama2-Accessoryによって行う手法を試すことを主眼に、trl SFTTrainerはサブとして扱う
        • DPOはtrl DPOTrainerで行う

その他

7*8Bを事前学習から行うことは学習はできたが、事前学習から行う事が速度的に難しい

LLama7Bを学習させて、そちらのパラメータをエキスパートの初期値に7*8Bを作る事も考えたが、チームのリソースを考えて断念した

モデルサイズを小さくして、MoEの構造の事前学習を行う事にした

第6回:週次報告

チーム全体の開発状況

  • 本番環境での学習
  • 学習のモニタリング、SFTの準備

サブチームからの情報共有

データチーム

追加学習データの準備

空きCPUでの前処理動作確認

モデルチーム

本番環境で学習開始

MoEモデルの学習率の調整

HF変換、出力テスト

CPU利用率の調整

評価チーム

途中のチェックポイントからの、空きCPUでの推論確認

ディスカッション

開発のマイルストーン

  • データ準備
    • 追加データの準備中
  • モデル学習コード準備
    • 本番環境学習中
  • シングルGPUでの稼働確認、実績
    • 本番環境学習中
  • マルチノードでの稼働確認、実績
    • 本番環境学習中
  • うまくいきそうか計画の確信度
    • 学習はうまくいきそう、精度を上げたい

第7回:週次報告

チーム全体の開発状況

  • 事前学習の継続と学習率のチューニング、事後学習の準備

サブチームからの情報共有

データチーム

追加学習データとして(AskLLM)の準備、綺麗な日本語データ準備、結合して学習させるべきかの調査

モデルチーム

量子化などを行いGoogle colabでチューニングができるコードの作成

評価チーム

現状のチェックポイントでのタスク評価(lm evaluation harness、評価スクリプト)
LLaMA2-Accessory、trl DPOTrainerによるSFT事後学習
Ask LLMによる事後学習データの評価とフィルタリング

ディスカッション

  • なし

開発のマイルストーン

  • データ準備
    • 事前学習データ完了、追加学習データ(AskLLM)の準備、綺麗な日本語データ準備
  • モデル学習コード準備
    • 事前学習コード作成完了、Finetuningコード作成完了、DPOコード準備中
  • シングルGPUでの稼働確認、実績
    • 事前学習コード、Finetuningコード、DPOコード動作確認済み
  • マルチノードでの稼働確認、実績
    • 事前学習コード、Finetuningコード動作確認済み、DPOコード未確認
  • うまくいきそうか計画の確信度
    • 今のところ順調に進んでいる

その他

  • 学習率を最小にする目安やタイミングについて悩んでいる。

第8回:週次報告

チーム全体の開発状況

  • 事前学習の継続と学習率のチューニング、事後学習の準備

サブチームからの情報共有

データチーム

追加学習データとして(AskLLM)の準備

綺麗な日本語データ準備

追加学習データの処理と本番環境への反映

モデルチーム

追加事前学習データによる学習

SFTの実施

評価チーム

現状のチェックポイントでの評価テスト
SFTデータ、マルチターンデータの準備
Ask LLMによる事後学習データの評価とフィルタリング
DPOの準備

ディスカッション

  • なし

開発のマイルストーン

  • データ準備
    • 事前学習データ完了、追加学習データ(AskLLM)の準備、綺麗な日本語データ準備
  • モデル学習コード準備
    • 事前学習コード作成完了、Finetuningコード作成完了、DPOコード準備中
  • シングルGPUでの稼働確認、実績
    • 事前学習コード、Finetuningコード、DPOコード動作確認済み
  • マルチノードでの稼働確認、実績
    • 事前学習コード、Finetuningコード動作確認済み、DPOコード未確認
  • うまくいきそうか計画の確信度
    • 今のところ順調に進んでいる

この成果は、NEDO(国立研究開発法人新エネルギー・産業技術総合開発機構)の助成事業「ポスト5G情報通信システム基盤強化研究開発事業」(JPNP20017)の結果得られたものです。

松尾研LLMコミュニティへのご案内

Slack参加リンクを始めとして、GENIACの概要やLLMコミュニティ主催各イベント等、関連リンクはこちらにまとめられております。
ぜひご覧ください!!
https://linktr.ee/matsuolab_community

東大松尾・岩澤研究室 | LLM開発 プロジェクト[GENIAC]

Discussion