MLTalks

Stay Hungry, Stay Foolish

这里先提前说下谱聚类的基本特征,然后后面按照论文的顺序做了讲解。 * 谱聚类算法与kmeans的区别,是把聚类的过程看成了一个图切割的过程,每一条样本都看成是N维空间内的一个节点,然后我们希望切割出来的子图,在子图内部点与点之前的距离(也就是相似度)会比较高,子图与子图之间的距离尽可能的小。 * 在谱聚类的过程中会把原始数据会做变换,从高维空间映射到低维空间,这样更容易进行聚类,可以看成向量化的过程。 * 矩阵的谱(spectrum)在数学中的定义表示是矩阵一系列的特征值。

阅读全文 »

基本结构

Variable

定义在variable.h文件中,具体定义如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Variable {
public:
template <typename T>
const T& Get() const {
PADDLE_ENFORCE(holder_ != nullptr, "Variable must hold some thing");
PADDLE_ENFORCE(IsType<T>(),
"Variable must be type %s, the holding type is %s",
typeid(T).name(), holder_->Type().name());
return *static_cast<const T*>(holder_->Ptr());
}
template <typename T>
T* GetMutable() {
if (!IsType<T>()) {
holder_.reset(new PlaceholderImpl<T>(new T()));
}
return static_cast<T*>(holder_->Ptr());
}
...
std::unique_ptr<Placeholder>
holder_; // pointers to a PlaceholderImpl object indeed.
friend class Scope;
const std::string* name_;
};
Placeholder用来真正保存分配的空间, 实现在PlaceholderImpl中。 Variable中的holder_保留了指向Placeholder实例的指针。每个variable都有一个string类型的名字保存在name_中,名字只在当前Scope空间中国年有效。

阅读全文 »

简介

在生产环境部署模型预测的时候,在负载较高的情况下也对实时性、准确性、鲁棒性有很高的要求。现有很多的机器学习框架和系统都是针对模型训练而不是预测。本文中Clipper是一个通用的低延迟预测服务系统,通过模块化的架构来简化模型预测的部署。

Clipper1 2系统是一个分层的架构, 通过分层简化了预测服务栈, 并实现了预测服务的三个目标:低延迟、高吞吐、提高准确度。整体被分为了两层, 第一个是模型抽象层(model abstraction layer), 第二个是模型选择层(model selection layer)。抽象层提供了统一的API来屏蔽ML框架和模型的差异,实现模型对应用的透明;模型选择层在模型抽象层之上,动态选择模型进行预测并融合不同模型预测结果,从而提供更加准确和鲁棒的模型预测服务。

为了实现低延迟和高吞吐,Clipper中采用了非常多优化手段。在抽象层中,Clipper针对不同模型的预测进行了缓存,并针对请求延迟的情况进行自适应调整batch大小,最大化提升请求吞吐量。在模型选择层,为了提高预测的精度,Clipper采用了bandit方法,对不同模型预测的结果进行了集成,评估模型预测的不确定性;在降低延迟方面,也采用了优化落后者(straggle3 mitigation)方法,预测过程中不等待最慢的模型的返回值。作者对Clipper用Rust进行了实现4,添加了多机器学习框架的支持, 包括Spark MLlib, Scikit-Learn, Caffe, TensorFlow, HTK等。

系统架构详细说明

Clipper架构被分为了模型选择层和模型抽象层,抽象层负责提供统一的预测接口,保证资源的隔离,针对批处理的(batch oriented)机器学习框架优化预测请求的负载。选择层负责将预测请求分发给不同的模型,基于反馈来组合预测结果,以此提高预测的准确度、评估不确定性、提供鲁棒的预测服务。

系统中预测请求先从请求方通过Clipper提供的REST或者RPC API发送过来,Clipper收到请求以后选择层根据请求的类型和最近的反馈,将请求通过模型抽象层分发给具体的一个或者多个模型进行预测操作。模型抽象层在将请求分配给自适应批计算队列(adaptive batching queue)以前,会先检查请求在预测缓存区中是否存在。Adaptive-batching-queue保存了针对不同机器学习框架和模型进行调整过的预测请求,然后请求会通过RPC发送给保存具体的模型的容器进行处理。这里为了方便处理,我们把模型容器部署到不同的Docker容器中。预测完成以后,结果会按照请求的反向顺序先发送给抽象层,然后是模型选择层。模型选择层会根据收到的多个不同模型预测的结果生成最终的预测结果以及估计置信度,最后把结果返回给请求的终端。终端请求方也会统计预测的效果,并将收集到这些信息通过RPC/REST请求发送给模型选择层。模型选择层会根据收到的反馈信息来对预测进行调整。接下来来介绍模型抽象层和模型选择层。

阅读全文 »