亚马逊AWS官方博客

大规模加速精准医学

本博文承蒙 AWS 医疗保健和生命科学合作伙伴解决方案架构师 Aaron Friedman 和 AWS 基因组学和生命科学高级解决方案架构师 Angel Pizarro 大力支持

精准医学是基于定量特征为个人量身定制的,这些特征包括基因组学、生活方式和环境。这门学科往往被视为人类健康下一波的驱动力。随着全民基因组测序和支持物联网的可穿戴设备等新计划和技术的出现,商业和公共部门的研究人员和临床医生如今可以获得先前无法取得的全新见解。

已有许多精准医学计划基于 AWS 实施。其中部分计划包括:

  • PrecisionFDA – 这项计划由美国食品和药品管理局主导。其目标是针对精准医学中的基因组学定义下一代医护标准。
  • 美国心脏协会精准医学平台 – 该平台使研究人员能够开展协作并分析数据集,更好地预测和干预心血管疾病和中风。
  • Deloitte ConvergeHEALTH – 使医疗保健和生命科学组织能够基于单一实证平台分析不同的数据集。

许多此类计划的核心都是基因组学,这一学科使得医疗保健组织能够建立纵向研究的基线。由于基因组学在精准医学计划中的广泛适用性(从罕见疾病诊断到改善临床试验结果),全球基因组学数据的增长速度已经超越了摩尔定律。许多人预计,到 2025 年这些数据集将增长到数十艾字节。

此外,该社区还会经常重新分析基因组学数据,比如在研究人员开发出新的计算方法时,或需要将较旧的数据与较新的基因组参照数据进行比较时。这些趋势推动了数据分析方法和算法的创新,以应对计算需求的激增。

Edico Genome 是 AWS 合作伙伴网络 (APN) 中的一家合作伙伴,他们开发出了一种新颖的解决方案,利用现场可编程门阵列 (FPGA) 加速基因组学分析。Edico Genome 以往一直在本地部署其 FPGA 设备。2016 年 12 月,在 AWS 宣布推出 Amazon EC2 F1 这种基于 FPGA 的实例系列后,Edico Genome 采用了云优先战略,成为 F1 发布合作伙伴,也是首批在 AWS 上部署支持 FPGA 的应用程序的合作伙伴之一。

2017 年 10 月 19 日,Edico Genome 与费城儿童医院 (CHOP) 合作,演示了名为 DRAGEN 的 FPGA 加速式基因组管道软件。这种软件可以大幅缩短患者基因组的分析时间,能够在最短的时间内分析来自应用基因组学生物库中心的 1000 个基因组。这创造了 1000 个完整人类基因组分析速度最快的吉尼斯世界纪录,他们当时使用的是单个 AWS 区域中的 1000 个 EC2 f1.2xlarge 实例。他们不仅能够以极高的吞吐量分析基因组,而且分析成本极低,AWS 为分析而计算每个完整人类基因组时,平均成本仅为大约 3 USD。

minutes-dragon-run

Edico Genome 用于此分析的 DRAGEN 版本也与 precisionFDA 的“隐藏的珍宝 – 热身挑战赛”中使用的版本相同,他们也是每项评估中表现最佳的团队之一。

在本文的其余部分,我们将介绍 Edico Genome 所使用的架构,这种架构结合了 EC2 F1 实例和 AWS Batch,实现了这一里程碑级别的成就。

EC2 F1 实例和 Edico 的 DRAGEN

EC2 F1 实例使用云规模的 FPGA 提供对可编程硬件加速的访问。AWS 客户将 F1 实例用于多种应用场景,包括大数据、财务分析和风险分析、图像和视频处理、工程模拟、AR/VR 和加速基因组学。
Edico Genome 所采用的由 FPGA 支持的 DRAGEN Bio-IT 平台现已与 EC2 F1 实例集成。您可以通过许多第三方平台、AWS Marketplace 和 Edico Genome 自己的平台获享 DRAGEN 的准确性、速度、灵活性和低计算成本。DRAGEN 平台为各种基因组学应用情况提供可扩展、加速且经济高效的辅助分析解决方案。Edico Genome 还提供高度优化的机制,用于有效存储基因组数据。

