机器学习可扩展性:将模型扩展至服务数百万用户
可扩展性无疑是一个高层次问题,当我们需要整合更多机器和资源来处理深度学习算法的流量时,这对许多初创机构来说都是梦想成真的时刻。
然而许多工程团队并未给予足够重视。主要原因:他们从一开始就没有清晰的扩展计划。这完全可以理解!因为我们需要先专注于优化应用程序和模型,稍后再处理扩展问题。但从一开始就有清晰计划并无坏处。
机器学习应用的首次部署
第一步是在某中心计算引擎上创建虚拟机实例。我们复制整个项目,允许HTTP流量,并将域名连接到此实例。模型启动运行并通过域名对用户可见。
我们有一个托管在单个虚拟机中的单体应用,需要一些手动工作来部署新更改和重启服务。但几周后,问题开始出现:
- 部署需要太多手动工作
- 添加新库版本和新模型时依赖关系开始不同步
- 调试不直接
为解决这些问题,我们添加了新的CI/CD流水线,成功自动化构建、测试和部署过程。我们还添加了一些日志以便访问实例并发现问题。
垂直扩展与水平扩展
垂直扩展(纵向扩展)是向现有机器添加更多功能(CPU、内存、GPU)来处理流量。
水平扩展(横向扩展)是向网络添加更多机器,并在它们之间共享处理和内存工作负载。
这意味着:创建新的虚拟机实例!然后复制应用程序,让它们同时运行和服务流量。
负载均衡器在此发挥作用,它是在多个机器之间分配网络流量的设备,通过分散流量确保没有单个服务器承受过多负载。
自动扩缩容
自动扩缩容是云计算中使用的一种方法,根据负载改变计算资源数量。通常这意味着实例数量基于某些指标自动增加或减少。
自动扩缩容有两种主要形式:计划性扩缩和动态扩缩。
缓存
另一种最小化应用程序响应时间的好方法是使用某种缓存机制。缓存不过是保存数据的存储系统,以便未来请求可以更快地服务。
监控警报
服务数百万用户的应用程序最重要也最烦人的部分是警报。有时系统会崩溃。这就是为什么我们必须建立警报系统,以便尽快修复错误。
重新训练机器学习模型
随着时间的推移,模型服务越来越多用户,数据分布开始变化。因此,模型准确性逐渐下降。我们需要构建循环来用新数据重新训练模型,并作为新版本重新部署。
模型A/B测试
另一个可能出现的需求,特别是在建立了重新训练之后,是模型A/B测试。A/B测试指的是通过向每个模型发送不同流量负载来在生产中尝试不同模型的过程。
离线推理
最后但同样重要的是离线推理。实时预测并不总是可行或需要的。在很多用例中,模型无法在几秒钟内完成推理,或者我们的应用程序不需要立即响应。
最常见的方法是任务/消息队列。消息队列是服务到服务异步通信的一种形式。
总结
在这篇相当长的文章中,我试图概述公司基础设施随着成长和获取更多用户而多年来的演变过程。扩展应用程序绝非易事,对于机器学习系统来说变得更加困难。主要原因是它们引入了一整套常见软件中不存在的新问题。
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)或者 我的个人博客 https://blog.qife122.com/
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)
公众号二维码
公众号二维码