Spockwang's Blog

编译独立的Tensorflow Serving库

| 评论

Tensorflow Serving的官方文档仅支持编译集成gRPC的模型预测服务,不方便开发者集成自己的框架中。本文将介绍一种方法编译独立的静态Tensorflow Serving库,开发者可直接调用Serving的API进行模型预测,方便集成至自己的服务中。

用Tensorflow C++ API训练模型

| 评论

用Tensorflow解决机器学习的问题时通常是用Python API构造模型并训练模型参数,然后将模型序列化到文件中。部署到线上时使用C++ API加载模型对输入进行预测。Tensorflow还专门提供了Serving模块来优化线上部署,除了进行预测外还提供了对模型的版本管理和模型热更新。但是为了更快地训练模型,缩短模型更新周期,就必须支持线上实时训练,也就是说必须支持用C++ API训练模型。但是C++ API目前还不完善,还不方便构造模型,所以仍然使用Python API构造模型,并导出给C++ API加载训练。

本文给出两种方法来编译C++库,一种是共享库,一种是静态库。

分布式系统的分区管理

| 评论

当数据量大到单机存不下时就需要分布式存储系统。分布式存储与单机存储最大的区别就是把数据按一定规则切分 为多个部分,每个机器只存储其中一部分,这样理论上来讲分布式存储可以应付无穷大的数据量。但是这里带来一 个新的问题,即如何找到我需要的数据是存储在哪台机器呢?这就是分布式系统的分区管理模块需要解决的问题, 除了这个问题外,还需要解决负载均衡和容灾的问题。

分区管理是有一定成本的,随机器数量增加而增加,所以分布式存储的伸缩性不是无穷的,伸缩能力主要取决于 分区管理。所以分区管理是分布式系统中相当重要的模块。

本文将介绍分区管理的一般解决思路,并介绍实际的分布式系统的解决方案,最后总结不同需求场景下应采用的 解决方案。

UNIX信号

| 评论

Introduction

UNIX信号在编程中用的不多,但是对于长时间运行的程序还是很有用的,比如通知程序重新加载配置文件、提早退 出打印一些信息、监控子进程是否还活着。

本文将澄清UNIX信号的概念,使用信号的注意事项及常用的编程模式。

线程私有存储

| 评论

Introduction

线程私有变量(Thread Local Storage)之于线程相当于静态变量之于进程,与进程变量相比是每个线程都有一份, 也就是所谓的“私有”。也可以把线程私有变量理解为key-value对,其中key是线程ID。它的主要作用是在多线程编程 中避免锁竞争的开销。本文将重点介绍线程私有变量的几种形式、用法及其背后的实现原理。

使用Feature Flags进行并行开发和持续集成

| 评论

Introduction

在服务开发过程中经常需要一边修复线上bug,一边又要开发新特性,而且可能需要同时开发好几个新特性,不同 的新特性开发持续的时间不等。这样要等到所有代码都开发完、测试好需要很长时间,代码一直处于无法上线的状 态,无法敏捷响应需求。如果这时候线上又出现紧急bug,就没法及时发布修复。

用MySql实现事务型消息队列

| 评论

Introduction

在离线数据处理系统中,为了解除模块之间的耦合关系,往往需要消息队列来实现模块之间的通信。对于离线系统来讲,消息队列要满足以下要求:

  • 消息不能丢失,即使在系统失败的情况下。消息一旦被插入就一定会被至少处理一次(只被处理一次是最好的,但是实现起来有难度,所以只要求at-least-once semantic);
  • FIFO顺序;
  • 支持多生产者;
  • 支持多消费者。每个消息只能被其中一个消费者处理。