在血液样本中发现罕见病的生物标志物

我是谁?

我是 Markus Schmitt,也是 Data Revenue 的首席执行官。我们在多个领域构建定制机器学习解决方案,包括医学、汽车制造等。

我要解决什么问题?

医生很难通过血液检查诊断罕见病。通常患者需要接受昂贵且耗时的半人工基因检测。

我们正在分析数千份血液样本,比较患病和健康患者。我们寻找血液中的生物标志物和化合物,例如铁,这些有助于医生识别患有罕见病的人(和未患病的人)。目前,这项工作是离线进行的,基于历史样本,但通过更多努力,这也可以用于实时:分析患者血液并比目前更快、更便宜地提供反馈。

Dask 有何帮助?

项目最初未使用 Dask,而是编写了我们自己的定制多进程功能。这增加了维护负担,而 Dask 使切换到有向无环图 (DAG) 级别的思维变得简单。无需再考虑单个核心,这太棒了。

Dask 使我们能够并行运行所有分析,缩短了整体反馈周期,并让我们更快地获得结果。我们发现 Dask 非常灵活。我们广泛使用它来协助进行分布式分析,但在更简单的情况下,Dask 也为我们增加了价值。我们的系统围绕用户提交的任务运行,无论是否涉及“大数据”,我们都可以使用 Dask 来帮助调度这些任务。

我为什么选择 Dask?

在清楚地认识到我们在维护自定义多进程代码上浪费了大量时间后,我们在选择 Dask 之前考虑了几种替代方案。我们特别考虑了

  • Apache Flink:我们发现它不仅缺少我们所需的一些功能,而且设置和维护也非常复杂。

  • Apache Spark:我们同样发现它在设置和维护方面非常耗时。

  • Apache Hadoop:我们发现 MapReduce 框架限制太多,感觉总是在勉强适应。

最终,我们选择了 Dask,因为它在简单性和功能性之间提供了极好的平衡。它足够灵活,几乎可以满足我们的一切需求,又足够简单,不会给我们的团队带来维护负担。我们使用 Dask 调度器以及更高级别的 API。我们的数据非常适合表格结构,因此 DataFrame API 为我们提供了很多价值。

痛点

Dask 在很大程度上满足了我们的需求,但我们也遇到了一些内存问题。有时,由于更高的抽象层,很难准确预测哪些数据会被加载到内存中。在某些情况下,Dask 会加载比我们预期多得多的数据到内存中,我们不得不添加自定义逻辑来延迟某些任务的处理。这些任务只有在前一个任务完成并释放内存后才会运行。由于我们处理的是医疗数据,我们也非常重视安全性和合规性。我们发现 Dask 与 Kubernetes 的集成在这些方面缺少一些必要的功能。特别是我们不得不手动应用一些 SSL 补丁,以确保数据始终通过 SSL 传输。但总的来说,尽管 Dask 有时未能完全满足我们的需求,但我们很容易对其进行修补。Dask 的架构使其易于理解并根据需要进行更改。

我在 Dask 周边使用的技术

我们在 AWS 上的 Kubernetes 中运行 Dask,批处理由 Luigi 管理。我们使用 scikit-learn 进行机器学习,并使用 Dash 构建交互式 GUI 和仪表板。

还有其他需要了解的吗?

我们在许多项目中使用 Dask,从小型项目到大型集成(例如与戴姆勒的合作),它的多功能性给我们留下了深刻印象。我们每天通过 Dask 处理数十亿条记录,数据量高达数 TB。