FastChat is an open platform for training, serving, and evaluating large language model (LLM) based chatbots. It powers Chatbot Arena (lmarena.ai) and gives you three things on your own hardware:
- A command-line chat interface for talking to local or downloaded models.
- A distributed multi-model serving system with a web UI and OpenAI-compatible REST APIs, so FastChat can be a drop-in local replacement for the OpenAI API.
- Training and evaluation code for state-of-the-art models such as Vicuna and the MT-Bench benchmark.
This guide shows you how to install FastChat, chat with a model from your terminal, stand up a web UI and an OpenAI-compatible API server, run quantized models on limited hardware, fine-tune your own model, and evaluate models with MT-Bench. Every command, flag, and environment variable below is taken directly from the source code.
Note
The Python package is named
fschat(version0.2.36), but you import and run it asfastchat(e.g.python3 -m fastchat.serve.cli). Both names refer to the same project.
Table of Contents
- Quick Start
- Installation
- Chatting from the Command Line
- Running on Limited Hardware
- Serving with a Web GUI
- The OpenAI-Compatible API Server
- High-Throughput Serving (vLLM, SGLang, and others)
- Launching Chatbot Arena
- Evaluating Models with MT-Bench
- Fine-Tuning Your Own Model
- Preparing Training Data
- How FastChat Works
- Troubleshooting
- Frequently Asked Questions
- Command & Flag Reference
1. Quick Start
If you have a GPU and just want to chat with a model:
pip3 install "fschat[model_worker,webui]"
python3 -m fastchat.serve.cli --model-path lmsys/vicuna-7b-v1.5
The model weights download automatically from Hugging Face on first run and are cached in your home folder (~/.cache/huggingface/hub/). Once loaded, you get an interactive prompt:
USER: Hello! Who are you?
ASSISTANT: I am Vicuna, a language model trained by researchers...
To stand up an OpenAI-compatible API instead, you launch three processes — a controller, a model worker, and the API server:
python3 -m fastchat.serve.controller
python3 -m fastchat.serve.model_worker --model-path lmsys/vicuna-7b-v1.5
python3 -m fastchat.serve.openai_api_server --host localhost --port 8000
You can then call http://localhost:8000/v1/chat/completions exactly like the OpenAI API.
Tip
Run each of the three serving processes in its own terminal (or with a process manager like
tmux). They are long-running and talk to each other over local HTTP.
2. Installation
FastChat requires Python 3.8 or newer.
Method 1: Install from PyPI
Serving + Web UI
pip3 install "fschat[model_worker,webui]"
Base only
pip3 install fschat
Method 2: Install from source
Install from source when you want to fine-tune, modify the code, or track the latest commit.
git clone https://github.com/lm-sys/FastChat.git
cd FastChat
pip3 install --upgrade pip # enable PEP 660 support
pip3 install -e ".[model_worker,webui]"
On a Mac you also need Rust and CMake before installing (required to build the tokenizers and qwen dependencies):
brew install rust cmake
Optional dependency groups
FastChat splits its heavier dependencies into extras. Install only what you need:
| Extra | Install command | What it adds |
|---|---|---|
model_worker |
pip3 install "fschat[model_worker]" |
torch, transformers>=4.31, accelerate, peft, sentencepiece, protobuf, openai, anthropic — needed to load and serve models |
webui |
pip3 install "fschat[webui]" |
gradio>=4.10, plotly, scipy — the web chat and Arena UI |
train |
pip3 install "fschat[train]" |
einops, flash-attn>=2.0, wandb — fine-tuning |
llm_judge |
pip3 install "fschat[llm_judge]" |
openai<1, anthropic>=0.3, ray — MT-Bench evaluation |
dev |
pip3 install "fschat[dev]" |
black==23.3.0, pylint==2.8.2 — formatting and linting |
You can combine extras in one bracketed list, for example pip3 install -e ".[model_worker,webui,train]".
Important
transformers>=4.31is required to use the 16K-context Vicuna models. Themodel_workerextra already pins this, but verify it if you installedtransformersseparately.
Verify the installation
python3 -c "import fastchat; print('FastChat ready')"
FastChat ready
3. Chatting from the Command Line
The CLI is the fastest way to talk to a model. The entry point is fastchat.serve.cli.
python3 -m fastchat.serve.cli --model-path lmsys/vicuna-7b-v1.5
--model-path accepts either a local folder or a Hugging Face repo ID. The default is lmsys/vicuna-7b-v1.5.
In-chat commands
While chatting, these special inputs control the session:
| Type this | Effect |
|---|---|
!!exit or an empty line |
Exit the chat |
!!reset |
Start a new conversation (clears history) |
!!remove |
Remove the last prompt |
!!regen |
Regenerate the last assistant message |
!!save <filename> |
Save the conversation history to a JSON file |
!!load <filename> |
Load a conversation history from a JSON file |
Sampling and generation options
| Flag | Default | Description |
|---|---|---|
--temperature |
0.7 |
Sampling temperature; lower is more deterministic |
--repetition_penalty |
1.0 |
Penalty applied to repeated tokens |
--max-new-tokens |
512 |
Maximum number of tokens to generate per reply |
--conv-template |
(auto) | Conversation prompt template to use |
--conv-system-msg |
(none) | Override the system message for the conversation |
--no-history |
off | Disable conversation history |
Choosing a display style
The --style flag controls how output is rendered:
python3 -m fastchat.serve.cli --model-path lmsys/vicuna-7b-v1.5 --style rich
| Style | Behavior |
|---|---|
simple (default) |
Plain streaming text |
rich |
Rich-text rendering with better streaming and Markdown; supports --multiline and --mouse |
programmatic |
Machine-readable I/O for scripting FastChat from another program |
Note
--style richis experimental. It renders Markdown and non-ASCII content more cleanly but may not behave correctly on every terminal.
Enable multi-line input (use ESC then Enter for a newline) and mouse positioning in rich mode:
python3 -m fastchat.serve.cli --model-path lmsys/vicuna-7b-v1.5 --style rich --multiline --mouse
Other useful CLI flags
| Flag | Description |
|---|---|
--debug |
Print debug information such as the full prompt sent to the model |
--judge-sent-end |
Enable correction logic for sentences cut off by an early end-of-sequence token |
Models you can chat with
FastChat supports a wide range of model families, including Llama 2, Vicuna, Alpaca, Baize, ChatGLM, Dolly, Falcon, FastChat-T5, GPT4ALL, Guanaco, MPT, OpenAssistant, OpenChat, RedPajama, StableLM, WizardLM, Yuan2, and more. The official models published by LMSYS:
| Model | Chat command | Approx. GPU memory |
|---|---|---|
| Vicuna-7B | python3 -m fastchat.serve.cli --model-path lmsys/vicuna-7b-v1.5 |
~14 GB |
| Vicuna-7B-16k | python3 -m fastchat.serve.cli --model-path lmsys/vicuna-7b-v1.5-16k |
~14 GB |
| Vicuna-13B | python3 -m fastchat.serve.cli --model-path lmsys/vicuna-13b-v1.5 |
~28 GB |
| Vicuna-13B-16k | python3 -m fastchat.serve.cli --model-path lmsys/vicuna-13b-v1.5-16k |
~28 GB |
| Vicuna-33B | python3 -m fastchat.serve.cli --model-path lmsys/vicuna-33b-v1.3 |
~60 GB |
| LongChat-7B | python3 -m fastchat.serve.cli --model-path lmsys/longchat-7b-32k-v1.5 |
~14 GB |
| FastChat-T5-3B | python3 -m fastchat.serve.cli --model-path lmsys/fastchat-t5-3b-v1.0 |
~6 GB |
Tip
Vicuna is based on Llama 2 and must be used under Llama's model license. Weights download automatically from the Hugging Face repos shown above.
4. Running on Limited Hardware
You do not need a data-center GPU to run FastChat. The CLI, web worker, and API worker all share the same hardware flags (defined in fastchat.model.model_adapter), so everything below works for serving too.
Multiple GPUs (model parallelism)
Aggregate memory across GPUs on the same machine:
python3 -m fastchat.serve.cli --model-path lmsys/vicuna-7b-v1.5 --num-gpus 2
If the automatic device mapping does not balance memory well, cap the per-GPU weight memory so more room is left for activations and longer context:
python3 -m fastchat.serve.cli --model-path lmsys/vicuna-7b-v1.5 --num-gpus 2 --max-gpu-memory 8GiB
You can also pin specific GPUs with --gpus:
python3 -m fastchat.serve.cli --model-path lmsys/vicuna-7b-v1.5 --gpus 0,2 --num-gpus 2
Caution
If
--num-gpusis larger than the number of GPUs listed in--gpus, FastChat raisesValueError: Larger --num-gpus (N) than --gpus .... Keep the two consistent.
CPU only
Runs without a GPU. Vicuna-7B needs ~30 GB and Vicuna-13B ~60 GB of system RAM:
python3 -m fastchat.serve.cli --model-path lmsys/vicuna-7b-v1.5 --device cpu
Use an Intel AI accelerator (AVX512_BF16 / AMX) to speed up CPU inference:
CPU_ISA=amx python3 -m fastchat.serve.cli --model-path lmsys/vicuna-7b-v1.5 --device cpu
Apple Silicon and other accelerators
The --device flag selects the backend. Valid values are cuda (default), cpu, mps, xpu, and npu.
Apple Silicon / AMD (Metal)
python3 -m fastchat.serve.cli --model-path lmsys/vicuna-7b-v1.5 --device mps --load-8bit
Requires torch >= 2.0. Vicuna-7B runs on a 32 GB M1 MacBook at roughly 1–2 words/second.
Intel XPU (Arc / Data Center GPU)
source /opt/intel/oneapi/setvars.sh
python3 -m fastchat.serve.cli --model-path lmsys/vicuna-7b-v1.5 --device xpu
Requires the Intel Extension for PyTorch. Vicuna-7B runs on an Intel Arc A770 16 GB.
Ascend NPU
source /usr/local/Ascend/ascend-toolkit/set_env.sh
python3 -m fastchat.serve.cli --model-path lmsys/vicuna-7b-v1.5 --device npu
Requires the Ascend PyTorch Adapter.
8-bit compression
Cut memory usage roughly in half (with slightly reduced quality) by adding --load-8bit. It works on CPU, GPU, and Metal backends:
python3 -m fastchat.serve.cli --model-path lmsys/vicuna-7b-v1.5 --load-8bit
With 8-bit, Vicuna-13B fits on a single 16 GB GPU (RTX 3090/4080, T4, V100-16GB, or AMD RX 6800 XT).
To squeeze even further, offload weights that don't fit in VRAM to CPU memory:
python3 -m fastchat.serve.cli --model-path lmsys/vicuna-7b-v1.5 --load-8bit --cpu-offloading
Warning
--cpu-offloadingrequires--load-8bitand thebitsandbytespackage, which is only available on Linux.
4-bit and accelerated quantization
FastChat ships flags for several quantization frameworks. Each set of flags is described in the linked docs:
| Framework | Enable flag | Notes |
|---|---|---|
| GPTQ (4-bit) | --gptq-ckpt, --gptq-wbits 4, --gptq-groupsize, --gptq-act-order |
See docs/gptq.md |
| AWQ (4-bit) | --awq-ckpt, --awq-wbits 4, --awq-groupsize |
See docs/awq.md |
| ExLlama V2 | --enable-exllama, --exllama-max-seq-len, --exllama-gpu-split, --exllama-cache-8bit |
See docs/exllama_v2.md |
| xFasterTransformer | --enable-xft, --xft-max-seq-len, --xft-dtype |
CPU only; see docs/xFasterTransformer.md |
Note
--enable-xftforces the device to CPU. If you pass another--device, FastChat printsxFasterTransformer now is only support CPUs. Reset device to CPUand continues on CPU.
Using ModelScope (for users in China)
Download weights from ModelScope instead of Hugging Face:
export FASTCHAT_USE_MODELSCOPE=True
python3 -m fastchat.serve.cli --model-path <modelscope-model-id>
5. Serving with a Web GUI
The web UI is a browser chat interface. It needs three components working together:
- Controller — coordinates everything and routes requests to workers.
- Model worker(s) — host one or more models.
- Gradio web server — the page users interact with.
Run each in its own terminal:
# 1. Controller
python3 -m fastchat.serve.controller
# 2. Model worker (loads the model)
python3 -m fastchat.serve.model_worker --model-path lmsys/vicuna-7b-v1.5
Wait until the worker prints Uvicorn running on ... — at that point it has registered with the controller. Confirm the connection:
python3 -m fastchat.serve.test_message --model-name vicuna-7b-v1.5
USER: Tell me a story with more than 1000 words.
ASSISTANT: Once upon a time...
# 3. Gradio web server (the UI)
python3 -m fastchat.serve.gradio_web_server
Open the printed local URL in your browser and start chatting.
Tip
If models don't appear in the dropdown, reboot the Gradio web server — it reads the model list from the controller at startup unless you set
--model-list-mode reload.
Serving multiple models or higher throughput
Register several workers to one controller. Give each its own GPU and port:
# Worker 0
CUDA_VISIBLE_DEVICES=0 python3 -m fastchat.serve.model_worker \
--model-path lmsys/vicuna-7b-v1.5 \
--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
Pointing multiple workers at the same model increases throughput; pointing them at different models lets one UI serve several models at once.
Useful web server flags
| Flag | Default | Description |
|---|---|---|
--host |
0.0.0.0 |
Interface to bind |
--port |
(auto) | Port to listen on |
--share |
off | Generate a public, shareable Gradio link |
--controller-url |
http://localhost:21001 |
Address of the controller |
--concurrency-count |
10 |
Size of the Gradio request queue |
--model-list-mode |
once |
once loads the model list at startup; reload refreshes it every request |
--moderate |
off | Enable content moderation to block unsafe inputs |
--show-terms-of-use |
off | Show a terms-of-use dialog before loading |
--gradio-auth-path |
(none) | Path to a file of user:password pairs for basic auth |
--gradio-root-path |
(none) | Root path prefix when running behind a reverse proxy |
6. The OpenAI-Compatible API Server
FastChat can stand in for the OpenAI API. The server implements Chat Completions, Completions, and Embeddings, so existing OpenAI client code works against it with only a changed base URL.
Launch the API server
You need the controller and at least one model worker running (see Section 5), then:
python3 -m fastchat.serve.openai_api_server --host localhost --port 8000
Supported endpoints
| Method | Path | Purpose |
|---|---|---|
GET |
/v1/models |
List available models |
POST |
/v1/chat/completions |
Chat completion (messages in, message out) |
POST |
/v1/completions |
Text completion (prompt in, text out) |
POST |
/v1/embeddings |
Generate embeddings |
POST |
/v1/engines/{model_name}/embeddings |
Embeddings (engine-style path) |
POST |
/api/v1/token_check |
Check token counts for a request |
Call it with the OpenAI Python SDK
Install the OpenAI package (≥ 1.0) and point it at your local server. Use any non-empty string as the key:
import openai
openai.api_key = "EMPTY"
openai.base_url = "http://localhost:8000/v1/"
model = "vicuna-7b-v1.5"
# Text completion
completion = openai.completions.create(model=model, prompt="Once upon a time", max_tokens=64)
print("Once upon a time" + completion.choices[0].text)
# Chat completion
chat = openai.chat.completions.create(
model=model,
messages=[{"role": "user", "content": "Hello! What is your name?"}],
)
print(chat.choices[0].message.content)
Call it with cURL
# List models
curl http://localhost:8000/v1/models
# Chat completion
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "vicuna-7b-v1.5",
"messages": [{"role": "user", "content": "Hello! What is your name?"}]
}'
# Text completion
curl http://localhost:8000/v1/completions \
-H "Content-Type: application/json" \
-d '{
"model": "vicuna-7b-v1.5",
"prompt": "Once upon a time",
"max_tokens": 41,
"temperature": 0.5
}'
# Embeddings
curl http://localhost:8000/v1/embeddings \
-H "Content-Type: application/json" \
-d '{
"model": "vicuna-7b-v1.5",
"input": "Hello world!"
}'
Serving multiple models in one process
Replace the single model_worker with multi_model_worker to load several models into one process and accelerator:
python3 -m fastchat.serve.multi_model_worker \
--model-path lmsys/vicuna-7b-v1.5 --model-names vicuna-7b-v1.5 \
--model-path lmsys/longchat-7b-16k --model-names longchat-7b-16k
Note
Multi-model serving in a single process works best with PEFT/LoRA models that share a base model (handled by the
PeftModelAdapter).
Tuning timeouts and batch size
These environment variables are read at startup (see Command & Flag Reference for the full list):
# A worker is considered timed out after this many seconds (default 100)
export FASTCHAT_WORKER_API_TIMEOUT=600
# Reduce embedding batch size if you hit out-of-memory while embedding (default 4)
export FASTCHAT_WORKER_API_EMBEDDING_BATCH_SIZE=1
Tip
If the API server sits behind Nginx, disable response buffering for streaming to work: set
proxy_buffering off;in the proxy location block.
7. High-Throughput Serving (vLLM, SGLang, and others)
The default model_worker is based on Hugging Face Transformers — broad compatibility but lower throughput. For batched, high-throughput serving, swap in an alternative worker. Each is a drop-in replacement for model_worker — keep the same controller and API server.
| Worker module | Backend | Highlight flags |
|---|---|---|
fastchat.serve.vllm_worker |
vLLM | --gpu_memory_utilization (default 0.9), --num-gpus, --trust_remote_code |
fastchat.serve.sglang_worker |
SGLang | --mem-fraction-static (default 0.9), --num-gpus, --multimodal |
fastchat.serve.lightllm_worker |
LightLLM | --max_total_token_num, --tp, --running_max_req_size |
fastchat.serve.mlx_worker |
MLX (Apple Silicon) | --model-path (default microsoft/phi-2) |
fastchat.serve.dashinfer_worker |
DashInfer (CPU) | config_file, --model-path (default qwen/Qwen-7B-Chat) |
fastchat.serve.huggingface_api_worker |
Remote HF Inference API | --model-info-file, --seed |
Example — serve Vicuna with vLLM:
python3 -m fastchat.serve.controller
python3 -m fastchat.serve.vllm_worker --model-path lmsys/vicuna-7b-v1.5
python3 -m fastchat.serve.openai_api_server --host localhost --port 8000
Warning
--gpu_memory_utilization(vLLM) and--mem-fraction-static(SGLang) reserve a fraction of GPU memory for weights, activations, and KV cache. Higher values raise throughput but can trigger out-of-memory errors. Lower the value if a worker crashes on startup.
See docs/vllm_integration.md, docs/lightllm_integration.md, docs/dashinfer_integration.md, and docs/mlx_integration.md for backend-specific setup.
8. Launching Chatbot Arena
Chatbot Arena is the side-by-side "battle" UI where two models answer the same prompt and you vote. To run it locally you use the multi web server, gradio_web_server_multi.
FastChat can put API-based models (OpenAI, Anthropic, Gemini, Mistral, and more) into the arena. Describe them in a JSON file, for example api_endpoint.json:
{
"gpt-4o-2024-05-13": {
"model_name": "gpt-4o-2024-05-13",
"api_base": "https://api.openai.com/v1",
"api_type": "openai",
"api_key": "<your key>",
"anony_only": false
}
}
For Anthropic models set "api_type": "anthropic_message"; for Gemini set "api_type": "gemini". Then launch:
python3 -m fastchat.serve.gradio_web_server_multi --register-api-endpoint-file api_endpoint.json
To mix in your own locally served models, launch a controller and workers as in Section 5 first.
Arena-specific flags
| Flag | Description |
|---|---|
--vision-arena |
Show tabs for the vision (image) arena |
--random-questions |
Load random sample questions from a JSON file |
--elo-results-file |
Load Elo leaderboard results and plots |
--leaderboard-table-file |
Load the leaderboard table |
--show-visualizer |
Show the Data Visualizer tab |
--password |
Set a password for the web server |
--ga-id |
Google Analytics ID |
Note
The hosted Chatbot Arena enforces input length and rate limits (for example, a 12,000-character input limit and a 50-turn conversation limit). These are tunable when you self-host — see the Admin Guide for the environment variables involved.
9. Evaluating Models with MT-Bench
MT-Bench is a set of challenging multi-turn questions used to benchmark chat models. FastChat automates grading by prompting a strong judge model (such as GPT-4). The tools live in fastchat/llm_judge. Install the evaluation extras first:
pip3 install "fschat[llm_judge]"
cd fastchat/llm_judge
Step 1 — Generate model answers
For a locally hosted model:
python3 gen_model_answer.py --model-path lmsys/vicuna-7b-v1.5 --model-id vicuna-7b-v1.5
For an API-based model (e.g. GPT-3.5):
python3 gen_api_answer.py --model gpt-3.5-turbo --bench-name mt_bench --parallel 4
Step 2 — Generate judgments
python3 gen_judgment.py --model-list vicuna-7b-v1.5 --judge-model gpt-4 --mode single
The --mode flag selects the grading strategy:
| Mode | Meaning |
|---|---|
single (default) |
Single-answer grading (each answer scored on its own) |
pairwise-baseline |
Compare each model against a baseline (default gpt-3.5-turbo) |
pairwise-all |
Compare all model pairs against each other |
Step 3 — Show the results
python3 show_result.py --bench-name mt_bench --judge-model gpt-4 --mode single
Key evaluation flags
| Flag | Default | Used by | Description |
|---|---|---|---|
--bench-name |
mt_bench |
all | Benchmark question set |
--judge-model |
gpt-4 |
judgment, results | The model acting as judge |
--baseline-model |
gpt-3.5-turbo |
judgment, results | Baseline for pairwise modes |
--parallel |
1 |
answer gen | Number of concurrent API calls |
--num-choices |
1 |
answer gen | Completions to generate per question |
--max-new-token |
1024 |
model answers | Max tokens to generate |
--first-n |
(all) | judgment | Debug: only run the first N judgments |
Tip
MT-Bench is the recommended way to benchmark models. The older 80-question Vicuna set lives in the separate vicuna-blog-eval repository.
10. Fine-Tuning Your Own Model
FastChat's training code (based on Stanford Alpaca, extended for multi-turn conversations) lives in fastchat/train. Install the training extras:
pip3 install -e ".[train]"
Train Vicuna-7B on local GPUs
The example below trains on 4× A100 (40 GB). Point --model_name_or_path at your base Llama weights and --data_path at your data:
torchrun --nproc_per_node=4 --master_port=20001 fastchat/train/train_mem.py \
--model_name_or_path meta-llama/Llama-2-7b-hf \
--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
Recommended Vicuna-13B hyperparameters (same family applies to 7B with smaller batch):
| Hyperparameter | Value |
|---|---|
| Global batch size | 128 |
| Learning rate | 2e-5 |
| Epochs | 3 |
| Max length | 2048 |
| Weight decay | 0 |
Training variants
| Script | Use case |
|---|---|
train/train_mem.py |
Standard training with FlashAttention memory optimization |
train/train_xformers.py |
Memory-efficient attention via xFormers (use on V100, which lacks FlashAttention) |
train/train_lora.py |
LoRA fine-tuning (parameter-efficient) |
train/train_lora_t5.py |
LoRA for T5 models |
train/train_flant5.py |
Fine-tune Flan-T5 |
train/train_baichuan.py |
Fine-tune Baichuan |
train/train_yuan2.py |
Fine-tune Yuan2 |
Tip
Turn on experiment tracking by passing
--report_to wandb(ortensorboard,mlflow). Seedocs/training.mdfor LoRA, FastChat-T5, and other model recipes, and the SkyPilot guide for training on cloud spot instances.
Important
LMSYS does not release the ShareGPT dataset used to train Vicuna. The repo ships
data/dummy_conversation.jsonso you can test the training pipeline; plug your own data into the same format.
11. Preparing Training Data
The fastchat/data package contains a pipeline of small scripts for cleaning and shaping conversation data. They all use --in-file / --out-file and can be chained. Run the whole pipeline at once with prepare_all.py, or invoke steps individually:
| Script | What it does |
|---|---|
data/clean_sharegpt.py |
Convert ShareGPT HTML to Markdown and drop invalid samples |
data/optional_clean.py |
Filter by language (--keep-lang, --skip-lang, --reduce-rep) |
data/split_long_conversation.py |
Split long conversations to fit --max-length |
data/split_train_test.py |
Split into train/test by --ratio (default 0.9) |
data/sample.py |
Take a sample (--begin, --end, --max-length) |
data/merge.py |
Merge multiple JSON files into one |
data/extract_gpt4_only.py |
Keep only GPT-4 conversations |
data/extract_single_round.py |
Keep only single-round conversations |
data/get_stats.py |
Compute dataset statistics |
data/inspect_data.py |
Inspect random samples |
Example — clean, then split a ShareGPT export:
python3 -m fastchat.data.clean_sharegpt --in-file sharegpt.json --out-file sharegpt_clean.json
python3 -m fastchat.data.split_long_conversation \
--in-file sharegpt_clean.json --out-file sharegpt_split.json \
--model-name-or-path meta-llama/Llama-2-7b-hf --max-length 2048
See docs/commands/data_cleaning.md for the full recommended sequence.
12. How FastChat Works
You don't need this section to use FastChat, but it explains why the serving setup has three moving parts. (For the full architecture, security model, and deployment internals, see the Admin Guide.)
┌──────────────┐
Browser → │ Gradio Web │
/ SDK → │ or OpenAI │ ──┐
│ API Server │ │ "which worker serves model X?"
└──────────────┘ ▼
┌───────────┐ registration +
│ Controller│ ◀ heartbeats
└───────────┘
│ routes request to a worker
┌─────────────┼─────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Worker 0 │ │ Worker 1 │ │ Worker N │ each hosts one or
│ (model) │ │ (model) │ │ (model) │ more models on a GPU
└──────────┘ └──────────┘ └──────────┘
- Workers load models and register with the controller, then send periodic heartbeats so the controller knows they're alive.
- The controller keeps a registry of which workers serve which models and hands out a worker address for each request. It can dispatch by shortest queue (default) or lottery.
- The web server and OpenAI API server are just two front ends that ask the controller where to send a request.
This separation is what lets you scale out (add workers), serve many models behind one URL, and swap the inference backend (vLLM, SGLang, …) without changing the front end.
13. Troubleshooting
Error: Larger --num-gpus (N) than --gpus ...
Cause: You set --num-gpus higher than the count of GPU IDs in --gpus.
Solution: Make the two match, e.g. --gpus 0,1 --num-gpus 2.
Prevention: If you only set --num-gpus, omit --gpus and let FastChat use the first N visible GPUs.
Error: Invalid style for console: <style>
Cause: --style was given a value other than simple, rich, or programmatic.
Solution: Use one of the three supported styles.
Error: Invalid device: <device>
Cause: --device was set to something other than cuda, cpu, mps, xpu, or npu.
Solution: Pick a supported backend for your hardware.
Error: ValueError: Cannot find any model weight files. Please check your (cached) weight path: <path>
Cause: --model-path points to a folder with no model weights, or a download was interrupted.
Solution: Verify the Hugging Face repo ID, or delete the partial download under ~/.cache/huggingface/hub/ and rerun so it re-downloads.
Error: No valid model adapter for <model_path>
Cause: FastChat doesn't recognize the model architecture from its path/config.
Solution: Check the supported model list (docs/model_support.md) and use a recognized model, or add an adapter as described there.
CUDA out of memory when loading a model
Cause: The model is larger than available VRAM.
Solution: Add --load-8bit, reduce --max-gpu-memory, spread across GPUs with --num-gpus, add --cpu-offloading (Linux + 8-bit), or use a smaller model.
Prevention: Check the memory estimates in Section 3 before loading.
Out of memory while creating embeddings
Cause: The embedding batch size is too large for your GPU.
Solution: export FASTCHAT_WORKER_API_EMBEDDING_BATCH_SIZE=1 before launching the worker.
Models don't appear in the web UI dropdown
Cause: The Gradio server cached an empty model list at startup, or no worker has registered yet.
Solution: Make sure a model worker printed Uvicorn running on ..., then reboot the Gradio web server, or launch it with --model-list-mode reload.
Worker requests time out
Cause: The model/hardware is slower than the default 100-second worker timeout.
Solution: export FASTCHAT_WORKER_API_TIMEOUT=600 (or higher) before launching.
The stop parameter is ignored via the OpenAI API
Cause: A known open issue (#1048) where the stop field is not always honored in chat/completions.
Solution: Trim stop sequences client-side as a workaround, and track the upstream issue.
Streaming hangs behind a reverse proxy
Cause: The proxy buffers the streamed response.
Solution: Disable buffering — in Nginx set proxy_buffering off; in the API server's location block.
Mac install fails building a dependency
Cause: Rust/CMake toolchain missing.
Solution: brew install rust cmake, then reinstall.
14. Frequently Asked Questions
Q: What's the difference between fschat and fastchat?
fschat is the PyPI package name you install; fastchat is the importable Python module you run (python3 -m fastchat.serve.cli). Same project.
Q: Do I need a GPU?
No. Use --device cpu (needs lots of RAM), --device mps on Apple Silicon, or --load-8bit to fit larger models on small GPUs. A GPU is strongly recommended for usable speed.
Q: Where are downloaded model weights stored?
In the Hugging Face cache in your home folder: ~/.cache/huggingface/hub/<model_name>.
Q: Can I use my own model?
Yes, if its architecture has a FastChat adapter. Pass a local folder or HF repo ID to --model-path. See docs/model_support.md to add a new model.
Q: How do I serve models faster?
Replace model_worker with vllm_worker or sglang_worker for batched, high-throughput serving. The controller and API server stay the same.
Q: How do I run several models at once?
Either launch one model_worker per model (each on its own port/GPU) and register them all to one controller, or use multi_model_worker to load several into one process.
Q: Is the API really OpenAI-compatible?
Yes — Chat Completions, Completions, and Embeddings are implemented. Point the OpenAI SDK's base_url at http://localhost:8000/v1/ and use any non-empty API key. Some parameters (logprobs, logit_bias, presence_penalty, frequency_penalty) are not yet supported.
Q: How do I require API keys on the server?
Launch the API server with --api-keys key1,key2. Requests must then send a matching key.
Q: Can I get a public link to share my demo?
Yes — add --share to the Gradio web server to create a temporary public URL.
Q: What models does the official project release? Vicuna (7B/13B/33B, plus 16K variants), LongChat-7B-32K, and FastChat-T5-3B. See Section 3.
Q: How do I evaluate a model I trained?
Generate answers with gen_model_answer.py, judge them with gen_judgment.py (judge defaults to GPT-4), then summarize with show_result.py. See Section 9.
Q: Which Python version do I need? Python 3.8 or newer.
Q: Can I use models from ModelScope instead of Hugging Face?
Yes — export FASTCHAT_USE_MODELSCOPE=True before launching.
Q: How do I save and resume a CLI conversation?
Type !!save mychat.json to save and !!load mychat.json to restore.
Q: Where do I configure content moderation?
Add --moderate to the Gradio web server to block unsafe inputs.
15. Command & Flag Reference
Main commands
| Command | Purpose |
|---|---|
python3 -m fastchat.serve.cli |
Interactive command-line chat |
python3 -m fastchat.serve.controller |
Start the controller |
python3 -m fastchat.serve.model_worker |
Start a Transformers model worker |
python3 -m fastchat.serve.vllm_worker |
High-throughput vLLM worker |
python3 -m fastchat.serve.sglang_worker |
SGLang worker |
python3 -m fastchat.serve.multi_model_worker |
Serve multiple models in one process |
python3 -m fastchat.serve.openai_api_server |
OpenAI-compatible REST API server |
python3 -m fastchat.serve.gradio_web_server |
Single-model web UI |
python3 -m fastchat.serve.gradio_web_server_multi |
Multi-model / Chatbot Arena UI |
python3 -m fastchat.serve.test_message |
Send a test message to a worker |
python3 -m fastchat.serve.huggingface_api |
One-shot generation via local model |
Shared model/hardware flags (CLI and workers)
| Flag | Default | Description |
|---|---|---|
--model-path |
lmsys/vicuna-7b-v1.5 |
Local folder or Hugging Face repo ID |
--revision |
main |
Hugging Face model revision |
--device |
cuda |
cuda, cpu, mps, xpu, or npu |
--gpus |
(all) | GPU IDs, e.g. 0,2 |
--num-gpus |
1 |
Number of GPUs for model parallelism |
--max-gpu-memory |
(auto) | Max weight memory per GPU, e.g. 13GiB |
--dtype |
(auto) | Override dtype; float16 on GPU, float32 on CPU by default |
--load-8bit |
off | 8-bit quantization |
--cpu-offloading |
off | Offload excess weights to CPU (needs 8-bit, Linux) |
Controller flags
| Flag | Default | Description |
|---|---|---|
--host |
localhost |
Bind address |
--port |
21001 |
Port |
--dispatch-method |
shortest_queue |
shortest_queue or lottery |
--ssl |
off | Enable SSL (needs SSL_KEYFILE, SSL_CERTFILE env vars) |
Model worker flags
| Flag | Default | Description |
|---|---|---|
--host |
localhost |
Bind address |
--port |
21002 |
Port |
--worker-address |
http://localhost:21002 |
Address other services use to reach this worker |
--controller-address |
http://localhost:21001 |
Controller to register with |
--model-names |
(from path) | Comma-separated display names |
--conv-template |
(auto) | Conversation prompt template |
--limit-worker-concurrency |
5 |
Max concurrent requests (prevents OOM) |
--stream-interval |
2 |
Token streaming interval |
--no-register |
off | Don't register with the controller |
--seed |
(random) | Fixed random seed for generation |
--ssl |
off | Enable SSL |
OpenAI API server flags
| Flag | Default | Description |
|---|---|---|
--host |
localhost |
Bind address |
--port |
8000 |
Port |
--controller-address |
http://localhost:21001 |
Controller to query for workers |
--api-keys |
(none) | Comma-separated list of accepted API keys |
--allow-credentials |
off | Allow CORS credentials |
--allowed-origins |
["*"] |
Allowed CORS origins |
--allowed-methods |
["*"] |
Allowed CORS methods |
--allowed-headers |
["*"] |
Allowed CORS headers |
--ssl |
off | Enable SSL |
Key environment variables
| Variable | Default | Effect |
|---|---|---|
FASTCHAT_WORKER_API_TIMEOUT |
100 |
Seconds before a worker request times out |
FASTCHAT_WORKER_API_EMBEDDING_BATCH_SIZE |
4 |
Embedding batch size (lower to avoid OOM) |
FASTCHAT_USE_MODELSCOPE |
False |
Download weights from ModelScope instead of Hugging Face |
CPU_ISA |
(none) | CPU instruction set for accelerated CPU inference, e.g. amx |
LOGDIR |
. |
Directory for log files |
PEFT_SHARE_BASE_WEIGHTS |
false |
Share base weights across PEFT models in multi-model serving |