云服务器内容精选

  • Step2 准备权重文件 将OBS中的模型权重上传到Notebook的工作目录/home/ma-user/work/下。上传代码参考如下。 import moxing as mox obs_dir = "obs://${bucket_name}/${folder-name}" local_dir = "/home/ma-user/work/qwen-14b" mox.file.copy_parallel(obs_dir, local_dir) 实际操作如下图所示。 图1 上传OBS文件到Notebook的代码示例
  • 投机推理benchmark验证 本章节介绍如何进行投机推理benchmark验证,当前投机推理benchmark仅支持在Notebook中进行测试。 进入benchmark_tools目录下。 cd benchmark_tools 运行验证脚本speculative_benchmark_parallel.py,具体操作命令如下,可以根据参数说明修改参数。 python speculative_benchmark_parallel.py --backend vllm --host ${docker_ip} --port 8080 --dataset human-eval-v2-20210705.jsonl \ --tokenizer /path/to/tokenizer --num-prompts 80 \ --output_len 4096 --trust-remote-code --backend:服务类型,如tgi,vllm,mindspore、openai。 --host ${docker_ip}:服务部署的IP地址,${docker_ip}替换为宿主机实际的IP地址。 --port:推理服务端口。 --dataset:数据集路径,推荐使用human-eval-v2-20210705.jsonl数据集,数据集可从https://github.com/openai/human-eval/blob/master/data/HumanEval.jsonl.gz下载压缩包解压获得。 --tokenizer:tokenizer路径,可以是HuggingFace的权重路径,backend取值是openai时,tokenizer路径需要和推理服务启动时--model路径保持一致,比如--model /data/nfs/model/llama_7b, --tokenizer也需要为/data/nfs/model/llama_7b,两者要完全一致。 --num-prompts:某个频率下请求数,默认80。 --output_len:输出长度,默认是1024。 --trust-remote-code:是否相信远程代码。 脚本运行完后,测试结果直接在终端输出。
  • 约束限制 创建在线服务时,每秒服务流量限制默认为100次,如果静态benchmark的并发数(parallel-num参数)或动态benchmark的请求频率(request-rate参数)较高,会触发推理平台的流控,请在ModelArts Standard“在线服务”详情页修改服务流量限制。 同步请求时,平台每次请求预测的时间不能超过60秒。例如输出数据比较大的调用请求(例如输出大于1k),请求预测会超过60秒导致调用失败,可提交工单设置请求超时时间。
  • 动态benchmark 获取测试数据集。 动态benchmark需要使用数据集进行测试,可以使用公开数据集,例如Alpaca、ShareGPT。也可以根据业务实际情况,使用generate_datasets.py脚本生成和业务数据分布接近的数据集。 公开数据集下载地址: ShareGPT: https://huggingface.co/datasets/anon8231489123/ShareGPT_Vicuna_unfiltered/resolve/main/ShareGPT_V3_unfiltered_cleaned_split.json Alpaca: https://github.com/tatsu-lab/stanford_alpaca/blob/main/alpaca_data.json 使用generate_dataset.py脚本生成数据集方法: generate_datasets.py脚本通过指定输入输出长度的均值和标准差,生成一定数量的正态分布的数据。具体操作命令如下,可以根据参数说明修改参数。 cd benchmark_tools python generate_dataset.py --dataset 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_dataset.py脚本执行参数说明如下: --dataset:数据集保存路径,如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:输出数据集的数量,可以根据实际需求设置。 执行脚本benchmark_serving.py测试动态benchmark。具体操作命令如下,可以根据参数说明修改参数。 Notebook中进行测试: conda activate python-3.9.10 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、openai等。本文档使用的推理接口是vllm。 --host:服务IP地址,如127.0.0.1。 --port:服务端口。 --url:如果以vllm接口方式启动服务,API接口公网地址与"/generate"拼接而成;如果以openai接口方式启动服务,API接口公网地址与"/v1/completions"拼接而成。部署成功后的在线服务详情页中可查看API接口公网地址。 图3 API接口公网地址 --app-code:获取方式见访问在线服务(APP认证)。 --dataset:数据集路径。 --dataset-type:支持三种 "alpaca","sharegpt","custom"。custom为自定义数据集。 --tokenizer:tokenizer路径,可以是huggingface的权重路径。如果服务部署在Notebook中,该参数为Notebook中权重路径;如果服务部署在生产环境中,该参数为本地模型权重路径。 --served-model-name:仅在以openai接口启动服务时需要该参数。如果服务部署在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。 --served-model-name: 选择性添加, 选择性添加,在接口中使用的模型名;如果没有配置,则默认为tokenizer。 --num-scheduler-steps: 需和服务启动时配置的num-scheduler-steps一致。默认为1。 脚本运行完后,测试结果保存在benchmark_serving.csv中,示例如下图所示。 图4 动态benchmark测试结果(示意图)
  • 静态benchmark 运行静态benchmark验证脚本benchmark_parallel.py,具体操作命令如下,可以根据参数说明修改参数。 Notebook中进行测试: conda activate python-3.9.10 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、openai等。本文档使用的推理接口是vllm。 --host:服务IP地址,如127.0.0.1。 --port:服务端口,和推理服务端口8080。 --url:如果以vllm接口方式启动服务,API接口公网地址与"/generate"拼接而成;如果以openai接口方式启动服务,API接口公网地址与"/v1/completions"拼接而成。部署成功后的在线服务详情页中可查看API接口公网地址。 图1 API接口公网地址 --app-code:获取方式见访问在线服务(APP认证)。 --tokenizer:tokenizer路径,HuggingFace的权重路径。如果服务部署在Notebook中,该参数为Notebook中权重路径;如果服务部署在生产环境中,该参数为本地模型权重路径。 --served-model-name:仅在以openai接口启动服务时需要该参数。如果服务部署在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的数量对应。 --num-scheduler-steps: 需和服务启动时配置的num-scheduler-steps一致。默认为1。 --enable-prefix-caching:服务端是否启用enable-prefix-caching特性,默认为false。 脚本运行完成后,测试结果保存在benchmark_parallel.csv中,示例如下图所示。 图2 静态benchmark测试结果(示意图)
  • benchmark方法介绍 性能benchmark包括两部分。 静态性能测试:评估在固定输入、固定输出和固定并发下,模型的吞吐与首token延迟。该方式实现简单,能比较清楚的看出模型的性能和输入输出长度、以及并发的关系。 动态性能测试:评估在请求并发在一定范围内波动,且输入输出长度也在一定范围内变化时,模型的延迟和吞吐。该场景能模拟实际业务下动态的发送不同长度请求,能评估推理框架在实际业务中能支持的并发数。 性能benchmark验证使用到的脚本存放在代码包AscendCloud-LLM-x.x.x.zip的llm_tools/llm_evaluation目录下。 代码目录如下: benchmark_tools ├── benchmark_parallel.py # 评测静态性能脚本 ├── benchmark_serving.py # 评测动态性能脚本 ├── generate_dataset.py # 生成自定义数据集的脚本 ├── benchmark_utils.py # 工具函数集 ├── benchmark.py # 执行静态、动态性能评测脚本 ├── requirements.txt # 第三方依赖 目前性能测试已经支持投机推理能力。 执行性能测试脚本前,需先安装相关依赖。 conda activate python-3.9.10 pip install -r requirements.txt
  • Step2 查看精度测试结果 默认情况下,评测结果会按照result/{model_name}/的目录结果保存到对应的测试工程。执行多少次,则会在{model_name}下生成多少次结果。benchmark_eval下生成的log中记录了客户端产生结果。数据集的打分结果在result/{model_name}/...目录下,查找到summmary目录,有txt和csv两种保存格式。总体打分结果参考txt和csv文件的最后一行,举例如下: npu: mmlu:46.6 gpu: mmlu:47 NPU打分结果(mmlu取值46.6)和GPU打分结果(mmlu取值47)进行对比,误差在1%以内(计算公式:(47-46.6)/47*100=0.85%)认为NPU精度和GPU对齐。
  • Step1 配置精度测试环境 获取精度测试代码。精度测试代码存放在代码包AscendCloud-LLM的llm_tools/llm_evaluation目录中,代码目录结构如下。目前使用的opencompass版本是0.2.6 benchmark_eval ├──opencompass.sh #运行opencompass脚本 ├──install.sh #安装opencompass脚本 ├──vllm_api.py #启动vllm api服务器 ├──vllm.py #构造vllm评测配置脚本名字 ├──vllm_ppl.py #ppl精度测试脚本 精度评测切换conda环境,确保之前启动服务为vllm接口,进入到benchmark_eval目录下,执行如下命令。 conda activate python-3.9.10 bash install.sh 在/home/ma-user/AscendCloud/AscendCloud-LLM/llm_tools/llm_evaluation/benchmark_eval目录下安装依赖。 cd opencompass #在benchmark_eval目录下 pip install -e . #下载对应依赖 cd ../human-eval #在benchmark_eval目录下 (可选,如果选择使用humaneval数据集) pip install -e . # 可选,如果选择使用humaneval数据集 (可选)如果需要在humaneval数据集上评估模型代码能力,请执行此步骤,否则忽略这一步。原因是通过opencompass使用humaneval数据集时,需要执行模型生成的代码。请仔细阅读human_eval/execution.py文件第48-57行的注释,内容参考如下。了解执行模型生成代码可能存在的风险,如果接受这些风险,请取消第58行的注释,执行下面步骤5进行评测。 # WARNING # This program exists to execute untrusted model-generated code. Although # it is highly unlikely that model-generated code will do something overtly # malicious in response to this test suite, model-generated code may act # destructively due to a lack of model capability or alignment. # Users are strongly encouraged to sandbox this evaluation suite so that it # does not perform destructive actions on their host or network. For more # information on how OpenAI sandboxes its code, see the accompanying paper. # Once you have read this disclaimer and taken appropriate precautions, # uncomment the following line and proceed at your own risk: # exec(check_program, exec_globals) #第58行 执行精度测试启动脚本opencompass.sh,具体操作命令如下,可以根据参数说明修改参数。请确保${work_dir} 已经通过export设置。 vllm_path=${vllm_path} \ host=$host \ service_port=${service_port} \ max_out_len=${max_out_len} \ batch_size=${batch_size} \ eval_datasets=${eval_datasets} \ model_name=${model_name} \ benchmark_type=${benchmark_type} \ bash -x opencompass.sh 参数说明: vllm_path:构造vllm评测配置脚本名字,默认为vllm。 host:与起服务的host保持一致,比如起服务为0.0.0.0,host设置也为0.0.0.0。 service_port:服务端口,与启动服务时的端口保持,比如8080。 max_out_len:在运行类似mmlu、ceval等判别式回答时,max_out_len建议设置小一些,比如16。在运行human_eval等生成式回答(生成式回答是对整体进行评测,少一个字符就可能会导致判断错误)时,max_out_len设置建议长一些,比如512,至少包含第一个回答的全部字段。 batch_size:输入的batch_size大小,不影响精度,只影响得到结果速度。 eval_datasets:评测数据集和评测方法,比如ceval_gen、mmlu_gen,不同数据集可以详见opencompass下面data目录。 model_name:评测模型名称,不需要与启动服务时的模型参数保持一致。 benchmark_type:作为一个保存log结果中的一个变量名,默认选eval。 参考命令: vllm_path=vllm host=0.0.0.0 service_port=8080 max_out_len=16 batch_size=2 eval_datasets=mmlu_gen model_name=llama_7b benchmark_type=eval bash -x opencompass.sh (可选)如果同时运行多个数据集,需要将不同数据集通过空格分开,加入到eval_datasets中,比如eval_datasets=ceval_gen mmlu_gen。运行命令如下所示。 cd opencompass python run.py --models vllm --datasets mmlu_gen ceval_gen --debug -w ${output_path} output_path: 要保存的结果路径。 (可选)创建新conda环境,安装vllm和opencompass。执行完之后,在 opencompass/configs/models/vllm/vllm_ppl.py 里是ppl的配置项。由于离线执行推理,消耗的显存相当庞大。其中以下参数需要根据实际来调整。 batch_size, 推理时传入的 prompts 数量,可配合后面的参数适当减少 offline,是否启动离线模型,使用 ppl 时必须为 True tp_size,使用推理的卡数 max_seq_len,推理的上下文长度,和消耗的显存直接相关,建议稍微高于prompts。其中,mmlu和ceval 建议 3200 另外,在 opencompass/opencompass/models/vllm_api.py 中,可以适当调整 gpu_memory_utilization。如果还是 oom,建议适当往下调整。 最后,如果执行报错提示oom,建议修改数据集的shot配置。例如mmlu,可以修改文件 opencompass/configs/datasets/mmlu/mmlu_ppl_ac766d.py 中的 fix_id_list, 将最大值适当调低。 ppl困惑度评测一般用于base权重测评,会将n个选项上拼接上下文,形成n个序列,再计算这n个序列的困惑度(perplexity)。其中,perplexity最小的序列所对应的选项即为这道题的推理结果。运行时间比较长,例如llama3_8b 跑完mmlu要2~3小时。 在npu卡上,使用多卡进行推理时,需要预置变量 export PYTORCH_NPU_ALLOC_CONF=expandable_segments:False 执行脚本如下: python run.py --models vllm_ppl --datasets mmlu_ppl -w ${output_path} output_path 指定保存结果的路径。 参考模型llama3系列模型,数据集mmlu为例,配置如下: 表1 参数配置 模型 max_seq_len batch_size shot数 llama3_8b 3200 8 采用默认值 llama3_70b 3200 4 [0, 1, 2] (可选) opencompass也支持通过本地权重来进行ppl精度测试。本质上使用transformers进行推理,因为没有框架的优化,执行时间最长。另一方面,由于是使用transformers推理,结果也是最稳定的。对单卡运行的模型比较友好,算力利用率比较高。对多卡运行的推理,缺少负载均衡,利用率低。 在昇腾卡上执行时,需要在 opencompass/opencompass/runners/local.py 中添加如下代码 import torch import torch_npu from torch_npu.contrib import transfer_to_npu 执行脚本如下 # for llama3_8b python run.py --datasets mmlu_ppl \ --hf-type base --hf-path {hf-path} \ --max-seq-len 3200 --max-out-len 16 --hf-num-gpus 1 --batch-size 4 \ -w {output_path} --debug 参数说明如下: --datasets:评测的数据集及评测方法,其中 mmlu 是数据集,ppl 是评测方法。 --hf-type:HuggingFace模型权重类型(base,chat), 默认为chat, 依据实际的模型选择。 --hf-path:本地 HuggingFace 权重的路径,比如/home/ma-user/nfs/model/Meta-Llama-3-8B。 --max-seq-len:模型的最大序列长度。 --max-out-len:模型的最大输出长度。 --hf-num-gpus:需要使用的卡数。 --batch-size:推理每次处理的输入数目。 -w:存放输出结果的目录。