我在2020年作为数据科学家学习的8种新工具 - kdnuggets


尽管2020年是充满挑战的一年,但我能够使用到远程工作的过渡来探索新工具来扩展我的数据科学技能。这一年,我从数据科学家过渡到应用科学家,不仅负责数据产品的原型制作,还将这些系统投入生产并监控系统的运行状况。
我曾经使用过Docker等工具来对应用程序进行容器化,但是我没有将容器部署为可扩展的,负载平衡的应用程序的经验。虽然我在2020年学到的许多技术通常与工程而非数据科学相关联,但学习这些工具以学习构建端到端数据产品可能会很有用。对于在初创公司工作的数据科学家来说尤其如此。
 
MLflow
 MLflow是用于模型生命周期管理的开源框架。该项目的目标是提供支持ML模型的开发,服务和监视的模块。我将从2020年开始使用其中两个组件:MLflow跟踪和模型注册表。跟踪模块使数据科学家能够记录不同模型管道的性能并可视化结果。例如,可以尝试使用不同的特征缩放方法,回归模型和超参数组合,并查看哪种管道配置产生了最佳结果。我在Databricks环境中使用了该环境,该环境为模型选择提供了有用的可视化。我还开始使用MLflow中的注册表模块来存储模型,培训笔记本在其中训练和存储模型,模型应用程序笔记本检索并应用模型。模型注册表中的有用功能之一是部署之前的能力阶段模型。注册表可以维护不同的模型版本,并且如果检测到问题,则可以还原到先前的版本。我计划在2021年探索MLFlow中的更多模块,包括模型服务。
 
Kubernetes
 Kubernetes是一个用于容器编排的开源平台。它使数据科学家能够将容器部署为可伸缩的Web应用程序,并提供各种配置选项以在Web上公开服务。从头开始设置Kubernetes部署可能涉及相当多的工作,但是云平台提供了Kubernetes的托管版本,可以轻松地使用该平台。对于想要学习Kubernetes的数据科学家,我的建议是使用Google Kubernetes Engine(GKE),因为它提供了快速的集群启动时间,并且拥有丰富的开发人员经验。
Kubernetes为什么如此有用?因为它使团队能够分离应用程序开发和应用程序部署方面的问题。数据科学家可以构建一个模型服务容器,然后将其交给工程团队,以将该服务作为可扩展的Web应用程序公开。在GCP中,它还与系统无缝集成,以实现负载平衡和网络安全。但是,使用GKE等托管服务,使用Kubernetes的障碍就更少了,数据科学家应该在该平台上获得动手经验。这样做使数据科学家能够构建端到端数据产品。
 
NoSQL
 虽然我在整个数据科学生涯中都使用过各种数据库,但直到2020年我才开始探索NoSQL数据库。NoSQL包括以低延迟操作实现键值存储的数据库。例如,Redis是一个内存数据库,提供亚毫秒级的读取。当构建实时系统时,由于Web服务接收到数据,因此您需要更新用户配置文件时,此性能很有用。例如,您可能需要更新描述用户活动的特征向量的属性,该特征向量作为输入传递到搅动模型并在HTTP post命令的上下文中应用。为了构建实时系统,对于数据科学家来说,接触NoSQL数据库至关重要。要学习诸如Redis之类的技术,使用mock库也是很有用的  库以测试API,然后再部署到云中。
 
OpenRTB
 OpenRTB是实时广告拍卖和广告投放的规范。该规范可在诸如Google Ad Exchange之类的交易所中使用,以使销售广告资源的发布商与希望投放广告的买方联系起来。我使用此协议为程序化用户获取实现了一个研究平台。尽管此规范不能广泛地应用于数据科学,但对于数据科学家了解如何构建可以实现标准化接口的系统很有用。对于OpenRTB,这涉及构建一个Web服务,该服务接收带有JSON负载的HTTP帖子,并返回带有定价详细信息的JSON响应。如果您有兴趣启动并使用OpenRTB规范,则Google提供了一个 protobuf 实现。
 
Java Web框架
我决定用Java编写OpenRTB研究平台,因为我对这种语言有最丰富的经验。但是,Rust和Go都是Java用于构建OpenRTB系统的绝佳选择。由于选择了Java,因此我需要选择一个Web框架来为我的应用程序实现端点。十多年前,我使用Jetty库用Java构建简单的Web应用程序时,我决定探索基于基准测试的新工具。我从Rapidoid 库开始 ,它是一个轻量级且快速的框架,用于使用Java构建Web应用程序。但是,当我在响应Web请求时开始向Redis添加呼叫时,我发现我需要从非托管方法转移到托管方法,以使用Rapidoid服务请求。然后我尝试了 Undertow 支持阻塞IO,并在我的基准测试中发现它的性能优于Rapidoid。尽管数据科学家通常不使用Java编写程序,但了解如何尝试不同的Web框架(例如在gunicorn和uWSGI之间进行选择以部署Python Web服务)的学习可能会很有用。
 
HTTPS
现在,实现OpenRTB协议需要通过安全的HTTP服务流量。为Web服务启用HTTPS涉及通过DNS将Web服务设置为命名端点,并使用签名证书来建立端点的身份。保护由GKE托管的GCP上的端点相对简单。使用节点端口和服务入口公开服务后,您需要为服务的IP地址设置DNS条目,然后使用GCP托管证书启用HTTPS。
由于在保护服务安全方面有些微妙之处,因此对于数据科学家学习建立HTTPS端点很有用。如果不需要端到端HTTPS(例如OpenRTB),则可以在Kubernetes集群中的负载均衡器和Pod之间内部使用HTTP,那么部署会更容易。如果需要端到端HTTPS,例如使用OAuth的Web服务,则Kubernetes配置会稍微复杂一点。
 
负载均衡
 为了扩展到OpenRTB的Web流量,我需要使用负载平衡来处理每秒超过10万个Web请求(QPS)。Kubernetes提供了可扩展服务于Web请求的Pod数量的基础架构,但是也有必要以一种在整个集群中平均分配请求的方式配置集群。Kubernetes有一个 未解决的问题 ,使用长期连接会导致跨Pod负载不均衡,这是OpenRTB系统的推荐配置。我用的是 原生容器 GKE中提供了负载平衡功能来缓解此问题。对于大型组织中的数据科学家而言,开始进行负载平衡并不常见,但是对于拥有拥有大量请求量的端到端数据产品的初创企业或团队而言,这是一项有用的技能。
 
日志
部署Web应用程序还涉及为系统设置监视,以确定是否发生任何问题。使用GCP构建应用程序时,StackDriver提供了一个受管系统,用于记录消息,报告自定义指标和设置警报。我能够使用该系统监视正常运行时间,并在发生事件时向Slack和SMS发送警报。对于数据科学家来说,接触日志库非常有用,以确保部署到云的系统按预期运行。
​​​​​​​