基于 AWS 扩展 DRAGEN

Edico Genome 使用 1000 个 EC2 F1 实例帮助其客户费城儿童医院 (CHOP) 并行处理和分析全部 1000 个完整人类基因组。他们使用 AWS Batch 预置计算资源,并在 1000 个 EC2 F1 实例中编排 DRAGEN 计算作业。该解决方案成功解决了创建可扩展基因组处理管道的挑战,该管道可轻松扩展到数千个并行运行的引擎。

架构

下面展示了用于该分析的简化示意图:
dragen-architecture

  1. DRAGEN 的门户使用 Elastic Load Balancing 和 Auto Scaling 组来纵向扩展将作业提交到 AWS Batch 的 EC2 实例。
  2. 作业元数据存储在工作流管理 (WFM) 数据库中,该数据库基于 Amazon Aurora 构建。
  3. DRAGEN Workflow Manager API 将作业提交到 AWS Batch。
  4. 这些作业在 AWS Batch 托管计算环境中执行,并由该环境负责启动 EC2 F1 实例。
  5. 这些作业作为 Docker 容器运行,具有完整基因组分析必不可少的 DRAGEN 二进制文件。
  6. 每个作业运行时,都会检索并存储 Amazon S3 中暂存的基因组数据。

之前列出的步骤也可以划分为以下几个概括性层级:

  • 工作流:Edico Genome 使用 Workflow Management API 编排 AWS Batch 作业的提交。作业的元数据(例如基因组的 S3 位置等)驻留在 Amazon Aurora 支持的工作流管理数据库中。
  • 批量执行:AWS Batch 启动 EC2 F1 实例并协调 DRAGEN 作业在这些计算资源上的执行。AWS Batch 使 Edico 在提交作业时可以快速轻松地实现扩容,启用所需的全部实例。他们还可以在每项作业完成后缩减容量,以优化成本和性能。
  • 计算/作业:Edico Genome 将其二进制文件存储在 AWS Batch 部署到每个 F1 实例的 Dock 容器中,使每个实例都能够运行 DRAGEN 而无需预先安装核心可执行文件。基于 AWS 的 DRAGEN 解决方案从 S3 流式传输所有基因组数据,以进行本地计算,然后将结果写入目标存储桶。他们使用指定了 IAM 权限的 AWS Batch 作业角色。该角色确保 DRAGEN 只能访问分析所需的存储桶或 S3 密钥空间。不需要为作业嵌入 AWS 凭据。

我们之前也在 AWS 计算博客上的基于 AWS 构建高吞吐量基因组学批处理工作流系列文章中介绍了这些概念。

演练

在接下来的部分中,我们将深入探究支持在 AWS 上实现 Edico Genome 可扩展 FPGA 基因组分析的几项任务:

  1. 为 AWS Batch 准备 Amazon FPGA 映像
  2. 创建 Dockerfile 并构建 Docker 映像
  3. 设置 AWS Batch FPGA 计算环境

先决条件

简而言之,您需要在映像上配置一个现代 Linux 发行版(3.10 以上版本)、Amazon ECS 容器代理、awslogs 驱动程序和 Docker。计算资源 AMI 规范中还提供了其他建议。

为 AWS Batch 准备 Amazon FPGA 映像

您可以将任何 Amazon 系统映像 (AMI) 或 Amazon FPGA 映像 (AFI) 与 AWS Batch 配合使用,只要其符合计算资源 AMI 规范即可。这使您能够通过增加根或数据卷的大小、添加实例存储以及连接 FPGA (F) 和 GPU(G 和 P)实例系列来自定义任何工作负载。

接下来安装 AWS CLI:

pip install awscli

添加在 F1 实例上与 FPGA 交互所需的任何其他软件。

首先,AWS 在 AWS Marketplace 中发布了 FPGA Developer AMI。它基于 CentOS Linux 映像,包括预集成的 FPGA 开发工具。它还包括为硬件加速应用开发和使用自定义 FPGA 所需的运行时工具。

有关如何为 AWS Batch 托管计算环境设置自定义 AMI 的更多信息,请参阅创建计算资源 AMI

构建 Dockerfile

