LightGBM GPU版本触发Memory Object Allocation Failure报错原因排查
LightGBM GPU 版本
Memory Object Allocation Failure 报错原因(显存充足场景下) 以下为该场景下的常见触发原因:
- OpenCL 单内存块分配上限限制
LightGBM GPU 版本基于 OpenCL 框架实现运算调度,绝大多数 OpenCL 驱动默认限制单块内存对象最大申请量不超过显存总量的1/4。即使设备总显存充足,当单次训练/推理需要申请的单块连续内存超过该阈值时,就会触发该报错。45GB 显存的 A40 默认单块上限通常为 10GB 左右,超过该值的单块内存申请会直接被拦截。 - OpenCL 上下文资源残留/冲突
如果同设备有其他占用 OpenCL 上下文的进程运行,或是之前 LightGBM 任务异常退出未释放显存句柄,会导致 OpenCL 层的可用内存池被占用。此时通过nvidia-smi查看显存显示空闲,但 OpenCL 层面可分配内存已经不足,也会触发分配失败。 - 运行参数配置错误
若手动配置了错误的gpu_device_id,实际调度到显存更小的核显/其他设备运行,或是开启了gpu_use_dp双精度运算开关,单样本显存占用量会提升2-3倍,超出预期的内存申请量也会触发该报错。 - 驱动与版本适配缺陷
R535 及以上版本的 NVIDIA 驱动与 3.3.0 以下版本的 LightGBM 存在适配问题,OpenCL 层会错误识别显存可用量,明明有45GB空闲显存,仅能识别到不足10GB的可分配空间。
对应修复方案
- 新增配置项
gpu_mem_part = 0.8,调整 OpenCL 内存分配的显存占比上限,突破默认单块内存的申请限制 - 执行
clinfo命令查看 OpenCL 层识别到的显存容量,若与实际不符,可重启 NVIDIA 驱动释放残留的上下文资源 - 升级 LightGBM 至 4.0 及以上版本,该版本重构了 GPU 内存分配逻辑,拆分了大内存块申请操作,同时修复了新驱动的适配问题
- 无特殊需求的情况下,关闭
gpu_use_dp开关,使用单精度运算降低显存占用
内容的提问来源于stack exchange,提问作者user17416953
相关产品推荐
相关产品推荐

