初めに
Web(transformers.js)やunityでLLMを使う際にフォーマットはONNXが嬉しいことが多々あります. そこで今回はLLMの変換を試してみます
こちらで実験的に各種モデルをONNXに変換したものは、以下にアップロードしています (各種モデルの使用は各モデルのライセンスに基づき使用してください)
環境
- 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に変換されるみたいです
bert-base-uncased
python -m scripts.convert --quantize --model_id bert-base-uncased
モデルは transformers.js/models/bert-base-uncased/onnx
に保存されています。
rinna/japanese-gpt2-xsmall
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で無理でした)
python -m scripts.convert --quantize --model_id cyberagent/calm2-7b-chat
モデルのサイズごとの使用メモリ量
計測時には、以下のコマンドで量子化モデルのオプションを入れずに計測をしています.
(肌感ですが、量子化モデルも同時に変換する場合は大体倍くらいのメモリを使うみたいでした).
また雑な計測なので、参考程度に...
python -m scripts.convert --model_id {model_id}
計測には、open-calm
シリーズを使用しました
モデル名 | モデルサイズ | 使用メモリ量 |
---|---|---|
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 |