[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
}'