跳转至

[toc]

ML Serverless Computing

机器学习场景下遇到的问题

  • ML 工作流中不同任务的异构性导致了训练工作流执行过程中资源的严重不平衡
  • ML 用户需要应对复杂的管理问题

无服务器计算

服务

无服务器计算可以提供以下一种或两种服务:

  • 函数即服务 (Functions-as-a-Service-FaaS);
  • 后端即服务(Backend-as-a-Service-BaaS)。

无服务器计算所提供的服务包括:

  • 时间限制的无状态函数作为执行程序逻辑的服务 API;
  • 一种管理程序状态的对象存储系统

无服务器计算对最终用户隐藏了集群配置和管理开销,提供了按需执行函数的能力。( BUT How?)

为了有效地管理资源,云服务提供商对每种资源的使用进行了限制。

  • 计算(computation):无服务器计算平台中提供的计算资源通常仅限于一个 CPU 核和一个较短的计算窗口。
  • 存储(Storage):S3等按数据量收费的存储系统,将潜在地将计算期间的中间状态存储在分布式对象存储中;
  • 控制面(Control Plane):发布 - 订阅服务等。

问题

无服务器计算面临着如下问题

  • 本地内存和存储空间小,因此无法在 AWS Lambda 或具有此类资源受限配置的 VM 上运行 Tensorflow 或 Spark
  • 低带宽以及缺乏 P2P 通信
  • 短暂且不可预测的加载时间,要求 Lambda 的 ML 运行时能够容忍 worker 的频繁离开和到达;
  • 缺乏快速共享存储,因Lambda 函数之间不能连接,所以需要使用共享存储,但没有快速的无服务器存储。

公有云无服务器平台有:

  • AWS Lambda
  • 阿里云函数计算
  • 华为云函数工作流

私有云无服务器框架有:

  • Fission : 使用 Kubernetes 构建函数,https://fission.io/。

  • Kubeless :kubernets 原生的无服务器计算框架,https://github.com/kubeless/kubeless。

  • Apache OpenWhisk:使用 Docker 构建函数。
  • OpenFaas:
  • OpenFunction

ML 的无服务器计算最新研究情况介绍

ML 包含大量的参数、复杂的处理流程,是典型的 “性能关键型应用”,具体到机器学习的问题,无服务器计算平台在 ML 应用场景下都或多或少存在一些问题。

A Case for Serverless Machine Learning (NIPS 2018)

分析了 ML 工作负载环境下的资源管理问题,探讨了利用无服务器基础设施实现 ML 工作流资源管理自动化的研究方向。

无服务器机器学习框架需要满足三个关键目标

  • API 需要支持广泛的 ML 任务:数据预处理、训练和超参数优化。Python API;
  • 具有丰富接口的低延迟可伸缩数据存储,为了为无状态工作者之间的中间数据和消息传递提供存储;
  • Runtime 必须是轻量级和高性能的,要在资源受限的 Lambda 上高效运行。

用户在一个单一的、集成的框架内执行 ML 任务:(1)数据集加载,支持常用的数据格式,(2)数据预处理,(3)模型训练,(4)大规模的超参数调整。

  • 为 ML 工作流的所有阶段提供了一个 Python API,提供了一个抽象底层系统级资源的高级接口;
  • 包含 Python 前端提供到客户端后端的接口;
  • 后端负责管理临时计算资源和调度任务;
  • 轻量级 Runtime,它封装了系统支持的不同计算之间共享的所有函数:
  • 智能迭代器来训练存储在 S3 中的数据集,预取/缓冲mini-batch与worker计算并行;
  • 为分布式数据存储提供API;
  • 为 workers 之间的中间数据和通信提供具有丰富接口的共享存储:
  • 用于一般消息传递、中间数据存储和数据缩减的键值存储;
  • 参数服务器接口

原型:

  • 具有参数服务器接口的高性能数据存储;
  • mini-batch 数据的循环缓冲区预取;
  • 逻辑回归 SGD 训练算法。

Cirrus: a Serverless Framework for End-to-end ML Workflows (SoCC19)

提供高级原语来支持 ML 工作流中的一系列任务:数据集预处理、训练和超参数优化。

设计原则是:

  • 自适应的细粒度资源分配:灵活地调整为每个工作流阶段保留的细粒度资源量。
  • 无状态服务器端后端:无状态的服务器端后端
  • 端到端无服务器 API
  • 高可扩展性:能够同时运行数千个 workers 和数百个实验。

Cirrus 的前端和客户端后端是用 Python 实现的,方便 Cirrus 与现有的机器学习方法相结合。

为了提高效率,分布式数据存储和 worker runtime 用 C++ 实现。

worker runtime 和数据存储通过 TCP 连接进行通信。

实现了一个共享组件库,其中包括线性代数库、通用实用程序和 ML 算法。

  • 目前 Cirrus 支持稀疏 Logistic 回归、潜在 Dirichlet 分配、Softmax 和协同过滤。

Cirrus 包括以下机制:(1)分片存储,(2)高度多线程,(3)数据压缩,(4)梯度滤波器和(5)异步通信。

Distributed Machine Learning with a Serverless Architecture

Serverless Linear Algebra (Socc 20)

NumPyWren:一个基于无服务器编程模型的线性代数系统;

LAmbdaPACK:一个为高度并行线性代数算法的无服务器执行而设计的领域特定语言。