Angel 模型训练核心类 MLLearner 详解:train 接口、训练流程与自定义实现
人工智能机器学习分布式训练图计算后端【免费下载链接】angelA Flexible and Powerful Parameter Server for large-scale machine learning项目地址https://gitcode.com/gh_mirrors/an/angel点击查看免费下载MLLearner 是 AngelA Flexible and Powerful Parameter Server for large-scale machine learning框架中负责模型训练的核心抽象类。按照官方 API 文档的定义Angel 中所有模型训练的核心逻辑原则上都应封装并经由 MLLearner 来实现与调用。本文将以 docs/apis/MLLearner.md 为主体结合仓库中的真实源码完整讲解 MLLearner 的定位、train核心接口的签名与语义、它与 DataBlock / MLModel / MLRunner 之间的协作关系以及基于它编写自定义训练器时的关键要点。MLLearner 在 Angel 训练体系中的定位在 Angel 的 ML 模块里一次完整的训练作业被拆分成了职责清晰的几个角色MLLearner 处于算法训练逻辑的最前端角色职责仓库中的类型MLRunner作业提交入口编排 PS 启动、任务调度、模型保存trait MLRunner见 MLRunner.scalaTask / BaseTask被调度到 Worker 上执行的训练任务负责构造 DataBlock 并调用 LearnerBaseTask见 Task.scala 相关实现MLLearner承载算法训练循环读取数据、迭代更新、产出模型abstract class MLLearner见 MLLearner.scalaMLModel训练的产出物由一个或多个 PSModel 组成abstract class MLModel见 MLModel.scalaDataBlock训练数据在 Worker 端的基本存储单元abstract class DataBlock见 DataBlock.java可以这样理解调用链MLRunner提交作业并调度BaseTaskBaseTask把 HDFS 上读入的数据组织成DataBlock[LabeledData]交给MLLearnerMLLearner在train方法中完成迭代训练最终返回一个MLModel。因此官方文档强调MLLearner 是train的核心类任何算法在 Angel 中的训练主循环都应落在这里。核心接口train完整解析MLLearner 对外只暴露一个核心抽象方法这也是子类必须实现的方法。官方文档 docs/apis/MLLearner.md 给出了它的精确定义def train(train: DataBlock[LabeledData], vali: DataBlock[LabeledData]): MLModel各要素的语义如下功能使用指定的算法对训练数据进行训练得到模型。所谓训练即反复读取训练数据集、计算损失与梯度、更新参数直到满足收敛条件或达到预设迭代轮数。参数trainDataBlock[LabeledData]类型训练数据集。其中LabeledData封装了样本的特征向量x与标签y定义见 LabeledData.scala 所在包。参数valiDataBlock[LabeledData]类型验证数据集。每个 epoch 结束后用它评估模型在当前轮次的泛化表现如损失、AUC、精度等。返回值MLModel训练得到的模型对象。值得注意的是该方法的两个参数类型是DataBlock[LabeledData]这与不断读取 DataBlock的定位完全一致——训练数据不是一次性整体加载到内存参与计算而是通过 DataBlock 提供的顺序读、随机取、循环读等能力被逐条消费。源码级剖析MLLearner 抽象类仓库中的真实定义位于 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/MLLearner.scala源码比文档给出了更丰富的实现细节abstract class MLLearner(val ctx: TaskContext) { val globalMetrics new GlobalMetrics(ctx) val conf: Configuration ctx.getConf def train(train: DataBlock[LabeledData], vali: DataBlock[LabeledData]): MLModel }可以从中读出三个对实现者至关重要的设计构造参数ctx: TaskContext每个 MLLearner 都与一个 TaskContext 绑定。它承载了当前任务在集群中的身份信息如任务索引ctx.getTaskIndex、总任务数ctx.getTotalTaskNum以及 epoch 推进状态ctx.getEpoch、ctx.incEpoch()。子类通常用它控制哪些任务负责初始化、当前训练到第几轮。conf: Configuration直接取自ctx.getConf所有训练超参数epoch 数、学习率、批次大小等都可以通过它读取。globalMetrics: GlobalMetrics训练指标注册与上报的统一入口。子类在train中通过globalMetrics.addMetric(name, metric)注册指标再在每个 epoch 通过globalMetrics.metric(name, value)更新数值。底层实现见 GlobalMetrics.scala它会把指标同步注册到 TaskContextctx.addAlgoMetric最终呈现在 Angel 的 Web UI 与日志中。同时train是一个抽象方法源码中没有方法体这意味着框架本身并不规定训练循环怎么写而是把完整的训练主逻辑交给具体算法子类去实现——这正呼应了文档中Angel 所有模型训练核心逻辑都应该写在这个类中的表述。数据流DataBlock 如何被不断读取要写出正确的train实现必须理解DataBlock的能力。从 DataBlock.java 可以看到它是 Angel 中所有从 HDFS 读入的数据的存储抽象专为机器学习做了适配核心能力包括read()顺序读取下一条数据get(index)按索引随机读取put(value)顺序写入resetReadIndex()把读游标重置到起始位置供新一轮遍历使用shuffle()打乱数据顺序在需要随机化训练顺序时使用slice(start, length)按区间切分出子存储size()返回数据条数。在实际的train实现中不断读取通常体现为两类模式按 epoch 顺序遍历resetReadIndex()后循环read()与按 mini-batch 循环采样借助loopingRead()实现无边界循环读取配合随机丢弃构造一批数据。这两类模式在下面的具体实现中都能看到。训练循环的经典模式从 KMeansLearner 看 train 的实现KMeans 是理解train方法结构的最佳入门示例其完整实现位于 KMeansLearner.scala。该 Learner 覆盖了文档所述不断读取 DataBlock训练得到 MLModel的全部要素读取配置从SharedConf/conf读取特征维度indexRange、epoch 数epochNum、聚类数K、自适应学习率参数C等。构造模型new KMeansModel(conf, ctx)模型内部维护中心点矩阵等 PSModel。初始化任务索引为 0 的任务随机挑选 K 个样本作为初始中心并推送到 PS其余任务则同步等待。注册指标globalMetrics.addMetric(MLConf.TRAIN_LOSS, LossMetric(trainData.size))与VALID_LOSS。迭代训练while (ctx.getEpoch epochNum)循环内每个 epoch 执行从 PS 拉取中心点 → 对每个 mini-batch 做局部更新 → 把增量推回 PS → 计算训练损失与验证损失 →ctx.incEpoch()。返回模型循环结束后return kmeansModel。可以看到 KMeansLearner 的train精确符合接口签名def train(trainData: DataBlock[LabeledData], valiData: DataBlock[LabeledData]): MLModel并通过ctx.getEpoch/ctx.incEpoch()与框架的 epoch 机制联动。这正是train 是核心类、训练逻辑都写在其中的典型示范。面向图模型与深度学习GraphLearner 的训练主循环对于 LR / DNN / FM / DeepFM 等基于计算图的算法训练逻辑封装在 GraphLearner.scala 中它继承MLLearner(ctx)并实现了train(trainData, validationData)。其训练主循环清晰地展示了pull → forward → backward → push → barrier → update这一与参数服务器交互的标准流程按SharedConf.numUpdatePerEpoch切分每个 epoch 的 mini-batch每个 batchgraph.feedData(batch)喂数据 →graph.pullParams(epoch)从 PS 拉参数 →graph.calLoss()前向计算损失 →graph.calBackward()反向传播 →graph.pushGradient()推送梯度通过PSAgentContext.get().barrier(...)做任务间同步屏障由任务 0 统一执行graph.update(...)在 PS 侧更新参数每个 epoch 结束调用validate(...)在验证集上计算 loss / AUC / precision二分类或 accuracy多分类、MSE / RMSE / MAE / R2回归并通过globalMetrics.metric上报。除了这两类仓库中还有大量extends MLLearner的实现例如 GBDTLearner.scala梯度提升树、LDALearner.scala主题模型等。它们共同验证了一点无论算法形态如何训练主循环都统一收敛到 MLLearner.train 这一个入口。train 的产出MLModel 与 PSModeltrain返回的MLModel并非一个简单的参数容器。从 MLModel.scala 的源码可以看到一个MLModel由一个或多个 PSModel组成内部用Map[String, PSModel]按名称维护提供addPSModel(name, psModel)添加模型组件、getPSModel(name)/getPSModels获取提供setSavePath(conf)/setLoadPath(conf)分别读取angel.save.model.path与angel.load.model.path配置把模型组件标记为需要保存/加载的路径声明predict(storage: DataBlock[LabeledData]): DataBlock[PredictResult]供预测阶段复用训练产出的模型。因此一个合格的train实现通常在方法内构造并填充 MLModel如 KMeansLearner 返回kmeansModel、GraphLearner 返回model供上层MLRunner在训练完成后统一执行saveModel落盘。标准训练调用链MLRunner 如何驱动 MLLearnertrain方法由谁触发答案在MLRunner。仓库中 MLRunner.scala 提供了标准的训练/预测模板方法其中训练流程为client.startPSServer() // 启动参数服务器 client.loadModel(model) // 按需加载已有模型 client.runTask(taskClass) // 调度训练任务任务内部实例化 MLLearner 并调用 train client.waitForCompletion()// 等待训练完成 client.saveModel(model) // 保存训练产出的模型 client.stop()也就是说MLRunner负责集群层面的编排而真正在 Worker 上执行的、逐条消费DataBlock并完成迭代更新的正是各个MLLearner子类的train方法。二者通过BaseTask衔接Task 读取数据构造 DataBlock 后以MLLearner的train为入口完成一轮训练。影响 train 行为的关键配置参数由于 MLLearner 的conf直接来自 TaskContext训练超参数均通过配置注入。以下是与train主循环强相关的核心配置默认值均来自 MLConf.scala读取逻辑见 SharedConf.scala配置键默认值含义与影响ml.epoch.num30训练轮数直接决定while (ctx.getEpoch epochNum)循环的执行次数ml.data.validate.ratio0.05训练集中划分出作为验证集的比例决定传入train的vali数据量ml.data.use.shufflefalse是否在每个 epoch 前对 DataBlock 执行shuffle()打乱训练顺序ml.minibatch.size128mini-batch 样本数控制每次参数更新的数据量ml.num.update.per.epoch10每个 epoch 内的参数更新次数与 batch 大小共同决定数据的消费方式ml.learn.rate0.5学习率多数优化器的核心步长参数ml.feature.index.range-1特征维度范围小于 0 时按稀疏模式动态确定ml.model.is.classificationtrue是否分类问题影响验证时计算 AUC/精度还是回归类指标ml.model.class.name图模型算法的模型类名GraphLearner 依赖此配置构建计算图这些参数在 KMeansLearner、GraphLearner 等实现中均有直接对应关系例如SharedConf.epochNum、SharedConf.numUpdatePerEpoch、SharedConf.useShuffle、SharedConf.learningRate等。编写自定义MLLearner时遵循同样的读取模式即可保持与框架其余模块的兼容。自定义 MLLearner 的实践要点综合官方文档 docs/apis/MLLearner.md 与仓库源码实现一个自定义 MLLearner 应把握以下要点继承并传入 TaskContextclass MyLearner(ctx: TaskContext) extends MLLearner(ctx)自动获得conf与globalMetrics。实现唯一的抽象方法train签名必须为def train(train: DataBlock[LabeledData], vali: DataBlock[LabeledData]): MLModel内部完成读配置 → 建模型 → 初始化 → epoch 循环 → 返回模型。用 epoch 机制控制迭代通过ctx.getEpoch判断轮次、ctx.incEpoch()推进轮次与框架的任务调度与进度统计保持一致。在 train 内部构造并返回 MLModel产物需是MLModel内部可含多个PSModel以便上层MLRunner统一saveModel。善用 globalMetrics 上报指标注册TRAIN_LOSS/VALID_LOSS等指标并在每个 epoch 更新训练过程即可在 Angel 的可视化页面上呈现。训练主逻辑务必收敛于此如文档所述训练的核心逻辑数据消费、梯度计算、参数更新都应封装在train中而非散落在 Task 或 Runner 层。综上MLLearner 是 Angel 面向算法开发者的训练中枢它以train(DataBlock, DataBlock) → MLModel这一简洁接口统一了从数据读取、迭代训练、指标上报到模型产出的完整闭环是理解 Angel ML 模块代码结构、以及扩展新算法时最值得首先阅读的核心抽象类。赞分享人工智能机器学习分布式训练图计算后端【免费下载链接】angelA Flexible and Powerful Parameter Server for large-scale machine learning项目地址https://gitcode.com/gh_mirrors/an/angel点击查看免费下载相关推荐如何训练自定义LatentSync模型完整训练流程详解如何训练自定义LatentSync模型完整训练流程详解 想要实现精准的唇形同步效果LatentSync模型通过结合Stable Diffusion技术和多模人工智能深度学习计算机视觉语音媒体生成视频Ray Train 核心概念详解训练函数、Worker、ScalingConfig 与 Trainer 的分布式训练全流程Ray Train 核心概念详解训练函数、Worker、ScalingConfig 与 Trainer 的分布式训练全流程 Ray Train 是 Ray A人工智能分布式训练强化学习任务调度模型推理服务后端PaddleSeg paddleseg.core 接口详解train、evaluate 与 predict 的训练评估全流程PaddleSeg paddleseg.core 接口详解train、evaluate 与 predict 的训练评估全流程 paddleseg.core 是人工智能计算机视觉预训练上一篇Fluent UI离线文档终极指南使用Service Worker实现快速访问下一篇Django Components扩展开发实战自定义功能与生命周期管理创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

