探秘高效分布式训练框架:Apache Horn
Apache Horn是一个在Apache孵化器中的项目,它是一个以神经元为中心的编程模型和同步/异步混合的分布式训练框架。Horn支持大规模数据上的大型模型训练,充分利用了Apache Hadoop和Hama的计算能力。
神经网络编程模型
Horn提供了一种直观的神经元编程模型,让用户能轻松实现基于神经网络的算法。在模型中,用户定义每个层上每个神经元的计算逻辑以及前向传播和反向传播过程中的消息传递。例如,以下代码展示了如何在forward()
方法中应用权重到输入数据并计算输出:
@Override
public void forward(
Iterable<Synapse<FloatWritable, FloatWritable>> messages)
throws IOException {
float sum = 0;
for (Synapse<FloatWritable, FloatWritable> m : messages) {
sum += m.getInput() * m.getWeight();
}
this.feedforward(this.squashingFunction.apply(sum));
}
而在backward()
方法中,我们衡量输出误差,并据此调整权重以减小错误:
@Override
public void backward(
Iterable<Synapse<FloatWritable, FloatWritable>> messages)
throws IOException {
float delta = 0;
for (Synapse<FloatWritable, FloatWritable> m : messages) {
// 计算每个神经元的误差梯度
delta += (m.getDelta() * m.getWeight());
// 权重修正
float weight = -this.getLearningRate() * this.getOutput()
* m.getDelta() + this.getMomentumWeight() * m.getPrevWeight();
this.push(weight);
}
this.backpropagate(delta
* this.squashingFunction.applyDerivative(this.getOutput()));
}
这种编程模型的优势在于简单易懂,让深度学习算法的实现变得更加直接。
快速启动与配置
Apache Horn还提供了简洁的配置接口,只需几步操作即可创建神经网络作业并将其提交给现有的Hadoop或Hama集群。下面的例子展示了如何配置一个两层神经网络来训练MNIST数据集:
HornJob job = new HornJob(conf, MultiLayerPerceptron.class);
job.setLearningRate(learningRate);
..
job.inputLayer(features, 0.8f); // droprate
job.addLayer(hu, ReLU.class, DropoutNeuron.class);
job.outputLayer(labels, SoftMax.class, StandardNeuron.class);
job.setCostFunction(CrossEntropy.class);
快速运行示例
下载MNIST的训练数据和标签数据,然后使用以下命令转换为HDFS序列文件:
% bin/horn jar horn-0.x.0.jar MNISTConverter \
train-images.idx3-ubyte train-labels.idx1-ubyte /tmp/mnist.seq
接着,使用以下命令进行训练(本例中,η=0.01,α=0.9,λ=0.0005,100个隐藏单元,mini-batch大小为10):
% bin/horn jar horn-0.x.0.jar MultiLayerPerceptron /tmp/model /tmp/mnist.seq \
0.01 0.9 0.0005 784 100 10 10 12000
在默认设置下,模型的准确率可达到95%以上。在本地模式下,20个任务将以同步方式训练模型,并大约在10分钟内完成。
高扩展性
Apache Horn采用了同步/异步混合的分布式训练架构。在单个BSP作业中,每个任务组通过区域屏障同步而不是全局屏障同步工作,以同步的方式使用分配的数据集训练大规模的神经网络模型。
参与贡献
Apache Horn是一个由Apache软件基金会支持的开源志愿项目。我们欢迎你了解项目并贡献你的专业知识。
通过上述介绍,不难看出Apache Horn的强大之处。无论是其独特的编程模型,还是高效的分布式训练机制,都使得它成为深度学习领域的一个强大工具。如果你正在寻找一个灵活且易于使用的分布式深度学习框架,那么Apache Horn绝对值得尝试!