[HiCache] L2、L3测试方法 - shun8686/sglang GitHub Wiki

一、L2 hicache测试

1 启动sglang服务

脚本删掉--disable-radix-cache,并增加:

  --enable-hierarchical-cache \
  --hicache-io-backend kernel_ascend \
  --enable-cache-report \
  --hicache-ratio 2 \
  --hicache-write-policy write_through \

2 测试

2.1 精度测试

使用evalscope或aisbench测试即可,要求精度相比不开启hicache不恶化

2.2 使用benchserving压测,触发L1淘汰后从L2恢复

unset http_proxy
unset https_proxy
unset HTTP_PROXY
unset HTTPS_PROXY

MODEL_PATH="${MODEL_PATH:-/home/weights/DeepSeek-V4-Flash-0731-w8a8}"
python3 -m sglang.benchmark.serving \
  --host 127.0.0.1 \
  --port 30122 \
  --backend sglang \
  --dataset-name generated-shared-prefix \
  --backend sglang \
  --gsp-num-groups 3 \
  --gsp-prompts-per-group 32 \
  --gsp-system-prompt-len 28800 \
  --gsp-question-len 3200 \
  --gsp-output-len 1024 \
  --max-concurrency 32 \
  --random-range-ratio 1 \
  --seed 100 \
  --model $MODEL_PATH \
  --tokenizer $MODEL_PATH \
  --warmup-requests 16 \
  --cache-report 

结果能看到DEVICE(L1)和HOST(L2)的命中率
如果命中不了host,则可能是L1的cache足够大,没有触发驱逐,可:
1)调大输入长度和条数,比如输入长度从32k改成64k(gsp-system-prompt-len改成57600,gsp-question-len改成6400),gsp-prompts-per-group条数适当调大;
2)服务启动参数max_total_tokens调小,即缩小kv cache池大小

二、L3 hicache测试

1 启动memcache服务

python -m sglang.srt.mem_cache.storage.npu_memcache.start_meta_service --config_path "metaservice_config.json"

metaservice_config.json的内容:

{
    "meta_service_url": "tcp://141.61.94.103:5007",
    "config_store_url": "tcp://141.61.94.103:6007",
    "metrics_url": "http://141.61.94.103:8007"
}

其中,ip修改为运行改memcache服务的服务器的IP,可以选sglang服务器中的一台,端口可自定义

2 启动sglang服务

2.1 修改服务参数

脚本删掉--disable-radix-cache,并增加:

  --enable-hierarchical-cache \
  --hicache-io-backend kernel_ascend \
  --enable-cache-report \
  --hicache-ratio 2 \
  --hicache-write-policy write_through \
  --hicache-storage-backend npu_memcache \
  --hicache-storage-backend-extra-config '{"meta_service_url":"tcp://141.61.94.103:5007", "config_store_url":"tcp://141.61.94.103:6007", "log_level":"info", "world_size":8, "protocol": "device_sdma", "dram_size": "20GB"}'

注意:
1、IP和端口和上面memcache服务配置的IP和端口保持一致;
2、protocol: A3设置成device_sdma,A5设置成device_urma;
3、world_size:设置成集群所有PD节点的rank数(tp-size * pp-size);
4、dram_size:这是每个rank贡献出来多少,一般设10GB~30GB,rank多的话设置小一点。
(更准确点计算,在主机上执行free -g 看当前单节点可用内存,单节点可用内存除以单节点rank数,就得到最大可用dram大小,但实际L3可以的空间还要去掉L2占用,所以要小,如果执行free -g可用内存本就不足,可以限制清理内存碎片:sync && echo 1 | sudo tee /proc/sys/vm/drop_caches)
例如A3环境,单节点tp-size=16, 则554/16 = 34,dram_size设成30GB以下

2.2 FAQ

1)执行free -g 如可用内存过小,可以先清理节点内存碎片

sync && echo 1 | sudo tee /proc/sys/vm/drop_caches

2)如果服务启动报memcache_hybrid.DistributedObjectStore.init failed,日志往上翻,如果是如下错误,则是主机内存空间不够了,需要适当调整:

  • dram_size调小,降低L3占用;
  • hicache-ratio调小,降低L2占用

