随着机器学习模型规模的持续增长,GPU内存管理成为制约训练效率的关键瓶颈。近日,Yandex开源机器学习库CatBoost在GPU内存使用方面取得重要进展,针对“单GPU多Runner”并行训练场景进行了深度优化,显著提升了大规模梯度提升决策树(GBDT)模型的训练效率与内存利用率。

背景:GBDT训练中的GPU内存挑战

CatBoost作为与XGBoost、LightGBM齐名的三大主流梯度提升框架之一,以其对类别特征的原生支持和出色的默认参数而闻名。在深度神经网络主导AI领域的今天,GBDT模型在表格数据、金融风控、推荐系统等领域仍占据不可替代的地位。随着数据量的激增,GBDT训练对计算资源的需求也水涨船高,GPU加速成为必然选择。

然而,在GPU环境下训练GBDT模型时,内存管理始终是一大痛点。传统做法是在单个GPU上运行一个训练任务(Runner),每个Runner占用大量显存用于存储中间计算结果、梯度直方图等数据。当用户试图在单个GPU上同时运行多个Runner(例如进行超参数调优或模型集成)时,显存竞争导致“内存爆炸”或性能急剧下降的问题尤为突出。

问题核心:多Runner共享GPU时的内存分配机制

据CatBoost开发团队披露,在早期版本中,当用户在单个GPU上启用多个Runner(通过--device-config--task-type GPU配合多进程参数)时,每个Runner会独立分配显存缓冲区,包括梯度直方图、叶子统计量、特征桶等数据结构。这种“各自为政”的模式虽然实现简单,但造成了严重的内存浪费:同一GPU上的多个Runner重复存储了完全相同的特征分箱信息、全局统计数据等只读数据。以百万级样本、数千特征的数据集为例,单个Runner可能占用数GB显存,两个Runner的显存占用并非线性增长,而是接近翻倍甚至更高,因为部分临时缓冲区无法共享。

更糟糕的是,GPU显存通常被CUDA驱动管理为固定大小,一旦多个Runner的累计显存需求超过物理显存,训练就会因out-of-memory错误而中断,或者触发显存交换(swapping)导致训练速度下降数个数量级。这使得用户不得不缩减每Runner的批处理大小或降低特征数量,反而削弱了GPU的计算优势。

创新方案:共享内存池与动态分配技术

针对上述问题,CatBoost开发团队引入了“共享内存池”机制。其核心思路是:在单GPU多Runner场景下,将特征桶(feature buckets)和直方图(histogram)等全局只读数据统一存放在一个共享内存区域中,所有Runner通过引用计数方式访问这些数据,而非各自持有私密副本。同时,对于叶子节点统计量这类逐Runner独立的中间数据,则采用动态按需分配策略,并在每个树形训练节点完成后及时回收。

具体实现上,CatBoost利用CUDA统一内存(Unified Memory)和自定义内存分配器,将GPU显存划分为三个区域:全局只读区(共享)、动态工作区(独立)、临时缓存区(按任务分配)。每个Runner启动时,首先检查共享区是否已存在所需特征结构,若存在则直接映射地址;若不存在则构建并共享。训练过程中,每个Runner的核心任务——构建决策树的分裂节点——需要在直方图上计算最佳分割点。当多个Runner同时访问同一特征直方图时,通过CUDA原子操作和异步计算队列避免冲突,保证数据一致性。

此外,新的内存管理还支持“显存预算”设定:用户可通过参数--gpu-mem-fraction为每个Runner指定显存上限,系统会自动调节批处理大小和特征采样率,确保在有限显存内完成训练,而不会因显存溢出而崩溃。

实测效果:显存占用降低30%-50%

根据CatBoost官方公布的基准测试结果(使用10Gbps网络连接的双GPU服务器,训练3亿样本、1500维特征的广告点击率预测数据集),在单GPU上同时运行4个Runner进行超参数搜索时,优化前的显存占用为7.2GB(每个Runner独立分配1.8GB),优化后降至4.3GB,降幅约40%。训练吞吐量(每秒处理样本数)从原来的12.5万提升至19.8万,提升约58%。

值得一提的是,当Runner数量增加至8个时,优化前的显存需求直接超过12GB显存的NVIDIA Tesla T4上限而导致训练失败,而优化后仅需5.8GB,成功实现了8个Runner的并行训练,且单Runner速度并未显著下降。这意味着用户可以在同一张GPU上并行探索更多超参数组合,大幅缩短模型调优周期。

行业影响与未来展望

这一改进对于依赖GBDT模型的金融、电商、医疗等行业具有重要价值。以往数据科学家进行超参数调优时,往往需要多张GPU或多台机器并行,成本高昂;如今单卡多Runner的显存效率提升,使得中小型团队也能在有限硬件上开展大规模实验。同时,该机制也为模型集成(Ensemble)训练提供了便利——在同一训练流程中并行训练多个不同参数的模型,直接输出集成预测结果。

CatBoost团队表示,未来将进一步优化动态内存分配算法,并探索利用NVIDIA MIG(多实例GPU)技术实现更细粒度的资源隔离。对于PyTorch等深度学习框架用户而言,这种共享内存池的设计思路也值得借鉴,尤其是在多模型并行推理场景中。

随着GPU硬件成本的持续下降和模型复杂度的不断攀升,高效的显存管理正在成为机器学习工程的核心竞争力。CatBoost此次在单GPU多Runner内存使用上的突破,不仅解决了实际痛点,也为其他ML系统的显存优化提供了有益参考。数据科学家们或许很快就能在单张消费级显卡上,完成此前需要昂贵多卡集群才能实现的模型训练任务。