morphserve

现有服务框架和静态压缩技术不能适配负载的波动。服务框架全精度时违反slo(请求变慢或被丢弃),静态压缩在部署前固定,所以长期精度下降,不能在请求下降时恢复高精度

基于形态自适应,实时监控系统负载, 并根据内存压力动态调整模型组件(transformer层和KVC模块)

workload变大 : 将部分全精度层替换为轻量的量化版本,并通过附加内存块动态扩展kv cache容量

workload变小 : 恢复全精度模型并回收kv cache中的内存

morphserve四个目标:

  • 运行时层替换: 基于负载感知的混合精度推理,使量化层与全精度层共存, 根据运行时压力动态调整,无需刷新模型或修改结构
  • 压力感知的kv-cache自适应调整: 根据内存压力动态调整kv cache的容量, 支持在突发流量下的prefill和decoding
  • 可调的运行时策略 :引导模型在"精度-延迟" 帕累托边界 上进行权衡,在保证高质量的同时降低响应延迟
  • 与现有 KVC 压缩和淘汰方案兼容:在不显著损失精度的前提下进一步提升效率

morphserve : 两个异步,token级别的运行时机制

  • LayerSwapper:通过敏感度分析识别对输出影响较小的 transformer 层,在运行时异步地将其替换为低精度版本;
  • KVResizer:在内存压力下自适应调整 KVC 容量,并与解码过程并行执行(使用独立的 CUDA 流),确保服务连续性。

Refer to caption

  1. 推理请求进入系统

  2. 服务状态监测 : 实时监控系统负载状况, 包括 GPU 利用率、内存压力、请求排队情况等。如果检测到负载压力或资源瓶颈,它会触发模型形态调整

  3. 请求调度 : 将来自用户的推理请求分发到多个 Worker 实例中(右侧的 Worker 0 到 Worker N-1),每个 Worker 包含模型副本

  4. work进行推理

    每个 Worker 包含:

    • Model Replica:模型副本(可支持混合精度)。
    • Cache Engine:管理 KV 缓存等关键内存资源。
    • Morphing Executor:用于动态替换模型中的层,或调整缓存结构。

    工作线程接收请求并执行推理

  5. 基于监控数据(来自步骤2),决定是否需要动态替换模型结构

例如,在高负载下,将某些 Transformer 层替换为预量化版本;

或根据内存压力,调整 KV 缓存大小。

形态控制器会使用 CPU 侧存储的:

  • 预量化的注意力层(Pre-quantized Att Layers)
  • 离线 profiling 得到的层替换顺序,用于指导最优替换策略。

5'. 控制指令发往worker

  1. Worker 完成推理后返回响应,系统将其返回给用户。

offline profiling for layer swapping sequence:

层重要性得分(?每一层的不同精度得分应该不同,是要提前算出所有层所有精度的lis么) : LIS = f(lts, lrs, mds)

?将高精度换为低精度遵照层重要性得分,那如果将低精度换为高精度呢

runtime layer swapping:

  • 模型预加载与内核预编译:

    • 所有layer层的的不同精度版本(FP16, INT8, INT4, INT3)预加载到一块连续, 锁页(固定在ram,不会换出到磁盘)cpu内存中
    • 全精度副本加载到预分配的连续显存中
    • 记录所有层不同精度的内存地址,实现快速直接内存拷贝
    • 为避免运行时延迟,所有不同精度层的推理内核也提前编译完成;
    • 使用内核融合
    • 其余服务流程则复用了最新的高效机制,如 PagedAttention和 FlashAttention,确保与现有推理技术兼容并高效运行
  • 运行时异步替换

    • 当第 28 层和第 29 层被选中替换时,替换过程会异步启动;

    • 同时,前面的层(例如第 0 到第 27 层)可以继续正常计算,互不干扰

    • 全精度层从 GPU 内存中被安全释放(因为其备份副本仍保留在 CPU 的锁页内存中);

    • 替换用的量化版本将被复制到原位置,避免了指针映射更新(pointer remapping);

kvresizer

Serving Monitor(服务监控器) 检测到 GPU 内存不足,无法为新请求的预填充或当前请求的解码阶段分配 KVC 块时,KVResizer 会被触发。

此时,MorphServe 会先启动 层替换机制,将部分全精度层替换为量化版本,从而释放内存空间。

  • 例如:将一个 FP16 层替换为 INT4 可节省多达 75% 的内存(参考图 3)。

接着,KVResizer 对 PagedAttention [33] 进行了扩展,支持在内核级别按需分配/释放 KVC 块,无需重新编译内核。

  • 所有调整操作通过独立的 CUDA 流异步执行,不会干扰当前的解码任务。

vLLM [33] 等框架中的静态预分配策略不同,KVResizer 会根据实时 GPU 内存可用情况动态调整 KVC 容量。

  • 当系统负载减轻时,临时创建的 KVC 块与被替换的量化层都会被释放,恢复为原来的全精度状态,确保内存回收与模型精度恢复

局限性。

尽管 MorphServe 在动态大语言模型(LLM)推理服务中表现出较强的实用性与有效性,但仍存在若干局限。为支持运行时层替换,MorphServe 会在主机内存中同时存储全精度和量化版本的模型层。虽然这会增加内存使用,但开销通常低于模型大小的 2 倍,现代的 LLM 推理集群基本可以容纳这一成本。未来的工作可以通过按需将层从 SSD 流式加载到主存,或使用 GPUDirect Storage (GDS) [48] 直接从 SSD 加载,以进一步降低成本。

目前,MorphServe 在 Transformer 层级进行“形态变换”(morphing)。这种方式已具备一定效果,但若能更细粒度地自适应,例如将注意力子模块和 MLP 子模块分别调整,可能会进一步提升效率与精度灵活性。

MorphServe 能够实时响应系统压力,但无法预测即将到来的突发负载。如果能集成轻量级的工作负载预测机制,将有助于实现更前瞻性的形态变换决策,从而在突发流量中提升响应能力

? 这是在vllm上开发的一个vllm插件么

?如果我们运行在a层时,此时要替换a+1层。在替换进行中,我们模型运行到a+1层,这是怎么解决的

?每一层的不同精度得分应该不同,是要提前算出所有层所有精度的lis么

?当系统负载减轻时,将所有层恢复为全精度状态会不会太简单直接。前文有提到精度-延迟之间的一个 帕累托边界 权衡,这个是怎么权衡的

posted @ 2025-07-29 22:49  拾墨、  阅读(5)  评论(0)    收藏  举报