华为云弹性内存存储EMS深度对接指南:从架构解析到生产级部署实战
1. 引言:大模型推理时代的“内存墙”困境
大语言模型的参数规模正在以惊人的速度膨胀,从百亿级到千亿级乃至万亿级,模型参数量每18个月增长约40倍。然而,单个神经处理单元或图形处理器的高带宽显存容量增长却远远滞后于模型规模的扩张。这种“内存墙”现象已经成为制约AI推理性能的核心瓶颈——当多轮对话的KVCache无法全部保留在显存中时,系统不得不丢弃历史缓存,导致后续推理需要重复计算,首Token时延急剧上升,用户感知到的对话响应速度显著下降。
为应对这一挑战,华为云在2024年的华为开发者大会上正式发布了弹性内存存储服务(Elastic Memory Service,EMS)。EMS并非传统的对象存储或文件存储,而是一种以DRAM内存为主要存储介质的云基础设施服务,专门为LLM推理提供高性能缓存和推理加速。本文将系统性地讲解华为云EMS的对接使用方法,涵盖技术架构、部署流程、SDK集成、框架对接以及生产级最佳实践。
需要先登录华为云控制台,点击:华为云控制台,还没有账号,点击:注册并关联,已有账号点击:登录后关联
2. EMS技术架构深度解析
2.1 “计算-内存-存储”三层架构
华为云EMS的核心创新在于将传统的“计算-存储”分离的两层云架构升级为“计算-内存-存储”的三层云架构。在这套架构中,新增的“内存层”即为弹性内存存储,它作为计算层与存储层之间的高性能内存缓存层,利用DRAM内存来缓存持久化存储层的数据或在计算过程中产生的中间数据。
EMS的产品架构主要由三部分组成:
- 领域专用服务SDK:包含一系列面向不同AI应用场景的插件和接口服务SDK,提供业务系统接入、业务数据布局和近数据处理等功能,实现业务请求的内存加速。目前该SDK主要应用于大语言模型的推理场景。
- 分布式内存池:负责跨节点的内存空间管理、数据负载均衡等任务,通过空间池化提供内存缓存共享访问。内存池当前采用融合部署方式,利用AI服务器中的DRAM资源进行池化,实现分布式共享与本地亲和调度。
- EMS管理面:负责EMS服务的部署、监控、升级及运维管理等功能,通过华为云的云原生基础设施为用户提供一站式的云上运维解决方案。
2.2 Memory Pooling专利技术与三大核心能力
EMS基于Memory Pooling专利技术,将AI服务器中的空闲DRAM资源进行池化,形成分布式内存池,实现DRAM资源的按需分配和高效利用。这一技术赋予了EMS三大核心能力:
- 显存扩展:大模型推理中,由于模型太大,通常需要使用大量的NPU卡才能将模型参数装下来进行推理,但NPU的算力往往利用率不高。EMS将模型参数分层存储在显存和EMS中,只用了一半的卡就可存下万亿参数的大模型,NPU部署数量减少50%。
- 算力卸载:大模型推理过程中包括模型计算和KV相关计算,其中KV相关计算的显存占用很大。EMS将KV相关计算卸载到内存存储层,释放NPU的算力用于核心模型计算。
- 以存代算:EMS缓存多轮对话的历史KVCache,历史KVCache命中时无需重新做推理计算,通过以存代算提升推理吞吐量,大幅节省AI推理算力资源。
2.3 KVCache技术原理
KVCache是用于加速Transformer模型推理过程的关键技术。在Transformer的Attention机制中,每个Token都会生成对应的Key矩阵和Value矩阵。当模型生成新Token时,需要计算当前Token与历史所有Token的Attention权重,如果每次都重新计算历史Token的K和V矩阵,计算量将随序列长度呈平方级增长。KVCache通过缓存历史Token的Key和Value矩阵,在生成新Token时直接复用缓存结果,避免了重复计算,从而显著提升推理效率。
EMS正是利用DRAM的高吞吐和低延迟特性,将LLM推理场景下多轮对话及公共前缀等历史KVCache缓存到EMS内存存储中。通过这种方式,EMS实现了推理过程中的KVCache高效存取,大幅降低了推理首Token时延,提升了LLM推理对话体验。
3. EMS对接前的准备工作
3.1 申请公测与激活凭证
华为云EMS目前处于公测阶段,用户需要先申请公测资格才能使用该服务。具体操作步骤如下:
- 登录EMS管理控制台
- 单击“申请公测”,进入申请公测页面
- 在公测申请页面填写相关信息并提交申请
- 等待审核通过后即可获得EMS的使用权限
EMS采用半托管融合部署方式,EMS数据面部署在用户AI节点上,用户需要使用激活凭证激活EMS后才能开始使用。激活时,EMS数据面会和EMS管理面通信,通过EMS管理面校验并完成用户关联后,用户才能正常使用EMS服务。激活凭证的创建同样在EMS管理控制台中完成。
3.2 环境与资源准备
在使用Python SDK访问华为云弹性内存服务EMS之前,需要先完成推理或训练环境的准备。环境准备包括以下内容:
- 下载并安装依赖软件和开发工具
- 确保Python版本为3.3以上
- 准备华为云账号及对应的Access Key和Secret Access Key
- 确认已在华为云控制台“我的凭证 > 访问密钥”页面创建并获取AK/SK
EMS数据面镜像部署在用户的CCE容器集群上。EMS镜像运行需要占用AI节点的vCPU、内存等资源,同时EMS用于保存推理KVCache需要额外占用AI节点的内存资源。在AI推理场景中,由于受限于显存瓶颈,DRAM内存富余较多,建议分配一半DRAM内存给EMS的KVCache内存池。EMS内存池空间越大,越有利于提高KVCache缓存命中率,从而提升推理吞吐量。
4. EMS部署与集群管理
4.1 部署EMS数据面
EMS数据面的部署需要通过华为云CCE容器集群来完成。具体部署流程如下:
- 在CCE控制台中创建或选择已有的容器集群
- 在EMS管理控制台中配置集群信息,关联目标CCE集群
- 部署EMS数据面镜像到CCE集群的AI节点上
- 确认EMS数据面Pod正常运行,资源占用符合预期
EMS的融合部署方式意味着EMS数据面与AI推理业务共享同一批AI节点资源。这种部署方式的优势在于数据本地性——EMS内存池与推理计算位于同一物理节点,可以最大限度降低数据访问延迟。
4.2 激活EMS服务
EMS数据面部署完成后,需要使用之前创建的激活凭证进行激活。激活过程本质上是EMS数据面与EMS管理面建立安全通信通道的过程:
- EMS数据面启动后读取激活凭证配置
- 数据面向管理面发起激活请求,携带凭证信息
- 管理面校验凭证有效性并完成租户关联
- 激活成功后,EMS数据面进入就绪状态,可以接收KVCache的读写请求
4.3 升级与卸载
EMS服务支持在线升级和卸载操作。当EMS软件版本较低时,可以执行升级操作以获取新功能和性能优化。升级过程中EMS管理面会协调数据面的滚动更新,尽可能减少对在线推理业务的影响。卸载EMS时,系统会先清理内存池中的数据,然后停止并移除EMS数据面Pod,释放占用的AI节点资源。
5. Python SDK对接详解
5.1 SDK安装与初始化
EMS提供了Python SDK供开发者集成调用。SDK的安装可以通过pip完成。安装完成后,需要进行EMS客户端的初始化配置。
以下是EMS Python SDK的初始化代码示例:
from ems import Ems, EmsConfig, EmsException, CcConfig
# 配置EMS客户端
config = EmsConfig(
ak="your_access_key",
sk="your_secret_key",
region="cn-south-1",
endpoint="ems-api.cn-south-1.myhuaweicloud.com"
)
# 初始化EMS客户端
try:
Ems.init(config)
print("EMS客户端初始化成功")
except EmsException as e:
print(f"EMS初始化失败: {e}")初始化时需要提供访问密钥、区域和终端节点等信息。终端节点即调用API的请求地址,不同服务不同区域的终端节点不同。初始化成功后,即可通过EMS客户端访问后续的KVCache读写接口。
5.2 健康检查
在生产环境中,建议业务侧定时检查EMS服务的健康状态。当调用SDK接口访问EMS服务时返回失败,业务可能会熔断EMS服务,此时可以使用定时检查EMS服务状态的方式来实现自动恢复。
健康检查的代码示例如下:
from ems import Ems
def check_ems_health():
try:
is_healthy = Ems.check_health()
if is_healthy:
print("EMS服务状态正常")
return True
else:
print("EMS服务状态异常")
return False
except EmsException as e:
print(f"健康检查异常: {e}")
return False
# 定时执行健康检查
import time
while True:
check_ems_health()
time.sleep(60) # 每分钟检查一次健康检查接口返回True表示EMS服务正常。建议在业务主流程中集成健康检查逻辑,当检测到EMS服务异常时采取降级或重试策略。
5.3 获取ContextCaching对象
在EMS中,KVCache的读写操作通过ContextCaching对象来完成。获取ContextCaching对象的代码如下:
from ems import Ems
# 获取ContextCaching对象
cc = Ems.get_cc()
if cc is not None:
print("成功获取ContextCaching对象")
else:
print("获取ContextCaching对象失败")ContextCaching对象提供了KVCache的保存和加载接口,包括同步和异步两种模式。
5.4 同步保存KVCache
同步保存KVCache是最直接的写入方式,调用接口后会等待数据写入完成再返回结果。适用于对延迟不敏感或数据量较小的场景。
from ems import Ems
cc = Ems.get_cc()
# 构造KVCache数据
kv_cache_data = {
"key": "your_cache_key",
"value": "your_cache_value",
"model_name": "your_model",
"sequence_id": "seq_12345"
}
# 同步保存KVCache
try:
result = cc.save_sync(kv_cache_data)
print(f"KVCache同步保存成功: {result}")
except Exception as e:
print(f"保存失败: {e}")5.5 异步保存KVCache
异步保存适用于对推理延迟敏感的场景。调用后立即返回Future句柄,数据在后台完成写入,不阻塞主推理流程。
from ems import Ems
cc = Ems.get_cc()
kv_cache_data = {
"key": "your_cache_key",
"value": "your_cache_value",
"model_name": "your_model",
"sequence_id": "seq_12345"
}
# 异步保存KVCache
try:
future = cc.save_async(kv_cache_data)
print("KVCache异步保存已提交")
# 后续可以通过future获取保存结果
result = future.get() # 阻塞等待结果
print(f"保存结果: {result}")
except Exception as e:
print(f"异步保存失败: {e}")异步接口还提供了检查异步IO状态和获取异步IO结果的方法。业务可以根据需要轮询异步操作的状态,或在回调中处理结果。
5.6 同步加载KVCache
加载KVCache是从EMS内存池中读取缓存的Key-Value数据。同步加载会阻塞直到数据返回。
from ems import Ems
cc = Ems.get_cc()
# 构造查询条件
query = {
"key": "your_cache_key",
"model_name": "your_model"
}
# 同步加载KVCache
try:
result = cc.load_sync(query)
if result is not None:
print(f"加载成功: {result}")
else:
print("缓存未命中")
except Exception as e:
print(f"加载失败: {e}")5.7 异步加载KVCache
异步加载可以在推理准备阶段提前发起缓存读取请求,在需要使用时再获取结果,从而隐藏数据访问延迟。
from ems import Ems
cc = Ems.get_cc()
query = {
"key": "your_cache_key",
"model_name": "your_model"
}
# 异步加载KVCache
try:
future = cc.load_async(query)
print("异步加载已发起")
# 在需要使用数据时再获取结果
result = future.get(timeout=5.0) # 设置超时
if result is not None:
print(f"加载成功: {result}")
else:
print("缓存未命中")
except Exception as e:
print(f"异步加载失败: {e}")5.8 异常处理
EMS SDK提供了完善的异常处理机制。开发者可以通过捕获EmsException来获取详细的错误信息:
from ems import Ems, EmsException
try:
# EMS操作
pass
except EmsException as e:
error_code = e.get_error_code()
error_detail = e.get_detail()
print(f"错误码: {error_code}, 详情: {error_detail}")常见的异常场景包括初始化失败、网络超时、凭证无效、内存池资源不足等。建议业务侧针对不同的错误码实现差异化的重试和降级策略。
6. 推理框架集成方案
6.1 vLLM框架集成
EMS提供了SDK供各种推理框架集成,兼容vLLM等开源框架及其他企业自研的LLM框架。vLLM可以通过集成EMS SDK的方式访问EMS弹性内存存储服务,实现推理KVCache的缓存及后续访问命中。
vLLM与EMS的集成架构通常采用以下方式:
- 在vLLM的推理引擎中引入EMS SDK作为KVCache的后端存储
- Prefill阶段完成后,将生成的KVCache通过EMS SDK异步保存到EMS内存池
- Decode阶段开始前,通过EMS SDK异步加载历史KVCache
- 利用EMS的分布式内存池实现跨节点的KVCache共享
在CCE分布式推理场景中,基于vLLM-Ascend推理引擎和Kthena框架部署大语言模型时,可以采用1P1D分离架构。通过物理隔离Prefill与Decode阶段,并结合EMS实现KVCache的高效传输,可以显著提升资源利用率和推理性能。
6.2 自研推理框架集成
对于企业自研的推理框架,集成EMS的方式更加灵活。开发者可以直接调用EMS Python SDK的接口,在推理流程的适当位置插入KVCache的保存和加载逻辑。典型的集成模式包括:
- Prefill阶段缓存:在Prefill计算完成后,将生成的KVCache保存到EMS
- Decode阶段加载:在Decode开始前,从EMS加载历史KVCache
- 多轮对话管理:将每轮对话的KVCache按会话ID组织存储,实现跨轮次的缓存复用
7. 监控与告警配置
7.1 监控指标
EMS提供了丰富的监控指标,帮助用户了解服务的运行状态。主要的监控指标包括:
- EMS内存池使用率
- KVCache缓存命中率
- KVCache读写请求的QPS和延迟
- EMS数据面Pod的资源占用(CPU、内存)
- EMS数据面与管理面的通信状态
7.2 配置告警
用户可以通过华为云云监控服务为EMS配置告警规则。当监控指标触发预设的告警阈值时,云监控将及时通过短信或邮件形式向您发送告警通知,确保您能够第一时间知晓并迅速响应,及时处理潜在问题。
建议配置的告警规则包括:
- 内存池使用率超过85%时触发告警
- 缓存命中率低于50%时触发告警
- 读写请求延迟超过阈值时触发告警
- EMS服务健康检查失败时触发告警
8. 生产级最佳实践
8.1 内存池容量规划
EMS内存池的大小直接影响缓存命中率和推理性能。在AI推理场景中,受限于显存瓶颈,DRAM内存通常有较多富余。建议根据以下原则进行容量规划:
- 分配一半的DRAM内存给EMS的KVCache内存池作为初始配置
- 根据实际缓存命中率监控数据动态调整内存池大小
- 内存池空间越大,KVCache缓存命中率越高,推理吞吐量越大
- 需要平衡EMS内存池与业务容器对其他资源的需求
8.2 高可用与容错设计
在生产环境中部署EMS时,建议采用以下高可用策略:
- 在多个可用区部署EMS数据面,实现跨AZ容灾
- 配置EMS管理面的多副本部署,避免单点故障
- 业务侧实现EMS调用的熔断和降级机制
- 定时执行健康检查,实现故障自动恢复
- 配置合理的超时时间,避免因EMS响应慢拖垮整个推理链路
8.3 性能优化建议
- 优先使用异步接口:在推理延迟敏感的场景中,优先使用KVCache的异步保存和加载接口,将数据访问与计算重叠
- 合理设置超时:根据网络环境和数据量大小,为EMS操作设置合理的超时时间
- 批量操作:对于批量推理场景,可以将多个KVCache操作批量提交,减少网络往返开销
- 数据本地性:利用EMS融合部署的特性,优先调度到与推理计算相同的节点访问EMS内存池
8.4 典型应用场景
EMS的典型应用场景主要包括:
- LLM智能对话场景:EMS缓存多轮对话的历史KVCache,历史KVCache命中时无需重新做推理计算,通过以存代算可提升推理吞吐,节省AI推理算力资源
- DeepSeek等大模型推理:利用EMS的显存扩展能力,在减少NPU卡数的前提下完成大模型推理部署
- 日推夜训场景:高性能弹性文件服务SFS Turbo与EMS联动,实现初始记忆(模型)快速加载,缩短推理算力启动时间
- 多租户推理服务:通过EMS的分布式内存池,实现多租户间的KVCache隔离与共享
9. 常见问题解答
问1:EMS初始化失败如何定位?
EMS初始化失败通常由以下原因引起:AK/SK配置错误、网络连通性问题、终端节点地址不正确、凭证未激活或已过期。建议按照以下步骤排查:检查AK/SK是否正确且具有EMS服务权限;确认网络能正常访问EMS服务的终端节点;检查EMS管理控制台中凭证状态是否为“已激活”;查看SDK返回的错误码和详细信息进行针对性处理。
问2:ContextCaching接口超时时间如何设置?
ContextCaching接口的超时时间可以通过SDK的配置参数进行设置。建议根据业务场景的延迟要求和服务端的处理能力来设定合理的超时值。对于同步接口,超时时间应覆盖正常情况下的P99延迟并留有余量;对于异步接口,可以设置较长的超时时间或通过轮询方式获取结果。
问3:EMS内存池需要占用AI节点多少DRAM内存?
EMS数据面镜像运行需要占用AI节点的vCPU和内存资源,同时EMS用于保存推理KVCache需要额外占用AI节点的内存资源。AI推理场景受限于显存瓶颈,DRAM内存富余较多,建议分配一半DRAM内存给EMS的KVCache内存池。具体分配比例应根据实际业务负载和缓存命中率监控数据进行调整。
问4:EMS支持哪些推理框架?
EMS提供SDK供各种推理框架集成,兼容vLLM等开源框架及其他企业自研的LLM框架。目前主要适配大语言模型推理场景,支持Prefill和Decode阶段的KVCache高效存取。未来将持续扩展对更多AI框架和场景的支持。
问5:EMS如何保障数据安全?
EMS在多个层面保障数据安全:传输层面,所有API调用均通过HTTPS加密传输;访问控制层面,通过IAM进行身份认证和权限管理,支持细粒度的资源访问控制;数据层面,EMS内存池中的数据在服务重启或节点故障时会自动清理,不会持久化残留;审计层面,EMS管理面记录所有操作日志,支持安全审计和追溯。
问6:EMS的计费方式是什么?
EMS目前处于公测阶段,具体的计费模式请以华为云官网公布的正式计费策略为准。公测期间通常提供免费使用额度,正式商用后将根据内存池容量、数据读写请求量等维度进行计费。建议关注华为云官网的计费说明页面获取最新信息。