有两种常用方法可以连接到 AWS Batch,以运行支持 FPGA 的算法。第一种方法也是 Edico Genome 采用的方法:将二进制文件存储在 Docker 容器中,并在安装了 Docker 的 F1 实例上运行该文件。在这种情景下构建容器时,所用的 Dockerfile 可能如下面的代码示例所示。

# DRAGEN_EXEC Docker image generator --
# Run this Dockerfile from a local directory that contains the latest release of
# - Dragen RPM and Linux DMA Driver available from Edico
# - Edico's Dragen WFMS Wrapper files
FROM centos:centos7
RUN rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
# Install Basic packages needed for Dragen
RUN yum -y install \
perl \
sos \
coreutils \
gdb \
time \
systemd-libs \
bzip2-libs \
R \
ca-certificates \
ipmitool \
smartmontools \
rsync
# Install the Dragen RPM
RUN mkdir -m777 -p /var/log/dragen /var/run/dragen
ADD . /root
RUN rpm -Uvh /root/edico_driver*.rpm || true
RUN rpm -Uvh /root/dragen-aws*.rpm || true
# Auto generate the Dragen license
RUN /opt/edico/bin/dragen_lic -i auto
#########################################################
# Now install the Edico WFMS "Wrapper" functions
# Add development tools needed for some util
RUN yum groupinstall -y "Development Tools"
# Install necessary standard packages
RUN yum -y install \
dstat \
git \
python-devel \
python-pip \
time \
tree && \
pip install --upgrade pip && \
easy_install requests && \
pip install psutil && \
pip install python-dateutil && \
pip install constants && \
easy_install boto3
# Setup Python path used by the wrapper
RUN mkdir -p /opt/workflow/python/bin
RUN ln -s /usr/bin/python /opt/workflow/python/bin/python2.7
RUN ln -s /usr/bin/python /opt/workflow/python/bin/python
# Install d_haul and dragen_job_execute wrapper functions and associated packages
RUN mkdir -p /root/wfms/trunk/scheduler/scheduler
COPY scheduler/d_haul /root/wfms/trunk/scheduler/
COPY scheduler/dragen_job_execute /root/wfms/trunk/scheduler/
COPY scheduler/scheduler/aws_utils.py /root/wfms/trunk/scheduler/scheduler/
COPY scheduler/scheduler/constants.py /root/wfms/trunk/scheduler/scheduler/
COPY scheduler/scheduler/job_utils.py /root/wfms/trunk/scheduler/scheduler/
COPY scheduler/scheduler/logger.py /root/wfms/trunk/scheduler/scheduler/
COPY scheduler/scheduler/scheduler_utils.py  /root/wfms/trunk/scheduler/scheduler/
COPY scheduler/scheduler/webapi.py /root/wfms/trunk/scheduler/scheduler/
COPY scheduler/scheduler/wfms_exception.py /root/wfms/trunk/scheduler/scheduler/
RUN touch /root/wfms/trunk/scheduler/scheduler/__init__.py
# Landing directory should be where DJX is located
WORKDIR "/root/wfms/trunk/scheduler/"
# Debug print of container's directories
RUN tree /root/wfms/trunk/scheduler
# Default behaviour.Over-ride with --entrypoint on docker run cmd line
ENTRYPOINT ["/root/wfms/trunk/scheduler/dragen_job_execute"]
CMD []

注意:Edico Genome 在此 Dockerfile 后半部分为其工作流管理系统 (WFMS) 使用了自定义 Python 包装函数,您应将其替换为您专属的工作流的函数。

第二种方法是安装二进制文件,然后使用 Docker 作为 AWS Batch 与 AFI 之间的轻量级连接器。例如,如果您预置了 AWS Marketplace 提供的 DRAGEN,那么就可能会选择这种方法。

在这种情况下,Dockerfile 不包含运行 DRAGEN 的二进制文件的安装,但包含完成作业所需的任何其他包。运行 Docker 容器时,您要授予 Docker 对底层文件系统的访问权限。

连接到 AWS Batch

AWS Batch 预置计算资源并运行您的作业,根据您的作业要求选择正确的实例类型,并在工作完成后缩减资源。AWS Batch 用户根据模板或“作业定义”向 AWS Batch 作业队列提交作业。

