MNN icon indicating copy to clipboard operation
MNN copied to clipboard

多个模型串行共享一个runtime,内存没有复用反倒增加

Open 486946 opened this issue 1 year ago • 16 comments

未使用runtime时,两个模型通过getsessioninfo查看内存信息分别为129.395508 MB和60.189285 MB 使用共享一个runtime时,两个模型通过getsessioninfo查看内存信息分别为129.395508 MB和189.584808 MB

共享runtime的作用应该为两者最大129.395508 MB才对,这怎么像是还累积了呢?

使用共享一个runtime方式如下: ScheduleConfig config; config.numberThread = 4; auto runtimeInfo = Interpreter::createRuntime({config});

/创建第一个模型/ std::shared_ptr<Interpreter> net1 = Interpreter::createFromFile("1.mnn"); auto session1 = net1->createSession(config, runtimeInfo); //获取第一个模型内存信息 net1->getSessionInfo(session1, Interpreter::MEMORY, &memoryUsage1);

/创建第二个模型/ std::shared_ptr<Interpreter> net2 = Interpreter::createFromFile("2.mnn"); auto session2 = net2->createSession(config, runtimeInfo); //获取第二个模型内存信息 net2->getSessionInfo(session2, Interpreter::MEMORY, &memoryUsage2);

/使用/ /* 填充输入1..... */ net1->runSession(session1);

/* 读取输出1 填充输入2..... */ net2->runSession(session2);

486946 avatar Feb 20 '24 01:02 486946

  1. 模型中的静态内存(与模型大小相等权重)是无法复用的,只能累加
  2. 共享 runtime 是共享线程池与内存池,不是共享内存,各session所使用的内存还是需要分配的

jxt1234 avatar Feb 20 '24 02:02 jxt1234

  1. 模型中的静态内存(与模型大小相等权重)是无法复用的,只能累加
  2. 共享 runtime 是共享线程池与内存池,不是共享内存,各session所使用的内存还是需要分配的

内存池不是提前优化分配好的内存吗?想串行的多个模型能够复用内存有什么办法(最好不增加耗时)?

486946 avatar Feb 20 '24 02:02 486946

内存池是用于分配内存的,但模型中的静态内存(卷积的权重)是不能共用的,这部分无法共用。动态部分可以共用,就是通过共享运行时方式

jxt1234 avatar Feb 20 '24 06:02 jxt1234

先看下你的模型有多大,是否量化过(量化过实际所需内存需要乘以 4)

jxt1234 avatar Feb 20 '24 06:02 jxt1234

先看下你的模型有多大,是否量化过(量化过实际所需内存需要乘以 4)

两个模型都是大约14M ,都是没有量化过的浮点模型,

486946 avatar Feb 20 '24 06:02 486946

模型发一下吧

jxt1234 avatar Feb 20 '24 06:02 jxt1234

diff --git a/source/backend/cpu/CPUBackend.cpp b/source/backend/cpu/CPUBackend.cpp index e96a2d10a..06df56dfb 100644 --- a/source/backend/cpu/CPUBackend.cpp +++ b/source/backend/cpu/CPUBackend.cpp @@ -273,6 +273,8 @@ bool CPUBackend::onSelectDynamicAllocator(int index, int maxIndex) {

ErrorCode CPUBackend::onResizeEnd() { getCache()->release();

  • FUNC_PRINT((float)mStaticAllocator->totalSize() / 1024.0f / 1024.0f);
  • FUNC_PRINT((float)mDynamicAllocator->totalSize() / 1024.0f / 1024.0f); return mCurrentDynamicAllocator->compute(); }

这么修改看一下 静态内存和动态内存大小

jxt1234 avatar Feb 20 '24 06:02 jxt1234

模型发一下吧

请提供下邮箱?还是什么

486946 avatar Feb 20 '24 06:02 486946

Hi: 我们的两个模型见附件 按照 https://github.com/alibaba/MNN/issues/2760#issuecomment-1953588478
添加之后查看静态内存和动态内存, 静态内存和getsessioninfo :memory 打印的数值一致 ,两个模型还是累加 ;动态内存,通过添加共享运行的runtime, 也没有什么变化,看不出是否共用 请帮忙查看一下,我们还是想串行的多个模型能够复用内存 谢谢 model1.zip model2.zip

keke444 avatar Feb 21 '24 07:02 keke444

最新代码上两个模型 getSessionInfo memory 是多少,共享 runtime 之后 getSessionInfo memory 是多少?

jxt1234 avatar Feb 21 '24 08:02 jxt1234

最新代码上两个模型 getSessionInfo memory 是多少,共享 runtime 之后 getSessionInfo memory 是多少?

分别是77M和43M,共享runtime之后分别是77M和120M

486946 avatar Feb 21 '24 08:02 486946

确实动态内存部分没有复用,还在解决中

jxt1234 avatar Feb 29 '24 10:02 jxt1234

确实动态内存部分没有复用,还在解决中

期待解决方案

486946 avatar Feb 29 '24 11:02 486946

确实动态内存部分没有复用,还在解决中

期待解决方案

分析了你的情况,已经讨论出解决方案了;后续需要时间实现和测试~

wangzhaode avatar Feb 29 '24 11:02 wangzhaode

请问是否有patch提前 发我们测试下

486946 avatar Mar 25 '24 01:03 486946

Marking as stale. No activity in 60 days.

github-actions[bot] avatar May 24 '24 09:05 github-actions[bot]