Fastchat: fastapi に基づいて大規模なモデル読み込みサービスを構築する
Fastapi LLM のサポート
FastChat サービスのアーキテクチャ
インストール
方法 1: pip
pip3 install "fschat[model_worker,webui]"
方法 2: ソース ファイル
git clone https://github.com/lm-sys/FastChat.git
cd FastChat
Mac 上で実行する場合:
brew install rust cmake
ソースからインストールする
pip3 install --upgrade pip # enable PEP 660 support
pip3 install -e ".[model_worker,webui]"
大規模モデル推論のロード
1. コマンドライン
python3 -m fastchat.serve.cli --model-path lmsys/vicuna-7b-v1.3
主要なパラメータの概要:
パラメータ | 説明する |
---|---|
–モデルパス | モデル パス。ローカル フォルダーまたは HuggingFace のリポジトリ ID を指定できます。 |
-リビジョン | HuggingFace Hub モデル リビジョンの識別 |
-デバイス | デバイスタイプは、cpu/cuda/mps/xpu を選択できます |
–gpus | 単一または複数の GPU (1 または 0、2 など) を指定します。 |
-num-gpus | GPUの数 |
–max-GPU-メモリ | モデルの重みを保存するために各 GPU が使用する最大メモリ。「13Gib」などの文字列で表されます。 |
–load-8bit | 8ビット量子化を使用する |
–cpu-オフロード | 8 ビット量子化の場合のみ: GPU の容量を超える重みを CPU にオフロードします。 |
–gptq-ckpt | GPTQ 定量化のための GPTQ チェックポイント パス |
–gptq-wbits | GPTQ量子化ビット数、2/3/4/8/16を選択できます |
–gptq-グループサイズ | GPTQ はグループ サイズを定量化します。デフォルトは行全体です。 |
–gptq-act-order | GPTQ アクティベーション順序ヒューリスティックを適用するかどうか |
–awq-ckpt | AWQ 量子化の AWQ チェックポイント パス |
–awq-wbits | AWQ 量子化ビット数、オプション 4/16 |
–awq-グループサイズ | AWQ の定量化されたグループ サイズ。デフォルトは行全体です。 |
–conv-template | 会話プロンプトのテンプレート |
–conv-system-msg | ダイアログシステムのメッセージ |
-温度 | 温度パラメータ |
–repetition_penalty | リピートペナルティパラメータ |
–max-new-tokens | 新しく生成されるトークンの最大数 |
-履歴はありません | 履歴は残らない |
-スタイル | 表示スタイルはシンプル/リッチ/プログラマティックから選択可能 |
–複数行 | 複数行入力を有効にする |
-ねずみ | カーソル位置のマウスサポートを有効にする (リッチスタイルのみ) |
–裁判官送致終了 | 文末を認識した論理修正を有効にするかどうか |
-デバッグ | デバッグ情報 (プロンプトなど) を出力します。 |
2.ウェブ
Web UI を使用してサービスを提供するには、次の 3 つの主要コンポーネントが必要です。
ユーザーと対話するWebサーバー
1 つ以上のモデルをホストするモデル ワーカー
Web サーバーとモデル ワーカーを調整するコントローラー。
スタートコントローラー
python3 -m fastchat.serve.controller
モデルの仕事を始める
python3 -m fastchat.serve.model_worker --model-path lmsys/vicuna-7b-v1.3
プロセスがモデルのロードを完了するまで待ちます。「Uvicorn running on...」が表示されます。モデル ワーカーは自身をコントローラーに登録します。
モデルがコントローラーに登録されているかどうかをテストします。成功すると、短い出力が表示されます。
Gradio Webサーバーを起動します
python3 -m fastchat.serve.gradio_web_server
これは、ユーザーが操作するユーザー インターフェイスです。
http://0.0.0.0:7860 を開くと、対話型インターフェイスが表示されます。
複数のモデルを登録する
- 複数のモデル ワーカーを 1 つのコントローラーに登録でき、これを使用して、より高いスループットで 1 つのモデルを提供したり、複数のモデルを同時に提供したりできます。これを行うときは、異なるモデル ワーカーに異なる GPU とポートを割り当てます。
# worker 0
CUDA_VISIBLE_DEVICES=0 python3 -m fastchat.serve.model_worker --model-path lmsys/vicuna-7b-v1.3 --controller http://localhost:21001 --port 31000 --worker http://localhost:31000
# worker 1
CUDA_VISIBLE_DEVICES=1 python3 -m fastchat.serve.model_worker --model-path lmsys/fastchat-t5-3b-v1.0 --controller http://localhost:21001 --port 31001 --worker http://localhost:31001
- [Chatbot Arena] タブを含むマルチタブ グラデーション サーバーを起動することもできます。
python3 -m fastchat.serve.gradio_web_server_multi
3. OpenAIのRESTful APIに対応
RESTful APIサーバー
- スタートコントローラー
python3 -m fastchat.serve.controller
- モデルの読み込みを開始する
python3 -m fastchat.serve.model_worker --model-path /mnt/code/LLM_Service/model/Baichuan-13b-Chat --num-gpus 2
- RESTful APIサーバーを起動する
python3 -m fastchat.serve.openai_api_server --host localhost --port 8000
- openai-python をインストールします。
pip install --upgrade openai
ChatOpenAI インターフェイスを介してモデルを呼び出します。
from langchain.chat_models import ChatOpenAI
from langchain import LLMChain
from langchain.prompts.chat import (
ChatPromptTemplate,
HumanMessagePromptTemplate,
)
api_base_url = "http://192.168.175.6:8000/v1"
api_key= "EMPTY"
LLM_MODEL = "Baichuan-13b-Chat"
model = ChatOpenAI(
streaming=True,
verbose=True,
# callbacks=[callback],
openai_api_key=api_key,
openai_api_base=api_base_url,
model_name=LLM_MODEL
)
human_prompt = "{input}"
human_message_template = HumanMessagePromptTemplate.from_template(human_prompt)
chat_prompt = ChatPromptTemplate.from_messages(
[("human", "我们来玩成语接龙,我先来,生龙活虎"),
("ai", "虎头虎脑"),
("human", "{input}")])
chain = LLMChain(prompt=chat_prompt, llm=model, verbose=True)
print(chain({
"input": "恼羞成怒"}))
同じマシン上の同じプロセスで複数のモデルを実行する場合は、
model_worker
上記の手順をマルチモデルのバリアントに置き換えることができます。
python3 -m fastchat.serve.multi_model_worker \
--model-path lmsys/vicuna-7b-v1.3 \
--model-names vicuna-7b-v1.3 \
--model-path lmsys/longchat-7b-16k \
--model-names longchat-7b-16k
ローカルGPUの微調整
依存関係をインストールする
pip3 install -e ".[train]"
微調整
次のコマンドを使用して、4 x A100 (40GB) を使用して Vicuna-7B をトレーニングできます。
--model_name_or_path
LLaMA 重みの実際のパスとデータの実際のパスを使用して--data_path
更新されます。
torchrun --nproc_per_node=4 --master_port=20001 fastchat/train/train_mem.py \
--model_name_or_path ~/model_weights/llama-7b \
--data_path data/dummy_conversation.json \
--bf16 True \
--output_dir output_vicuna \
--num_train_epochs 3 \
--per_device_train_batch_size 2 \
--per_device_eval_batch_size 2 \
--gradient_accumulation_steps 16 \
--evaluation_strategy "no" \
--save_strategy "steps" \
--save_steps 1200 \
--save_total_limit 10 \
--learning_rate 2e-5 \
--weight_decay 0. \
--warmup_ratio 0.03 \
--lr_scheduler_type "cosine" \
--logging_steps 1 \
--fsdp "full_shard auto_wrap" \
--fsdp_transformer_layer_cls_to_wrap 'LlamaDecoderLayer' \
--tf32 True \
--model_max_length 2048 \
--gradient_checkpointing True \
--lazy_preprocess True