在大部分模型推理场景中,业务进程通过OSS或NAS将模型文件挂载到本地目录,进行模型读取、模型切换以及容器的扩缩容等操作时,会受网络带宽的影响,存在较大的延时问题。为了解决这个问题,EAS提供了本地目录内存缓存加速的功能。通过将模型文件缓存到内存中,可以提高读取数据的速度,减少延时。本文为您介绍如何配置本地目录内存缓存并详细说明其带来的加速效果。
背景信息
在大部分模型推理场景中,特别是在典型的Stable Diffusion场景中,存在推理耗时长的问题。在这种场景下,推理请求需要频繁切换基础模型和lora模型,每次切换都要从OSS或NAS回源读取模型,导致延时大幅增加。为了解决这个问题,EAS提供了本地目录内存缓存加速的功能。具体的实现原理如下图所示:
在大部分推理场景中,业务进程会通过OSS、NAS或Image将模型文件挂载到本地目录。关于存储挂载更详细的内容介绍,请参见高级配置:服务存储挂载。
EAS提供了本地目录内存缓存(Memory Cache)加速功能。
在AIGC场景中,内存相对比较空闲。您可以利用空闲内存将本地目录中的模型文件通过挂载的方式缓存到内存中。
该缓存支持LRU淘汰策略和不同实例间的共享,以文件系统目录的形式呈现。
无需修改业务代码,直接读取缓存配置的目标本地目录中的文件,即可享受加速效果。
同一服务的不同实例之间会形成一个p2p网络。在进行实例扩容时,可以通过p2p网络从其他实例中就近读取缓存的文件,以加速实例扩容的速度。
注意事项
为保持数据一致性,挂载的加速目录是只读的,无法进行写操作。
如果需要添加模型文件,可以直接在源目录中新增文件,加速目录可以直接读取源目录中的文件。
不建议直接操作源目录来更新或删除模型文件,可能导致读取到缓存的脏数据。
配置方法
通过控制台配置本地目录内存缓存
进入模型在线服务(EAS)页面。
登录PAI控制台。
在左侧导航栏单击工作空间列表,在工作空间列表页面中单击待操作的工作空间名称,进入对应的工作空间。
在工作空间页面的左侧导航栏选择 ,进入模型在线服务(EAS)页面。
在模型在线服务(EAS)页面,单击部署服务,然后在自定义模型部署区域,单击自定义部署。
在新建服务页面,配置以下关键参数,其他参数配置说明,请参见服务部署:控制台。
参数
描述
模型服务信息
填写模型配置
单击填写模型配置,来进行模型配置。以OSS挂载为例:
选择OSS路径,例如
oss://path/to/models/
。配置挂载路径,表示将OSS路径挂载到容器中的目录,例如
/data-slow
。
运行命令
您需要在该参数中配置启动参数
-ckpt-dir
,并将该参数指向加速目录,例如-ckpt-dir /data-fast
。服务功能配置
内存缓存加速
单击内存缓存加速,并配置以下参数:
占用最大内存:被加速文件占用的最大内存,单位GB。当加速文件占用的最大内存超过该限制时,默认采用LRU策略淘汰。
源路径:加速文件的源目录。该目录可以是OSS或NAS中的加速文件挂载到容器中的挂载路径,也可以是挂载路径下的子目录,或者是容器内的其他普通文件目录。例如
/data-slow
。挂载路径:加速文件的挂载目录,该目录内的文件内容和源目录保持一致,业务程序需从该目录中读取模型。例如
/data-fast
。
上述挂载配置表示将OSS路径挂载到容器中的
/data-slow
目录,并通过cachefs将源目录/data-slow
再次挂载到加速目录/data-fast
。这样,业务程序可以直接从加速目录/data-fast
读取源目录/data-slow
中的加速文件。参数配置完成后,单击部署。
通过本地客户端配置本地目录内存缓存
步骤一:准备配置文件
您只需要在挂载配置中增加cache和mount_path参数即可,配置示例如下。更多关于存储挂载的详细介绍,请参见高级配置:服务存储挂载。
"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"
}
]
参数说明
参数
描述
cache
capacity
被加速文件占用的最大内存。当加速文件占用的最大内存超过该限制时,默认采用LRU策略淘汰。
path
加速文件的源目录。该目录可以是OSS或NAS中的加速文件挂载到容器中的挂载路径,也可以是挂载路径下的子目录,或者是容器内的其他普通文件目录。
mount_path
加速文件的挂载目录,该目录内的文件内容和源目录保持一致,业务程序需从该目录中读取模型。
配置说明
上述挂载配置表示将OSS路径挂载到容器中的
/data-slow
目录,并通过cachefs将源目录/data-slow
再次挂载到加速目录/data-fast
。这样,业务程序可以直接从加速目录/data-fast
读取源目录/data-slow
中的加速文件。
以部署Stable Diffusion模型服务为例,配置本地目录内存缓存的完整示例如下,您可以根据实际场景需求进行修改。更多关于部署Stable Diffusion推理服务详细介绍,请参见5分钟使用EAS部署Stable Diffusion API服务。
{
"cloud": {
"computing": {
"instance_type": "ml.gu7i.c8m30.1-gu30"
}
},
"containers": [
{
"image": "eas-registry-vpc.cn-hangzhou.cr.aliyuncs.com/pai-eas/stable-diffusion-webui:3.2",
"port": 8000,
"script": "./webui.sh --listen --port 8000 --skip-version-check --no-hashing --no-download-sd-model --skip-install --filebrowser --api --no-read-lora-meta --disable-nsfw-censor --public-cache --ckpt-dir data-fast/models/Stable-diffusion"
}
],
"metadata": {
"cpu": 32,
"enable_webservice": true,
"gpu": 1,
"instance": 1,
"name": "sd_cache"
},
"storage": [
{
"mount_path": "/code/stable-diffusion-webui/data-oss",
"oss": {
"path": "oss://examplebucket/data-zf/"
},
"properties": {
"resource_type": "model"
}
},
{
"mount_path": "/code/stable-diffusion-webui/data-fast/models",
"cache": {
"path": "/code/stable-diffusion-webui/data-oss/models",
"capacity": "15G"
}
}
]
}
其中关键参数说明如下,其他参数说明,请参见服务模型所有相关参数说明。
script:您需要在该参数中配置启动参数
-ckpt-dir
,并将该参数指向加速目录。例如-ckpt-dir data-fast/models/Stable-diffusion
。storage:存储挂载配置。表示将OSS路径挂载到
data-oss
目录,并通过cachefs将源目录data-oss/models
挂载到加速目录data-fast/models
。后续,业务程序可以直接从加速目录data-fast/models/Stable-diffusion
中读取源目录data-oss
中的加速文件。其中OSS的path参数需要配置为您自己的模型文件所在的OSS Bucket路径。
步骤二:部署模型服务
部署一个模型服务,使其能够使用本地目录内存缓存加速的功能。
通过控制台部署模型服务
通过EASCMD客户端部署模型服务
服务部署成功后,可以直接从本地目录的内存缓存中读取模型文件,以提高模型读取、模型切换和扩缩容场景的效率。有关加速效果的更多详细说明,请参见加速效果。
加速效果
以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挂载进行读取的时间相当。
如果服务内有多个实例,这些实例会自动形成一个内存共享集群。当这些实例加载相同的模型时,会直接从远端内存中的内网进行拉取,以实现远端命中。在这种情况下,文件的读取时间和文件大小呈线性相关。
当服务进行扩容时,新的实例会自动加入已有的内存共享集群,并且初始化模型加载时可以直接从远端进行读取。因此,弹性扩缩容更快,更适合弹性场景。