模型精度测试V1#
精度测试流程#
llmc支持基础的ppl(perplexity,困惑度)评测,但是更多的下游任务评测,llmc本身并不支持。
常见的做法使用评测工具直接对模型进行推理测试,目前已有的评测工具包括但不限于
但是这种评测方法评测效率不高,我们推荐使用推理引擎评测工具分离的方式进行模型精度评测,模型由推理引擎进行推理,并以api的形式serving起来,评测工具对该api进行评测。这种方式有以下的好处:
使用高效的推理引擎进行模型推理,可以加速整个评测进程
将模型的推理和模型的评测分离开,各自负责份内专业的事,代码结构更清晰
使用推理引擎推理模型,更符合实际部署的场景,和模型实际部署的精度更容易对齐
我们在此推荐并介绍使用以下的模型的压缩-部署-评测流程:llmc压缩-lightllm推理-opencompass评测
以下是相关工具的链接:
lightllm推理引擎的使用#
lightllm官方仓库有着更详细的文档,这里仅给出一个简单快速入门的使用文档
起一个float模型的服务
安装lightllm
git clone https://github.com/ModelTC/lightllm.git
cd lightllm
pip install -v -e .
起服务
python -m lightllm.server.api_server --model_dir 模型路径 \
--host 0.0.0.0 \
--port 1030 \
--nccl_port 2066 \
--max_req_input_len 6144 \
--max_req_total_len 8192 \
--tp 2 \
--trust_remote_code \
--max_total_token_num 120000
上述命令将在本机的1030端口,起一个2卡的服务
上述命令可以通过tp的数量设置,在tp张卡上进行TensorParallel推理,适用于较大的模型的推理。
上述命令中的max_total_token_num,会影响测试过程中的吞吐性能,可以根据lightllm文档,进行设置。只要不爆显存,往往设置越大越好。
如果要在同一个机器上起多个lightllm服务,需要重新设定上面的port和nccl_port,不要有冲突即可。
对服务进行简单测试
执行下面的python脚本
import requests
import json
url = 'http://localhost:1030/generate'
headers = {'Content-Type': 'application/json'}
data = {
'inputs': 'What is AI?',
"parameters": {
'do_sample': False,
'ignore_eos': False,
'max_new_tokens': 128,
}
}
response = requests.post(url, headers=headers, data=json.dumps(data))
if response.status_code == 200:
print(response.json())
else:
print('Error:', response.status_code, response.text)
若上述脚本是有正常返回,说明服务正常
起一个量化模型的服务
python -m lightllm.server.api_server --model_dir 模型路径 \
--host 0.0.0.0 \
--port 1030 \
--nccl_port 2066 \
--max_req_input_len 6144 \
--max_req_total_len 8192 \
--tp 2 \
--trust_remote_code \
--max_total_token_num 120000 \
--mode triton_w4a16
上述命令加了一个--mode triton_w4a16,表示使用了w4a16的naive量化
起完服务,同样需要验证一下服务是否正常
上述的命令使用的模型路径是原始预训练的模型,并没有经过llmc调整。可以按照llmc的文档,打开save_trans,保存一个调整之后的模型,然后再运行上述的naive量化服务命令
opencompass评测工具的使用#
opencompass官方仓库有着更详细的文档,这里仅给出一个简单快速入门的使用文档
安装opencompass
git clone https://github.com/open-compass/opencompass.git
cd opencompass
pip install -v -e .
修改配置文件
配置文件在这里,这个配置文件是用于opencompass来评测lightllm的api服务的精度,需要注意的是里面的url里面的port,要和上述的lightllm的服务port保持一致
评测的数据集选择,需要修改这部分代码
with read_base():
from .summarizers.leaderboard import summarizer
from .datasets.humaneval.deprecated_humaneval_gen_a82cae import humaneval_datasets
上述的代码片段,表示测试humaneval数据集,更多的数据集测试支持,可以查看这里
数据集下载
需要根据opencompass的文档,做好数据集的准备
运行精度测试
修改好上述的配置文件后,即可运行下面的命令
python run.py configs/eval_lightllm.py
当模型完成推理和指标计算后,我们便可获得模型的评测结果。其中会在当前目录下生成output文件夹,logs子文件夹记录着评测中的日志,最后生成summary子文件会记录所测数据集的精度
lm-evaluation-harness评测工具的使用#
我们保留了lm-evaluation-harness中的命令。只添加了两个参数--config和--quarot。前者用于加载由save_trans保存的转换模型或根据模型路径的原始huggingface模型。如果不使用quant部分,则配置中将移除该部分以对全精度模型进行评估,我们只支持RTN量化,其中所有相关的量化粒度需要与转换模型的设置对齐。如果模型经过QuaRot转换,则使用后者。
export CUDA_VISIBLE_DEVICES=4,5,6,7
llmc=./llmc
lm_eval=./llmc/lm-evaluation-harness
export PYTHONPATH=$llmc:$PYTHONPATH
export PYTHONPATH=$llmc:$lm_eval:$PYTHONPATH
# Replace the config file (i.e., RTN with algorithm-transformed model path or notate quant with original model path)
# with the one you want to use. `--quarot` is depend on the transformation algorithm used before.
accelerate launch --multi_gpu --num_processes 4 llmc/tools/llm_eval.py \
--config llmc/configs/quantization/RTN/rtn_quarot.yml \
--model hf \
--quarot \
--tasks lambada_openai,arc_easy \
--model_args parallelize=False \
--batch_size 64 \
--output_path ./save/lm_eval \
--log_samples
备注:请在--model_args不使用pretrained=*同时进行评估时取消并行化(或paralleize=False)。
常见问题#
问题1
opencompass中的数据集配置文件,同一个数据集有不同的后缀,表示的是什么意思
解决方法
不同后缀表示不同的prompt模板,详细的opencompass问题,可以查看opencompass文档
问题2
llama模型的humaneval的测试精度过低
解决方法
可能需要将opencompass提供的数据集中的humaneval的jsonl文件里面每一条末尾的\n给删除,再重新测试一下
问题3
测试速度还是不够快
解决方法
可以考虑lightllm起服务时的max_total_token_num参数设置是否合理,过小的设置,会导致测试并发偏低