Angel参数服务器(PS)快速入门指南
angel 项目地址: https://gitcode.com/gh_mirrors/ang/angel
前言
Angel是一个基于参数服务器(Parameter Server)架构的分布式机器学习框架,由腾讯公司开源。本文将带领读者快速了解Angel的核心概念,并通过实现一个简单的逻辑回归(LR)算法来掌握Angel的基本使用方法。
核心概念解析
参数服务器架构
Angel采用经典的参数服务器架构,主要由两部分组成:
- 参数服务器(PS):负责存储和管理模型参数,通常由多台机器组成集群
- 工作节点(Worker):执行实际计算任务的逻辑单元,每个Worker可以运行一个或多个Task
在训练过程中,Worker会周期性地从PS拉取最新参数,计算梯度后推送给PS进行参数更新。这种架构特别适合大规模机器学习任务。
矩阵计算抽象
Angel将机器学习算法抽象为矩阵运算,主要支持三种数据结构:
- 向量(Vector):一维数组
- 矩阵(Matrix):二维数组
- 张量(Tensor):多维数组
在Angel中,分布式存储的矩阵参数被抽象为PSModel
,开发者只需要关注PSModel
的定义和计算过程,无需关心底层分布式细节。
开发第一个Angel算法:逻辑回归
算法原理简介
逻辑回归(Logistic Regression)是最基础的分类算法之一,其核心是通过Sigmoid函数将线性回归结果映射到(0,1)区间。在Angel中实现LR主要涉及三个步骤:
- 定义模型结构
- 实现训练过程
- 配置运行环境
1. 定义模型结构
我们需要创建一个继承MLModel
的QSLRModel
类:
class QSLRModel(ctx: TaskContext, conf: Configuration) extends MLModel(ctx){
// 获取特征维度,默认为DEFAULT_ML_FEATURE_NUM
val N = conf.getInt(MLConf.ML_FEATURE_NUM, MLConf.DEFAULT_ML_FEATURE_NUM)
// 创建PSModel,表示权重向量
val weight = PSModel[DenseDoubleVector]("qs.lr.weight", 1, N).setAverage(true)
addPSModel(weight)
// 设置模型保存和加载路径
setSavePath(conf)
setLoadPath(conf)
}
关键点说明:
PSModel
表示存储在参数服务器上的模型参数setAverage(true)
表示使用参数平均策略- 特征维度N和存储路径都可通过配置灵活指定
2. 实现训练过程
训练任务需要继承TrainTask
类:
class QSLRTrainTask extends TrainTask {
// 数据解析方法
override def parse(key: LongWritable, value: Text): LabeledData = {
DataParser.parseVector(key, value, feaNum, "dummy", negY = true)
}
// 训练逻辑
override def train(ctx: TaskContext): Unit = {
val lrModel = new QSLRModel(conf, ctx)
val weightOnPS = lrModel.weight
while (ctx.getIteration < epochNum) {
// 1. 从PS获取当前权重
val weight = weightOnPS.getRow(0)
// 2. 计算梯度
val grad = batchGradientDescent(weight)
// 3. 更新参数
weightOnPS.increment(grad.timesBy(-1.0 * lr))
weightOnPS.clock.get
// 4. 迭代计数
ctx.incIteration()
}
}
}
训练流程解析:
- 每次迭代从PS拉取最新参数
- 使用批量梯度下降计算梯度
- 将梯度推送到PS进行参数更新
clock()
确保参数更新同步- 迭代计数器递增
3. 配置运行环境
最后需要实现Runner类来提交任务:
class LRRunner extends MLRunner {
override def train(conf: Configuration): Unit = {
train(conf, QSLRModel(conf), classOf[QSLRTrainTask])
}
}
任务提交与执行
完成代码编写后,可以使用以下命令提交任务:
./bin/angel-submit \
--action.type train \
--angel.app.submit.class com.tencent.angel.example.quickStart.QSLRRunner \
--angel.train.data.path $input_path \
--angel.save.model.path $model_path \
--ml.epoch.num 10 \
--ml.feature.num 10000 \
--ml.data.type dummy \
--ml.learn.rate 0.001 \
--angel.workergroup.number 3 \
--angel.worker.memory.mb 8000 \
--angel.worker.task.number 3 \
--angel.ps.number 1 \
--angel.ps.memory.mb 5000 \
--angel.job.name QSLR
关键参数说明:
ml.epoch.num
:训练迭代次数ml.feature.num
:特征维度ml.learn.rate
:学习率angel.workergroup.number
:Worker组数量angel.ps.number
:参数服务器数量
总结
通过本文,我们了解了:
- Angel参数服务器的基本架构
- 如何实现一个简单的逻辑回归算法
- Angel任务的开发流程和关键组件
这只是一个开始,Angel还支持更复杂的算法和更大规模的分布式训练。掌握这些基础知识后,读者可以进一步探索Angel的高级特性和优化技巧。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考