LightGBM 分布式并行训练实战:从 CLI 双机示例到三种并行算法原理

发布时间:2026/9/13 6:49:41
LightGBM 分布式并行训练实战:从 CLI 双机示例到三种并行算法原理 LightGBM 分布式并行训练实战从 CLI 双机示例到三种并行算法原理【免费下载链接】LightGBMA fast, distributed, high performance gradient boosting (GBT, GBDT, GBRT, GBM or MART) framework based on decision tree algorithms, used for ranking, classification and many other machine learning tasks.项目地址: https://gitcode.com/GitHub_Trending/li/LightGBM导读本文围绕 LightGBM 官方提供的分布式学习示例 examples/parallel_learning完整讲解如何基于Socket 通信在 2 台机器上跑通分布式的二分类训练包括机器清单mlist配置、训练/预测配置文件逐项解读与启动命令。随后文章会从 Parallel-Learning-Guide.rst 与 Features.rst 提取三种分布式学习算法Feature Parallel、Data Parallel、Voting Parallel的设计动机与适用场景并结合 src/treelearner/tree_learner.cpp 与 src/io/config.cpp 的源码实现说明 LightGBM 在单机多线程之外的多机并行能力边界。读完本文你将具备直接复现该分布式示例、自行裁剪配置到更多机器以及根据数据规模与特征规模选择正确并行算法的完整能力。示例目录结构速览examples/parallel_learning/目录是一个完整、可复现的分布式训练最小工程共包含 7 个文件文件作用README.md分布式学习示例的说明文档本文主体mlist.txt机器清单文件示例中为占位说明实际需按机器 IP 编辑train.conf分布式训练配置文件feature 并行、2 台机器predict.conf基于训练产出模型做预测的配置文件binary.train/binary.test训练/测试数据libsvm 文本格式label 在首列binary.train.weight/binary.test.weight对应数据的样本权重文件其中binary.train为 7000 行、28 维特征的二分类数据label 位于第 0 列取值为 0/1后续配置中label_column 0与之对应权重文件存在时LightGBM 会自动读取与数据同名的.weight文件。一、双机 Socket 并行训练三步跑通示例官方 README 给出的流程非常精简一共三步。下面结合目录内真实配置逐条展开保证可复制。第 1 步编辑机器清单mlist.txt在 mlist.txt 中写入参与训练的 2 台机器的 IP 与通信端口格式为每行一台机器IP 空格 端口machine1_ip 12400 machine2_ip 12400要点端口在每台机器上保持一致示例统一为12400且必须与 train.conf 中的local_listen_port 12400一致该端口是 TCP 通信端口需提前在每台机器的防火墙中放行入站流量mlist.txt每台机器上都要存在且内容一致。第 2 步把整个目录与可执行文件分发到两台机器需要拷贝的内容包括数据文件binary.train、binary.test及其.weight、配置文件train.conf、predict.conf、机器清单mlist.txt以及编译产物lightgbm可执行文件。LightGBM 官方文档 Parallel-Learning-Guide.rst 在 Socket 版本的运行说明中特别强调数据文件、可执行文件、配置文件和mlist.txt都要复制到所有机器上。第 3 步在两台机器上同时启动训练在存放该示例的目录下两台机器分别执行./lightgbm configtrain.confWindows 平台对应命令为lightgbm.exe configtrain.conf两台机器需要同时启动LightGBM 会建立网络握手后进行联合训练。训练完成后依据 train.conf 中的output_model LightGBM_model.txt每台机器都会产出模型文件LightGBM_model.txt。随后任一台机器可用 predict.conf 做预测./lightgbm configpredict.confpredict.conf 内容如下task predict data binary.test input_model LightGBM_model.txt即加载训练得到的模型对binary.test计算预测分数。通信后端Socket 与 MPI 二选一示例默认基于Socket通信。LightGBM 同样支持基于MPI的分布式学习两种方式的核心差异如下见 Parallel-Learning-Guide.rst维度Socket 版本MPI 版本mlist.txt内容machine_ip port每行含端口machine_ip仅 IP 或主机名网络依赖需在所有机器放行同一 TCP 端口依赖 MPI 环境Linux 需mpiexecWindows 需启动smpd服务启动方式每台机器分别执行./lightgbm configtrain.conf仅在其中一台机器执行mpiexec --machinefile mlist.txt ./lightgbm configtrain.conf路径要求各机器路径自由MPI 要求所有机器上运行路径一致二、train.conf分布式配置逐项精讲train.conf 是一份麻雀虽小五脏俱全的分布式训练配置。下面按职责分组逐项解释括号内为源码层src/io/config_auto.cpp认可的别名。2.1 任务与模型设定参数示例值说明tasktrain任务类型支持train/predictboosting_typegbdt提升类型别名boosting、boostobjectivebinary目标函数别名application、app示例为二分类支持regression、lambdarank等metricbinary_logloss,auc评估指标多个指标用逗号分隔binary_logloss是二分类默认指标可追加aucmetric_freq1每多少次迭代输出一次指标is_training_metrictrue是否对训练集也输出指标别名tranining_metric、train_metriclabel_column0数据中 label 所在列下标从 0 开始max_bin255特征分箱数。255 是推荐值可节省内存且精度损失很小num_trees100树的数量别名num_tree、num_iteration、num_round等learning_rate0.1学习率收缩率别名shrinkage_ratenum_leaves63单棵树叶子数别名num_leaf2.2 数据输入参数示例值说明databinary.train训练数据别名train_data、train若存在同名权重文件自动命名为binary.train.weightvalid_databinary.test验证数据别名valid、test、test_data支持多个、逗号分隔权重文件对应binary.test.weightis_save_binary_filefalse是否保存为二进制缓存文件下次训练自动加载别名is_save_binary、save_binaryuse_two_round_loadingfalse数据大于内存时开启两轮加载否则保持 false 以获得更快速度is_enable_sparsetrue稀疏特征优化开关别名is_sparse2.3 树学习器与分布式核心参数重点# type of tree learner, support following types: # serial , single machine version # feature , use feature parallel to train # data , use data parallel to train # voting , use voting based parallel to train tree_learner feature# number of machines in parallel training, alias: num_machine num_machines 2 # local listening port in parallel training, alias: local_port local_listen_port 12400 # machines list file for parallel training, alias: mlist machine_list_file mlist.txttree_learner别名tree分布式并行的开关决定使用哪种并行算法。可选serial单机、feature特征并行、data数据并行、voting基于投票的并行。本示例使用feature。num_machines别名num_machine参与训练的机器数示例为 2必须与mlist.txt中的行数一致。local_listen_port别名local_port、port本地监听端口所有机器必须统一并与mlist.txt中写的端口一致。machine_list_file别名machine_list、mlist机器清单文件路径。从源码 src/io/config.cpp 可以确认这三个参数的联动规则当num_machines 1时is_parallel被置为true当num_machines 1时tree_learner被强制改写为serial即单机训练时并行配置自动失效反之当tree_learner serial时is_parallel false且num_machines被强制置 1。也就是说num_machines与tree_learner是互相牵制的分布式训练必须两者同时配置正确。参数别名与类型声明可在 src/io/config_auto.cpp 中查到num_machines别名num_machine、local_listen_port别名local_port、port、machine_list_filename别名machine_list_file、machine_list、mlist。2.4 防过拟合与运行资源参数示例值说明feature_fraction0.8特征子采样别名sub_feature每轮迭代随机选取 80% 特征bagging_freq5每 5 轮迭代执行一次 Bagging数据子采样bagging_fraction0.8Bagging 时随机选取 80% 数据别名sub_rowmin_data_in_leaf50叶子最小数据量别名min_data_per_leaf、min_data用于抑制过拟合min_sum_hessian_in_leaf5.0叶子最小 Hessian 和同样用于防过拟合num_threads注释掉多线程数默认等于 CPU 核数默认一行被注释表示使用默认值2.5 模型输入输出参数示例值说明output_modelLightGBM_model.txt训练产出的模型文件input_model注释示例trained_model.txt从已有 GBDT 模型继续训练output_result注释示例prediction.txt预测任务输出文件三、三种分布式并行算法原理与选型LightGBM 官方提供 3 种分布式学习算法通过tree_learner参数切换Parallel-Learning-Guide.rst并行算法配置方式Data parallel数据并行tree_learnerdataFeature parallel特征并行tree_learnerfeatureVoting parallel投票并行tree_learnervoting3.1 选型矩阵官方文档给出如下适用场景矩阵数据量小#data is small数据量大#data is large特征量小#feature is smallFeature ParallelData Parallel特征量大#feature is largeFeature ParallelVoting Parallel即特征并行在数据量小时普遍适用数据量变大后特征量小时选数据并行、特征量大时选投票并行。3.2 Feature Parallel特征并行传统算法流程Features.rst垂直切分数据不同机器持有不同特征子集各 worker 在本地特征集上寻找局部最优分裂点{feature, threshold}互相通信局部最优分裂点取全局最优持有最优分裂的 worker 执行分裂并把数据分裂结果发给其他 worker其他 worker 依据收到的结果分裂数据。其缺陷在于分裂操作无法被并行加速时间复杂度为O(#data)且需要通信分裂结果约O(#data / 8)每个数据 1 bit因此数据量大时加速效果差。LightGBM 的改进不再垂直切分数据而是每台机器持有全量数据。这样各 worker 无需通信分裂结果每台机器都知道如何分裂流程缩减为三步本地找最优分裂 → 通信比较取全局最优 → 执行分裂。由于每机全量数据的前提该方法适用于数据量不至于过大的场景——这也是示例默认tree_learnerfeature的原因。3.3 Data Parallel数据并行传统算法流程水平切分数据各 worker 用本地数据构建局部直方图合并所有局部直方图为全局直方图从全局直方图找最优分裂并执行。其缺陷是通信成本高点对点通信约O(#machine * #feature * #bin)使用 All Reduce 集合通信约O(2 * #feature * #bin)。LightGBM 的优化用Reduce Scatter替代全局直方图合并——不同 worker 各自负责不同不重叠特征的直方图合并再在本地合并结果上找局部最优分裂最后同步全局最优分裂借助 LightGBM 的直方图减法histogram subtraction只需通信一个叶子的直方图其兄弟叶子可通过减法得到进一步降低通信量。综合后LightGBM 数据并行的通信复杂度约为O(0.5 * #feature * #bin)。另外src/io/config.cpp 显示当tree_learnerdata时若设置了histogram_pool_size直方图 LRU 队列框架会主动禁用该队列以降低通信成本。3.4 Voting Parallel投票并行Voting parallel 在数据并行基础上进一步将通信成本降到常数级通过两阶段投票来减少特征直方图的通信量详见 Features.rst。适合数据量大 特征量大的最重负载场景。3.5 源码实现映射src/treelearner/tree_learner.cpp 中的CreateTreeLearner工厂函数完成了从配置字符串到具体并行学习器的实例化tree_learner取值CPU 设备实例化GPU 设备实例化serialSerialTreeLearnerGPUTreeLearnerfeatureFeatureParallelTreeLearnerSerialTreeLearnerFeatureParallelTreeLearnerGPUTreeLearnerdataDataParallelTreeLearnerSerialTreeLearnerDataParallelTreeLearnerGPUTreeLearnervotingVotingParallelTreeLearnerSerialTreeLearnerVotingParallelTreeLearnerGPUTreeLearner三类并行学习器的实现分别位于 data_parallel_tree_learner.cpp、feature_parallel_tree_learner.cpp 与 voting_parallel_tree_learner.cpp均基于ParallelTreeLearner基类parallel_tree_learner.h扩展。同时注意CUDA 设备目前仅支持单机训练CUDASingleGPUTreeLearner其余并行类型会直接 Fatal 报错。四、分布式训练的底层机制4.1 网络初始化与 Socket 通信分布式训练的网络层由 src/network/network.cpp 承担Network::Init(Config config)会根据配置建立各机器间的 TCP 连接。训练启动后每个机器根据mlist.txt获得集群拓扑并以local_listen_port上建立监听。数据加载阶段会依据rank与num_machines进行数据划分见 src/io/dataset_loader.cpp多机训练时各 rank 按机器数对训练样本进行分片采样Random::NextShort(0, num_machines) rank全局数据量由各机器统计汇总。4.2 训练完成后的产出GBDT 训练在 src/boosting/gbdt.cpp 中对Network::num_machines() 1分支做了同步处理保证各机器得到一致的全局模型。最终每台机器都写出output_model指定的模型文件单机即可用该模型进行预测——这也是 predict.conf 可以在任意一台机器独立执行的原因。4.3 防火墙与网络注意事项Socket 模式成败的关键在网络上所有参与机器的local_listen_port必须一致且已在防火墙放行入站若环境有 NAT、代理或跨网段限制需确保机器间 TCP 直连可达MPI 模式还需满足所有机器同一路径的硬性约束。五、扩展更多机器的并行训练把双机示例扩展到 N 台机器只需三处联动修改mlist.txt写入 N 行machine_ip port端口统一train.conf中num_machines改为 N保证 N 台机器的防火墙均放行同一端口且tree_learner与数据规模匹配参照 3.1 选型矩阵。官方并行指南 Parallel-Learning-Guide.rst 以 4 机为例给出同样的配置范式tree_learneryour_parallel_algorithm、num_machinesyour_num_machines如 4、machine_list_filemlist.txt、local_listen_port12345。六、已知边界与注意事项结合源码与文档使用 CLI 分布式训练时需注意单机退化为 serial只要num_machines 1或tree_learner serial框架会自动忽略并行设置src/io/config.cppforced splits 限制data/voting数据并行模式下不支持forcedsplits_filename设置会直接 Fatalsrc/io/config.cpp数据并行会关闭直方图缓存histogram_pool_size在数据并行下被置为 -1 以省通信src/io/config.cppCUDA 设备仅单机device_typecuda时仅支持serialsrc/treelearner/tree_learner.cpp线性树linear tree只能串行linear_treetrue时tree_learner会被强制改写为serialsrc/io/config.cpp。七、更多资料入口分布式学习官方指南docs/Parallel-Learning-Guide.rst分布式优化原理详解docs/Features.rst分布式示例数据与配置examples/parallel_learningMPI 版本构建说明docs/Installation-Guide.rstPython 包通过 Dask 进行分布式训练lightgbm.dask官方维护示例见 examples/python-guide/dask其网络参数machines、local_listen_port与 CLI 侧语义一致说明官方同时提供 SparkSynapseML、Kubeflow、Ray、Mars 等第三方集成它们并非由 LightGBM 维护者维护本文不展开。结语从 examples/parallel_learning 出发本文完整还原了 LightGBM 双机 Socket 并行训练的三步流程并逐项解读了train.conf中与分布式相关的tree_learner、num_machines、local_listen_port、machine_list_file四个核心参数及其别名与联动规则。在原理层面Feature / Data / Voting 三种并行算法的通信优化思路均有 Features.rst 与 src/treelearner 源码可查证。将配置文件 选型矩阵 源码映射三者结合即可在任意规模的集群上正确、高效地开展 LightGBM 分布式训练。【免费下载链接】LightGBMA fast, distributed, high performance gradient boosting (GBT, GBDT, GBRT, GBM or MART) framework based on decision tree algorithms, used for ranking, classification and many other machine learning tasks.项目地址: https://gitcode.com/GitHub_Trending/li/LightGBM创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询