趋近智
本实践练习侧重于将本章前面讨论的优化策略专门应用于在线特征商店。低延迟的特征获取对于欺诈检测或推荐系统等实时机器学习应用来说非常重要。我们的目标是系统地找出在线服务中的性能瓶颈,并应用常用调整技术来改进特征获取时间。
我们将模拟一个在线特征查询的P99延迟需要改进的情况,并逐步完成诊断和解决性能瓶颈的步骤。
设想一个在线特征商店正在为实时推荐引擎提供特征。监控显示,获取用户偏好特征的第99百分位(P99)延迟偶尔会超出50毫秒的服务水平目标(SLO),从而影响用户体验。该在线商店由一个常见键值数据库(如Redis、Cassandra或DynamoDB)支持。
目标: 将P99特征获取延迟持续降低到50毫秒以下。
假定工具:
在进行改动之前,必须准确测量当前性能。
我们假定基线测试结果如下:
建立了基线之后,调查高P99延迟的潜在原因。常见方面包括:
EXPLAIN,或检查NoSQL中的表模式)来验证索引使用情况。对于我们的情况,我们假设调查显示查询已根据实体ID正确索引,但某些用户配置文件包含大型聚合历史特征,这增加了载荷大小,并且数据库本身没有额外的缓存层。
基于诊断结果,我们应用相关优化。
在调用特征商店的应用程序服务内部引入一个短生命周期、内存中的缓存。这可以吸收对相同特征的请求高峰,并减轻数据库的负载。
functools.lru_cache(Python),或类似机制。# 使用Python的LRU缓存示例
import time
from functools import lru_cache
# 假设 'fetch_features_from_online_store' 是函数
# 它查询实际数据库(Redis, DynamoDB等)
def fetch_features_from_online_store(entity_id: str) -> dict:
# 模拟数据库查询
print(f"Cache miss. Fetching features for {entity_id} from DB...")
time.sleep(0.03) # 模拟数据库延迟
# 替换为实际的数据库客户端调用
# Example: return redis_client.get(f"user:{entity_id}")
return {"feature_a": entity_id * 3, "large_history": [i for i in range(500)]}
# 缓存最多10000个项目,每个项目在2秒后过期
@lru_cache(maxsize=10000)
def get_user_features_cached(entity_id: str, ttl_hash=None) -> dict:
"""
用于缓存特征商店查询的封装函数。
'ttl_hash' 根据时间强制重新评估缓存。
"""
return fetch_features_from_online_store(entity_id)
def get_features_with_ttl(entity_id: str, ttl_seconds: int = 2) -> dict:
"""在你的应用程序中调用此函数"""
# 根据当前时间窗口计算哈希以强制执行TTL
current_interval = int(time.time() / ttl_seconds)
return get_user_features_cached(entity_id, ttl_hash=current_interval)
# --- 应用程序使用 ---
user_id = "user_123"
start_time = time.time()
features_1 = get_features_with_ttl(user_id)
print(f"First call latency: {time.time() - start_time:.4f}s")
start_time = time.time()
features_2 = get_features_with_ttl(user_id) # 如果在TTL内,应该命中缓存
print(f"Second call latency: {time.time() - start_time:.4f}s")
# 等待TTL过期
time.sleep(3)
start_time = time.time()
features_3 = get_features_with_ttl(user_id) # 应该缓存未命中
print(f"Third call latency (after TTL): {time.time() - start_time:.4f}s")
如果大型特征对象是延迟的主要原因,考虑以下几点:
我们假设我们将用户特征拆分为一个user_profile视图(小)和一个user_history_aggregates视图(大)。推荐模型主要需要user_profile,从而大幅减少了典型的载荷大小。
实施更改后(例如,添加缓存并修改应用程序以获取更小、更具体的特征视图),运行在步骤1中配置的相同负载测试场景。
我们假设新结果如下:
我们可以可视化P99延迟的改进:
应用缓存和数据模型优化前后P99延迟的比较,显示已达到50毫秒的SLO。
性能调整很少是一次性活动。
本实践练习展示了改进在线特征商店性能的系统方法。通过建立基线、找出瓶颈、应用有针对性的优化(如缓存和数据模型调整),并验证结果,你可以确保你的特征商店满足生产机器学习系统严苛的延迟要求。请记住,具体技术及其有效性将很大程度上取决于你的特定架构、工作负载和技术选择。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造