Architecture 数据科学家和工程师之间长期有效合作的代码库设计最佳实践

Architecture 数据科学家和工程师之间长期有效合作的代码库设计最佳实践,architecture,Architecture,一些上下文: 核心产品堆栈采用Java语言,由工程师专门维护。数据科学家负责提出算法改进/补充。 数据科学家不使用Java编写代码,而是使用Python进行工作。他们与工程团队合作,将想法表达为在核心Java代码库中实现的Python代码 问题: 审查新想法取决于工程团队编写新的Java代码。这降低了整个技术团队的迭代速度 什么架构可以缓解这个问题 我们在一些ML项目中遇到了类似的设置:产品工程师有一个核心Java堆栈,为存储在NoSQL(MongoDB)中的数据提供一系列RESTful API

一些上下文:
核心产品堆栈采用Java语言,由工程师专门维护。数据科学家负责提出算法改进/补充。
数据科学家不使用Java编写代码,而是使用Python进行工作。他们与工程团队合作,将想法表达为在核心Java代码库中实现的Python代码

问题:
审查新想法取决于工程团队编写新的Java代码。这降低了整个技术团队的迭代速度


什么架构可以缓解这个问题

我们在一些ML项目中遇到了类似的设置:产品工程师有一个核心Java堆栈,为存储在NoSQL(MongoDB)中的数据提供一系列RESTful API,数据工程师/数据科学家用Python编写ML脚本,用于培训和功能工程。以下是一些帮助我们的事情:

  • Java产品工程团队构建RESTful API,使数据工程师能够以我们用于模型开发/培训/功能工程的常规节奏从MongoDB中提取数据(JSON/CSV格式)
  • 我们使用它来轻松管理数据集,如代码(版本化的、可重用的数据包)和Git来对ML模型进行版本化。通过使用
    版本
    和/或
    标记
    和/或
    散列
    ,您可以使用此方法还原/跳转到任何保存的模型状态或历元(例如,对于神经网络)
  • 科学家用于审查/处理数据和模型的数据。您可以使用Cutter将数据非常轻松地(延迟加载)拉入Pandas数据帧--它只是一个Python包
  • 从coult.data.username导入我的\u数据\u包
    
  • Java工程团队使用Java
    Runtime
    类中的
    exec()
    方法,使用命令行Python脚本(由Python数据工程师编写——这些是带有命令行参数的可执行文件,用于使用经过正确训练的模型和数据输入)批量处理新数据/新数据加载pickle模型以生成预测 我认为这本身不是一个规范的解决方案或最佳实践,但它帮助我们平衡了Java工程团队和Python DE/DS的需求

    被子的一些好处:

    • 再现性-想象一下没有版本的源代码。哎哟为什么要使用未版本化的数据?版本化数据通过创建对潜在复杂数据依赖关系的明确引用,使分析具有可复制性
    • 协作与透明-数据喜欢共享。Cutter为查找和共享数据提供了统一的目录
    • 审核-注册表跟踪所有读写操作,以便管理员知道何时访问或更改数据
    • 更少的数据准备-注册表将网络、存储和文件格式抽象出来,以便用户能够专注于他们希望对数据做什么
    • 重复数据消除-数据通过其SHA-256散列进行标识。对于每个用户,重复数据都会写入磁盘一次。因此,大型重复数据片段消耗的磁盘和网络带宽更少
    • 更快的分析-序列化数据加载速度比文件快5到20倍。此外,像ApacheParquet这样的专用存储格式可以最大限度地减少I/O瓶颈,从而使Presto DB和Hive等工具运行得更快


    我希望这有帮助!祝你好运,我很想听听进展如何。

    请你更清楚地说明为什么数据科学家需要为主要产品提出代码。他们不处理数据并使用自己的算法吗?我们的评论是关于角色范围的政策。但我会让你开心的。在对数据科学家角色的广义解释下,除了进行事后数据分析等工作外,为主要产品提出/试验新的算法方法也是他们工作的一部分