Fugaku-LLM-13BをTransformers + bitsandbytesで動かしてみる

はじめに

スーパーコンピュータ富岳を使って学習された日本語LLM「Fugaku-LLM-13B」と「Fugaku-LLM-13B-Instruct」をTransformersで動かしてみました。

Fugaku-LLMの詳細については以下のプレスリリースを確認してください。 pr.fujitsu.com

動作環境

ハードウェア

  • CPU : AMD Ryzen7 3700X
  • RAM : 80GB
  • GPU : NVIDIA GeForce RTX3090

ソフトウェア

  • OS : Windows11 23H2
  • Python : 3.10.11

Pythonライブラリ

  • Torch=2.2.2
  • Transformers=4.39.3
  • bitsandbytes=0.43.1
  • accelerate=0.29.1

環境構築

モデルのダウンロード

HuggingFaceの以下のページからモデルをダウンロードします。 ライセンスへの同意が必要なためアカウントの登録が必要です。

Fugaku-LLM-13B

huggingface.co

Fugaku-LLM-13B-instruct huggingface.co

Python環境の準備

Transformersでそのままモデルをロードした場合、GPUメモリが足りないため一部がRAMにロードされ処理が遅くなりました。そこでbitsandbytesを使ってモデルの量子化することでGPUメモリの不足を解決しました。

pipコマンドでbitsandbytes、accelerateをインストールします。

pip install bitsandbytes accelerate

モデルロード時に、以下のようにquantization_configを追加することで量子化をすることができます。

quantization_config = BitsAndBytesConfig(load_in_4bit=True,
                                         bnb_4bit_quant_type="nf4", 
                                         bnb_4bit_compute_dtype=torch.float16
                                        )
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, quantization_config=quantization_config,
                                             torch_dtype=torch.float16,
                                            )

実行

まずは、モデルのロードを行います。

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig

model_path = "./Fugaku-LLM-13B"
quantization_config = BitsAndBytesConfig(load_in_4bit=True,
                                         bnb_4bit_quant_type="nf4", 
                                         bnb_4bit_compute_dtype=torch.float16
                                        )
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForCausalLM.from_pretrained(model_path, quantization_config=quantization_config,
                                             torch_dtype=torch.float16,
                                            )
model.eval()

モデルロード時の全体のGPUメモリ使用量は9.5GBでした。 bitsandbytesを使わない場合はGPUメモリ使用量24.0GB + メモリ使用量4GB前後でした。

ベースモデル

ベースモデルでは次のような出力を得ることができました。

一方で生成時の設定を変更すると以下の学習データのような文章が出力されました。

指示調整モデル

指示調整モデルではREADME.mdを参考に以下の形式で指示を行います。

system_example = "以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。"
instruction_example = "スーパーコンピュータ「富岳」の名前の由来を教えてください。"

prompt = f"{system_example}\n\n### 指示:\n{instruction_example}\n\n### 応答:\n"

指示調整モデルでは次のような出力を得ることができました。

かなり正確に指示に従う一方で数値を訪ねる質問では不正確な答えが出力されました。

おわりに

産官学が連携して自由に利用できる大規模言語モデルを作る取り組みが今後も続いてほしいと思います。