更新时间:2024-08-17 GMT+08:00
分享

推理性能测试

本章节介绍如何进行推理性能测试,建议在Notebook的JupyterLab中另起一个Terminal,执行benchmark脚本进行性能测试。若需要在生产环境中进行推理性能测试,请通过调用接口的方式进行测试。

benchmark方法介绍

性能benchmark包括两部分。

  • 静态性能测试:评估在固定输入、固定输出和固定并发下,模型的吞吐与首token延迟。该方式实现简单,能比较清楚的看出模型的性能和输入输出长度、以及并发的关系。
  • 动态性能测试:评估在请求并发在一定范围内波动,且输入输出长度也在一定范围内变化时,模型的延迟和吞吐。该场景能模拟实际业务下动态的发送不同长度请求,能评估推理框架在实际业务中能支持的并发数。

性能benchmark验证使用到的脚本存放在代码包AscendCloud-3rdLLM-x.x.x.zip的llm_evaluation目录下。

代码目录如下:

benchmark_tools 
├── benchmark_parallel.py  # 评测静态性能脚本
├── benchmark_serving.py  # 评测动态性能脚本
├── generate_dataset.py   # 生成自定义数据集的脚本
├── benchmark_utils.py   # 工具函数集
├── benchmark.py         # 执行静态,动态性能评测脚本
执行性能测试脚本前,需先安装相关依赖。
pip install -r requirements.txt

静态benchmark

运行静态benchmark验证脚本benchmark_parallel.py,具体操作命令如下,可以根据参数说明修改参数。

notebook中进行测试:
cd benchmark_tools 
python benchmark_parallel.py --backend vllm --host 127.0.0.1 --port 8080 --tokenizer /path/to/tokenizer --epochs 10 --parallel-num 1 2 4 8  --output-tokens 256 256 --prompt-tokens 1024 2048 --benchmark-csv benchmark_parallel.csv

生产环境中进行测试:

python benchmark_parallel.py --backend vllm --url xxx --app-code xxx --tokenizer /path/to/tokenizer --epochs 10 --parallel-num 1 2 4 8  --output-tokens 256 256 --prompt-tokens 1024 2048 --benchmark-csv benchmark_parallel.csv

参数说明:

  • --backend:服务类型,支持tgi、vllm、mindspore等。本文档使用的推理接口是vllm。
  • --host:服务IP地址,如127.0.0.1。
  • --port:服务端口,和推理服务端口8080。
  • --url:API接口公网地址与"/v1/completions"拼接而成,部署成功后的在线服务详情页中可查看API接口公网地址。
    图1 API接口公网地址
  • --app-code:获取方式见访问在线服务(APP认证)
  • --tokenizer:tokenizer路径,HuggingFace的权重路径。若服务部署在notebook中,该参数为notebook中权重路径;若服务部署在生产环境中,该参数为服务启动脚本run_vllm.sh中${model_path}
  • --epochs:测试轮数,默认取值为5。
  • --parallel-num:每轮并发数,支持多个,如 1 4 8 16 32。
  • --prompt-tokens:输入长度,支持多个,如 128 128 2048 2048,数量需和--output-tokens的数量对应。
  • --output-tokens:输出长度,支持多个,如 128 2048 128 2048,数量需和--prompt-tokens的数量对应。
脚本运行完成后,测试结果保存在benchmark_parallel.csv中,示例如下图所示。
图2 静态benchmark测试结果(示意图)

