已关闭
【缺陷报告】内存泄漏 - 文件test_aclnn_mla_preprocess_v2.cpp - 函数main - 行号418 #4793
zhangjunkai9创建于  8月31日关闭于  9月11日
zhangjunkai9
8月31日 创建

缺陷信息

缺陷类型memoryLeak (内存泄漏)
函数main
文件attention/mla_preprocess_v2/examples/test_aclnn_mla_preprocess_v2.cpp
行号418
置信度90%
分析模型maas-glm-5.1-zhipu

缺陷描述

在 main 函数中,第418-429行通过 CreateAclTensorND 创建了5个输出张量(qOut、kvCacheOut、qRopeOut、krCacheOut、qDownOut),每个都通过 aclrtMalloc 分配了 device 和 host 内存。但在函数末尾的资源释放段(第479-554行),仅释放了24个输入张量的 aclTensor、device 和 host 内存,完全遗漏了这5个输出张量的 aclDestroyTensor、aclrtFree(deviceAddr) 和 aclrtFree(hostAddr) 调用,导致5个输出张量的设备内存、host内存和 aclTensor 对象全部泄漏。

事实核查

核查1(模式成立):第418-429行通过 CreateAclTensorND 创建5个输出张量(qOut、kvCacheOut、qRopeOut、krCacheOut、qDownOut),每个分配 device+host 内存;

函数末尾释放段(第479-554行)仅释放24个输入张量的 aclDestroyTensor(479-502行)、aclrtFree(deviceAddr)(505-528行)、aclrtFree(hostAddr)(531-554行),完全遗漏这5个输出张量的释放,泄漏模式成立。

核查2(防护无效):释放段无任何输出张量的释放调用。

核查3(函数可达):main 为入口函数,depth 0,可达。

核查4(触发可满足):泄漏发生在成功路径即正常执行路径,程序正常执行完毕后5个输出张量泄漏,触发条件满足。

模式成立+无防护+可达+触发可满足,确认为真实缺陷。

数据流证据

Source(问题源头)

attention/mla_preprocess_v2/examples/test_aclnn_mla_preprocess_v2.cpp:418 行 ret = CreateAclTensorND(qOutShape, &qOutDeviceAddr, &qOutHostAddr, ACL_FLOAT16, &qOut) 分配 qOut 的 device+host 内存并创建 aclTensor

Sink(问题爆发点)

attention/mla_preprocess_v2/examples/test_aclnn_mla_preprocess_v2.cpp:554 行 函数末尾释放段结束(第479-554行),未包含 qOut/qvCacheOut/qRopeOut/krCacheOut/qDownOut 的 aclDestroyTensor 和 aclrtFree 调用

传播路径:

# 文件 行号 说明
1 attention/mla_preprocess_v2/examples/test_aclnn_mla_preprocess_v2.cpp 418 ret = CreateAclTensorND(qOutShape, &qOutDeviceAddr, &qOutHostAddr, ACL_FLOAT16, &qOut) 分配 qOut 的 device+host 内存
2 attention/mla_preprocess_v2/examples/test_aclnn_mla_preprocess_v2.cpp 420 ret = CreateAclTensorND(kvCacheOutShape, &kvCacheOutDeviceAddr, &kvCacheOutHostAddr, ...) 分配 kvCacheOut 的 device+host 内存
3 attention/mla_preprocess_v2/examples/test_aclnn_mla_preprocess_v2.cpp 423 ret = CreateAclTensorND(qRopeOutShape, &qRopeOutDeviceAddr, &qRopeOutHostAddr, ...) 分配 qRopeOut 的 device+host 内存
4 attention/mla_preprocess_v2/examples/test_aclnn_mla_preprocess_v2.cpp 425 ret = CreateAclTensorND(krCacheOutShape, &krCacheOutDeviceAddr, &krCacheOutHostAddr, ...) 分配 krCacheOut 的 device+host 内存
5 attention/mla_preprocess_v2/examples/test_aclnn_mla_preprocess_v2.cpp 428 ret = CreateAclTensorND(qDownOutShape, &qDownOutDeviceAddr, &qDownOutHostAddr, ...) 分配 qDownOut 的 device+host 内存
6 attention/mla_preprocess_v2/examples/test_aclnn_mla_preprocess_v2.cpp 479-502 aclDestroyTensor 释放段仅释放24个输入张量,未包含 qOut/kvCacheOut/qRopeOut/krCacheOut/qDownOut
7 attention/mla_preprocess_v2/examples/test_aclnn_mla_preprocess_v2.cpp 505-528 aclrtFree(deviceAddr) 释放段仅释放24个输入 device 地址,未包含5个输出 device 地址
8 attention/mla_preprocess_v2/examples/test_aclnn_mla_preprocess_v2.cpp 531-554 aclrtFree(hostAddr) 释放段仅释放24个输入 host 地址,未包含5个输出 host 地址

调用链

可达调用链1 起点:(entry functions) → 终点:main 深度:0

# 文件 函数 函数起始行 调用点行
1 attention/attention_update/examples/test_aclnn_attention_update.cpp main 77 —

修复建议

// 在第502行之后补充输出张量的 aclDestroyTensor 调用
aclDestroyTensor(qOut);
aclDestroyTensor(kvCacheOut);
aclDestroyTensor(qRopeOut);
aclDestroyTensor(krCacheOut);
aclDestroyTensor(qDownOut);
// 在第528行之后补充输出 device 地址的 aclrtFree 调用
aclrtFree(qOutDeviceAddr);
aclrtFree(kvCacheOutDeviceAddr);
aclrtFree(qRopeOutDeviceAddr);
aclrtFree(krCacheOutDeviceAddr);
aclrtFree(qDownOutDeviceAddr);
// 在第554行之前补充输出 host 地址的 aclrtFree 调用
aclrtFree(qOutHostAddr);
aclrtFree(kvCacheOutHostAddr);
aclrtFree(qRopeOutHostAddr);
aclrtFree(krCacheOutHostAddr);
aclrtFree(qDownOutHostAddr);
likedislike
weihao18成员
9月1日 评论:

你好,建议汇总到具体算子进行集中处理

likedislike
游震成员
9月3日 评论:

/assign @chaotang233

likedislike
CANN-robotCANN-robot成员
9月3日 将 chaotang233 设为负责人
唐超成员
9月4日 评论:

已收到该issue,路由对应同学处理

likedislike
唐唐超成员
9月4日 将 zhengyuhao3 设为负责人
唐唐超成员
9月4日 移除了负责人 chaotang233
Zzhengyuhao3成员
9月10日 关联了pull request:fix mla_prprocess_v2 example memory leaks
CANN-robotCANN-robot成员
9月11日 关闭了 issue
CANN-robotCANN-robot成员
9月11日 添加了label:resolved