(紙)
python examples/tui-multi-lora.py低ランクアダペーション(LORA)は、前提条件のLLMに新しい知識を追加するパラメーター効率的な方法です。前処理されたLLMには100個のGBストレージが必要ですが、LORA Finetunedモデルは1%のストレージとメモリオーバーヘッドのみを追加します。 Punicaは、複数のLora Finetunedモデルを実行するためのコストで実行できるようにします。
どうやって?
形状[H1, H2]のWの重量が前処理されたモデルの重量であると仮定すると、LORAは2つの小さなマトリックスAの[H1, r]と[r, H2]のB追加します。 Finetunedモデルで入力xを実行するとy := x @ (W + A@B)はy := x@W + x@A@Bです。
n LORAモデルがある場合、 A1 、 B1 、 A2 、 B2 、...、 An 、 Bnがあります。各LORAモデルにマップする入力バッチX := (x1,x2,...,xn)が与えられた場合、出力はY := X@W + (x1@A1@B1, x2@A2@B2, ..., xn@An@Bn)です。左側は、前処理されたモデルの入力バッチを計算します。非常に効率的です。レイテンシーは、強力なバッチ効果のおかげで、入力が1つしかない場合とほぼ同じです。
右側(ロラアドオン)を計算する効率的な方法を見つけました。以下に示すように、セグメント化された収集マトリックスベクトル乗算(SGMV)と呼ばれるCudaカーネルでこの操作をカプセル化します。

次のマイクロベンチマーク図では、前提条件のモデルの強力なバッチ効果を観察できます。オレンジ色のラインに描かれているように、ロラの素朴な実装は遅いです。 SGMVを介して実装されたLORAは効率的であり、強力なバッチ効果を保持します。

次の図は、PunicaとHuggingface Transformers、Deepspeed、Faster Transformer、VLLMなど、Punicaと他のシステムとのテキスト生成スループットの比較を示しています。ベンチマークでは、LORAモデルの人気のさまざまな設定を考慮します。明確なことは、各リクエストが異なるLORAモデルに対してであることを意味します。同一のことは、すべての要求が同じLORAモデルに対してであることを意味します。均一で歪んでいる間にあります。 Punicaは、最先端のシステムと比較して12倍のスループットを達成しています。

詳細を理解するために私たちの論文を読んでください:プニカ:マルチテナントロラサービング。
バイナリパッケージからプニカをインストールするか、ソースからビルドできます。
8.0 8.6 8.9+PTX pip install ninja torch
pip install punica -i https://punica-ai.github.io/whl/cu121/ --extra-index-url https://pypi.org/simple
# Note: Change cu121 to your CUDA version. # Please install torch before punica
pip install ninja numpy torch
# Clone punica
git clone https://github.com/punica-ai/punica.git
cd punica
git submodule sync
git submodule update --init
# If you encouter problem while compilation, set TORCH_CUDA_ARCH_LIST to your CUDA architecture.
# export TORCH_CUDA_ARCH_LIST="8.0"
# Build and install punica
pip install -v --no-build-isolation . 上記のデモを参照してください。
examples/finetune/
python -m benchmarks.bench_textgen_lora --system punica --batch-size 32 @misc { punica ,
title = { Punica: Multi-Tenant LoRA Serving } ,
author = { Lequn Chen and Zihao Ye and Yongji Wu and Danyang Zhuo and Luis Ceze and Arvind Krishnamurthy } ,
year = { 2023 } ,
eprint = { 2310.18547 } ,
archivePrefix = { arXiv } ,
primaryClass = { cs.DC }
}