Fork me on GitHub

编程指南


要提交一个训练作业,用户需要提供图1中的四个部分的配置:

  • NeuralNet :描述神经网络结构,包括每层的具体设置和层与层的连接关系;
  • TrainOneBatch :该算法需要根据不同的模型类别而定制;
  • Updater :定义服务器端更新参数的协议;
  • Cluster Topology :指定服务器和工作者的分布式拓扑架构。

初级用户指南 将介绍如何利用内建层提交一个训练作业,而 高级用户指南 将详细介绍如何编写用户自己的主函数并注册自己实现的组件。此外,高级用户和初级用户对训练数据集的处理方式是相同的。

图 1 - SINGA 概览

初级用户指南

用户可以使用SINGA提供的主函数提交训练作业。对于这种情况,用户必须在命令行中提供根据 JobProto 设置的作业配置文件,

./bin/singa-run.sh -conf <path to job conf> [-resume]

-resume 表示从上次的检查点(checkpoint)继续训练。 MLP 模型和 CNN 模型使用内建层提交训练作业。请阅读相关页面,查看它们的作业配置文件,这些页面会介绍每个组件配置的细节。

高级用户指南

如果用户的模型中包含一些自己定义的组件,比如Updater,用户必须自己编写主函数注册这些组件,跟Hadoop的主函数类似。一般地,主函数应该

  • 初始化SINGA,如:设置日志;
  • 注册用户自定义组件;
  • 创建作业配置并传递给SINGA driver。

主函数示例

#include "singa.h"
#include "user.h"  // header for user code

int main(int argc, char** argv) {
  singa::Driver driver;
  driver.Init(argc, argv);
  bool resume;
  // parse resume option from argv.

  // register user defined layers
  driver.RegisterLayer<FooLayer>(kFooLayer);
  // register user defined updater
  driver.RegisterUpdater<FooUpdater>(kFooUpdater);
  ...
  auto jobConf = driver.job_conf();
  //  update jobConf

  driver.Train(resume, jobConf);
  return 0;
}

driver 类’ Init 方法加载用户在命令行参数中 (-conf <job conf>)提供的作业配置文件(至少包含集群拓扑结构),并返回jobConf给用户,用户可更新和添加神经网络或者Updater的配置。如果定义了Layer、Updater、Worker或者Param的子类,用户需要通过driver为它们注册。最后,作业配置会被提交到driver,由driver启动训练。

将来我们会提供类似keras 的帮助工具,使作业配置更加简单。

用户需要使用SINGA库(.libs/libsinga.so)编译和链接自己的代码(如:layer的实现和主函数),得到可执行文件,如名为mysinga 的文件。执行以下命令启动该程序,用户需要将mysinga 和作业配置文件的路径传给 ./bin/singa-run.sh

./bin/singa-run.sh -conf <path to job conf> -exec <path to mysinga> [other arguments]

RNN application 提供了一个完整的实现主函数训练特定RNN模型的例子。