WINT2量化
权重经过 CCQ(卷积编码量化) 方法进行离线压缩。权重的实际存储数值类型为INT8,每个INT8数值中打包了4个权重,等价于每个权重2bits。激活不做量化。在推理过程中,权重会被实时反量化并解码为BF16数值类型,并使用BF16数值类型进行计算。 - 支持硬件:GPU - 支持结构:MoE结构
该方法依托卷积算法利用重叠的Bit位将2Bit的数值映射到更大的数值表示空间,使得模型权重量化后既保留原始数据更多的信息,同时将真实数值压缩到极低的2Bit大小,大致原理可参考下图: 卷积编码量化示意图
CCQ WINT2一般用于资源受限的低门槛场景,以ERNIE-4.5-300B-A47B为例,将权重压缩到89GB,可支持141GB H20单卡部署。
执行WINT2离线推理
- 执行TP2/TP4模型时,可更换
model_name_or_path
以及tensor_parallel_size
参数。
model_name_or_path = "baidu/ERNIE-4.5-300B-A47B-2Bits-Paddle"
prompts = ["解析三首李白的诗"]
from fastdeploy import LLM, SamplingParams
sampling_params = SamplingParams(temperature=0.7, top_p=0, max_tokens=128)
llm = LLM(model=model_name_or_path, tensor_parallel_size=1, use_cudagraph=True,)
outputs = llm.generate(prompts, sampling_params)
print(outputs)
启动WINT2推理服务
- 执行TP2/TP4模型时,可更换
--model
以及tensor-parallel-size
参数;
python -m fastdeploy.entrypoints.openai.api_server \
--model baidu/ERNIE-4.5-300B-A47B-2Bits-Paddle \
--port 8180 \
--metrics-port 8181 \
--engine-worker-queue-port 8182 \
--cache-queue-port 8183 \
--tensor-parallel-size 1 \
--max-model-len 32768 \
--use-cudagraph \
--enable-prefix-caching \
--enable-chunked-prefill \
--max-num-seqs 256
用户发起服务请求
执行启动服务指令后,当终端打印如下信息,说明服务已经启动成功。
api_server.py[line:91] Launching metrics service at http://0.0.0.0:8181/metrics
api_server.py[line:94] Launching chat completion service at http://0.0.0.0:8180/v1/chat/completions
api_server.py[line:97] Launching completion service at http://0.0.0.0:8180/v1/completions
INFO: Started server process [13909]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:8180 (Press CTRL+C to quit)
FastDeploy提供服务探活接口,用以判断服务的启动状态,执行如下命令返回 HTTP/1.1 200 OK
即表示服务启动成功。
curl -i http://0.0.0.0:8180/health
通过如下命令发起服务请求
curl -X POST "http://0.0.0.0:8180/v1/chat/completions" \
-H "Content-Type: application/json" \
-d '{
"messages": [
{"role": "user", "content": "把李白的静夜思改写为现代诗"}
]
}'
FastDeploy服务接口兼容OpenAI协议,可以通过如下Python代码发起服务请求。
import openai
host = "0.0.0.0"
port = "8180"
client = openai.Client(base_url=f"http://{host}:{port}/v1", api_key="null")
response = client.chat.completions.create(
model="null",
messages=[
{"role": "system", "content": "I'm a helpful AI assistant."},
{"role": "user", "content": "把李白的静夜思改写为现代诗"},
],
stream=True,
)
for chunk in response:
if chunk.choices[0].delta:
print(chunk.choices[0].delta.content, end='')
print('\n')
通过指定 --model baidu/ERNIE-4.5-300B-A47B-2Bits-Paddle
可自动从AIStudio下载已离线量化好的WINT2模型,在该模型的config.json文件中,会有WINT2量化相关的配置信息,不用再在启动推理服务时设置 --quantization
.
模型的config.json文件中的量化配置示例如下:
"quantization_config": {
"dense_quant_type": "wint8",
"moe_quant_type": "w4w2",
"quantization": "wint2",
"moe_quant_config": {
"moe_w4_quant_config": {
"quant_type": "wint4",
"quant_granularity": "per_channel",
"quant_start_layer": 0,
"quant_end_layer": 6
},
"moe_w2_quant_config": {
"quant_type": "wint2",
"quant_granularity": "pp_acc",
"quant_group_size": 64,
"quant_start_layer": 7,
"quant_end_layer": 53
}
}
}
- 更多部署教程请参考get_started;
- 更多模型说明请参考支持模型列表。
WINT2效果
在ERNIE-4.5-300B-A47B模型上,WINT2与WINT4效果对比:
测试集 | 数据集大小 | WINT4 | WINT2 |
---|---|---|---|
IFEval | 500 | 88.17 | 85.95 |
BBH | 6511 | 94.43 | 90.06 |
DROP | 9536 | 91.17 | 89.32 |
CMMLU | 11477 | 89.92 | 86.55 |