推理说明
所有文档
menu

百舸异构计算平台 AIHC

推理说明

使用说明

准备工作

为了客户快速POC,AIAK提前缓存了模型权重、测试数据集,用户可以直接使用快速验证。

前置检查:使用命令查看CPU模式cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor,确保Mode策略使用performance进行测试,否则会影响性能!如果策略为其他类型,使用如下命令进行修改:

cpupower idle-set -d 2 > /dev/null
cpupower idle-set -d 3 > /dev/null
cpupower frequency-set -g performance > /dev/null

目前模型权重文件以及测试数据集缓存在对象存储BOS上,请选择百度云任一机器,执行以下命令安装BOS命令行工具:

# 下载bcecmd程序
wget https://doc.bce.baidu.com/bce-documentation/BOS/linux-bcecmd-0.4.5.zip
# 解压
unzip linux-bcecmd-0.4.5.zip
cd linux-bcecmd-0.4.5

镜像&权重&数据准备

  • 拉取镜像
docker pull registry.baidubce.com/aihc-aiak/aiak-inference-llm:ubuntu22.04-cu12.3-torch2.4.0-py310_2.0.2.2
  • 下载模型权重(非量化&量化)
./linux-bcecmd-0.4.5/bcecmd bos【模型链接】【本地路径】
# 例如下载30B模型
./linux-bcecmd-0.4.5/bcecmd bos sync bos://cce-ai-datasets/huggyllama/llama-30b /mnt/pfs/meta-llama/llama-30b/
模型 地址
llama2-7b-hf bos://cce-ai-datasets/huggingface.co/meta-llama/Llama-2-7b-hf
llama2-7b-sq bos://cce-ai-datasets/aiak_quanted_models/smooth_quant/llama2-7b/1-gpu/
llama-30b-hf bos://cce-ai-datasets/huggyllama/llama-30b
llama-30b-sq(1-gpu) bos://cce-ai-datasets/aiak_quanted_models/smooth_quant/llama-30b/1-gpu/
llama-30b-sq(4-gpu) bos://cce-ai-datasets/aiak_quanted_models/smooth_quant/llama-30b/4-gpu/
llama-2-13b-hf bos://cce-ai-datasets/huggingface.co/meta-llama/Llama-2-13b-hf
llama-2-13b-sq bos://cce-ai-datasets/aiak_quanted_models/smooth_quant/llama2-13b/1-gpu/
llama-2-70b-hf bos://cce-ai-datasets/huggingface.co/meta-llama/Llama-2-70b-hf
llama-2-70b-sq bos://cce-ai-datasets/aiak_quanted_models/smooth_quant/llama2-70b/8-gpu/
llama-3-8b-hf bos://cce-ai-datasets/huggingface.co/meta-llama/Meta-Llama-3-8B/
llama3-8b-sq bos://cce-ai-datasets/aiak_quanted_models/smooth_quant/Meta-Llama-3-8B/1-gpu/
llama-3-70b-hf bos://cce-ai-datasets/huggingface.co/meta-llama/Meta-Llama-3-70B/
llama3-70b-sq bos://cce-ai-datasets/aiak_quanted_models/smooth_quant/Meta-Llama-3-70B
qwen2-72b-Instruct bos:/cce-ai-models/huggingface.co/Qwen/Qwen2-72B-Instruct
qwen2-72b-sq bos:/cce-ai-datasets/hac-aiacc/aiak_quanted_models/qwen2-72b-instruct/smooth_quant/8-gpu
  • 下载测试数据集
./linux-bcecmd-0.4.5/bcecmd bos cp bos://cce-ai-datasets/ShareGPT_V3_unfiltered_cleaned_split.json  /mnt/pfs/data/ShareGPT_V3_unfiltered_cleaned_split.json

部署推理实例的服务端

需要规模使用时,请使用标准K8S模式发起部署