毕夏AI降重降AIGC:一份“化验单”引发的科普实验

毕夏AI降重降AIGC:一份“化验单”引发的科普实验

毕夏AI官网:www.bixiaai.com 微信公众号搜一搜:毕夏AI官网 各位同学好。今天聊一个让我血压有点高的话题。 上个月有个学生发来一张截图。他的论文查重报告:重复率4.8%。漂亮。旁边是AIGC检测报告:疑似AI生成67%。导师批注两个…

2026/10/12 13:06:31 阅读更多 →
你论文里的“引用”正在替你说话:毕夏AI官网 www.bixiaai.com 期刊论文功能的“信号降噪”逻辑

你论文里的“引用”正在替你说话:毕夏AI官网 www.bixiaai.com 期刊论文功能的“信号降噪”逻辑

毕夏AI官网:www.bixiaai.com 微信公众号搜一搜:毕夏AI官网 学术界有一个几乎所有人都在经历、但很少有人正视的困境。 不是“写不出来”。而是——你引用的每一篇文献,都在替你向审稿人传递一个信号。 问题是,大多数研究者根本…

2026/10/14 14:31:52 阅读更多 →
Modern JavaScript Tutorial(en.javascript.info)仓库指南:内容结构、写作格式与贡献方式

Modern JavaScript Tutorial(en.javascript.info)仓库指南:内容结构、写作格式与贡献方式

