亚马逊AWS官方博客

使用 fMRIprep 在 AWS 上预处理 fMRI 数据

典型的 fMRI 研究通常会产生 TB 级或更大的成像数据。在单台计算机上存储和预处理此数据可能具有挑战性,因为单台计算机通常没有足够的磁盘空间来存储数据,也没有足够的计算能力来对数据进行预处理。传统上,研究人员结合使用基于云的存储和本地高性能集群来存储和预处理数据。但是,云和本地集群之间传输数据可能很耗时,而学习如何使用集群本身具有挑战性。在本文中,我们“开源”了一个可简化使用 Amazon Simple Storage Service (S3)Elastic Compute Cloud (EC2) 分析 fMRI 数据的存储和计算需求的解决方案。该解决方案将展示研究人员如何在 AWS 上运行 fMRIprep(由斯坦福大学的 Poldrack 实验室开发的 fMRI 数据的开源预处理管道),预处理 fMRI 数据以进行进一步分析。我们相信,采用基于云的解决方案可通过大大减少 fMRI 数据的预处理工程量,帮助研究人员专注于核心研究。

聊天时间 25 分钟
完成时间 30 分钟
完成费用 10 USD 或免费

解决方案概述

用户将 BIDS 格式的数据上传到 S3 并启动 Lambda 函数 → Lambda 解析上传的数据并启动 EC2 实例的集群 → EC2 实例运行fMRIprep 对数据进行预处理 → 预处理后的数据保存到 S3。

先决条件

  1. FreeSurfer 许可证。fMRIprep 使用FreeSurfer,这需要许可证。您可以免费获得它。
  2. 一个 AWS 账户。
    如果您还没有 AWS 账户,请注册一个免费套餐账户。
    如果您是学生或教职员工,则可以通过 AWS Educate 注册,这将为您提供至少 75 USD 抵扣额以及其他好处。
    如果您没有教育帐户,则浏览本教程的费用为 10 USD。如果您不想支付任何费用,请选择免费套餐实例类型,除最后一步外,您可以本博文的大部分内容。
  3. 熟悉 fMRIprep 和 AWS 控制台

演练

以下各节涵盖了四个主要步骤:

  1. 启动 AWS CloudFormation 堆栈。
  2. 将 FreeSurfer 许可证和 fMRI 数据上传到 S3。
  3. 更新 Lambda 函数并开始预处理。
  4. 清理。

步骤

登录 AWS 控制台

  1. 选择右上角的俄勒冈 (us-west-2) 区域。(如果要在其他地区启动,请查看本文末尾的“补充步骤”部分中的额外说明。)

  2. 如果您请求一个 AWS 教研账户,则需要使用以下 URL 登录到控制台:https://aws.amazon.com/education/awseducate/members/

启动 CloudFormation 模板

  1. 如果 CloudFormation stack 堆栈按预期工作,则应该会看到 创建堆栈 对话框。

  2. 如果第 1 步对您不适用,请打开CloudFormation(单击左上角的服务,输入 cloudformation,然后单击 CloudFormation)。单击创建堆栈,选择模板已就绪,然后选择 Amazon S3 URL。将此 https://aws-blog-files.s3.amazonaws.com/fmriprep-cf.json 复制到 Amazon S3 URL 字段中,然后单击下一步
  3. 根据需要更改堆栈名称(例如 fmriprep),输入 UniqueUserID(例如 xqq),然后单击下一步。注意:您必须选择一个唯一的 UniqueUserID – 必须与 xqq 不同,因为 S3 存储桶名称是全局名称,并且 CloudFormation 将基于 UniqueUserID 创建三个 S3 存储桶。如果 CloudFormation 因堆栈中已存在 XXX 存储桶的错误而失败,请选择其他 UniqueUserID,然后重试。
  1. 将其他所有内容保留为默认设置,单击下一步,直到看到功能选项卡,将其选中,然后单击创建堆栈

成功创建堆栈(大约一分钟)后,将为您创建以下资源:

  • 三个 S3 存储桶,用于存储输入、输出数据和 FreeSurfer 许可证。
  • 一个 Lambda 函数,可解析输入数据并启动 EC2 实例,以预处理输入存储桶中的 fMRI 数据。
  • 一个 Lambda 的 IAM 角色,用来启动 EC2 实例。
  • 一个 EC2 的 IAM 角色,用于从 S3 读取和写入文件。

在继续下一步之前,请确保已成功创建堆栈。

上传 FreeSurfer 许可证和 fMRI 数据(BIDS格式)。