#启动docker
docker run --gpus all -itd --name aiak2.0.1_test  --shm-size=32768m --privileged --user=root --network host -v /PATH/TO/MODEL:/mnt/model registry.baidubce.com/aihc-aiak/aiak-inference-llm:ubuntu22.04-cu12.3-torch2.4.0-py310_2.0.2.2 /bin/bash
#进入docker
docker exec -it infer_test bash
apiVersion: apps/v1
kind: Deployment
metadata:
  name: aiak-inference-test
  namespace: default
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: aiak-inference-test
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: aiak-inference-test
    spec:
      containers:
        - command:
            - /bin/bash
            - '-c'
            - "trap 'kill $(jobs -p)' EXIT; sleep 3d"
          image: 'registry.baidubce.com/aihc-aiak/aiak-inference-llm:ubuntu22.04-cu12.3-torch2.4.0-py310_2.0.2.2'
          imagePullPolicy: Always
          name: vllm
          resources:
            limits:
              baidu.com/a800_80g_cgpu: "8"
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          volumeMounts:
          - mountPath: /usr/bin/docker
            name: docker
          - mountPath: /var/run/docker.sock
            name: docker-sock
          - mountPath: /mnt/pfs
            name: pfs
          - mountPath: /dev/shm
            name: cache-volume
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: volcano
      securityContext: {}
      terminationGracePeriodSeconds: 60
      volumes:
      - hostPath:
          path: /usr/bin/docker
          type: ''
        name: docker

详细参数查阅《参数说明-服务端主要参数》章节

使用内置量化工具(可选)

进入docker服务的命令行进行操作,量化时间与模型大小和卡数有关,需要十几分钟到1小时左右

# 进入量化工具所在目录
cd /workspace/aiak-model-quant-tool/
# 示例
weight_only_int8量化
python3 model_quantization.py -i /input_path/ -o ./output_path/ -tp 1 -quant_type weight_only_int8 -t fp16
smooth-quant量化默认校准数据集
python3 model_quantization.py -i /input_path/ -o ./output_path/ -tp 1 -quant_type smooth_quant -t fp16 -sq 0.75
smooth-quant量化自定义校准数据集
python3 model_quantization.py -i /input_path/ -o ./output_path/ -tp 1 -quant_type smooth_quant -t fp16 -sq 0.75 --tokenids_path /XX/path_to/smooth_tokenids.txt

详细参数查阅《参数说明-内置量化工具参数》章节

  • 量化输出示例
