在过去的几个月里,来自索尔克研究所的一个生物学家团队一直在日常使用 SkyPilot 在云上进行研究。

在这篇用户投稿中,来自Ecker 实验室刘汉青博士分享了他们的经验。本文转载自 Medium 上的原文

现代基因组技术产生了海量数据,需要大量的计算资源进行处理。尽管云平台非常适合处理如此巨大的计算需求,但在生物学领域仍未得到充分利用。这种差距主要源于对云技术的理解有限,以及设置云环境所带来的令人生畏的初始学习曲线。幸运的是,几个月前,我们索尔克研究所的 Ecker 实验室将加州大学伯克利分校的开源库 SkyPilot 添加到了我们的工具包中。在 SkyPilot 的帮助下,我们迅速调整了工作流程,完全在云上分析了大量的单细胞完整小鼠脑图谱数据集。

在这篇文章中,我们将介绍我们为什么以及如何使用云和 SkyPilot 完成了这项大型基因组项目。文章结束时,其他生物学家和生物信息学家应该能够理解我们基于云的方法的优势,并能够利用我们提供的具体示例轻松开始使用云进行自己的研究。

背景:为整个哺乳动物大脑构建详细的“零件清单”。

大脑是已知宇宙中最复杂的结构之一。每个人的大脑都包含数十亿个细胞,通过数万亿个突触连接,由此产生了一个问题:神经科学家如何有效地揭示脑细胞的巨大复杂性? 一个潜在的答案在于革命性的单细胞技术,这项技术使得能够开发整个器官的细胞图谱,就像为精密机器制作的详细“零件清单”一样。

在我们最近的 bioRxiv 预印本(图 1)中,我们展示了一份涵盖整个小鼠大脑的前沿单细胞基因组数据集。小鼠是研究哺乳动物神经系统基本原理的常用动物模型。这项研究包含了多个数据集,共计超过 10,000,000 个深度单细胞图谱(由我们和其他合作者生成),这些图谱与大脑功能至关重要的多种分子模式相关,例如 RNA、DNA 修饰和 DNA 的 3D 结构。每个数据集都涉及生成数百 TB 的测序数据。

图 1. 完整小鼠脑单细胞图谱项目总结。更多详情请参见我们的预印本

使用 SkyPilot 的通用云工作流程

尽管全面的生物学分析超出了本文的范围,并在我们的预印本中有详细介绍,但我们将重点概述我们所有研究的日常工作流程。我们的通用工作流程包含四个部分,每个部分都对应 SkyPilot 中的一个现成概念:

  1. 资源:在特定区域和云上找到合适的计算资源;
  2. 数据 (file_mounts):从/向云对象存储桶读写大量数据、现有代码和基因组参考文件;
  3. 设置:安装数十个生物信息学软件包;
  4. 运行:启动 Jupyter 服务器进行交互式探索,或运行 Snakemake(一种流行的生物信息学管道软件包)命令进行批量管道处理。

我们将此通用流程可视化,以展示 SkyPilot 如何通过一个包含 30 行代码的 YAML 文件显著简化和增强我们的基于云的生产力(图 2)。

One SkyPilot YAML file generates a fully reproducible data analysis environment
图 2. 一个 SkyPilot YAML 文件生成一个完全可重现的数据分析环境。


实际分析中的两个用例

此外,我们为对正在进行的实际生物学分析感兴趣的读者提供了以下两个具体示例。如果您以前没有使用过 SkyPilot,请先查看文档中的 SkyPilot“安装”和“快速入门”。

用例 I:使用 Jupyter Notebooks 进行交互式探索

与许多数据科学项目类似,我们分析的初始阶段通常是探索性的,需要使用 Jupyter Notebooks 访问完整数据集。特别是,单细胞数据分析中的一项常见任务涉及对细胞-特征矩阵进行Leiden 聚类。这种聚类分析包括几个预处理和准备阶段。完成聚类过程后,可视化结果并进行后续差异分析以理解和表征细胞簇至关重要。

这些任务对计算环境有几项要求,手动管理起来可能很困难:

  1. 资源:我们的需求根据数据集大小不断变化,范围从小型 VM(例如 n2d-standard-16)到可能的最大 VM(例如 n2d-highmem-96)。
  2. 数据:分析可能涉及跨多个存储桶的数百个文件。将所有这些文件直接复制到 VM 的持久性磁盘非常麻烦。
  3. 设置:随着新工具的不断涌现,我们希望测试各种选项,并记录安装步骤以便在不同的 VM 上重复使用。

使用 SkyPilot YAML 文件可以轻松满足这些要求(图 2)。让我们从一个基本示例开始,然后逐步修改它:

使用一个非常基本的 YAML 文件创建 VM

以下是用于启动一个小型(n2d-standard-16)VM 的最小 YAML 文件,该 VM 被授予访问分析和数据存储桶的权限并启动一个 Jupyter 服务器:

# cluster_vm.yaml

resources:
  cloud: gcp
  instance_type: n2d-standard-16
  disk_size: 128

