推理系统中的模型缓存策略踩坑记录
在大模型推理系统中,缓存策略直接影响响应速度和资源利用率。最近在优化一个基于Transformer的推理服务时,踩了不少坑,分享一下经验。
问题背景
我们的推理服务部署在K8s集群上,使用TensorRT进行推理加速。最初采用的是简单的LRU缓存机制,但在高并发场景下出现明显的性能瓶颈。
初步尝试
首先尝试了Redis缓存方案:
import redis
import json
redis_client = redis.Redis(host='localhost', port=6379, db=0)
def get_cached_result(key):
cached = redis_client.get(key)
if cached:
return json.loads(cached)
return None
# 缓存策略:按访问频率缓存
结果发现缓存命中率很低,因为请求参数变化太频繁。
核心问题
经过分析,主要问题在于:
- 缓存key设计不合理(包含所有输入参数)
- 缓存过期策略缺失
- 没有考虑模型输出的相似性
解决方案
最终采用了基于哈希的缓存策略,并结合LRU+LFU混合算法:
import hashlib
from collections import OrderedDict
# 自定义缓存类
class ModelCache:
def __init__(self, max_size=1000):
self.cache = OrderedDict()
self.max_size = max_size
def get_key(self, inputs):
# 提取关键参数生成hash key
key_data = str(sorted(inputs.items()))
return hashlib.md5(key_data.encode()).hexdigest()
def get(self, key):
if key in self.cache:
# 移动到末尾(最近使用)
self.cache.move_to_end(key)
return self.cache[key]
return None
def set(self, key, value):
self.cache[key] = value
self.cache.move_to_end(key)
# 超出容量时删除最旧项
if len(self.cache) > self.max_size:
self.cache.popitem(last=False)
实践建议
- 缓存粒度:按模型输入的关键特征生成hash key
- 过期机制:设置合理的TTL时间
- 监控指标:记录命中率、响应时间等
这个方案将平均响应时间从800ms降低到300ms,效果显著。

讨论