root@A800:/workspace/aiak-model-quant-tool# python3 model_quantization.py -i /input_path/ -o /output_path/  -quant_type weight_only_int8  -tp 2
=============== Argument ===============
out_dir: /Qwen-14B/
in_file: /Qwen-14B/
tensor_parallelism: 2
model_quantization_type: weight_only_int8
multi_query_mode: False
========================================
INFO 12-01 08:30:18 model_quantization.py:35] quantization an LLM engine model_config:QWenConfig {
INFO 12-01 08:30:18 model_quantization.py:35]   "architectures": [
INFO 12-01 08:30:18 model_quantization.py:35]     "QWenLMHeadModel"
INFO 12-01 08:30:18 model_quantization.py:35]   ],
INFO 12-01 08:30:18 model_quantization.py:35]   "attn_dropout_prob": 0.0,
INFO 12-01 08:30:18 model_quantization.py:35]   "auto_map": {
INFO 12-01 08:30:18 model_quantization.py:35]     "AutoConfig": "configuration_qwen.QWenConfig",
INFO 12-01 08:30:18 model_quantization.py:35]     "AutoModelForCausalLM": "modeling_qwen.QWenLMHeadModel"
INFO 12-01 08:30:18 model_quantization.py:35]   },
INFO 12-01 08:30:18 model_quantization.py:35]   "bf16": false,
INFO 12-01 08:30:18 model_quantization.py:35]   "emb_dropout_prob": 0.0,
INFO 12-01 08:30:18 model_quantization.py:35]   "fp16": false,
INFO 12-01 08:30:18 model_quantization.py:35]   "fp32": false,
INFO 12-01 08:30:18 model_quantization.py:35]   "hidden_size": 5120,
INFO 12-01 08:30:18 model_quantization.py:35]   "initializer_range": 0.02,
INFO 12-01 08:30:18 model_quantization.py:35]   "intermediate_size": 27392,
INFO 12-01 08:30:18 model_quantization.py:35]   "kv_channels": 128,
INFO 12-01 08:30:18 model_quantization.py:35]   "layer_norm_epsilon": 1e-06,
INFO 12-01 08:30:18 model_quantization.py:35]   "max_position_embeddings": 8192,
INFO 12-01 08:30:18 model_quantization.py:35]   "model_type": "qwen",
INFO 12-01 08:30:18 model_quantization.py:35]   "no_bias": true,
INFO 12-01 08:30:18 model_quantization.py:35]   "num_attention_heads": 40,
INFO 12-01 08:30:18 model_quantization.py:35]   "num_hidden_layers": 40,
INFO 12-01 08:30:18 model_quantization.py:35]   "onnx_safe": null,
INFO 12-01 08:30:18 model_quantization.py:35]   "rotary_emb_base": 10000,
INFO 12-01 08:30:18 model_quantization.py:35]   "rotary_pct": 1.0,
INFO 12-01 08:30:18 model_quantization.py:35]   "scale_attn_weights": true,
INFO 12-01 08:30:18 model_quantization.py:35]   "seq_length": 2048,
INFO 12-01 08:30:18 model_quantization.py:35]   "tie_word_embeddings": false,
INFO 12-01 08:30:18 model_quantization.py:35]   "tokenizer_class": "QWenTokenizer",
INFO 12-01 08:30:18 model_quantization.py:35]   "transformers_version": "4.34.0",
INFO 12-01 08:30:18 model_quantization.py:35]   "use_cache": true,
INFO 12-01 08:30:18 model_quantization.py:35]   "use_dynamic_ntk": true,
INFO 12-01 08:30:18 model_quantization.py:35]   "use_flash_attn": "auto",
INFO 12-01 08:30:18 model_quantization.py:35]   "use_logn_attn": true,
INFO 12-01 08:30:18 model_quantization.py:35]   "vocab_size": 152064
INFO 12-01 08:30:18 model_quantization.py:35] }
INFO 12-01 08:30:18 model_quantization.py:35]  quantization tp_size is: 2, 
INFO 12-01 08:33:29 model_quantization.py:35] ==quantization= state_dict===key: transformer.h.0.attn.c_proj.qscale ==value.shape: torch.Size([2, 5120])
INFO 12-01 08:33:29 model_quantization.py:35] ==quantization= state_dict===key: transformer.h.0.attn.c_proj.qweight ==value.shape: torch.Size([5120, 1280])
INFO 12-01 08:33:29 model_quantization.py:35] ==quantization= state_dict===key: transformer.h.0.ln_1.weight ==value.shape: torch.Size([5120])
INFO 12-01 08:33:29 model_quantization.py:35] ==quantization= state_dict===key: transformer.h.0.ln_2.weight ==value.shape: torch.Size([5120])
INFO 12-01 08:33:29 model_quantization.py:35] ==quantization= state_dict===key: transformer.wte.weight ==value.shape: torch.Size([152064, 5120])
('json_quant_config: ', {'w_bit': 8})
……
INFO 12-01 08:33:54 model_quantization.py:35] Quantization model save path: /output_path/2-gpu

启动推理服务的服务端

支持直接以入参形式来部署容器运行

python3 -m vllm.entrypoints.openai.api_server --model=<MODEL_PATH> --tensor-parallel-size 1 --dtype=float16 --port 8888 --enable-prefix-caching

详细参数查阅《参数说明-服务端主要参数》章节;

目前只支持huggingface的checkpoint类型,如果需要使用Megatron的checkpoint,需要先将其转换为HF格式。

测试推理服务的客户端

使用curl命令进行功能单测

流式请求

客户端发送请求时,stream设置为True。

  1. 确保启动服务端,如未启动服务端,可使用以下命令启动
python3 -m vllm.entrypoints.openai.api_server --model=/path/to/your/model/ --tensor-parallel-size=1 --dtype=float16 --gpu_memory_utilization=0.8
  1. 客户端请求示例
curl http://localhost:8000/v1/completions -H "Content-Type: application/json" -d '{
    "model": "/path/to/your/model/",
    "prompt": ["中国的首都是"],"stream":"True"               
}'

注意: 详细参数查阅《参数说明-客户端输入参数》章节;

  1. 得到返回

pic1.png

非流式请求

客户端发送请求时,stream设置为False,或者不设置(默认值为False)

  1. 确保启动服务端,如未启动服务端,可使用以下命令启动
python3 -m vllm.entrypoints.openai.api_server --model=/path/to/your/model/ --tensor-parallel-size=1 --dtype=float16 --gpu_memory_utilization=0.8
  1. 客户端请求示例
curl http://localhost:8000/v1/completions -H "Content-Type: application/json" -d '{
    "model": "/path/to/your/model/",
    "prompt": ["中国的首都是"],"stream":"False"               
}'

