内存缓存本地目录

模型推理时,通过OSSNAS挂载模型文件到本地目录,受网络带宽影响,存在延时问题。EAS提供本地目录内存缓存加速功能。将模型文件缓存到内存中,提高读取速度,减少延时。本文介绍如何配置本地目录内存缓存及其加速效果。

背景信息

在大部分模型推理场景中,业务进程会通过OSS、NASImage将模型文件挂载到本地目录。请参见服务存储挂载。业务进程中模型读取、模型切换、容器的扩缩容等操作都会受网络带宽影响。比较典型的如StableDiffusion场景中,推理请求会涉及到频繁切换基础模型和lora模型,每次切换都需从OSS/NAS回源读取模型,导致延时增加。

为了解决这个问题,EAS提供了本地目录内存缓存(Memory Cache)加速功能。具体的实现原理如下图所示:

image
  • 利用空闲内存将本地目录中的模型文件缓存到内存中。

  • 该缓存支持LRU淘汰策略和实例间共享,以文件系统目录形式呈现。

  • 无需修改业务代码,直接读取缓存配置的目标本地目录中的文件,即可享受加速效果。

  • 同一服务的不同实例会形成p2p网络,实例扩容时可通过p2p网络就近读取缓存文件,加速扩容速度。

注意事项

  • 为保持数据一致性,挂载的加速目录是只读的,无法写操作。

  • 如需添加模型文件,请在源目录中新增文件,加速目录会读取源目录中的文件。

  • 不建议直接更新或删除源目录中的模型文件,这可能导致读取到缓存的脏数据。

配置方法

假设当前服务部署已有配置的参数如下:

  • 镜像启动命令:python /run.py

  • 模型文件OSS路径:oss://path/to/models/

  • 模型文件挂载到容器中的目录:/data-slow

那么/data-slow就是需要被加速的文件的源目录,先将其再次挂载到加速目录/data-fast。这样,业务程序可以直接从加速目录/data-fast读取源目录/data-slow中的加速文件,具体配置方式如下:

控制台配置

  1. 登录PAI控制台,在页面上方选择目标地域,并在右侧选择目标工作空间,然后单击进入EAS

  2. 单击部署服务,然后在自定义模型部署区域,单击自定义部署

  3. 自定义部署页面,配置以下关键参数,其他参数配置说明,请参见服务部署:控制台

    参数

    描述

    示例

    环境信息

    模型配置

    选择OSS类型的挂载方式。

    • OSS路径oss://path/to/models/

    • 挂载路径/data-slow

    运行命令

    配置启动参数-ckpt-dir,指向加速目录。

    python /run.py -ckpt-dir /data-fast

    服务功能

    内存缓存加速

    打开开关,并配置以下参数:

    • 占用最大内存:被加速文件占用的最大内存,单位GB。被加速文件占用的最大内存,超过限制时采用LRU策略淘汰。

    • 源路径:加速文件的源目录,可以是OSSNAS中的加速文件挂载到容器中的挂载路径,也可以是挂载路径下的子目录,或者是容器内的其他普通文件目录。

    • 挂载路径:加速文件的挂载目录,业务程序需从该目录中读取模型。

    • 占用最大内存:20 GB

    • 源路径/data-slow

    • 挂载路径/data-fast

  4. 参数配置完成后,单击部署

本地客户端配置

步骤一:准备配置文件

在挂载配置中增加cachemount_path参数,在script参数中配置启动参数-ckpt-dir,同时配置示例如下。其他参数配置说明,请参见服务模型所有相关参数说明

   {
    "containers": [
        {
            "image": "****",
            "port": 8000,
            "script": "python /run.py -ckpt-dir /data-fast"
        }
    ],
    "storage": [
        {
            "mount_path": "/data-slow",
            "oss": {
                "path": "oss://path/to/models/",
                "readOnly": false
            },
            "properties": {
                "resource_type": "model"
            }
        },
        {
            "cache": {
                "capacity": "20G",
                "path": "/data-slow"
            },
            "mount_path": "/data-fast"
        }
    ]
}

参数说明:

参数

描述

script

配置启动参数-ckpt-dir,并将该参数指向加速目录。

cache

capacity

被加速文件占用的最大内存,单位GB。被加速文件占用的最大内存,超过限制时采用LRU策略淘汰。

path

加速文件的源目录。该目录可以是OSSNAS中的加速文件挂载到容器中的挂载路径,也可以是挂载路径下的子目录,或者是容器内的其他普通文件目录。

mount_path

加速文件的挂载目录,该目录内的文件内容和源目录保持一致,业务程序需从该目录中读取模型。

步骤二:部署模型服务

部署一个模型服务,使其能够使用本地目录内存缓存加速的功能。

通过控制台部署模型服务

  1. 登录PAI控制台,在页面上方选择目标地域,并在右侧选择目标工作空间,然后单击进入EAS

  2. 模型在线服务(EAS)页面,单击部署服务,然后在自定义模型部署区域,单击JSON独立部署。将步骤一准备好的配置内容粘贴到编辑框中。

  3. 单击部署

通过EASCMD客户端部署模型服务

  1. 下载EASCMD客户端并进行身份认证。具体操作,请参见下载并认证客户端

  2. 按照步骤一中的配置要求,在EASCMD客户端所在目录创建一个名为test.jsonJSON文件。

  3. JSON文件所在的当前目录执行以下命令,以Windows 64版本为例。

    eascmdwin64.exe create <test.json>

加速效果

Stable Diffusion场景为例,模型切换的加速效果如下,单位:秒。您的最终的加速效果以实际情况为准。

模型

模型大小

OSS挂载

cachefs本地命中

cachefs远端命中

anything-v4.5.safetensors

7.2G

89.88

3.845

15.18

Anything-v5.0-PRT-RE.safetensors

2.0G

16.73

2.967

5.46

cetusMix_Coda2.safetensors

3.6G

24.76

3.249

7.13

chilloutmix_NiPrunedFp32Fix.safetensors

4.0G

48.79

3.556

8.47

CounterfeitV30_v30.safetensors

4.0G

64.99

3.014

7.94

deliberate_v2.safetensors

2.0G

16.33

2.985

5.55

DreamShaper_6_NoVae.safetensors

5.6G

71.78

3.416

10.17

pastelmix-fp32.ckpt

4.0G

43.88

4.959

9.23

revAnimated_v122.safetensors

4.0G

69.38

3.165

3.20

  • 当缓存中没有对应的模型时,Cachefs会自动回源读取模型。如该文件通过OSS挂载,则Cachefs会从OSS拉取文件,耗时与直接通过OSS挂载进行读取相当。

  • 服务内的多个实例会形成内存共享集群,加载相同模型时直接从远端内存拉取,读取时间与文件大小呈线性相关。

  • 服务扩容时,新实例会加入内存共享集群,初始化模型可直接从远端读取,弹性扩缩容更快,适合弹性场景。