文档/教程前端 【免费下载链接】en.javascript.info Modern JavaScript Tutorial 项目地址: https://gitcode.com/gh_mirrors/en/en.javascript.info 点击查看 免费下载 本指南基于 en.javascript.info 仓库(《现代 JavaScript 教程》英文内容仓库&…

2026/10/12 21:46:07 阅读更多 →

最新新闻

AI高薪风口来袭!小白程序员如何抓住机遇,收藏这份学习指南?

AI高薪风口来袭!小白程序员如何抓住机遇,收藏这份学习指南?

文章主要介绍了AI行业的薪资现状,从实习生日薪5000元到年薪上亿,AI人才市场正在经历一场白热化的争夺战。文章指出,AI正在“入侵”每一个行业,人才缺口超过500万,普通人有机会分到一杯羹。文章建议普通人通过系统学习掌…

2026/10/14 21:14:53 阅读更多 →
大厂校招薪资大揭秘:小白程序员必看,收藏这份热门岗位薪资指南!

大厂校招薪资大揭秘:小白程序员必看,收藏这份热门岗位薪资指南!

本文汇总了字节跳动、腾讯、阿里巴巴等热门大厂校招薪资情况,涵盖前后端开发、AI/Agent方向、测开等岗位。数据来源于往届案例及公开信息,详细展示了不同级别薪资待遇及福利。文章提醒求职者在选择Offer时,不仅要关注总包,还要了解…

