基于LRU策略最大化提升显存利用率的模型加载方法与流程

专利检索2022-05-10  13


基于lru策略最大化提升显存利用率的模型加载方法
技术领域
1.本发明涉及显存技术领域,具体来说,涉及基于lru策略最大化提升显存利用率的模型加载方法。


背景技术:

2.大企业做数字化转型的时候,必定会面临ai场景,有ai应用和ai能力的需求,在真正的ai能力的生产过程中,必定存在ai能力的调用,通常是基于ai能力开放平台对外提供api实现,基于模型版本之上做ai能力的上架和部署,在能力部署时,存在单模型和多模型组合部署,显然多模型组合部署更能体现资源利用的价值,在多模型部署的基础之上,需要解决cpu、gpu、内存、显存资源共享问题。而在ai能力(多模型)的日常生产过程中,必定存在应用上、不同时间段上对模型调用量存在差异化诉求,需要解决同一ai能力中a模型密集型调用和b模型零散型甚至零调用的差异化,从而导致a模型资源不足,b模型资源浪费;并且存在运行态模型置换的诉求,即同一能力包含多个模型(a、b、c),且每个模型都启动多个实例,前期资源仅能支撑有调用量的a和b此时c无调用请求,在后期生产运行当中会出现b无调用量c有调用量的需求,造成资源的占用与浪费。
3.针对相关技术中的问题,目前尚未提出有效的解决方案。


技术实现要素:

4.针对相关技术中的问题,本发明提出基于lru策略最大化提升显存利用率的模型加载方法,以克服现有相关技术所存在的上述技术问题。
5.为此,本发明采用的具体技术方案如下:基于lru策略最大化提升显存利用率的模型加载方法,该方法包括以下步骤:构建与部署人脸识别、人像对比、人体分析三个模型并配置实例;启动定时任务,每相隔10分钟获取该段时间内gpu的实时利用率,并计算该时间段内的平均gpu利用率;通过最优资源调度策略调度计算滑动平均显存使用率;根据该段时间内的数据信息,通过最优资源调度策略预测得到下一段时间所需的实例数量;根据模型在下一段时间所需的实例数量与模型已使用的实例数量对实例数量进行调整;通过最优资源调度策略最终实现显存利用率的最大化。
6.进一步的,所述构建与部署人脸识别、人像对比、人体分析三个模型并配置实例包括以下步骤:通过ai平台配置人脸识别、人像对比、人体分析三个模型能力;给人脸识别、人像对比、人体分析三个模型分别配置6个可弹性伸缩的实例;将人脸识别、人像对比、人体分析三个模型配置到同一显卡;
通过容器管理平台部署启动人脸识别、人像对比、人体分析三个模型。
7.进一步的,所述启动定时任务,每相隔10分钟获取该段时间内gpu的实时利用率,并计算该时间段内的平均gpu利用率包括以下步骤:启动定时任务,每相隔10分钟通过资源监控工具获取该段时间内gpu的实时资源利用率;将获取的gpu实时利用率存入,供后面最优资源调度策略(lru)调度使用;最优资源调度策略调度中心循环从远程字典服务获取某段时间数据,对该段时间内的gpu实时利用率进行采样,通过计算得到该段时间内的平均gpu利用率。
8.进一步的,所述每相隔10分钟通过资源监控工具获取该段时间内gpu的实时资源利用率包括以下步骤:分别获取三个模型在第一时间段内、第二时间段内分析的图片数量;分别获取三个模型在第一时间段内分析的图片数量与第二时间内分析的图片的数量以及三个模型在1秒钟所能分析的最大图片数量,进行计算得到gpu实时资源利用率。
9.进一步的,所述计算得到gpu实时资源利用率的公式如下:;其中,a表示gpu的实时资源利用率,i,j分别第一时间段、第二时间段,且i>j,c
i
表示模型在第一时间段内分析的图片数量,c
j
表示模型在第二时间段内分析的图片j数量,m表示模型在1秒钟所能分析的最大图片数量。
10.进一步的,所述通过计算得到该段时间内的平均gpu利用率的计算公式如下:;其中,表示平均gpu利用率,i表示一段时间内实时gpu实时利用率的采样次数,j表示模型运行实例数量。
11.进一步的,所述通过最优资源调度策略调度计算滑动平均显存使用率的计算公式如下: ;其中,为模型在 t时段的滑动平均显存使用率,为模型在 t时段的平均gpu利用率,且在不使用滑动平均模型时 =,β为0

