PySR项目中Julia 1.11版本内存泄漏问题分析与解决方案
问题背景
在PySR项目升级到1.0.0版本后,用户报告了严重的内存泄漏问题。该问题表现为在长时间运行符号回归任务时,Julia进程的内存使用量会持续增长,最终导致系统内存耗尽而崩溃。值得注意的是,这一问题在Julia 1.10版本中并不存在,而在升级到Julia 1.11版本后开始出现。
问题现象
用户在使用PySR进行符号回归时观察到以下典型现象:
- 内存使用量随时间呈线性增长趋势,即使设置了heap_size_hint_in_bytes参数也无法有效限制内存增长
- 在240GB内存的VM上,任务通常在8-11小时后因内存耗尽而崩溃
- 内存增长主要来自Julia工作进程,每个进程的内存占用可达数GB
- 问题在multiprocessing和multithreading两种并行模式下都会出现,但在multithreading模式下内存增长更为迅速
技术分析
经过深入调查,发现问题根源在于Julia 1.11版本中引入的新垃圾收集器(GC)实现。Julia 1.11对GC进行了重写以实现并行化,但在某些情况下存在内存回收不彻底的问题。具体表现为:
- 在特定数据维度下(如2×2500的小型数据集),内存泄漏现象尤为明显
- 内存增长速率与数据处理速度相关,处理速度越快,内存增长越迅速
- 设置heap_size_hint_in_bytes参数无法有效限制内存使用,表明GC未能按预期工作
解决方案
目前有以下几种可行的解决方案:
- 降级到Julia 1.10版本:这是最直接的解决方案。可以通过以下Python代码强制使用Julia 1.10:
import juliapkg
juliapkg.require_julia("~1.10")
import pysr
-
等待Julia官方修复:Julia开发团队已经确认了这个问题,并在最新版本中提供了修复。相关修复将包含在未来的Julia稳定版本中。
-
调整运行参数:虽然不能完全解决问题,但以下参数调整可以减缓内存增长:
- 启用bumper=True
- 使用较小的heap_size_hint_in_bytes值(如150MB)
- 考虑使用multiprocessing而非multithreading
最佳实践建议
对于PySR用户,特别是在生产环境中运行长时间任务的用户,建议:
- 在问题完全解决前,优先使用Julia 1.10版本
- 监控内存使用情况,特别是当处理小型数据集时
- 考虑定期重启长时间运行的任务,以避免内存累积
- 关注PySR和Julia的版本更新,及时获取修复补丁
技术展望
这一问题凸显了并行垃圾收集器实现的复杂性。随着Julia语言在科学计算领域的广泛应用,其内存管理机制将不断优化。PySR作为依赖Julia的符号回归工具,也将持续跟进Julia的核心改进,为用户提供更稳定、高效的计算体验。
未来版本的PySR可能会默认使用更稳定的Julia版本,避免类似问题的发生。同时,项目也会加强对内存使用的监控和限制机制,提高长时间运行的稳定性。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考