Chapter 10
推理与量化:swift infer / swift export
ms-swift 把推理 / 量化 / 部署都做成 CLI:swift infer 单机推理、swift deploy OpenAI API server、swift export 合并 LoRA + 量化导出。本章过一遍。
10.1swift infer
# 命令行交互
swift infer \
--adapters ./output/v0-xxx/checkpoint-200 \
--stream true \
--infer_backend pt
# 批量推理 jsonl
swift infer \
--adapters ./output/v0-xxx/checkpoint-200 \
--val_dataset ./test.jsonl \
--max_batch_size 16 \
--result_path ./out.jsonl
| infer_backend | 速度 | 说明 |
|---|---|---|
| pt | baseline | 纯 PyTorch,最稳 |
| vllm | 3-5× | 需要 merge_lora=true |
| lmdeploy | 4-6× | 商汤 LMDeploy |
| sglang | 4×+ | 新晋推理引擎 |
10.2合并 LoRA:swift export
swift export \
--adapters ./output/v0-xxx/checkpoint-200 \
--merge_lora true \
--output_dir ./merged_model
合并后 ./merged_model/ 是标准 HF 目录,可以推送 Hub 或喂给 vLLM。
10.3量化导出
| 方法 | 位宽 | 命令 |
|---|---|---|
| AWQ | 4 | --quant_method awq --quant_bits 4 |
| GPTQ | 4 / 8 | --quant_method gptq --quant_bits 4 |
| BNB | 4 / 8 | --quant_method bnb |
| HQQ | 4 / 8 | --quant_method hqq |
AWQ 量化完整命令
swift export \
--adapters ./output/checkpoint-200 \
--merge_lora true \
--quant_method awq \
--quant_bits 4 \
--quant_n_samples 256 \
--quant_seqlen 2048 \
--dataset alpaca-zh#256 \ # ★ calibration data
--output_dir ./quant_out
量化跑 5-30 分钟(取决于 calibration 大小),产物可以喂 vLLM / TGI。
10.4推送到魔搭 / HF Hub
# 魔搭
swift export \
--adapters ./output/checkpoint-200 \
--merge_lora true \
--push_to_hub true \
--hub_model_id my-org/my-model \
--hub_token YOUR_MODELSCOPE_TOKEN
# HuggingFace
USE_HF=1 swift export \
--adapters ./output/checkpoint-200 \
--push_to_hub true \
--hub_model_id your-name/your-model
10.5swift deploy:OpenAI 兼容 API
swift deploy \
--model ./merged_model \
--infer_backend vllm \
--port 8000 \
--host 0.0.0.0 \
--max_model_len 4096 \
--gpu_memory_utilization 0.85
启动后可以用 OpenAI Python client:
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8000/v1", api_key="EMPTY")
r = client.chat.completions.create(
model="my-model",
messages=[{"role":"user","content":"你好"}],
)
10.6常见错误
| 现象 | 处理 |
|---|---|
| AWQ 量化时 OOM | 降 quant_n_samples、quant_seqlen |
| vLLM 推理时 LoRA 不生效 | vLLM 需要 merge_lora 后的合并模型,或用 vLLM 自家 multi-LoRA |
| 量化后效果显著下降 | 4bit 通用模型一般 -1pp;推理增强模型 -3pp;要 -5pp 以下用 AWQ 而非 GPTQ |
| swift deploy 卡 health check | 等首次 model load 完成(~30s) |
10.75 个 Infer Engine 速查
v4 的 swift/infer_engine/ 提供 5 个可插拔推理引擎。--infer_backend 字段切换:
| infer_backend | 位置 | 典型场景 |
|---|---|---|
pt(默认) | infer_engine.py(12.5 KB)+ transformers_engine.py(26.8 KB) | 调试 / 小流量;最兼容 |
vllm | vllm_engine.py(39.9 KB) | 批量生成 / paged attention;最常用生产 |
sglang | sglang_engine.py(14 KB) | 结构化输出(强制 JSON / 正则)/ 长 KV 复用 |
lmdeploy | lmdeploy_engine.py(16.1 KB) | TurboMind C++ 后端,吞吐极致 |
(内部) grpo_vllm | grpo_vllm_engine.py(6.3 KB) | 给 GRPO rollout 用,保留 reward batch prefix |
这 5 个都实现 OpenAI 兼容协议(protocol.py 20.8 KB),所以 swift deploy 起服务时切 backend 用户端无感。
10.8AutoInferEngine 路由顺序
"我没显式指定 backend,swift 怎么挑?"看 infer_engine.py:
- 显式
--infer_backend取值最高优先; - 否则按"已安装的 backend"自动挑(
is_vllm_available() / is_sglang_available()等); - 都没装就走
pt(transformers); - 多模态模型自动检测,部分 backend 不支持 VLM 时回退到
pt。
10.9swift export 四种量化路径
swift export --quant_method ... 字段(来源 swift/arguments/export_args.py):
| quant_method | 精度损失 | 典型用 |
|---|---|---|
awq | 低 | 4bit 推理首选;activation-aware |
gptq | 中 | 4bit / 8bit;广泛兼容 |
fp8 | 极低 | H100/H200 推理;近 fp16 精度 |
bnb | 中 | bitsandbytes,挂 LoRA 推理用 |
必备字段:
--quant_bits 4 / 8;--quant_n_samples 128(校准数据条数);--quant_seqlen 2048(校准序列长度);--dataset校准数据集(与训练 SFT 数据集格式相同)。
10.10GGUF / Ollama 导出(2025-02 新)
swift 自带 GGUF 转换路径,不用单独装 llama.cpp。swift export 加:
swift export \
--model ./merged_model \
--to_ollama true \
--gguf_quantization q4_k_m \
--output_dir ./ollama_pkg
产出:
model.gguf(量化好的 GGUF);Modelfile(Ollama 配置,含 chat template / system prompt);ollama create my-model -f Modelfile直接装上。
10.11这章你需要带走的
- 三条命令:
swift infer / export / deploy; - 合并 LoRA 用
swift export --merge_lora true; - 4bit 量化首选 AWQ,效果稳;
- OpenAI 兼容服务用
swift deploy,底层 vLLM。