xdl源码解读

[TOC]

XDL 深度源码解读

只是一些杂乱的记录

主要接口都在ps-plus/client/client.cc下面,其中DensePush和SparsePush负责更新参数,xdl里负责和ps-plus通信的op实现在xdl/core/ops/ps_ops下面,python接口在xdl/python/training/optimizer_impls.py里

overview

读源码千万不要一开始就去看类具体的实现细节,这样容易陷入误区。因为往往开源的东西并不一定是按照最佳标准编写的,一开始就去深入细节容易迷失。

首先应该高屋建瓴,先看package的分布

xdl

ps-plus首先是一个parameter server.所以整体的设计应该满足ps的要求

client 是调用方与ps node通信的端

common 通用类,主要是和hdfs交互,加载模型等

main 启动类

message 通信类

Model_server model_server类

Plugins 插件

Profiler 不太清楚,像是一些锁之类的

scheduler 调度类,请求都由scheduler 转发给ps server

server server类

service 服务

tool 工具类

Main.cc

1
2
3
4
5
6
7
8
#include "ps-plus/common/option_parser.h" // 一个option parser 启动时用
#include "ps-plus/server/server_service.h" // server类
#include "ps-plus/scheduler/scheduler_impl.h" // scheduler的实现
#include "ps-plus/scheduler/placementer.h" // placementer 用来放置key

#include <dlfcn.h> // linux动态库显式框架
#include <thread> // 线程类
#include <glog/logging.h> // logging类

Common

## types.h

定义了一些数据类型,从8位int 到 double

Client

base_client

定义了pull和push的操作,全部是异步

我们看一个spare pull 和 push的实现

1
2
3
4
5
6
7
8
9
virtual void SparsePull(const std::string& variable_name, 
const Tensor& ids,
Tensor* result,
const Callback& cb) = 0;
virtual void SparsePush(const std::string& variable_name,
const Tensor& ids,
const std::string& updater,
const std::vector<Data*>& data,
const Callback& cb) = 0;