已关闭
【缺陷报告】内存泄漏 - 文件test_aclnn_swin_transformer_ln_qkv_quant.cpp - 函数main - 行号192 #4803
zhangjunkai9创建于  8月31日关闭于  24 天前
zhangjunkai9
8月31日 创建

缺陷信息

缺陷类型memoryLeak (内存泄漏)
函数main
文件ffn/swin_transformer_ln_qkv_quant/examples/test_aclnn_swin_transformer_ln_qkv_quant.cpp
行号192
置信度95%
分析模型maas-glm-5.1-zhipu

缺陷描述

main 函数通过 CreateAclTensor 模板函数分配了 11 个 device 内存(aclrtMalloc)并创建了 11 个 aclTensor(aclCreateTensor),包括 x/gamma/beta/weight/bias/quantScale/quantOffset/dequantScale/queryOutput/keyOutput/valueOutput。但在第189-196行的清理代码中,仅 aclDestroyTensor(x) 和 aclDestroyTensor(queryOutput) 销毁了 2 个 Tensor,仅 aclrtFree(xDeviceAddr) 和 aclrtFree(outqDeviceAddr) 释放了 2 个 device 内存。gamma、beta、weight、bias、quantScale、quantOffset、dequantScale、keyOutput、valueOutput 共 9 个 aclTensor 未销毁,gammaDeviceAddr、betaDeviceAddr、weightDeviceAddr、biasDeviceAddr、scaleDeviceAddr、offsetDeviceAddr、dequantDeviceAddr、outkDeviceAddr、outvDeviceAddr 共 9 个 device 内存未释放。main 是程序入口,调用链可达。

事实核查

核查1(模式成立):main 函数在第122-152行通过 CreateAclTensor 模板分配了 11 个 device 内存(aclrtMalloc)并创建了 11 个 aclTensor(aclCreateTensor)。

第189-193行清理代码仅 aclDestroyTensor(x) 和 aclDestroyTensor(queryOutput) 销毁 2 个 Tensor,仅 aclrtFree(xDeviceAddr) 和 aclrtFree(outqDeviceAddr) 释放 2 个 device 内存。

gamma/beta/weight/bias/quantScale/quantOffset/dequantScale/keyOutput/valueOutput 共 9 个 Tensor 未销毁,对应 9 个 device 内存未释放,内存泄漏模式成立。

核查2(防护无效):清理代码仅覆盖 2/11,无完整释放逻辑,防护无效。

核查3(函数可达):main 为程序入口,trivially 可达。

核查4(触发可满足):main 执行时所有 CreateAclTensor 调用均使用真实 hostData 和 shape,分配成功后仅部分释放,触发条件满足。

综合1-4,确认为真实缺陷。

数据流证据

Source(问题源头)

ffn/swin_transformer_ln_qkv_quant/examples/test_aclnn_swin_transformer_ln_qkv_quant.cpp:122 行 ret = CreateAclTensor(selfHostData, selfShape, &xDeviceAddr, ...) 首个 device 内存分配(共11个,第122-152行)

Sink(问题爆发点)

ffn/swin_transformer_ln_qkv_quant/examples/test_aclnn_swin_transformer_ln_qkv_quant.cpp:189-196 行 aclDestroyTensor(x)/aclDestroyTensor(queryOutput)/aclrtFree(xDeviceAddr)/aclrtFree(outqDeviceAddr) 仅清理 2/11 Tensor 和 2/11 device 内存,其余 9 个泄漏

传播路径:

# 文件 行号 说明
1 ffn/swin_transformer_ln_qkv_quant/examples/test_aclnn_swin_transformer_ln_qkv_quant.cpp 70 int main() 程序入口 main 函数
2 ffn/swin_transformer_ln_qkv_quant/examples/test_aclnn_swin_transformer_ln_qkv_quant.cpp 122 ret = CreateAclTensor(selfHostData, selfShape, &xDeviceAddr, ACL_FLOAT16, &x) 分配 xDeviceAddr 并创建 x
3 ffn/swin_transformer_ln_qkv_quant/examples/test_aclnn_swin_transformer_ln_qkv_quant.cpp 125 ret = CreateAclTensor(gammaHostData, gammaShape, &gammaDeviceAddr, ...) 分配 gammaDeviceAddr 并创建 gamma
4 ffn/swin_transformer_ln_qkv_quant/examples/test_aclnn_swin_transformer_ln_qkv_quant.cpp 128 ret = CreateAclTensor(betaHostData, gammaShape, &betaDeviceAddr, ...) 分配 betaDeviceAddr 并创建 beta
5 ffn/swin_transformer_ln_qkv_quant/examples/test_aclnn_swin_transformer_ln_qkv_quant.cpp 131 ret = CreateAclTensor(weightHostData, weightShape, &weightDeviceAddr, ...) 分配 weightDeviceAddr 并创建 weight
6 ffn/swin_transformer_ln_qkv_quant/examples/test_aclnn_swin_transformer_ln_qkv_quant.cpp 134 ret = CreateAclTensor(biasHostData, biasShape, &biasDeviceAddr, ...) 分配 biasDeviceAddr 并创建 bias
7 ffn/swin_transformer_ln_qkv_quant/examples/test_aclnn_swin_transformer_ln_qkv_quant.cpp 137 ret = CreateAclTensor(scaleHostData, gammaShape, &scaleDeviceAddr, ...) 分配 scaleDeviceAddr 并创建 quantScale
8 ffn/swin_transformer_ln_qkv_quant/examples/test_aclnn_swin_transformer_ln_qkv_quant.cpp 140 ret = CreateAclTensor(offsetHostData, gammaShape, &offsetDeviceAddr, ...) 分配 offsetDeviceAddr 并创建 quantOffset
9 ffn/swin_transformer_ln_qkv_quant/examples/test_aclnn_swin_transformer_ln_qkv_quant.cpp 143 ret = CreateAclTensor(dequantHostData, biasShape, &dequantDeviceAddr, ...) 分配 dequantDeviceAddr 并创建 dequantScale
10 ffn/swin_transformer_ln_qkv_quant/examples/test_aclnn_swin_transformer_ln_qkv_quant.cpp 146 ret = CreateAclTensor(outqHostData, outShape, &outqDeviceAddr, ...) 分配 outqDeviceAddr 并创建 queryOutput
11 ffn/swin_transformer_ln_qkv_quant/examples/test_aclnn_swin_transformer_ln_qkv_quant.cpp 149 ret = CreateAclTensor(outkHostData, outShape, &outkDeviceAddr, ...) 分配 outkDeviceAddr 并创建 keyOutput
12 ffn/swin_transformer_ln_qkv_quant/examples/test_aclnn_swin_transformer_ln_qkv_quant.cpp 151 ret = CreateAclTensor(outvHostData, outShape, &outvDeviceAddr, ...) 分配 outvDeviceAddr 并创建 valueOutput
13 ffn/swin_transformer_ln_qkv_quant/examples/test_aclnn_swin_transformer_ln_qkv_quant.cpp 189 aclDestroyTensor(x) 仅销毁 x(sink:9 个 Tensor 未销毁)
14 ffn/swin_transformer_ln_qkv_quant/examples/test_aclnn_swin_transformer_ln_qkv_quant.cpp 190 aclDestroyTensor(queryOutput) 仅销毁 queryOutput
15 ffn/swin_transformer_ln_qkv_quant/examples/test_aclnn_swin_transformer_ln_qkv_quant.cpp 192 aclrtFree(xDeviceAddr) 仅释放 xDeviceAddr(sink:9 个 device 内存未释放)
16 ffn/swin_transformer_ln_qkv_quant/examples/test_aclnn_swin_transformer_ln_qkv_quant.cpp 193 aclrtFree(outqDeviceAddr) 仅释放 outqDeviceAddr

调用链

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

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

修复建议

// 在第189行处替换为完整的清理代码:
aclDestroyTensor(x);
aclDestroyTensor(gamma);
aclDestroyTensor(beta);
aclDestroyTensor(weight);
aclDestroyTensor(bias);
aclDestroyTensor(quantScale);
aclDestroyTensor(quantOffset);
aclDestroyTensor(dequantScale);
aclDestroyTensor(queryOutput);
aclDestroyTensor(keyOutput);
aclDestroyTensor(valueOutput);
aclrtFree(xDeviceAddr);
aclrtFree(gammaDeviceAddr);
aclrtFree(betaDeviceAddr);
aclrtFree(weightDeviceAddr);
aclrtFree(biasDeviceAddr);
aclrtFree(scaleDeviceAddr);
aclrtFree(offsetDeviceAddr);
aclrtFree(dequantDeviceAddr);
aclrtFree(outqDeviceAddr);
aclrtFree(outkDeviceAddr);
aclrtFree(outvDeviceAddr);
if (workspaceSize > 0) {
    aclrtFree(workspaceAddr);
}
aclrtDestroyStream(stream);
aclrtResetDevice(deviceId);
aclFinalize();
likedislike
weihao18成员
9月1日 评论:

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

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

/assign @chaotang233

likedislike
CANN-robotCANN-robot成员
9月3日 将 chaotang233 设为负责人
唐唐超成员
9月4日 将 zhengyuhao3 设为负责人
唐唐超成员
9月4日 移除了负责人 chaotang233
Zzhengyuhao3成员
25 天前 关联了pull request:fix(swin_transformer_ln_qkv_quant): free all tensors in example
CANN-robotCANN-robot成员
24 天前 关闭了 issue
CANN-robotCANN-robot成员
24 天前 添加了label:resolved