注意:请勿在文件名或路径中使用空格,否则 Lambda 函数可能无法正确运行。

  1. 单击服务后,键入 S3,以打开 S3 服务。
  2. 通过单击上传,添加许可证(例如,license.txt),然后单击左下方的上传,将您的 FreeSurfer 许可证文件上传到 FreeSurfer 存储桶(例如,fmriprep-freesurfer-license-xqq,其中“xqq”应为您的 UniqueUserID)。注意:请勿创建任何额外的文件夹来存储许可证文件。否则,您将必须相应地更改 Lambda 函数。
  3. BIDS 格式的数据上传到输入存储桶中(例如,fmriprep-input-xqq)。
    您也可以尝试使用此玩具数据集bids-examples 中的其他数据集。如果使用玩具数据集,则将其下载,解压缩,然上传整个文件夹。
    下图显示了示例存储桶文件夹结构。上传数据之前,请使用 BIDS 验证程序确认您的数据为 BIDS 格式。

更新 Lambda 函数并开始预处理

Lambda 函数从输入 S3 存储桶文件夹中提取数字主题 ID,并基于已安装 Docker 和 fMRIprep 的预构建 AMI 启动 EC2 实例。

  1. 打开 Lambda 服务(单击服务选项卡,输入 lambda 并选择 Lambda)。
  2. CloudFormation 应该已经为您创建了 Lambda 函数(例如,fmriprep-lambda-xqq)。单击并向下滚动环境变量部分。
    • freesurfer_license_filename 更改为您的文件名(例如 license.txt)。
    • 将 folder_in_input_bucket 更改为您的 BIDS 数据文件夹(例如 hcp_example_bids)。
    • ami_idinstance_typeunique_user_id保留为默认值。
      • 如果您希望使用自己的 AMI 或在其他区域中启动,请输入您自己的 AMI ID 代替 ami-0938afc45f7f5593c。请参阅本文结尾处的“补充步骤”下的详细信息。
      • 您可以将 instance_type 更改为 t2.micro 以避免所有费用,但预处理会因内存不足而失败。
      • 如果您要处理自己的数据,则可能需要更改instance_type(例如,更改为m4.xlarge),以使其具有足够的 RAM。在此处查看可用的实例类型
    • 注意:上述所有变量也可以直接在 Lambda 函数中更改。
  3. 单击右上角的保存,然后单击测试
    • 如果系统提示您创建新测试,请输入任何名称(例如 test),并将所有内容保留为默认值,然后单击创建
    • 再次单击测试,几秒钟后应该显示一条成功消息。
  4. 转到 EC2 控制面板,您应该看到 EC2 实例正在运行以预处理数据。EC2 名称告诉该实例正在处理哪个主题。
  5. 处理完 fMRI 数据后,来自 fMRIprep 的输出文件将保存在输出 S3 存储桶中,并且 EC2 实例将自动终止。您可以通过 SSH 进入 EC2 实例,并使用命令 cat /var/log/cloud-init-output.log 检查进度。

清理

  1. 在 S3 中,删除输入/输出/FreeSurfer 许可证存储桶中的所有文件。
  2. 在 CloudFormation 中,删除您创建的堆栈。成功删除堆栈后,所有内容将被删除。

服务选择说明

数据存储

在 S3 中存储 fMRI 数据有几个优点:

  • S3 可以存储的数据量没有限制,您只需为已用空间付费。
  • S3 中的数据可以通过 EC2 之类的计算服务轻松访问,从而无需在存储和计算提供商之间传输数据。
  • S3 具有高持久性,并支持版本控制和生命周期策略。使用生命周期策略,您可以存档不太可能再次使用的数据,以进一步降低存储成本。

计算

AWS 提供了许多计算选择,例如 EC2、ECS。在本文中,我们使用了预装 Docker 和 fMRIprep 的 Amazon 系统映像 (AMI)。通过使用此 AMI,其他研究人员可以直接开始预处理 fMRI 数据,而不必重复繁琐的安装工作。您还可以同时启动许多 EC2 实例,以批处理大量 fMRI 数据(您可能需要提交服务限制增加请求,以增加可以同时启动的实例数量)。与 S3 一样,您也只需为使用的商品付费。

计划程序

在本文中,我们使用 Lambda 函数来安排计算作业。Lambda 函数读取上传文件夹中的 fMRI 数据,识别要分析的主题,并启动对应数量的 EC2 实例来处理数据。预处理完成后,EC2 将数据保存到输出 S3 存储桶并自动终止。

用于安排工作的更原生的解决方案是使用 AWS BatchAWS Fargate。但是,Batch 使用 ECS,为此,建议的 Docker映像大小小于 10 GB,而用于 fMRIprep 的 Docker 映像约为 13GB。大型 Docker 映像的检索和加载速度很慢,这会在开始实际分析之前产生大量计算开销。

