RayRTC 是字节基础架构组与字节 AML 组共同合作,在内部 RTC(Realtime Text Classification)文本训练平台上基于 Ray 进行的下一代 Serverless ML 的探索。RTC 文本分类平台是一个一站式的 NLP 服务平台,包括了数据预处理,标注,模型训练,打分,评估,AutoML 以及模型推理等机器学习全流程。目前字节内各大产品,包括抖音,TikTok,头条,西瓜,番茄等都有使用该平台提供的相关自然语言能力。RayRTC 通过算法与系统的协同设计及 Serverless 等技术为 RTC 提供了性能和资源利用率的极致优化,并由此抽象出一套通用的 Serverless ML 框架,目前已在字节内部机器学习平台上部署上线。
第一次接触 Ray 的读者可能会问,除了明星创始人团队,深度贴近当前 ML 需求的产学研支持,Ray 这套框架到底有哪些吸引人的地方?
首先是以 Ray 为底座可以非常轻松构建完整机器学习完整生态,如下图所示:
机器学习的研发人员往往不仅需要关注算法本身,在实际的生产环境中,各个环节所涉及的工程量和运维量也不容小觑。不少研究表明,工程师们有 80-90%的时间和精力投入在了算法之外的数据处理,全流程打通等。Ray 社区在近几年的演进中,不断吸收业界领先的理念,积极地与其他开源社区和各大厂商进行合作交流。以 Ray 为计算引擎的上层生态的丰富度是别的开源生态中不常见的。比如大数据处理方面,有 Intel 设计的 RayDP,将 Spark 无缝集成到 Ray 中,通过 Ray 的 Actor 拉起 Spark 的 executor,利用 Ray 的分布式调度实现资源细粒度的调控。这样做的好处在于以 Spark 为大数据引擎的机器学习应用中,通过 Ray 可以将 Spark 产生的 dataframe 以 ML Dataset 的形式直接从内存传给下游的机器学习框架,比如 PyTorch。而 Ray 的生态里的其他组件,比如超参训练(Ray Tune)和推理服务(Ray Serve),则进一步补足了训练阶段后续的一系列工程需求。研发人员可以抛开繁琐的上线部署流程,实现一键分布式以及一键部署。
Ray 的另一个显著优势是其简单通用的 API ,只需在一段函数上加入ray.remote 的装饰器,便可将一个单机程序变成分布式执行单元,如下所示:
复制
#declare a Ray task
@ray.remote
def fun(a):
return a + 1
#submit and execute a Ray task
fun.remote()
#declare a Ray actor
@ray.remote
class Actor():
def fun(slef, a):
return a+1
actor = Actor.remote()
#execute an actor method
actor.fun.remote()
Ray 中最基础的概念包括 Task 和 Actor,分别对应函数和类。函数一般是无状态的,在 Ray 里被封装成 Task,从而被 Ray 的分布式系统进行调度;类一般是有状态的,在 Ray 里被映射成一个 Actor。Actor 的表达性更强,能覆盖大多数的应用程序子模块。基于 Actor 和 Task,Ray 对用户暴露了资源的概念,即每个 actor 或 task 都可以指定运行所需要的资源,这对异构的支持从开发人员的角度变得非常便利。比如:
Ray 另外的优势在于:
高效的数据传递和存储:Ray 通过共享内存实现了一个轻量级的 plasma 分布式 object store。数据通过 Apache Arrow 格式存储。
分布式调度:Ray 的调度是 decentralized,每个节点上的 raylet 都可以进行调度;raylet 通过向 gcs 发送 heart beat 获取全局信息,在本地优先调度不能满足的情况下,快速让位给周边 raylet 进行调度。
多语言的支持:目前已经支持的语言包括:Python, Java, C++。后续 go 的支持以及更通用的多语言架构设计也在进行中。
大型站长资讯类网站! https://www.nzzz.com.cn