动态benchmark

  1. 获取测试数据集。

    动态benchmark需要使用数据集进行测试,可以使用公开数据集,例如Alpaca、ShareGPT。也可以根据业务实际情况,使用generate_datasets.py脚本生成和业务数据分布接近的数据集。

    公开数据集下载地址

    使用generate_datasets.py脚本生成数据集方法:

    generate_datasets.py脚本通过指定输入输出长度的均值和标准差,生成一定数量的正态分布的数据。具体操作命令如下,可以根据参数说明修改参数。

    cd benchmark_tools 
    python generate_datasets.py --datasets custom_datasets.json --tokenizer /path/to/tokenizer \
    --min-input 100 --max-input 3600 --avg-input 1800 --std-input 500 \
    --min-output 40 --max-output 256 --avg-output 160 --std-output 30 --num-requests 1000

    generate_datasets.py脚本执行参数说明如下:

    • --datasets:数据集保存路径,如custom_datasets.json。
    • --tokenizer:tokenizer路径,可以是HuggingFace的权重路径。
    • --min-input:输入tokens最小长度,可以根据实际需求设置。
    • --max-input:输入tokens最大长度,可以根据实际需求设置。
    • --avg-input:输入tokens长度平均值,可以根据实际需求设置。
    • --std-input:输入tokens长度方差,可以根据实际需求设置。
    • --min-output:最小输出tokens长度,可以根据实际需求设置。
    • --max-output:最大输出tokens长度,可以根据实际需求设置。
    • --avg-output:输出tokens长度平均值,可以根据实际需求设置。
    • --std-output:输出tokens长度标准差,可以根据实际需求设置。
    • --num-requests:输出数据集的数量,可以根据实际需求设置。
  2. 执行脚本benchmark_serving.py测试动态benchmark。具体操作命令如下,可以根据参数说明修改参数。
    notebook中进行测试:
    cd benchmark_tools
    python benchmark_serving.py --backend vllm --host 127.0.0.1 --port 8080 --dataset custom_dataset.json --dataset-type custom --tokenizer /path/to/tokenizer --request-rate 0.01 1 2 4 8 10 20 --num-prompts 10 1000 1000 1000 1000 1000 1000 --max-tokens 4096 --max-prompt-tokens 3768 --benchmark-csv benchmark_serving.csv

    生产环境中进行测试:

    python benchmark_serving.py --backend vllm --url xxx --app-code xxx --dataset custom_dataset.json --dataset-type custom --tokenizer /path/to/tokenizer --request-rate 0.01 1 2 4 8 10 20 --num-prompts 10 1000 1000 1000 1000 1000 1000 --max-tokens 4096 --max-prompt-tokens 3768 --benchmark-csv benchmark_serving.csv
    • --backend:服务类型,支持tgi、vllm、mindspore等。本文档使用的推理接口是vllm。
    • --host:服务IP地址,如127.0.0.1。
    • --port:服务端口。
    • --url:API接口公网地址与"/v1/completions"拼接而成,部署成功后的在线服务详情页中可查看API接口公网地址。
      图3 API接口公网地址
    • --app-code:获取方式见访问在线服务(APP认证)
    • --datasets:数据集路径。
    • --datasets-type:支持三种 "alpaca","sharegpt","custom"。custom为自定义数据集。
    • --tokenizer:tokenizer路径,可以是huggingface的权重路径。若服务部署在notebook中,该参数为notebook中权重路径;若服务部署在生产环境中,该参数为服务启动脚本run_vllm.sh中${model_path}
    • --request-rate:请求频率,支持多个,如 0.1 1 2。实际测试时,会根据request-rate为均值的指数分布来发送请求以模拟真实业务场景。
    • --num-prompts:某个频率下请求数,支持多个,如 10 100 100,数量需和--request-rate的数量对应。
    • --max-tokens:输入+输出限制的最大长度,模型启动参数--max-input-length值需要大于该值。
    • --max-prompt-tokens:输入限制的最大长度,推理时最大输入tokens数量,模型启动参数--max-total-tokens值需要大于该值,tokenizer建议带tokenizer.json的FastTokenizer。
    • --benchmark-csv:结果保存路径,如benchmark_serving.csv。
    脚本运行完后,测试结果保存在benchmark_serving.csv中,示例如下图所示。
    图4 动态benchmark测试结果(示意图)

相关文档