2026-10-08 17:20:24.524126 WARN [1705-1705][HYBM hybm_vmm_based_segment.cpp:195 MallocFromHost] Try HalMemCreate use 1GB page not successful, ret:6, than try 2MB page
2026-10-08 17:21:34.868639 INFO [1709-1709][HYBM hybm_vmm_based_segment.cpp:178 HalMemCreateAdapterFromHost] Try HalMemCreate ret:6 numa:4294967295 spend time:71160749 size:21474836480
2026-10-08 17:21:34.868701 ERROR [1709-1709][HYBM hybm_vmm_based_segment.cpp:201 MallocFromHost] Try HalMemCreate failed ret:6 device:13 spend time: size:21474836480
2026-10-08 17:21:34.868708 ERROR [1709-1709][HYBM hybm_vmm_based_segment.cpp:281 AllocLocalMemory] Assert ret == BM_OK, HalMemCreate failed: 6 segType:1 devId:13 size:21474836480
2026-10-08 17:21:34.868714 ERROR [1709-1709][HYBM hybm_entity_default.cpp:218 AllocLocalMemory] segment allocate slice with size: 21474836480 failed: -6
2026-10-08 17:21:34.868719 ERROR [1709-1709][HYBM hybm_big_mem_entry.cpp:102 hybm_alloc_local_memory] allocate slice with size: 21474836480, mType: 2 failed: -6
2026-10-08 17:21:34.868726 ERROR [1709-1709][SMEM smem_bm_entry.cpp:117 AllocDramMem] alloc local host mem failed, size: 21474836480
2026-10-08 17:21:34.868730 ERROR [1709-1709][SMEM smem_bm_entry.cpp:187 Initialize] alloc dram mem failed, result: -1

3 测试

3.1 精度测试

使用evalscope或aisbench测试即可
参考命令:

MODEL_PATH=/home/weights/DeepSeek-V4-Flash-0731-w8a8

evalscope eval \
    --model ${MODEL_PATH} \
    --api-url http://127.0.0.1:6633/v1 \
    --api-key EMPTY \
    --eval-type openai_api \
    --generation-config '{"max_tokens":120000,"top_p":1,"temperature":1,"timeout":6000,"stream":true,"extra_body":{"chat_template_kwargs":{"thinking":true}}}' \
    --datasets gpqa_diamond \
    --dataset-args '{"gpqa_diamond":{"local_path":"/mnt/share/dataset/gpqa","subset_list":["gpqa_diamond"]}}' \
    --eval-batch-size 32 \
    --ignore-errors \
    --work-dir ./gpqa/ \

3.2 使用benchserving压测,触发L1淘汰后从L2/L3恢复

unset http_proxy
unset https_proxy
unset HTTP_PROXY
unset HTTPS_PROXY

MODEL_PATH="${MODEL_PATH:-/home/weights/DeepSeek-V4-Flash-0731-w8a8}"
python3 -m sglang.benchmark.serving \
  --host 127.0.0.1 \
  --port 30122 \
  --backend sglang \
  --dataset-name generated-shared-prefix \
  --backend sglang \
  --gsp-num-groups 3 \
  --gsp-prompts-per-group 32 \
  --gsp-system-prompt-len 28800 \
  --gsp-question-len 3200 \
  --gsp-output-len 1024 \
  --max-concurrency 32 \
  --random-range-ratio 1 \
  --seed 100 \
  --model $MODEL_PATH \
  --tokenizer $MODEL_PATH \
  --warmup-requests 16 \
  --cache-report 

观察benchserving打印结果中device(L1)、host(L2)、storage(L3)的命中情况是否正常

----------------Cache Hit Details-----------------
Total prompt tokens:                     6285195
Total cached tokens:                     4192256
  Device:                                3309568
  Host:                                  423936
  Storage:                               458752
Cache hit rate:                          66.7%
  Device:                                78.9%
  Host:                                  10.1%
  Storage:                               10.9%

3.3 针对不同模型做精准测试,L1/L2/L3

python测试脚本见:
https://github.com/shun8686/sglang/wiki/%5BHiCache%5D-%E6%B5%8B%E8%AF%95%E8%84%9A%E6%9C%AC
执行方法:

export HICACHE_TEST_URL=http://127.0.0.1:8869
export HICACHE_TEST_MODEL=deepseek-v4
python3 test_npu_hicache_npu_memcache.py

HICACHE_TEST_MODEL取值:
qwen3.6-hybrid-mamba、deepseek-v4、glm5.2-dsa、kimi-k3-kda

其他

curl --location 'http://127.0.0.1:8869/v1/chat/completions' \
--header 'Content-Type:application/json' \
--data '{
    "messages": [
        {"role": "user", "content": "The capital of France is"}
    ],
    "temperature": 0,
    "max_tokens": 100
}'