file_mounts:
  /data:
    source: gs://project-data-bucket/
    mode: MOUNT
  /home/analysis:
    source: gs://my-analysis-bucket/
    mode: MOUNT

setup: |
  pip install --upgrade pip
  conda env update -f /home/analysis/env.yaml  

run: |
  nohup jupyter-lab --no-browser --port 8888 &  

要使用此命令启动名为“clustering”的 VM,只需在 shell 中运行:

$ sky launch -c clustering cluster_vm.yaml

只需大约一分钟,我们的 VM 即可启动并运行,准备进行聚类分析!这条神奇的命令带来了几个显著的好处:

  1. 该 VM 可以访问我的两个存储桶,一个(gs://project-data-bucket/)包含大型数据文件,另一个(gs://my-analysis-bucket)包含我的日常分析文件夹。这些存储桶被挂载到 VM 的文件系统,可以像访问系统上的任何其他本地文件一样访问它们。
  2. /home/analysis/env.yaml 中列出的所有软件包都在 VM 设置期间自动安装。值得注意的是,/home/analysis/env.yaml 实际上位于远程存储桶 gs://my-analysis-bucket/env.yaml 中。多亏了 (1) 中的文件挂载,我们在使用它之前无需下载!
  3. VM 启动后,Jupyter Notebook 服务器就会运行。此外,SkyPilot 还在本地机器和新 VM 之间建立了 SSH 连接,因此我们可以直接 SSH 到 VM 或创建到 Jupyter Notebook 服务器的 SSH 隧道,只需使用我们指定的便捷 VM 名称即可(而无需复制粘贴 IP 地址)。
$ ssh clustering # enter the VM
$ ssh -L 8888:localhost:8888 clustering # or create an SSH tunnel to the running Jupyter server

完成分析后,关闭 VM 也非常简单:

$ sky stop clustering

如果我们担心忘记关闭 VM(我经常会忘记),一个更好的解决方案是使用自动停止功能

# this will turn off the VM after 4 hours.
$ sky autostop clustering -i 240

下次(通常是第二天早上)当我们想要继续分析时,只需重复上述 sky launch 命令(它会运行 setup)或 sky start(它不会重新运行 setup),一切都会恢复正常!

如果我需要更多资源怎么办?

只需在 YAML 文件的 resources 部分请求不同的 VM 类型。例如,如果我们想要一台大得多机器、几个强大的 GPU($$$)以及更多磁盘空间,只需这样请求:

resources:
  cloud: gcp
  instance_type: n2d-highmem-64
  disk_size: 512
  accelerators: V100:4

我们甚至可以在不同的云提供商(例如 GCP、AWS、Azure、Lambda Cloud)上请求资源,因为 SkyPilot 旨在支持任何云。我们还可以让 SkyPilot 帮助选择最便宜的解决方案

如果我的新项目数据在另一个存储桶中怎么办?

通常,我们的日常分析涉及多个项目。移动文件可能既痛苦又容易出错。使用 SkyPilot,我们无需这样做。只需在 YAML 文件的 file_mounts 部分添加另一个条目:

file_mounts:
  /new_data/:
    source: gs://new-project-data-bucket/
    mode: MOUNT
  /reference/:
    source: gs://genome-reference-bucket/some/reference/dir/
    mode: COPY
  # followed by other file mounts, as many as you need.

除了 MOUNT 模式外,我们还可以将文件 COPY 到此 VM(自动完成!),这对于一些经常访问的文件(例如基因组参考)可能是理想的选择。请查看文档中的更多选项。

如果我需要安装新工具怎么办?

在 VM 设置期间添加新工具非常简单。我们可以将所有安装命令记录在 YAML 文件的 setup 部分:

setup: |
  … # previous install code
  pip install a_new_cool_package
  # or any git clone, R installation commands  

请记住,setup 下的所有内容都只是 shell 命令。每当我们使用 sky launch 启动 VM 时,它们都会自动执行。

用例 I 总结

在这个用例中,我们利用功能多样的 SkyPilot 框架来满足我们使用 Jupyter Notebook 服务器进行交互式数据分析的日常需求。实践中,创建一个可重用的 SkyPilot YAML 文件大约需要 5 分钟,而启动一个 VM 只需大约 1 分钟。得益于这个高效的框架,早上设置 VM 比等待浓缩咖啡机制作一杯咖啡还要快。

用例 II:在 Spot VM 上使用 Snakemake 管道进行批量扩展。

通常,探索性数据分析的目标是建立一个经过优化的分析管道,该管道可以应用于数量级更大的数据集。在基因组数据分析中,此类管道通常编写在 Snakefile 中,然后由 Snakemake 工作流管理系统管理,通过单个命令执行。一个处理原始测序数据并生成分析就绪文件的此类管道示例可在此处找到:这里

由于这些管道中的许多都资源密集型,因此成本成为阻碍生物学家使用云服务的主要因素。 例如,我们目前的映射管道处理单个细胞大约需要 1 个 CPU 小时(其缓慢的特性是由于每个细胞包含数百万个 reads)。鉴于我们的完整小鼠大脑数据集包含约 50 万个细胞,仅仅是数据映射(众多分析步骤之一)可能就会产生数万美元的费用。

降低云中批量作业成本的一个极佳解决方案是使用竞价型(或可抢占型)机器。例如,在 Google Cloud Platform 上,竞价型 VM 通常比按需型机器便宜几倍。然而,不利的一面是,从工程角度来看,竞价型 VM 可能难以管理。由于成本较低,云提供商可以在任何时候未经通知地关闭 VM,这一过程称为抢占。尽管在抢占后可以重新启动机器,但工作负载可能需要重新启动,并且如果管理不当,中间文件可能会损坏。

SkyPilot 自动管理竞价型作业,可节省约 6 倍成本

幸运的是,SkyPilot 解决了这个工程难题。使用之前的同一个 YAML 文件,我们可以通过单个 sky spot launch 命令启动一个“托管竞价型作业”。SkyPilot 会管理竞价型 VM,自动从抢占中恢复,甚至在竞价型资源不可用时故障转移到不同的区域或云平台。

以下是我们用于在 Spot VM 上运行映射作业的 YAML 文件示例。它看起来与之前的交互式作业相同,区别在于在 YAML 文件的 run 部分,我们将执行 snakemake 命令来执行一些批量作业(将单细胞 reads 映射到基因组)。

# mapping_vm.yaml

resources:
  cloud: gcp
  instance_type: n2d-standard-64
  disk_size: 256

file_mounts:
  /input:
    source: gs://sequencing-raw-data-bucket/
    mode: MOUNT
  /output:
    source: gs://mapped-data-bucket/
    mode: MOUNT
  /ref:
    source: gs://genome-reference-bucket/
    mode: COPY

setup: |
  pip install --upgrade pip
  conda env update -f /ref/mapping_env.yaml  

run: |
  snakemake --snakefile SNAKEFILE --directory DIR --cores 32  

我们可以通过 shell 中的单个 sky spot launch 命令执行映射:

$ sky spot launch -n mapping mapping_vm.yaml

关键区别在于,按需型 n2d-standard-64 VM 每小时花费 $2.70,而竞价型 n2d-standard-64 VM 花费 $0.41,即便宜 6.5 倍(截至撰写本文时,在 us-west1 区域)。尽管 VM 可能受到抢占,但 SkyPilot 会在抢占后自动重启它并恢复工作负载(在我们的例子中是 Snakemake 命令)(图 3)。一旦 Snakemake 恢复,它就可以从自己的检查点重新启动管道,进一步确保工作流程的连续性(这也要归功于 Snakemake 的检查点功能)。

图 3. 一个 Spot VM 持续无人值守运行了七天。抢占事件(“按最高严重性划分的日志”面板上的蓝色条)每天至少发生一次,频率可能更高。然而,VM 和工作负载可以通过 SkyPilot 成功恢复。

用例 II 总结和我们五个月的经验

在本例中,我们介绍了 SkyPilot 框架的 Spot 功能,这对于使 Spot VM 可用于日常、资源密集型的批量作业至关重要。在过去五个月里,我们广泛利用 SkyPilot 管理 Spot VM(图 4),与使用按需型 VM 相比,估计节省了 5.7 倍的成本

此外,如果相同的计算工作在我们的本地 HPC 设施(内部服务器 + 德克萨斯高级计算中心的 Stampede2 超级计算机)上执行,则大约需要 15 个月(总耗时)才能完成。本地 HPC 耗时更长归因于多种因素,我们将在下一节讨论。实现总耗时提速 3 倍对于大规模项目(如构建完整小鼠脑图谱)的生产力和及时完成至关重要。

Cost and wall time saving based on our five-month experience using spot-VM on GCP with SkyPilot
图 4. 根据我们五个月使用 SkyPilot 在 GCP 上使用 Spot VM 的经验,显示的成本和总耗时节省。


我们为什么转向云?

在采用云计算之前,我们曾使用本地计算资源以及超算中心的低成本或免费高性能计算 (HPC) 系统。然而,在本地管理不断增长的基因组数据集多年后,我们遇到了许多通过基于云的解决方案可以更有效解决的限制。在表 1 中,我们概述了影响我们日益依赖云计算的关键因素,无论现在还是可预见的未来。

表 1. 本地环境与云环境的比较

SkyPilot 为生物信息学家带来了什么?

SkyPilot 是一个功能多样的框架,可以在任何云上运行任何作业。作为生物信息学家,我们特别欣赏这个框架,主要有两个原因:

  1. 成本效益:SkyPilot 旨在优化云计算费用。
  2. 时间效率:该框架能够无缝访问广泛的云资源,同时将学习时间降至最低。

生物信息学领域预计在未来几年数据量和计算需求将快速增长。例如,在我们的鼠脑图谱项目完成后,NIH BRAIN 倡议的下一阶段旨在支持人类脑图谱的开发。即使您自己不生成大量数据集,也极有可能需要大量的计算能力来有效地利用这些广泛的参考图谱解决您的研究问题。

因此,今天就毫不犹豫地利用 SkyPilot 和云平台的力量来处理您要求最高的计算任务吧!