2026/10/14 21:14:53 阅读更多 →
如何快速上手cad-viewer:10分钟在浏览器中打开你的第一份DWG/DWG图纸

如何快速上手cad-viewer:10分钟在浏览器中打开你的第一份DWG/DWG图纸

前端3D渲染图形学 【免费下载链接】cad-viewer The world’s first fully web-based DXF/DWG viewer and editor that runs entirely in the browser — no backend server required. 项目地址: https://gitcode.com/gh_mirrors/cad/cad-viewer 点击查看 免费下载 …

2026/10/14 21:14:53 阅读更多 →
大模型高薪诱惑:年薪百万?小白必看收藏!

大模型高薪诱惑:年薪百万?小白必看收藏!

一篇顶会一作AIGC方向211本硕,某短视频大厂算法岗月入4.5万,实际年薪或超百万。但需注意,高薪并非保底,且薪资构成复杂,包括签字费、期权等。大厂算法岗普通档薪资为26k-36k,该岗位薪资远超普通水平&#x…

2026/10/14 21:14:53 阅读更多 →
AI工程师两大门派:传统算法与AI大模型应用开发,收藏这份入门指南!

AI工程师两大门派:传统算法与AI大模型应用开发,收藏这份入门指南!

文章介绍了AI领域的两大门派:传统算法工程师和AI大模型应用开发工程师。前者是“基建狂魔”,通过数学和编程解决实际问题,如精准推荐、最优路线规划等;后者是“场景魔术师”,利用现成大模型解决业务落地难题&#xff0…

2026/10/14 21:14:53 阅读更多 →
阿里云短信签名模板审核避坑指南与Python调用实战

阿里云短信签名模板审核避坑指南与Python调用实战

简介:本资源是一份面向Java开发者的企业级短信集成实战示例,聚焦阿里云短信服务(Dysmsapi)的快速接入与稳定调用,适用于用户注册验证、密码重置、订单通知等典型业务场景。压缩包共92个文件,含68个C#源码文…

2026/10/14 21:13:53 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →