ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Angel 上的分布式 KMeans 聚类:Mini-batch 参数服务器实现与实战指南

Angel 上的分布式 KMeans 聚类:Mini-batch 参数服务器实现与实战指南 人工智能机器学习分布式训练图计算后端【免费下载链接】angelA Flexible and Powerful Parameter Server for large-scale machine learning项目地址https://gitcode.com/gh_mirrors/an/angel点击查看免费下载本文以开源项目 AngelA Flexible and Powerful Parameter Server for large-scale machine learning官方文档 kmeans_on_angel_en.md 为主线系统讲解如何在 Angel 参数服务器架构上训练分布式 KMeans 聚类模型。文章覆盖 Mini-batch KMeans 的核心原理、模型在 PS 上的存储与更新方式、全部算法与资源参数的取值说明以及训练train、增量训练inctrain、预测predict三类提交命令的完整写法同时结合仓库源码KMeansRunner、KMeansModel、KMeansLearner、KMeansTrainTask 及本地测试用例深入解释底层调用链与实现细节。读完本文你将能够独立配置并提交一个可运行的 Angel KMeans 聚类任务。1. KMeans 算法回顾KMeans 是一种把数据划分为 K 个**方差相近equal variance**分组的聚类方法。算法为每个数据点分配一个最近的簇其中距离由数据点与簇的中心点centers度量。传统 KMeans 存在明显的性能瓶颈每轮迭代都要全量计算所有样本到所有中心的距离且中心更新依赖全局同步但当它在 Angel 的 Parameter ServerPS架构上实现时可以在保持同等精度的前提下获得更好的性能。迭代式 KMeans 的一般流程如下其中xi 是第 i 个样本ci 是它的最近簇miu_jμ_j是第 j 个簇的中心点。每轮迭代包含两个步骤分配Assignment把每个样本划归到距离最近的中心点所在的簇更新Update用每个簇内所有样本的均值重新计算该簇的中心。经典 KMeans 直接在整个数据集上执行上述两步当数据规模达到 Web 级别时每一轮全量扫描的开销会迅速成为瓶颈。2. Mini-batch KMeans面向大规模数据的改进为了解决面向用户user-facing的 Web 应用中普遍存在的延迟latency、可扩展性scalability和稀疏性sparsity问题Sculley 在论文Web-Scale K-Means Clustering[1] 中提出了基于mini-batch 优化的改进版 KMeans 算法每一轮迭代只从数据集中随机采样一小批样本mini-batch来更新中心点而不是扫描全部数据。其核心收益在于降低单轮计算量每轮只处理一个 mini-batch 的样本计算与内存开销大幅下降天然适配参数服务器每次更新只需把局部增量推送到 PS由 PS 汇总避免了全量数据广播收敛质量有保障论文与 Angel 的实践均表明mini-batch 优化在显著提速的同时能够保持与标准 KMeans 接近的精度。3. Angel 上的分布式实现3.1 模型存储中心矩阵 计数向量KMeans 在 Angel 上的模型由两部分组成均存放在 ParameterServer 上模型组件形状说明中心矩阵centersK × N表示 K 个簇的中心点N 为特征维数即 feature 个数计数向量vK × 1记录每个簇累计接收到的样本数对应到源码KMeansModel.scala 中定义了两个 PSModel// 中心矩阵K 行、indexRange 列行类型由 ml.model.type 指定默认 T_DOUBLE_DENSE val centers: PSModel new PSModel(KMEANS_CENTERS_MAT, K, indexRange, -1, -1, modelSize) .setAverage(true) .setRowType(SharedConf.modelType) // 计数向量1 行、K 列密集 float 向量 val v: PSModel new PSModel(KMEANS_V_MAT, 1, K, -1, -1) .setAverage(true) .setRowType(RowType.T_FLOAT_DENSE)其中centers在 PS 端以KMEANS_CENTERS_MAT kmeans_centers命名v以KMEANS_V_MAT kmeans_v命名。注意centers采用了setAverage(true)的 PS 聚合方式这与训练时的增量推送机制配合见 3.3 节modelSize由ml.model.size相关配置决定用于为稀疏模型预留 PS 端存储空间。3.2 模型更新逐轮 mini-batch 迭代KMeans on Angel 以迭代方式训练每个 epoch 内通过 mini-batch 更新中心点。完整训练流程封装在 KMeansRunner.scala 的train方法中client.startPSServer() // 1. 启动 PS client.loadModel(model) // 2. 加载/初始化模型 client.runTask(classOf[KMeansTrainTask]) // 3. 运行训练任务 client.waitForCompletion() // 4. 等待完成 client.saveModel(model) // 5. 保存模型训练任务由 KMeansTrainTask.scala 执行它继承自TrainTask通过DataParser解析输入数据并按照ml.data.validate.ratio默认验证比例把样本拆分为训练集与验证集每第 vali 个样本划入验证集最终交给KMeansLearner完成学习。3.3 算法流程一个 epoch 的三步曲KMeansLearner.scala 完整实现了训练逻辑其算法总览如下初始化训练开始时由ctx.getTaskId.getIndex 0的任务负责且未配置angel.load.model.path时调用initKCentersRandomly从训练数据中随机挑选 K 个样本作为初始中心通过centers.increment(newCent)推送到 PS再syncClock()同步时钟其余任务则等待 PS 上的中心就绪后继续。每个 epoch 的三步更新对应trainOneEpoch方法拉取pullCentersFromPS()把 K 个中心从 PS 拉取到本地 workerpullVFromPS()拉取计数向量同时本地预计算每个中心的centerDist(i) c·c用于加速距离计算采样与局部更新按ml.num.update.per.epoch每个 epoch 的 mini-batch 个数把本轮样本划分为多个 mini-batch对每个样本x用findClosestCenter(x)找到最近中心cId本地计数lcV(cId) 1计算自适应学习率eta C / (lcV(cId) C)并更新中心lcCenters(cId) (1 - eta) * lcCenters(cId) eta * x源码中对应imul(1 - eta).iaxpy(x, eta)更新该中心的模长缓存centerDist(cId)推送用oldCenters备份做差得到centerUpdatecenters.increment(centerUpdate)把增量推到 PS计数向量同理v.increment(counterUpdate)最后对两个 PSModel 分别syncClock()。这里的学习率eta随每个簇接收样本数递减C/(vC)这正是 mini-batch KMeans 论文中保证收敛的关键设计簇越大单条新样本对中心的扰动越小。目标值Objective计算每轮 epoch 结束时computeObjValue会遍历训练集与验证集累加每个样本到其最近中心的距离作为本轮 lossml.train.loss/ml.valid.loss指标可用于观察聚类质量随迭代的收敛趋势。预测与轮廓系数KMeansModel.predict拉取中心后为每个样本输出所属簇 id、到最近中心的距离当设置ml.kmeans.silhouette.flagtrue时还会额外输出轮廓系数silhouette其内部用簇内样本数与距离加权计算可在不依赖真实标签的情况下评估聚类紧密度。默认该开关为 false见 MLConf.scala 中DEFAULT_KMEANS_SILHOUETTE_FLAG false。4. 执行与性能4.1 输入格式数据格式由ml.data.type指定支持libsvm、dense、dummy三种格式。具体格式说明见 Angel 数据格式。Angel 自带的 KMeans 本地测试用例 KmeansTest.java 使用 libsvm 格式的 USPS 手写数字数据集data/usps/usps_256d_train.libsvm、data/usps/usps_256d_test.libsvm256 维特征完整演示了本地模式下 train → inctrain → predict 三步流程可作为配置正确性的参考模板。4.2 参数说明IO 参数参数说明ml.feature.index.range特征个数特征索引范围ml.data.type数据格式取值dummy或libsvm见 Angel 数据格式angel.train.data.path训练数据输入路径angel.predict.data.path预测数据输入路径angel.save.model.path训练模型的保存路径angel.predict.out.path预测结果输出路径angel.log.path日志保存路径算法参数参数说明ml.epoch.num迭代轮数epoch 数ml.minibatch.sizemini-batch 样本数每个 mini-batch 的样本量ml.kmeans.center.numK聚类簇个数对应源码常量MLConf.KMEANS_CENTER_NUM默认值为 5ml.kmeans.c学习率参数 C对应源码常量MLConf.KMEANS_C默认值为 0.1训练命令中常用 0.15补充说明上述两个默认值来自 MLConf.scalaDEFAULT_KMEANS_CENTER_NUM 5、DEFAULT_KMEANS_C 0.1。每个 epoch 内部的 mini-batch 切分数由ml.num.update.per.epoch控制见 SharedConf.scala 的numUpdatePerEpoch实现batch 大小据此按样本总数均分。资源参数参数说明angel.workergroup.numberworker 数量angel.worker.memory.mb每个 worker 申请的内存MBangel.worker.task.number每个 worker 上的任务数默认 1angel.ps.numberPS 数量angel.ps.memory.mb每个 PS 申请的内存MB4.3 提交命令Angel 使用统一的angel-submit脚本提交任务。以下命令基于官方文档整理$traindata、$predictdata、$modelout、$predictout、$logpath、$centerNum、$featureNum为需要替换的变量。训练任务Training Job./bin/angel-submit \ --action.typetrain \ --angel.app.submit.classcom.tencent.angel.ml.clustering.kmeans.KMeansRunner \ --ml.model.class.namecom.tencent.angel.ml.clustering.kmeans.KMeansModel \ --angel.train.data.path$traindata \ --angel.save.model.path$modelout \ --angel.output.path.deleteonexisttrue \ --angel.log.path$logpath \ --ml.data.typelibsvm \ --ml.model.typeT_DOUBLE_DENSE \ --ml.kmeans.center.num$centerNum \ --ml.kmeans.c0.15 \ --ml.epoch.num10 \ --ml.feature.index.range$featureNum \ --ml.feature.num$featureNum \ --angel.workergroup.number4 \ --angel.worker.memory.mb5000 \ --angel.worker.task.number1 \ --angel.ps.number4 \ --angel.ps.memory.mb5000 \ --angel.job.namekmeans_train增量训练任务IncTraining Job增量训练从已有模型--angel.load.model.path继续训练适合数据持续到达、需要周期性更新的场景./bin/angel-submit \ --action.typeinctrain \ --angel.app.submit.classcom.tencent.angel.ml.clustering.kmeans.KMeansRunner \ --ml.model.class.namecom.tencent.angel.ml.clustering.kmeans.KMeansModel \ --angel.train.data.path$traindata \ --angel.load.model.path$modelout \ --angel.save.model.path$modelout \ --angel.output.path.deleteonexisttrue \ --angel.log.path$logpath \ --ml.data.typelibsvm \ --ml.model.typeT_DOUBLE_DENSE \ --ml.kmeans.center.num$centerNum \ --ml.kmeans.c0.15 \ --ml.epoch.num10 \ --ml.feature.index.range$featureNum \ --ml.feature.num$featureNum \ --angel.workergroup.number4 \ --angel.worker.memory.mb5000 \ --angel.worker.task.number1 \ --angel.ps.number4 \ --angel.ps.memory.mb5000 \ --angel.job.namekmeans_inctrain与训练任务相比增量训练的关键差异仅在于增加了--angel.load.model.path加载已有模型而--angel.save.model.path继续指向模型输出目录。从源码看KMeansRunner.train对 train 与 inctrain 两种 action 的处理路径一致二者通过配置中的加载路径区分当angel.load.model.path非空时learner 会跳过随机初始化initKCentersRandomly只在ANGEL_LOAD_MODEL_PATH为空时执行直接从已保存的中心出发继续迭代。预测任务Prediction Job./bin/angel-submit \ --action.typepredict \ --angel.app.submit.classcom.tencent.angel.ml.clustering.kmeans.KMeansRunner \ --ml.model.class.namecom.tencent.angel.ml.clustering.kmeans.KMeansModel \ --angel.predict.data.path$predictdata \ --angel.load.model.path$modelout \ --angel.predict.out.path$predictout \ --angel.output.path.deleteonexisttrue \ --angel.log.path$logpath \ --ml.data.typelibsvm \ --ml.model.typeT_DOUBLE_DENSE \ --ml.kmeans.center.num$centerNum \ --ml.feature.index.range$featureNum \ --ml.feature.num$featureNum \ --angel.workergroup.number4 \ --angel.worker.memory.mb5000 \ --angel.worker.task.number1 \ --angel.ps.number4 \ --angel.ps.memory.mb5000 \ --angel.psagent.cache.sync.timeinterval.ms500 \ --angel.job.namekmeans_predict预测任务运行的是KMeansPredictTaskKMeansRunner.predict中通过client.runTask(classOf[KMeansPredictTask])触发不需要保存模型因此命令中不出现--angel.save.model.path而是以--angel.predict.out.path指定预测结果输出位置。注意预测命令额外设置了--angel.psagent.cache.sync.timeinterval.ms500用于控制 PSAgent 缓存与 PS 的同步间隔可按实际网络情况调整。预测结果中每条记录输出样本 id、所属簇 id 与到最近中心的距离开启ml.kmeans.silhouette.flagtrue后还会附加轮廓系数列。4.4 性能参考官方文档给出的实测数据如下来自 kmeans_on_angel_en.md数据SVHN3×10³ 个特征7×10⁴ 个样本资源Angelexecutor 4 个各 5G 内存、1 个 taskPS 4 个各 5G 内存100 个 epoch 的训练耗时Angel 约 45 分钟该数据用于说明 Angel 在中等规模数据上运行 KMeans 的资源占用与耗时量级实际效果会随数据规模、特征维度与资源配置变化。5. 参考文献[1] Sculley D. Web-scale k-means clustering[C]// International Conference on World Wide Web, WWW 2010, Raleigh, North Carolina, USA, April. DBLP, 2010:1177-1178.附相关源码与文档索引官方算法文档kmeans_on_angel_en.md本文主体、kmeans_on_angel.md中文版数据格式说明data_format_en.md任务入口与流程KMeansRunner.scala模型与距离/轮廓计算KMeansModel.scala训练算法实现KMeansLearner.scala训练任务数据解析与切分KMeansTrainTask.scala参数默认值与常量定义MLConf.scala本地端到端测试train / inctrain / predictKmeansTest.java示例数据data/usps/usps_256d_train.libsvm、data/usps/usps_256d_test.libsvm赞分享人工智能机器学习分布式训练图计算后端【免费下载链接】angelA Flexible and Powerful Parameter Server for large-scale machine learning项目地址https://gitcode.com/gh_mirrors/an/angel点击查看免费下载相关推荐如何利用Angel参数服务器实现高效KMeans聚类大规模机器学习的终极解决方案如何利用Angel参数服务器实现高效KMeans聚类大规模机器学习的终极解决方案 在当今数据爆炸的时代处理海量数据的机器学习任务变得越来越普遍。KMeans人工智能机器学习分布式训练图计算后端Rust By Practice 生命周期完全攻略如何搞定 Rust 最难懂的生命周期问题Rust By Practice 生命周期完全攻略如何搞定 Rust 最难懂的生命周期问题 Rust 生命周期是新手公认最难啃的知识点之一。Rust By P人工智能机器学习分布式训练图计算后端PyTorch 分布式参数服务器实战使用 Distributed RPC 框架实现参数服务器训练PyTorch 分布式参数服务器实战使用 Distributed RPC 框架实现参数服务器训练 导读 本篇文章基于 PyTorch tutorials 仓库示例工程上一篇显卡驱动清理终极指南如何用DDU解决驱动残留问题下一篇Display Driver Uninstaller (DDU)显卡驱动彻底清理的终极解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表