[release/0.3] Fix memory leak caused by c_pointers - #1435
Conversation
PaddlePaddle-bot
left a comment
There was a problem hiding this comment.
🤖 Paddle-CI-Agent | pr_review |
2026-07-09 15:49:10
📋 Review 摘要
PR 概述:在 paddlefleet_ops 导入阶段为 CUTLASS DSL Numeric 标量类型注入 __c_pointers__ per-type cache,减少高频 kernel launch 下 ctypes 对象反复创建。
变更范围:packages/paddlefleet_ops/src/paddlefleet_ops/__init__.py
影响面 Tag:CustomOps PaddleFleetOps
问题
| 级别 | 文件 | 概述 |
|---|---|---|
| 🟡 建议 | packages/paddlefleet_ops/src/paddlefleet_ops/__init__.py:34 |
CUTLASS patch 初始化失败会被完全静默吞掉 |
| 🟡 建议 | packages/paddlefleet_ops/src/paddlefleet_ops/__init__.py:79 |
成功日志与 PR 描述中的验证搜索串不一致 |
📝 PR 规范检查
标题不符合 checklist §D1 的 Cherry-Pick 格式;描述已包含 §D2 要求的 PR Category、PR Types、Description 结构。
标题建议(可直接复制):
[Cherry-Pick][Bug fixes] Fix CUTLASS DSL c pointer cache leak(#1325)
总体评价
缓存思路本身与 PR 目标一致,但当前失败路径和验证日志会让补丁未生效或验证误判时缺少可观测性。建议修正后再以 PR 描述中的日志信号验证。
| def _patch_cutlass_cptr_cache(maxsize=4096): | ||
| try: | ||
| from cutlass.base_dsl import typing as _typing | ||
| except Exception: |
There was a problem hiding this comment.
🟡 建议 这里会把 cutlass.base_dsl.typing 导入过程中的任意异常静默吞掉。
当前补丁是否生效完全依赖这个导入;如果安装了 nvidia-cutlass-dsl 但其依赖或初始化异常,函数会直接返回 0,后面也不会打印失败原因,训练进程仍然带着未缓存的 __c_pointers__ 继续跑。按 checklist §C,except Exception 吞异常且无日志属于错误静默。
建议只把 ImportError / ModuleNotFoundError 作为 CUTLASS 不存在的正常路径;对其它异常至少记录 warning 后返回,或让异常暴露出来。
| _patched_count = _patch_cutlass_cptr_cache() | ||
| if _patched_count: | ||
| logging.getLogger(__name__).warning( | ||
| f"[cptr_cache] Patched {_patched_count} CUTLASS DSL types" |
There was a problem hiding this comment.
🟡 建议 这里的成功日志和 PR 描述要求的验证信号不一致。
PR 描述让使用者搜索 [cptr_cache] Result: patched 18 types,但代码实际输出 [cptr_cache] Patched {N} CUTLASS DSL types。按现状验证步骤会误判补丁未生效。
建议统一为描述中的固定格式,例如 "[cptr_cache] Result: patched {_patched_count} types",或同步更新 PR 描述中的搜索串。
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## release/0.3 #1435 +/- ##
===============================================
Coverage ? 100.00%
===============================================
Files ? 1
Lines ? 3
Branches ? 0
===============================================
Hits ? 3
Misses ? 0
Partials ? 0
Flags with carried forward coverage won't be shown. Click here to find out more. 🚀 New features to boost your workflow:
|
PaddleFleet Log Analysis
日志分析报告流水线: Integration test (H20, multi-card) — Job 86067341571
失败的测试 case: 根本原因分析: PR #1435(
修复建议:
🔄 每次 Re-run 后自动更新 |
PR Category
User Experience
PR Types
Bug fixes
Description
Fix memory fragmentation caused by uncached c_pointers() in CUTLASS DSL scalar types.
Problem:
CUTLASS DSL scalar types (Int32, Float32, Float64, Float16, BFloat16, TFloat32 等) 的 c_pointers() 方法在每次 kernel 调用时都会创建新的 ctypes
对象。在训练循环中高频 kernel launch 场景下,这些短生命周期对象与框架长生命周期对象交替分配,导致 pymalloc arena 碎片化,进程 RSS 单调增长
Fix:
在 paddlefleet_ops/init.py 中添加 monkey-patch,对所有 CUTLASS DSL Numeric 子类的 c_pointers() 方法注入 per-type cache(dict keyed by
scalar value)。首次调用时缓存结果,后续相同值直接返回缓存,避免重复创建 ctypes 对象。
验证生效
在日志搜索是否存在:[cptr_cache] Result: patched 18 types
是否引起精度变化
否
Cherry-pick of #1325 to
release/0.3.Merged in dev: #1325