transformers.jsでLLMをONNXに変換する

初めに

Web(transformers.js)やunityでLLMを使う際にフォーマットはONNXが嬉しいことが多々あります. そこで今回はLLMの変換を試してみます

こちらで実験的に各種モデルをONNXに変換したものは、以下にアップロードしています (各種モデルの使用は各モデルのライセンスに基づき使用してください)

huggingface.co

環境

  • L4 GPU
  • ubuntu22.04

準備

transformers.jsをclone します

venvを使って環境を構築します

python3 -m venv env
source env/bin/activate

必要なライブラリのインストール します

pip install -r requirements.txt

ONNXに変換

以下のようにモデルIDを指定して、LLMのONNXを作成します

python -m scripts.convert --quantize --model_id {model_id}

保存されたモデルは models ディレクトリに保存されます

また量子化される際にはint8に変換されるみたいです

github.com

bert-base-uncased

huggingface.co

python -m scripts.convert --quantize --model_id bert-base-uncased

モデルは transformers.js/models/bert-base-uncased/onnx に保存されています。

rinna/japanese-gpt2-xsmall

huggingface.co

python -m scripts.convert --quantize --model_id rinna/japanese-gpt2-xsmall

rinna/japanese-gpt-neox-3.6b-instruction-sft-v2

使用メモリは18GB程度でした

cyberagent/calm2-7b-chat

使用メモリが40GBを超えて100GBくらいまで使用しないと厳しそうです (こちらの環境ではメモリサイズoverで無理でした)

huggingface.co

python -m scripts.convert --quantize --model_id cyberagent/calm2-7b-chat

モデルのサイズごとの使用メモリ量

計測時には、以下のコマンドで量子化モデルのオプションを入れずに計測をしています.
(肌感ですが、量子化モデルも同時に変換する場合は大体倍くらいのメモリを使うみたいでした).

また雑な計測なので、参考程度に...

python -m scripts.convert --model_id {model_id}

計測には、open-calm シリーズを使用しました

huggingface.co

モデル名 モデルサイズ 使用メモリ量
cyberagent/open-calm-small 0.160B 2.28GB
cyberagent/open-calm-medium 0.4B 6.15GB
cyberagent/open-calm-large 0.83B 10.51GB
cyberagent/open-calm-1b 1B 22.51GB