Upgrade to Pro — share decks privately, control downloads, hide ads and more …

2024/11/8 関西Kaggler会 2024 #3 / Kaggle Kernel で ...

Kohecchi
November 08, 2024

2024/11/8 関西Kaggler会 2024 #3 / Kaggle Kernel で Gemma 2 × vLLM を動かす。

Kohecchi

November 08, 2024
Tweet

More Decks by Kohecchi

Other Decks in Programming

Transcript

  1. モチベーション Q1. なんで Gemma 2? → LMSYS や atmaCup #17 で

    Gemma 2 が大活躍 Q2. なんで vLLM? → 推論がめっちゃ速いらしい
  2. LMSYS https://www.kaggle.com/competitions/lmsys-chatbot-arena ❖ 開催期間: 2024/5/3 ~ 8/3 ❖ 主催: LMSYS

    Chatbot Arena ❖ タスク:2つのLLMに与えた Prompt と モデルの回答 から 勝敗を予測する
  3. LMSYS上位解法 - LLM&推論高速化 LLM max_len 量子化 その他 高速化 1st Gemma2-9b-it

    x2 (TTA) 2000 GPTQ 8 bit Data Parallelism 2nd Gemma2-9b-it RLHFlow/ArmoRM-Llama3-8B-v0.1 4096 4096 ? Data Parallelism 高速化ライブラリのOperator移 植 3rd sfairXC/FsfairX-Gemma2-RM-v0.1 Gemma2-9b-it 4096 3072 bnb 4bit vllm(学習データ生成時) 4th Gemma2-9b-it 3072 情報なし 情報なし 5th Gemma2-9b-it 4096 ※8kも可 bnb 8bit Data Parallelism 長さでソート&バッチ化 Gemma2-9b-it が強かった。T4 x2 だと 2 models アンサンブルで9時間がギリギリ。 高速化手法なしだと、1 model の推論も終わらない。
  4. model_0 = Gemma2ForSequenceClassification.from_pretrained( cfg.gemma_dir, device_map = torch.device('cuda:0'), use_cache = False,

    ) model_1 = Gemma2ForSequenceClassification.from_pretrained( cfg.gemma_dir, device_map = torch.device('cuda:1'), use_cache = False, ) … data = data.sort_values("length", ascending = False) sub_1 = data.iloc[0::2].copy() sub_2 = data.iloc[1::2].copy() with ThreadPoolExecutor(max_workers=2) as executor: results = executor.map(inference, (sub_1, sub_2), (model_0, model_1), (device_0, device_1)) Data Parallelism - 各GPUにモデルをロードして並列処理 GPU 0 にモデルをロード GPU 1 にモデルをロード データを2つに分割して 各GPUで並列処理
  5. llm = vllm.LLM( model = model_name, tensor_parallel_size = 2, gpu_memory_utilization

    = 0.95, dtype = "half", enforce_eager = True, max_model_len = MAX_LENGTH, ) tokenizer = llm.get_tokenizer() sampling_params = vllm.SamplingParams( top_p = 0.9, temperature = 0, seed = 777, skip_special_tokens = True, max_tokens = 1, ) responses = model.generate( prompts, sampling_params = sampling_params, ) コードもシンプル モデルのロード tokenizer の取得 推論 パラメータ設定
  6. vLLM x Gemma2 x Kaggle GPU の相性が良くない Kaggle で使える GPU(T4,

    P100)が古すぎて、Flash Attention 2 がサポートして いない(= Kaggle環境の vLLM で Gemma 2 が動かせない) [Bug]: Gemma-2-2b-it load model hangs by vLLM==0.5.1 on Tesla T4 GPU #7464 「もっと新しいGPUを使え」とし か言えない。もしくは、flash attention が T4 をサポートする のを祈るんだな。
  7. つまづきポイント • import vllm でエラー → pip install 順の修正、 --force-reinstall

    オプション追加 • モデルロードでエラー → config.json 修正 • 推論でエラー → Parameter 修正 : : 数多のエラーを 乗り越えて ようやく動いた
  8. 検証結果 LMSYS の Test データ(約25,000件)で推論時間を検証。vLLMめっちゃ速い! # LLM vllm 量子化 max_len

    その他 結果 1 Gemma2-9b-it なし なし 1000 ー T4 16GB に載らない 2 Gemma2-9b-it なし bnb 4 bit (Unthlos) 2048 ソート Data Parallelism 4時間40分 3 Gemma2-9b-it なし bnb 4 bit (Unthlos) 3072 ソート Data Parallelism 6時間00分 4 Gemma2-9b-it あり なし 1000 なし 1時間36分 5 Gemma2-9b-it あり なし 2048 なし 2時間14分 6 Gemma2-9b-it あり なし 3072 なし 2時間20分
  9. まとめ # LLM 種類 LoRA vllm Unsloth 結果 1 Gemma2-9b-it

    Causal なし あり なし 〇 動く。めっちゃ速い 2 Gemma2-9b-it Causal あり あり なし 〇 動く。めっちゃ速い 3 Gemma2-9b-it Causal なし あり あり × 動かず 4 Gemma2-9b-it Classifier なし あり なし △ひと手間必要そう(未検証) • vLLM × Gemma2 × T4 の相性が悪いが、Causal モデルであれば使える • 推論はめっちゃ速い • しばらくは LMSYS の公開ノートブックを使う方が安全かも
  10. atmaCup #17 データで Gemma 2 + LoRA × vllm ×

    T4 を動かす推論コードを公開 https://www.kaggle.com/code/kohecchi/atmacup17-gemma2-lora-x-vllm-causal-infer