You need to enable JavaScript to run this app.
导航
EIC 性能测试方法
最近更新时间:2025.06.07 20:57:55首次发布时间:2025.06.07 20:57:55
我的收藏
有用
有用
无用
无用

基于容器服务(VKE)应用中心的应用模板及其指导文档进行部署应用,需要测试弹性极速缓存(EIC)实例最佳性能时,通过本文方法进行测试。

前提条件

已通过 VKE 应用中心的应用模板,部署了大模型应用。详细操作,请参见 AI 云原生最佳实践

操作步骤

步骤一:停止 GDKV Server 并重新部署应用

基于 VKE 应用中心的应用模板部署完成基于 SGLang 或 Dynamo 的应用后,通过应用模版更新。

  1. 登录 容器服务控制台
  2. 在左侧导航栏,选择 应用中心 > Helm 应用
  3. Helm 应用 页面,筛选目标 集群命名空间 后,找到 SGLang 或 Dynamo 应用并单击应用名称。
    alt
  4. 进入 Helm 应用详情页 页面后,在页面右上角单击 更新
  5. 更新 Helm 应用 页面,单击 参数配置 > values.yaml 后的编辑按钮。
    alt
  6. 找到 GDKV 相关配置,修改enabledfalse,然后单击 确定 保存变更。
    gdkv:
      bitmai:
        pullPolicy: IfNotPresent
        repository: vke-pre-cn-beijing.cr.volces.com/vke/bitmai
        tag: v0.0.1
      enabled: false # 修改为 false,停止 GDKV Server。
    
  7. 系统回到 更新 Helm 应用 页面后,单击右下角 确定 部署应用。

步骤二:卸载 EIC 实例已有节点

  1. 登录 弹性极速缓存控制台
  2. 在左侧导航栏选择 实例管理,找到对应 EIC 实例后,单击实例名称进入实例详情页。
  3. 在实例详情页选择 节点列表 页签,查看 EIC 实例已有节点列表。
  4. 勾选全部节点前的复选框,并单击节点列表下方的 卸载 即可发起节点卸载。

步骤三:扩容 EIC 实例节点

  1. 弹性极速缓存控制台 的 EIC 实例详情页,单击 实例信息 页签。
  2. 实例信息 页签的 配置信息 区域下单击 节点数 参数后的 扩容
    alt
  3. 在实例的 扩容 页面,勾选需要扩容的节点,当实例当前的节点个数为 0 时,调整节点使用的内存和硬盘容量等参数,然后右下角 扩容实例 即可发起扩容。
    建议单台 GPU 机器 DRAM 至少配置 1024 GiB 的内存,以获取更大的推理性能。
    alt