作业队列映射到一个或多个计算环境,这些环境描述了 AWS Batch 可以预置的资源的数量和类型。在这种情况下,Edico 创建了一个托管计算环境,该环境能够在 us-east-1 中的多个可用区中启动 1000 个 EC2 F1 实例。当作业提交到作业队列时,服务会启动所需的实例数量和类型。在实例可用时,AWS Batch 随即在适当大小的 Docker 容器中运行每项作业。

Edico Genome Workflow Manager API 会将作业提交到 AWS Batch 作业队列。此作业队列会映射到包含按需 F1 实例的 AWS Batch 托管计算环境。在本节中,您可以亲自动手完成上述设置。

创建可供 DRAGEN 使用的计算环境:

aws batch create-compute-environment --cli-input-json file://<path_to_json_file>/F1OnDemand.json

您的 JSON 文件包含以下代码(请替换为您自己的资源 ID):


{
 "computeEnvironmentName": "F1OnDemand",
 "type": "MANAGED",
 "state": "ENABLED",
 "computeResources": {
   "type": "EC2",
   "minvCpus": 0,
   "maxvCpus": 128,
   "desiredvCpus": 0,
   "instanceTypes": [
     "f1.2xlarge",
     "f1.16xlarge"
   ],
   "subnets": [
     "subnet-220c0e0a",
     "subnet-1a95556d",
     "subnet-978f6dce"
   ],
   "securityGroupIds": [
     "sg-cf5093b2"
   ],
   "ec2KeyPair": "id_rsa",
   "instanceRole": "ecsInstanceRole",
   "tags": {
     "Name": "Batch Instance – F1OnDemand"
   }
  },
 "serviceRole": "arn:aws:iam::012345678910:role/service-role/AWSBatchServiceRole"
}

以及相应的作业队列:

aws batch create-job-queue --cli-input-json file://<path_to_json_file>/dragen.json

其中 dragen.json 如下所示:


{
 "jobQueueName": "DRAGEN-OnDemand",
 "state": "ENABLED",
 "priority": 100,
 "computeEnvironmentOrder": 
 [
  {
    "order": 1,
    "computeEnvironment": "F1OnDemand"
  }
 ]
}

一个 f1.2xlarge EC2 实例包含一个 FPGA、8 个 vCPU 和 122GiB RAM。由于 DRAGEN 需要运行整个 FPGA,因此 Edico Genome 需要确保每次只对一个实例执行一次分析。通过在 AWS Batch 作业定义中使用 f1.2xlarge vCPU 和内存作为代理,Edico Genome 可以确保一次只能在一个实例上运行一个作业。此定义在 AWS CLI 中如下所示:

aws batch register-job-definition --job-definition-name dragen-wgs --type container --container-properties '{ "image": ${DRAGEN_IMAGE}, "vcpus": 8, "memory": 120000}'

现在,您可以轻松地将作业提交到 DRAGEN 环境:

aws batch submit-job --job-name dragen-run1 --job-queue DRAGEN-OnDemand --job-definition dragen-wgs --container-overrides command=${RUN_PARAMETERS}

您可以使用以下命令查询 DRAGEN 作业的状态:

aws batch describe-jobs --jobs <the job ID from the above command>

作业的日志将写入 /aws/batch/job CloudWatch 日志组。

小结

在本文中,我们演示了如何使用 AWS Batch 设置环境,支持大规模在 EC2 F1 实例上运行 DRAGEN。如果您一直按照文中介绍的演练步骤操作,那么您应该已经复制了 Edico Genome 在创造吉尼斯世界纪录时使用的大部分架构。

可以通过多种方法利用 DRAGEN 的计算能力,对基因组执行大规模分析。首先,可以通过多种不同的基因组平台使用 DRAGEN,例如 DNAnexus 平台。也可通过 AWS Marketplace 获得 DRAGEN。您可以应用这篇博文中介绍的架构,构建性能和成本经过优化的可扩展解决方案。

有关 AWS Batch 如何促进基因组学大规模处理的更多信息,请务必查看我们关于 AWS 上高吞吐量基因组学分析的 aws-batch-genomics GitHub 存储目录。