1的加权随机数,上述公式中β设定为0.9;且上述公式可展开如下:;将时间t到1各个时刻的使用率填入公式,即可计算出u
t
在t到1时刻的滑动平均显
存使用率。
12.进一步的,所述数据信息包括平均资源利用率、每个模型已使用的实例数量、gpu最大利用率以及gpu最小利用率。
13.进一步的,所述通过最优资源调度策略(lru策略)预测得到下一段时间所需的实例数量的计算公式如下:;其中,z表示模型下一段时间所需的实例数量,表示表示滑动平均显存使用率,z
o
为模型已使用的pod数量,p表示最大利用率,p表示最小利用率。
14.本发明的有益效果为:针对多模型共享显存的场景,通过lru调度策略,使模型动态启停,解决了多模型共享显存低利用率的痛点,即将多模型的显存占用进行有效分配,对低使用率的模型分配更少的显存资源,对高使用率的模型提供更多的显存资源,从而提升显存的利用率,进而节约资源;通过glances实时监控,提升容器切换的实时性;通过redis快速缓存,提升模型切换的高速性。
附图说明
15.为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
16.图1是根据本发明实施例的基于lru策略最大化提升显存利用率的模型加载方法的流程图;图2是根据本发明实施例的基于lru策略最大化提升显存利用率的模型加载方法中技术实现流程图。
具体实施方式
17.为进一步说明各实施例,本发明提供有附图,这些附图为本发明揭露内容的一部分,其主要用以说明实施例,并可配合说明书的相关描述来解释实施例的运作原理,配合参考这些内容,本领域普通技术人员应能理解其他可能的实施方式以及本发明的优点,图中的组件并未按比例绘制,而类似的组件符号通常用来表示类似的组件。
18.根据本发明的实施例,提供了基于lru策略最大化提升显存利用率的模型加载方
法。
19.现结合附图和具体实施方式对本发明进一步说明,如图1所示,根据本发明实施例的基于lru策略最大化提升显存利用率的模型加载方法,该方法包括以下步骤:s1、构建与部署人脸识别、人像对比、人体分析三个模型并配置实例;其中,步骤s1包括以下步骤:s11、通过ai平台配置人脸识别、人像对比、人体分析三个模型能力;s12、给人脸识别、人像对比、人体分析三个模型分别配置6个可弹性伸缩的实例;s13、将人脸识别、人像对比、人体分析三个模型配置到同一显卡;s14、通过容器管理平台(rancher)部署启动人脸识别、人像对比、人体分析三个模型。
20.s2、启动定时任务,每相隔10分钟获取该段时间内gpu的实时利用率,并计算该时间段内的平均gpu利用率;其中,步骤s2包括以下步骤:s21、启动定时任务,每相隔10分钟通过资源监控工具(glances)获取该段时间内gpu的实时资源利用率;此外,步骤s21包括以下步骤:s211、分别获取三个模型在第一时间段内、第二时间段内分析的图片数量;其中,人脸识别模型,1

10分钟内处理的图片数c1:12021张,10

20分钟内处理的图片数c2:8782张;人像对比模型,1

10分钟内处理的图片数c1:49389张,10

20分钟内处理的图片数c2:30287张;人体分析模型,1

10分钟内处理的图片数c1:120789张,10

20分钟内处理的图片数c2:152573张。
21.s212、分别获取三个模型在第一时间段内分析的图片数量与第二时间内分析的图片的数量以及三个模型在1秒钟所能分析的最大图片数量,进行计算得到gpu实时资源利用率,其计算公式如下:;其中,a表示gpu的实时资源利用率,i,j分别第一时间段、第二时间段,且i>j,c
i
表示模型在第一时间段内分析的图片数量,c
j
表示模型在第二时间段内分析的图片j数量,m表示模型在1秒钟所能分析的最大图片数量。
22.此外,人脸识别模型最多图片处理数m(每秒):50张;人像对比模型最多图片处理数m(每秒):112张;人体分析模型最多图片处理数m(每秒):258张。
23.s22、将获取的gpu实时利用率存入,供后面最优资源调度策略(lru)调度使用;s23、最优资源调度策略(lru)调度中心循环从远程字典服务(redis)获取某段时间数据,对该段时间内的gpu实时利用率进行采样,通过计算得到该段时间内的平均gpu利用率,其计算公式如下:
;其中,表示平均gpu利用率,i表示一段时间内实时gpu实时利用率的采样次数,j表示模型运行实例数量。
24.此外,人脸识别模型平均gpu资源利用率u:35.20%;人像对比模型平均gpu资源利用率u:81.67%;人体分析模型平均gpu资源利用率u:88.29%。
25.s3、通过最优资源调度策略调度计算滑动平均显存使用率,且计算公式如下: ;其中,为模型在 t时段的滑动平均显存使用率,为模型在 t时段的平均gpu利用率,且在不使用滑动平均模型时 =,β为0

