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

时间:2018-07-06 12:19:47

标签: architecture

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

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

哪种架构可以缓解此问题?

1 个答案:

答案 0 :(得分:0)

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

  1. Java产品工程团队构建RESTful API,以允许数据工程师以常规节奏从MongoDB中提取数据(JSON / CSV格式),我们将其用于模型开发/培训/功能工程。
  2. 我们使用Quilt轻松管理我们的数据集,例如代码(版本化,可重复使用的数据包),并使用Gi​​t来对pickled ML模型进行版本控制。您可以使用versions和/或tags和/或hashes使用此方法将其还原/跳转到任何已保存的模型状态或纪元(例如,对于神经网络)。
  3. 数据科学家使用Jupyter notebooks来审查/使用数据和模型。您可以使用Quilt真正轻松地(延迟加载)数据到Pandas数据框中-这只是一个Python包
from quilt.data.username import my_data_package
  1. Java工程团队使用Java exec()类中的Runtime方法使用命令行Python脚本(由Python数据工程师创作的批处理文件)来批量处理新数据/新数据。命令行参数(使用正确的训练有素的模型和数据输入)来加载腌制的模型以生成预测。 See this SO answer

我认为这本身不是规范的解决方案或最佳实践,但它帮助我们平衡了Java工程团队和Python DE / DS的需求。

被子的一些好处:

  • 可重复性-想象一下没有版本的源代码。哎哟。为什么要使用未版本控制的数据?通过对可能存在复杂数据依赖关系的明确引用,版本化数据使分析具有可重复性。
  • 协作与透明度-数据喜欢共享。被褥提供了用于查找和共享数据的统一目录。
  • 审核-注册表跟踪所有读取和写入,以便管理员知道何时访问或更改数据。
  • 数据准备少-注册表提取了网络,存储和文件格式,以便用户可以专注于他们希望对数据进行的处理。
  • 重复数据删除-数据由其SHA-256哈希标识。对于每个用户,重复数据一次写入磁盘。结果,大量重复的数据片段会消耗更少的磁盘和网络带宽。
  • 更快的分析-序列化数据的加载速度比文件快5到20倍。而且,诸如Apache Parquet之类的专用存储格式最大程度地减少了I / O瓶颈,从而使Presto DB和Hive之类的工具运行得更快。

Source

希望对您有所帮助!祝你好运,并想听听它的进展。