权限

AWS 提供了许多服务和功能来确保系统的安全性。CloudFormation 堆栈创建两个角色,一个用于 Lambda 代表您启动 EC2 实例,另一个用于授予 EC2 实例对 S3 存储桶的读/写访问权限。

补充步骤(可选)

要安装 AWS CLI,请通过 CLI 上传数据,然后自动启动 Lambda 函数:

  1. 安装 AWS CLI
  2. 配置 AWS 凭证
  3. 使用以下 AWS CLI 上传数据:aws s3 cp –recursive ./hcp_example_bids s3://fmriprep-input-xqq/
  4. 通过 AWS CLI 运行 Lambda 函数。例如,
    aws lambda invoke --function-name fmriprep-lambda-xqq --payload '{"test": "test"}' out
  5. 您可以连续执行以上两个命令,以便 Lambda 在上传数据后自动开始预处理。例如,
    aws s3 cp --recursive ./hcp_example_bids s3://fmriprep-input-xqq/ && aws lambda invoke --function-name fmriprep-lambda-xqq --payload '{"test": "test"}' out

要在其他区域运行此工作流程:

  1. 由于无法在其他区域使用 AMI,因此您需要自己创建 AMI 或将现有 AMI 从 us-east-1 复制到您的区域。
  2. 要创建自己的 AMI,请遵循 AMI 文档。您需要安装 Docker 和 fMRIprep 的 Docker 版本,然后创建 AMI。
  3. 在所需区域中拥有 AMI 之后,启动 CloudFormation 堆栈。在 Lambda 函数中,将出现的 AMI 都更改为AMI ID,将 REGION 更改为所需区域。请注意,您需要在此处输入区域代码而不是区域名称。有关区域名称和对应代码的完整列表,请参阅 AMI 文档

常见问题

为什么不使用 AWS Fargate/ECS/Batch 等容器服务?

  • fMRIprep Docker 映像大于 10GB。AWS 不建议在生产环境中使用大型容器。此外,大型 Docker 映像需要花费很长时间才能加载,从而在处理管道中造成大量开销。
  • Fargate 将数据量限制为 10 GB,而 fMRI 任务通常需要大量的临时存储。此外,四个 vCPU 的上限可能会限制 fMRIprep 的性能。
  • ECS:可以安装外部卷,但过程并不简单。
    如果可以解决这些限制,那么与当前解决方案相比,AWS Batch/Fargate/ECS 可能是更好的解决方案。

为什么不使用 AWS ParallelCluster

  • 安装软件和维护 HPC 集群所需的步骤比快速介绍如何使用 AWS 运行 fMRIprep 所需的步骤更多。
  • 对于拥有 HPC 集群管理经验的研究人员,我们鼓励他们尝试使用 AWS ParallelCluster 作为另一种可能的解决方案。AWS ParallelCluster 提供了一种轻松的方法来设置按需 HPC 集群。

通过本地 HPC 使用 AWS 主要有哪些优势?

  • 使用 CloudFormation 之类的工具更灵活且更容易设置。
  • 数据存储 (S3) 和数据处理 (EC2) 之间良好集成。

如何连接到我的实例?

  • 在 EC2 中的密钥对中创建您自己的密钥对名称。
  • 在 Lambda 函数中,将 KeyName(第 38 行)更改为 EC2 中的密钥对名称。
  • 在 EC2 中,选择要连接的实例,然后单击连接

将来可对这些步骤做哪些添加或改进?

  • 根据实例类型更改 Lambda 函数,以此微调性能,以便 Docker 可以利用所有计算核心。
  • 作业完成后添加电子邮件通知。
  • 了解如何使用 AWS Batch/Fargate 运行预处理。

小结

AWS 提供了许多不同的存储和计算服务。本博文展示了一种在 AWS 上开始运行 fMRIprep 来预处理 fMRI 数据的简单方法。我们预计,随着服务功能的增加和扩展,迟早会出现其他更好的方法。我们希望读者能够与我们合作,继续探索在 AWS 上处理 fMRI 数据的更好、更高效的方法。这里提供了 CloudFormation 模板Lambda 函数模板,供读者进行修改和改进。请通过评论告诉我们您的想法和建议。

致谢

感谢 AWS 高级解决方案架构师 Tapodipta Ghosh 提供建议和技术审查。

Mengxue Kang

Mengxue Kang 是罗格斯大学 (Rutgers University) 的认知心理学博士研究生和计算机科学硕士。她使用神经影像工具和机器学习技术研究记忆的机制。她拥有 4 年的 fMRI 数据处理经验。

本博文中的内容和意见属于第三方作者,AWS 不对本博文的内容或准确性负责。