`

dmlc分布式线性模型编译笔记

阅读更多
1、使用第三方修改后的wormhole工程


原始工程wormhole:https://github.com/dmlc/wormhole
文档:https://media.readthedocs.org/pdf/wormhole/latest/wormhole.pdf
在线文档:https://wormhole.readthedocs.io/en/latest/


下面的这个虽然比较新,但是。。。根本没开发完成!!!
difacto: https://github.com/dmlc/difacto

第三方修改过的:
https://github.com/CNevd/Difacto_DMLC
因为tracker原因,该项目在我自己搭建的hadoop(单机)上没问题,但是公司平台上运行不起来
tracker最终使用的是dmlc core的tracker(直接复制tracker文件夹即可,但是参数名称有变化);

最终使用的修改过tracker后的工程:https://github.com/cherishlc/Difacto_DMLC

2、找不到glog库的问题
注意:也可使用编译选项make USE_GLOG=0 从而不依赖glog
https://github.com/google/glog 下载一下,编译
注意:如果./autogen.sh && ./configure && make && make install命令的最后一步安装因权限问题无法解决,可以通过设置LD_LIBRARY_PATH, LIBRARY_PATH 等环境变量解决:
export GLOG_HOME=/home/user/glog

# g++ 引用的头文件路径
export EXTRA_INCLUDES=$GLOG_HOME/src
# g++ 引用的lib文件路径
export LIBRARY_PATH=$LIBRARY_PATH:$GLOG_HOME/.libs
# 运行程序时查找的动态链接库路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$GLOG_HOME/.libs



3、编译
以下编译选项打开了HDFS开关,并且不依赖glog
make USE_HDFS=1 USE_GLOG=0 -j8

export MAKEDMLC="make USE_HDFS=1 USE_GLOG=0 -j8"
cd dmlc-core; $MAKEDMLC; cd -
cd ps-lite; $MAKEDMLC; cd -
cd src/linear; $MAKEDMLC


4、yarn任务提交
调用链:
TODO


/Difacto_DMLC/dmlc-core/yarn/src/org/apache/hadoop/yarn/dmlc/Client.java

5、logistic regression代码阅读

#训练数据的内部存储格式; 以稀疏矩阵形式存储
src/solver/minibatch_solver.h:  using Minibatch = dmlc::RowBlock<FeaID>;
dmlc-core/include/dmlc/data.h:  template<typename IndexType> struct RowBlock {

#index 比如 第0个特征的 FeaID为0
src/linear/async_sgd.h:using FeaID = ps::Key;



#真正执行训练的地方
src/linear/async_sgd.h:  virtual void ProcessMinibatch(const Minibatch& mb, const Workload& wl) {
线性模型的计算是在ProcessMinibatch函数中的loss->Init函数:
src/linear/loss.h: loss->Init(data->GetBlock(), *val, nt_);
void Init(const RowBlock<unsigned>& data,
    const std::vector<V>& w, int nt) {
data_ = data;
Xw_.resize(data_.size);
SpMV::Times(data_, w, &Xw_, nt_); // linear model here
nt_ = nt;
init_ = true;
}

线性部分(不包括sigmoid)的计算是在SpMV::Times函数,其实就是个 乘法+累加的运算
其定义在:
src/base/spmv.h
关键代码: 
if (D.value) {//D为dmlc::RowBlock<unsigned>;  D.value不为空,说明在libsvm 格式的训练文件中, 0 1:0.5 2:1中权重有不为1的情况; 这时,线性模型就会考虑这些权重!!!
  for (size_t j = D.offset[i]; j < D.offset[i+1]; ++j)
    y_i += x[D.index[j]] * D.value[j];
} else {
  for (size_t j = D.offset[i]; j < D.offset[i+1]; ++j)
    y_i += x[D.index[j]];
}



6、关于logistic loss
从下面的代码中可以看到,输入中的label只区分是否大于0,大于0则认为是正样本,否则为负样本
至于logistic regression中标签取0\1和取1,-1的区别(实际上没有区别,只是loss的形式不同,但loss的值是完全一样的),
可以参考博客:https://www.cnblogs.com/bentuwuying/p/6616680.html
定义在src/linear/loss.h: template <typename V> class LogitLoss
最终调用的是:src/base/binary_class_evaluation.h:  V LogitObjv()
  V LogitObjv() {
    V objv = 0;
#pragma omp parallel for reduction(+:objv) num_threads(nt_)
    for (size_t i = 0; i < size_; ++i) {
      V y = label_[i] > 0 ? 1 : -1;
      V score = y * predict_[i];
      if (score < -30)
        objv += -score;
      else if (score <= 30)
        objv += log( 1 + exp( - score ));
    }
    return objv;
  }


7、数据读取
0、在工程目录搜索libsvm文件名,可以发现libsvm格式的解析类位于dmlc-core/src/data/libsvm_parser.h中,解析方法为ParseBlock()

但是解析函数是被谁调用的呢?博主按如下方式进行的查找:
1、上文提到,真正执行训练的是src/linear/async_sgd.h中的AsgdWorker类,训练函数为ProcessMinibatch();在其中没有找到数据读取的相关函数
2、AsgdWorker类的父类为solver::MinibatchWorker, 位于src/solver/minibatch_solver.h中
3、ProcessMinibatch()虚函数在solver::MinibatchWorker的Process()方法中被调用,这里可以看到dmlc::data::MinibatchIter<FeaID> reader; 这个reader就是读取数据的类了,该类位于src/base/minibatch_iter.h中。
4、reader传递给ProcessMinibatch()函数的数据为reader.Value()
5、reader.Value()返回reader的成员变量out_blk_;  out_blk_在成员函数Next()的末尾被设为out_blk_ = mb_.GetBlock();
6、继续追溯,mb_在成员函数Next()中通过Push()方法被设置,在Push方法中,mb_通过in_blk_设置;而Next方法中有一句in_blk_ = parser_->Value();

至此,数据流分析完毕
  reader(比如LibSVMParser)
  => solver::MinibatchWorker的 in_blk_ => mb_ => out_blk_
  => AsgdWorker::ProcessMinibatch() mb 通过localize=> data
  => loss->Init(data->GetBlock(), *val, nt_); 声明loss,并将data赋值到其中

因而,如果想修改libsvm数据的解析方式及使用方式,需要修改的地方有:
  数据读取:LibSVMParser类中的ParseBlock()函数
  将读取的数据分片: MinibatchIter类中的Push函数
  数据本地化:Localizer类中的RemapIndex()函数
  计算梯度时使用样本权重:LogitLoss中的CalcGrad函数
 
分享到:
评论

相关推荐

    DMLC深盟分布式深度机器学习开源平台解析1

    摘要:本文由DMLC分布式深度机器学习开源项目(中文名深盟)开发者联合撰写,介绍DMLC已有的xgboost、cxxnet、Minerva、ParameterS

    Difacto_DMLC-master.zip

    《Difacto_DMLC: 分布式机器学习框架深度解析》 在现代大数据时代,机器学习已经成为数据科学的核心组成部分,而分布式机器学习框架则在处理大规模数据集时发挥着至关重要的作用。Difacto_DMLC是一个专为大规模机器...

    dmlc-core:用于构建可扩展和便携式分布式机器学习的通用积木库

    DMLC-Core是支持所有DMLC项目的骨干库,为构建高效且可扩展的分布式机器学习库提供了基础。 开发者频道 什么是新的 内容 已知的问题 RecordIO格式不能跨不同的处理器字节序移植。 因此,不可能将RecordIO文件保存...

    xgboost jvm下编译好的

    本文将详细解释如何在Ubuntu操作系统上编译XGBoost以适应JVM环境,并使用生成的JAR包。 首先,为了在JVM环境中使用XGBoost,我们需要确保系统已经安装了必要的依赖。这包括Java Development Kit (JDK) 和Apache ...

    美团外卖模型演进之路.pdf

    为了支持大规模的模型训练,美团可能使用了DMLC(Distributed Machine Learning Community)库,尤其是其分布式通信组件,如ReduceScatter。同时,LightGBM通过MPI(Message Passing Interface)或Socket进行分布式...

    xgboost64位免编译文件

    在现代数据分析与机器学习领域,XGBoost作为一个高效的、分布式梯度增强库,因其出色的性能和易用性而广受青睐。特别是在Windows环境下,对于许多非专业程序员或者初学者来说,能够直接使用的免编译版本的XGBoost...

    王超&陈帅华 xgboost导读和实战

    xgboost是C++开源分布式机器学习系统DMLC的Boosting模型,单机采用多线程来加速树的构建,并依赖DMLC的另一个部件rabbit来进行分布式计算。xgboost提供了 Python和R语言接口。本文档由参与贡献的王超和陈帅华撰写。 ...

    xgboost导读和实战_王超&陈帅华

    xgboost是C++开源分布式机器学习系统DMLC的Boosting模型,单机采用多线程来加速树的构建,并依赖DMLC的另一个部件rabbit来进行分布式计算。xgboost提供了 Python和R语言接口。本文档由参与贡献的王超和陈帅华撰写。

    用vs2013编译cxxnet1

    编译完成后,将生成的`dmlc.lib`文件路径添加到CXXNet的附加依赖项中。 - **Rabit**: 类似于DMLC-Core,也需单独编译成lib库。 #### 二、解决编译错误 即使完成了上述步骤,直接编译CXXNet仍然可能会遇到一些问题...

    xgboost 0.4版本编译后32位&64位

    xgboost 0.4版本编译后32位&64位,按下面链接里的说法,0.47版本不支持Windows,所以对0.4版本用vs2015社区版进行32位和64位编译,分别用于32位操作系统/32位python和64位操作系统/64位python,xgboost最新版本0.6,...

    使用Kubernetes运行MXNet和AutoTVM1

    启动分布式训练,可以使用DMLC(Distributed Machine Learning Container)工具,设置相应的环境变量,如`DMLC_ROLE`、`DMLC_PS_ROOT_URI`、`DMLC_PS_ROOT_PORT`、`DMLC_NUM_SERVER`和`DMLC_NUM_WORKER`。...

    mxnet-model-gallery:DMLC项目的预训练模型

    模型库 所有模型都托管在并在CC0下获得许可。 该模型是ILSVRC2012数据集上的预训练模型。 该模型在ILSVRC2012-Validation Set上能够达到54.5%的Top-1准确性和78.3%的Top-5准确性。 该模型是ILSVRC2012数据集上的...

    xgboost编译好的包

    XGBoost,全称Extreme Gradient Boosting,是由DMLC团队开发的一款高效、灵活且可扩展的梯度提升库,广泛应用于机器学习领域,尤其是数据挖掘、推荐系统、图像识别等多个场景。它以其高效的计算性能和优秀的模型精度...

    mkmatlab代码-dmlc-cxxne:dmlc-cxxne

    上运行,几乎呈线性加速 该库由分布式参数服务器分布式支持 无需 GPU 编程即可轻松扩展 cxxnet 建立在 开发人员可以编写 numpy 样式的模板表达式来扩展库一次 mshadow 将为用户生成高性能的 CUDA 和 CPU 代码 它带来...

    xgboost.docx

    XGBoost基于DMLC(Distributed Machine Learning Cluster)项目,它允许用户进行分布式训练,并提供了丰富的参数调整选项以优化模型性能。以下是XGBoost及其核心库DMLC-core中可修改的一些关键参数: **DMLC-core...

    web-data:存储所有Web数据的仓库,包括dmlc项目中文档的图像

    这个标题揭示了一个专门用于存储Web数据的仓库,其中包含了与DMLC(分布式机器学习库)项目相关的文档图像。这表明这个仓库可能是开发者、研究人员或者数据科学家用来共享和访问与DMLC项目相关的各种Web资源的平台。...

    mkmatlab代码-CXXNET:DMLC/CXXNET的副本供学习

    包含最先进的深度学习模型的简明实现 该项目保持最小的依赖,使其可移植且易于构建 超越单一 GPU 和单一机器 该库可在多个 GPU 上运行,几乎呈线性加速 该库由分布式参数服务器分布式支持 无需 GPU 编程即可轻松扩展...

Global site tag (gtag.js) - Google Analytics