注意: 详细参数查阅《参数说明-客户端输入参数》章节;

  1. 得到返回

pic2.png

使用内置数据集进行性能压测

进入容器使用以下方式可以查看推理服务性能

# 使用docker或k8s进入容器的命令分别如下
# docker进入容器
docker exec -it <container_id_or_name> /bin/bash

# kubectl进入容器
kubectl exec -it <pod-name> -- /bin/bash

# 性能测试客户端快速启动命令:
cd /workspace/performance-tool/

# 30b:
# 以下命令,修改-c模型地址,与-d数据集地址即可
nohup bash run.sh -c /mnt/pfs/meta-llama/llama-30b/ -m aiak_triton -d /mnt/pfs/data/ShareGPT_V3_unfiltered_cleaned_split.json -w 256 -n 10000 -g 8001 > client.log &

# 如果需要测试定长的性能,增加如下参数:
# -z 1000 -l 1000 -f true, -z是输入长度,-l是输出长度,-f是忽略休止符,注意目前支持的输入输出总长度不能超过32k

# 参数说明:
# 参数-n:【必选】客户端请求数(aiak_triton模式下需设置为batch size的整数倍)
# 参数-p:【可选】是否开启泊松分布模拟排队等待时间,True表示开启,False表示关闭
# 参数-w:【必选】客户端并发数,建议选取1*BS,2*BS等进行测试
# 参数-c:【必选】模型的checkpoint路径
# 参数-t:【可选】模型tokenizer路径,一般情况和checkpoint路径相同
# 参数-s:【可选】dataset类型,默认数据集为sharegpt(json格式),可选 【booksum(csv格式),自定义input-instruction(json格式)】
# 参数-d:【必选】dataset路径,默认数据集为ShareGPT_V3_unfiltered_cleaned_split.json,booksum数据集只需要指定到具体路径即可
# 参数-u:【可选】是否加载本地cache加速测试数据预处理过程,默认false,true表示开启,模型首次测试,-u参数设置为false,后续测试可置为true进行加速,更换模型测试时,首次需要设置成false
# 参数-q:【可选】是否执行量化模式,支持weight_only_int8, smooth_quant
# 参数-g:【可选】grpc端口,默认8001
# 参数-h:【可选】http端口,默认8002
使用performance tool进行性能测试示例
  1. 确保启动服务端,如未启动服务端,可使用以下命令启动
python3 -m vllm.entrypoints.openai.api_server \
    --model=<path_to_your_model_directory> \
    --tensor-parallel-size 1 \
    --dtype=float16 \
    --gpu_memory_utilization=0.8
  1. 使用performance_tool进行测试
bash run.sh \
    -c <path_to_model_directory> \
    -d /mnt/pfs/datasets/ShareGPT_V3_unfiltered_cleaned_split.json \
    -m openai_api_server \
    -n 10000 \
    -w 256 \
    -v true \
    -h 8000
  1. 获得测试结果

pic3.png

数据集特征 含义 计算方法
数量 数据集包含条数
输入长度最小值 数据集中单条prompt长度最小值
输入长度最大值 数据集中单条prompt长度最大值
输入长度均值 数据集中所有prompt长度的平均数
输入长度标准差 数据集中所有prompt的标准差分布
输出长度最小值 数据集中单条prompt生成结果长度最小值
输出长度最大值 数据集中单条prompt生成结果长度最大值
输出长度均值 数据集中所有prompt生成结果长度的平均数
输出长度标准差 数据集中所有prompt的生成结果标准差分布
指标 含义 计算方法
quant 量化精度,具体为fp16或Smoothquant等
测试条数 数据集包含条数
并发数 同时响应的请求数量
P80延时 首token延时,80分位 从输入prompt的第一个token到生成第一个token,这段时间为首token延时,将所有句子的首token延时从小到大排序,第80%条为80分位值
P99延时 首token延时,99分位 同上,99%
总延时 所有任务处理完成总耗时
QPS 端到端并发量(每秒处理完成几条) QPS = sequence_nums / total time
吞吐 每秒处理token数(包括输入) Throughput = tokens_sum / total time
吐字率 每秒处理token数(不包括输入) Throughput = output_lens / total time
上一篇
AIAK-Inference-LLM简介
下一篇
参数说明