步骤四:性能验证

  1. 生成 Benchmark测试脚本。
      需要下载 vLLM 或者 SGLang Benchmark 测试脚本。
    https://github.com/vllm-project/vllm/tree/main/benchmarks
    
    执行如下命令启动脚本。
    bash test.sh >test.log 2>&1 &
    
    脚本内容如下所示。
    # 定义 input 和 output 长度
    OUTPUT_LEN=1500
    
    # 创建 Logs 目录(如果不存在)
    model=Deepseek
    # 测试 GPU 和 EIC 性能时,dir 替换为模型应用相关的日志存储目录
    dir=logs_vllm_Deepseek
    mkdir -p $dir
    
    # 定义 request-rate 和 max-concurrency
    #declare -a input_lens=(200 500 1024 2048 4096 8192 16000 32000)
    #declare -a request_rates=(1 16 32 48 64 80 128 160)
    #declare -a max_concurrency=(1 16 32 48 64 80 128 160)
    #declare -a num_prompts=(4 64 128 192 256 320 512 640)
    
    declare -a max_concurrency=(2 4 8 16)
    declare -a input_lens=(3500 3500 3500)
    declare -a num_prompts=(16 32 64)
    
    SEED=1
    
    # 运行 benchmark 测试
    for i in "${!input_lens[@]}"; do
        for j in "${!max_concurrency[@]}"; do
            INPUT_LEN=${input_lens[$i]}
            RATE=${max_concurrency[$j]}
            CONCURRENCY=${max_concurrency[$j]}
            PROMPTS=${num_prompts[$i]}
            SEED=$((SEED + 1))
            echo "Running benchmark with input len: $INPUT_LEN, output len $OUTPUT_LEN, request rate $RATE, concurrency $CONCURRENCY, prompts $PROMPTS, first round"
            python3 benchmark_serving.py --backend vllm \
                     --tokenizer /models/deepseek \
                     --model $model \
                     --base-url http://127.0.0.1:8080 \
                     --endpoint /v1/completions \
                     --metric_percentiles '50,90,95,99' \
                     --goodput ttft:5000 tpot:250 \
                     --num-prompts $PROMPTS \
                     --request-rate $RATE \
                     --max-concurrency $CONCURRENCY \
                     --random-input-len $INPUT_LEN \
                     --random-prefix-len 0 \
                     --random-output-len $OUTPUT_LEN \
                     --dataset-name random \
                     --ignore-eos \
                     --seed $SEED \
                     --save-result \
                     --result-dir ./$dir \
                     >> $dir/${model}_${CONCURRENCY}_${PROMPTS}_${INPUT_LEN}_${OUTPUT_LEN}_firstround.txt 2>&1 
            sleep 1
            echo "Running benchmark with input len: $INPUT_LEN, output len $OUTPUT_LEN, request rate $RATE, concurrency $CONCURRENCY, prompts $PROMPTS, second round"
            python3 benchmark_serving.py --backend vllm \
                     --tokenizer /models/deepseek \
                     --model $model \
                     --base-url http://127.0.0.1:8080 \
                     --endpoint /v1/completions \
                     --metric_percentiles '50,90,95,99' \
                     --goodput ttft:5000 tpot:250 \
                     --num-prompts $PROMPTS \
                     --request-rate $RATE \
                     --max-concurrency $CONCURRENCY \
                     --random-input-len $INPUT_LEN \
                     --random-prefix-len 0 \
                     --random-output-len $OUTPUT_LEN \
                     --dataset-name random \
                     --ignore-eos \
                     --seed $SEED \
                     --save-result \
                     --result-dir ./$dir \
                     >> $dir/${model}_${CONCURRENCY}_${PROMPTS}_${INPUT_LEN}_${OUTPUT_LEN}_secondround.txt 2>&1 
            sleep 1
            echo "Running benchmark with input len: $INPUT_LEN, output len $OUTPUT_LEN, request rate $RATE, concurrency $CONCURRENCY, prompts $PROMPTS, finished"
        done
    done
    
  2. 启动 EIC。
    启动 SGLang 带 EIC 参数,下方代码块以 Deepseek R1为例。进行 SGLang 应用性能验证时,可以验证前缀多机共享的效果。
    GLOO_SOCKET_IFNAME=eth0 NCCL_SOCKET_IFNAME=eth0 NCCL_IB_GID_INDEX=3 NCCL_IB_DISABLE=0 python3 -m sglang.launch_server --model-path /models/deepseek --tp 16 --dist-init-addr $LWS_LEADER_ADDRESS:20000 --nnodes 2 --node-rank $LWS_WORKER_INDEX --trust-remote-code --mem-fraction-static 0.75 --enable-hierarchical-cache --enable-eic-cache --hicache-write-policy=write_back --hicache-size 1500 --page-size 16 --host 0.0.0.0 --port 8080  >server.log 2>&1 &
    
    GLOO_SOCKET_IFNAME=eth0 NCCL_SOCKET_IFNAME=eth0 NCCL_IB_GID_INDEX=3 NCCL_IB_DISABLE=0 python3 -m sglang.launch_server --model-path /models/deepseek --tp 16 --dist-init-addr $LWS_LEADER_ADDRESS:20000 --nnodes 2 --node-rank $LWS_WORKER_INDEX --trust-remote-code --mem-fraction-static 0.75 --enable-hierarchical-cache --enable-eic-cache --hicache-write-policy=write_back --hicache-size 1500 --page-size 16 >server.log 2>&1 &
    
    其中--enable-hierarchical-cache --enable-eic-cache --hicache-write-policy=write_back --hicache-size 1500 --page-size 16是启动 EIC 需要带的额外参数。在 步骤三 中单台 GPU 扩容配置的内存为 1024 GiB, 因此此处配置--hicache-size为 1500 比较合适。
  3. 不带 EIC 启动。
    启动 SGLang 不带 EIC 参数。示例代码块如下,仅供参考。
    GLOO_SOCKET_IFNAME=eth0 NCCL_SOCKET_IFNAME=eth0 NCCL_IB_GID_INDEX=3 NCCL_IB_DISABLE=0 python3 -m sglang.launch_server --model-path /models/deepseek --tp 16 --dist-init-addr $LWS_LEADER_ADDRESS:20000 --nnodes 2 --node-rank $LWS_WORKER_INDEX --trust-remote-code --mem-fraction-static 0.75 --page-size 16 --host 0.0.0.0 --port 8080  >server.log 2>&1 &
    
    GLOO_SOCKET_IFNAME=eth0 NCCL_SOCKET_IFNAME=eth0 NCCL_IB_GID_INDEX=3 NCCL_IB_DISABLE=0 python3 -m sglang.launch_server --model-path /models/deepseek --tp 16 --dist-init-addr $LWS_LEADER_ADDRESS:20000 --nnodes 2 --node-rank $LWS_WORKER_INDEX --trust-remote-code --mem-fraction-static 0.75 --page-size 16 >server.log 2>&1 &