我们介绍学习增强系统的初衷和范式转移。本章包含以下内容:
计算机系统的设计和运维过去一直以来都依靠工程师的经验和试错。在系统的规模和复杂度较小时,工程师可以经由大量的实验来评估系统的性能并理解系统的行为。工程师从这些实验里来获得经验,并手写成系统里的启发式算法和决策规则。另外,这些经验不仅能帮助工程师来优化现有的系统,也能帮助他们设计未来的系统。
然而,现代计算机系统的复杂性和规模快速提升,为这种依赖人力和经验的方式带来了前所未有的挑战,尤其人力的增长赶不上系统规模和动态性上升的速度。我们这边用现代系统常用的微服务架构,来当作是一个例子。微服务架构强调模块化 —— 一个系统由多个模块(即微服务)组成,而模块的实现就基于像 Docker 的容器技术和 Hypervisor 的虚拟技术。模块化使得现代系统能够很好地支持横向扩展,纵向扩展,和持续更新,尤其是配合像 Kubernetes 的自动集群管理下。随着时间,用户的需求和场景有了改变,集群的规模也能做出相对应的调整来保证系统的服务品质。然而,每一次的变化都代表着工程师需要重新理解系统的行为,来优化和维护系统。但是,人的理解力难以理解大规模系统的行为是如何被每一个设定参数和决策所影响。系统里的每一微服务有着不同的设定参数和决策,然后微服务和微服务之间有着不同的执行依赖关系。例如,计算机系统里常用的数据库有着上百个设定参数,也有着像数据索引的决策。另外,操作系统里有调度策略,分布系统里有资源的分配策略,云微服务有扩容和调参策略,互联网路有拥塞控制(Congestion Control)和流量控制(Flow Control)的设定参数,视频流应用有网路品质的评估策略,防火墙有规则匹配策略,中央处理器里有缓存置换和预存取算法,甚至代码编译器也有设定参数,等等。
在近几年,学习增强系统的范式转移已成为系统设计的趋势。自从机器学习和深度学习在计算机视觉和自然语言处理等领域取得突破,计算机系统领域也开始探讨如何利用机器学习和深度学习。系统的性能和行为,与决策和参数的关系,可以被想象成一个非线性的空间。而学习增强系统的范式就是在这空间里学习并搜索全局最优解。学习这空间可能很复杂;但现代系统普遍有完善的行为监测机制和精细的日志,加上近期机器学习的进步(例如深度学习和强化学习),大大提升了数据驱动的可行性。
学习增强系统普遍有 3 种实现的方式。第一,机器学习被用来辅助启发式算法和决策规则的执行;第二,机器学习被用来取代现有的启发式算法和决策规则;第三,机器学习被用来设计新的启发式算法和决策规则。不同的实现方式有着不同的折衷与取舍,尤其是在以下的维度:系统所需要的决策准确度,系统所能提供的数据,系统所能容忍的模型训练时间与资源开销,系统所能容忍的模型推理时间与资源开销,系统所能容忍的模型推理误差,等等。比如,相比于辅助启发式算法和决策规则的执行,用机器学习来取代启发式算法和决策规则可以大大地利用机器学习在优化问题上的能力。但是,从过往的经验上来看,机器学习的执行时间往往比简单的启发式算法大,并且推理的误差可能造成系统错误。另外,虽然利用机器学习来设计新的启发式算法和决策规则可以降低工程师的工作量,其所需在系统上采集的训练数据可能非常地庞大。之后在这章节里,我们将从我们过去的科研和产品经验里,来总结这些折衷与取舍为机器学习所带来新的挑战。
机器学习可以从海量的系统数据中归纳总结出其内在的行为规律。在进入下一个章节前,读者可以思考有哪些系统问题适合用机器学习的思维来解决。
-
Docker (software). https://en.wikipedia.org/wiki/Docker_(software)
-
Kubernetes. https://en.wikipedia.org/wiki/Kubernetes