1的加权随机数,上述公式中β设定为0.9;且上述公式可展开如下:;将时间t到1各个时刻的使用率填入公式,即可计算出u
t
在t到1时刻的滑动平均显存使用率。
26.s4、根据该段时间内的数据信息,通过最优资源调度策略(lru策略)预测得到下一段时间所需的实例数量;其中,所述数据信息包括平均资源利用率、每个模型已使用的实例数量、gpu最大利用率以及gpu最小利用率。
27.所述通过最优资源调度策略(lru策略)预测得到下一段时间所需的实例数量的计算公式如下:;其中,z表示模型下一段时间所需的实例数量,表示表示滑动平均显存使用率,z
o
为模型已使用的pod数量,p表示最大利用率,p表示最小利用率。
28.s5、根据模型在下一段时间所需的实例数量与模型已使用的实例数量对实例数量进行调整;s6、通过最优资源调度策略(lru)最终实现显存利用率的最大化。
29.如图2所示,以下通过具体技术手段与流程对本方法进行进一步的解释与说明:通过定时任务每10分钟调用glances接口,获取各个模型的显存使用情况。glances能够很好的监控模型显存使用情况,并且提供接口实时反馈给应用端。
30.获取glances返回,写入redis缓存。java的linkedhashmap实现了lru 算法,原理即是基于双向链表记录插入、访问的规则,在插入、访问元素时,变换链表。linkedhashmap默认插入作为排序,可以设定accessorder为true,来使得排序依据访问情况,具体内部实现逻辑与hashmap类似,可以根据插入、访问排序主要是重写了newnode、afternodeaccess访问,该方法实现了对双向链表的操作,插入时将元素更新至链表尾部,访问时将数据更新至链表头部。
31.定时任务每分钟去获取lru缓存中各个模型的显存占用率,调用rancher接口,把最近最少使用或者不怎么使用显存的模型降低实例数,更甚是停用模型,达到显存的最优利用。rancher自成一套包括网络,存储,负载均衡,dns的容器模块,它们运行在linux之上,为上层提供统一基础设施服务,非常方便提供接口和界面对容器进行管理。
32.监控任务代码实现如下:package com.iwhalecloud.aifactory.aiinference;import com.iwhalecloud.aifactory.aigateway.common.rancherutil;import com.iwhalecloud.aifactory.aigateway.common.interceptor.gpuuseinfo;import com.iwhalecloud.aifactory.airesource.aicmdb.host.vo.gpudata;import com.iwhalecloud.aifactory.aiinference.airmodelservice;import org.quartz.job;import org.quartz.jobexecutioncontext;import org.quartz.jobexecutionexception;import java.util.list;/** * @author zj * @description: 定时监控模型显存使用情况,并根据显存占用率启停模型 * @since 2021/5/20 14:24 */public class lrujob implements job {
ꢀꢀꢀꢀ
/**
ꢀꢀꢀꢀꢀ
* 定时监控模型显存使用情况,并根据显存占用率启停模型
ꢀꢀꢀꢀꢀ
**/
ꢀꢀꢀꢀ
@override
ꢀꢀꢀꢀ
public void execute(jobexecutioncontext context) throws jobexecutionexception {
ꢀꢀꢀꢀꢀꢀꢀꢀ
//1.查询使用中的所有显存
ꢀꢀꢀꢀꢀꢀꢀꢀ
list<gpudata> gpudatalist = getgpulist();
ꢀꢀꢀꢀꢀꢀꢀꢀ
for (gpudata gpudata : gpudatalist) {
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
//2.查询共享同一显存的模型列表
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
list<airmodelservice> airmodelservicelist = getmodelbygpu(gpudata);
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
for (airmodelservice airmodelservice : airmodelservicelist) {
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
//3.调用glances接口,查询模型的显存占用率
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
gpuuseinfo gpuuseinfo = getmodelgpuinfobyglances(airmodelservice);
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
//4.将模型显存暂用率写入redis缓存
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
putmodelgpuuseinfo(gpudata.getid().tostring() "

" airmodelservice.getid().tostring(), gpuuseinfo);
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
}
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
//5.根据模型最近使用情况启停模型
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
dealmodelbygpu(gpudata, airmodelservicelist);
ꢀꢀꢀꢀꢀꢀꢀꢀ
}
ꢀꢀꢀꢀ
}
ꢀꢀꢀꢀ
/**
ꢀꢀꢀꢀꢀ
* 根据模型最近使用情况启停模型
ꢀꢀꢀꢀꢀ
**/
ꢀꢀꢀꢀ
private void dealmodelbygpu(gpudata gpudata, list<airmodelservice> airmodelservicelist) {
ꢀꢀꢀꢀꢀꢀꢀꢀ
for (airmodelservice airmodelservice : airmodelservicelist) {
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
if (!isstart(airmodelservice) && islrustart(gpudata, airmodelservice)) { //模型处于停止状态,且达到启动条件
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
//5.1启动模型
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
rancherutil.start(airmodelservice);
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
}
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
else if (isstart(airmodelservice) && islrustop(gpudata, airmodelservice)) { //模型处于启动状态,且达到停止条件
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
//5.2停止模型
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
rancherutil.stop(airmodelservice);
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
}
ꢀꢀꢀꢀꢀꢀꢀꢀ
}
ꢀꢀꢀꢀ
}}glances监控数据以及接口如表1所示:
表1glances提供了监控数据获取接口,调用glances接口将容器显存使用情况存入redis缓存,为后面的lru调度提供数据支撑。
33.lru缓存实现:package com.iwhalecloud.aifactory.aiinference;import java.util.linkedhashmap;import java.util.map;/** * @author zj * @description: lru缓存 * @since 2021/5/20 15:11 */public class lrucache {
ꢀꢀꢀꢀ
private int cachesize;
ꢀꢀꢀꢀ
private linkedhashmap<integer,integer> linkedhashmap;
ꢀꢀꢀꢀ
public lrucache(int capacity) {
ꢀꢀꢀꢀꢀꢀꢀꢀ
this.cachesize = capacity;
ꢀꢀꢀꢀꢀꢀꢀꢀ
linkedhashmap = new linkedhashmap<integer,integer>(capacity,0.75f,true){
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
@override
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
protected boolean removeeldestentry(map.entry eldest) {
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
return size()>cachesize;
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
}
ꢀꢀꢀꢀꢀꢀꢀꢀ
};
ꢀꢀꢀꢀ
}
ꢀꢀꢀꢀ
public int get(int key) {
ꢀꢀꢀꢀꢀꢀꢀꢀ
return this.linkedhashmap.getordefault(key,

1);
ꢀꢀꢀꢀ
}
ꢀꢀꢀꢀ
public void put(int key,int value) {
ꢀꢀꢀꢀꢀꢀꢀꢀ
this.linkedhashmap.put(key,value);
ꢀꢀꢀꢀ
}}根据显存利用率,使用lru策略缓存判断启停代码实现:package com.iwhalecloud.aifactory.aiinference;import com.iwhalecloud.aifactory.aiinference.airmodelservice;public class rancherutil {
ꢀꢀꢀꢀ
//启动模型
ꢀꢀꢀꢀ
public static boolean start(airmodelservice airmodelservice) {
ꢀꢀꢀꢀꢀꢀꢀꢀ
//调用rancher接口,启动模型
ꢀꢀꢀꢀꢀꢀꢀꢀ
return startmodelbyrancher(airmodelservice);
ꢀꢀꢀꢀ
}
ꢀꢀꢀꢀ
//停止模型
ꢀꢀꢀꢀ
public static boolean stop(airmodelservice airmodelservice) {
ꢀꢀꢀꢀꢀꢀꢀꢀ
//调用rancher接口,停止模型
ꢀꢀꢀꢀꢀꢀꢀꢀ
return sotpmodelbyrancher(airmodelservice);
ꢀꢀꢀꢀ
}}综上所述,借助于本发明的上述技术方案,针对多模型共享显存的场景,通过lru调度策略,使模型动态启停,解决了多模型共享显存低利用率的痛点,即将多模型的显存占用进行有效分配,对低使用率的模型分配更少的显存资源,对高使用率的模型提供更多的显存资源,从而提升显存的利用率,进而节约资源;通过glances实时监控,提升容器切换的实时性;通过redis快速缓存,提升模型切换的高速性。
34.以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
转载请注明原文地址:https://win.8miu.com/read-50277.html

最新回复(0)