Press "Enter" to skip to content

使用MONAI Deploy在AWS上构建医学影像AI推理流程

这篇文章是与Ming(Melvin)秦、David Bericat和Brad Genereaux共同撰写的,来自NVIDIA。

医学成像AI研究人员和开发人员需要一个可扩展的企业框架来构建、部署和整合他们的AI应用程序。AWS和NVIDIA联合起来实现了这一愿景。AWS、NVIDIA和其他合作伙伴通过加速企业成像的云连接构建应用和解决方案,使医疗保健更加可访问、经济实惠和高效。MONAI Deploy是MONAI(医学开放网络人工智能)的关键模块之一,由包括NVIDIA在内的学术界和工业界领袖联合开发。AWS HealthImaging(AHI)是一个符合HIPAA要求的高可扩展、高性能、经济实惠的医学影像存储库。我们开发了一个MONAI Deploy连接器到AHI,以通过基于云原生API的大规模缩短图像检索延迟,将医学成像AI应用程序集成到AHI中。MONAI AI模型和应用程序可以托管在Amazon SageMaker上,它是一个完全托管的服务,可以扩展地部署机器学习(ML)模型。SageMaker负责设置和管理推断实例,并提供内置的指标和日志,以供您监控和接收警报。它还提供了各种用于ML推断的NVIDIA GPU实例,以及多种模型部署选项,包括实时推断、无服务器推断、异步推断和批量转换。

在本文中,我们演示了如何使用SageMaker多模型终端节点将MONAI应用程序包(MAP)与AWS HealthImaging连接器一起部署,以进行实时推断和异步推断。这两个选项涵盖了大多数近实时医学成像推断流水线使用案例。

解决方案概述

以下图示说明了解决方案架构。

MONAI部署在AWS架构图

先决条件

完成以下先决步骤:

  1. 使用具有以下可用区域之一的AWS帐户,其中有AWS HealthImaging可用:北弗吉尼亚(us-east-1),俄勒冈(us-west-2),爱尔兰(eu-west-1)和悉尼(ap-southeast-2)。
  2. 创建一个具有AWS Identity and Access Management(IAM)权限的Amazon SageMaker Studio 域和用户配置文件,以访问AWS HealthImaging。
  3. 启用JupyterLab v3扩展并安装Imjoy-jupyter-extension,如果您想在SageMaker笔记本上使用itkwidgets交互式可视化医学图像。

MAP连接器到AWS HealthImaging

AWS HealthImaging导入DICOM P10文件并将其转换为ImageSets,这是DICOM系列的优化表示。 AHI提供了对ImageSet元数据和ImageFrames的API访问。元数据包含JSON文档中的所有DICOM属性。 ImageFrames以高吞吐量无损格式High-Throughput JPEG2000 (HTJ2K)返回,可以快速解码。可以使用AWS命令行界面(AWS CLI)或AWS SDK检索ImageSets。

MONAI是一个医学图像AI框架,将研究突破和AI应用带入临床影响。MONAI Deploy是处理管道,允许端到端的工作流程,包括打包,测试,部署和运行临床生产中的医学影像AI应用程序。它包括MONAI Deploy App SDK,MONAI Deploy ExpressWorkflow ManagerInformatics Gateway。MONAI Deploy App SDK提供了可立即使用的算法和框架,加速构建医学图像AI应用程序,以及将应用程序打包到MAP容器中的实用工具。应用程序SDK中内置的基于标准的功能允许MAP平滑地集成到卫生IT网络中,其中对使用DICOM,HL7和FHIR等标准以及数据中心和云环境通信有要求。 MAPs可以使用预定义和定制运算符来进行DICOM图像加载,系列选择,模型推理和后处理

我们开发了一个使用AWS HealthImaging Python SDK Boto3的Python模块。您可以pip安装它并使用helper函数检索DICOM服务-对象对(SOP)实例,如下所示:

!pip install -q AHItoDICOMInterfacefrom AHItoDICOMInterface.AHItoDICOM import AHItoDICOMhelper = AHItoDICOM()instances = helper.DICOMizeImageSet(datastore_id=datastoreId , image_set_id=next(iter(imageSetIds)))

可以使用交互式3D医学图像查看器itkwidgets可视化输出SOP实例,可以在以下notebook中找到。 AHItoDICOM类利用多个进程从AWS HealthImaging中并行检索像素帧,并使用Python OpenJPEG库解码HTJ2K二进制块。 ImageSetIds来自给定AWS HealthImaging导入作业的输出文件。给定DatastoreId和导入JobId,可以检索ImageSetId,它与DICOM系列实例UID等效,如下所示:

imageSetIds = {}try:    response = s3.head_object(Bucket=OutputBucketName, Key=f"output/{res_createstore['datastoreId']}-DicomImport-{res_startimportjob['jobId']}/job-output-manifest.json")    if response['ResponseMetadata']['HTTPStatusCode'] == 200:        data = s3.get_object(Bucket=OutputBucketName, Key=f"output/{res_createstore['datastoreId']}-DicomImport-{res_startimportjob['jobId']}/SUCCESS/success.ndjson")        contents = data['Body'].read().decode("utf-8")        for l in contents.splitlines():            isid = json.loads(l)['importResponse']['imageSetId']            if isid in imageSetIds:                imageSetIds[isid]+=1            else:                imageSetIds[isid]=1except ClientError:    pass

通过使用本地AWS HealthImaging API功能,您可以使用ImageSetId分别检索DICOM标头元数据和图像像素。DICOM导出器将DICOM标头和图像像素聚合到Pydicom数据集中,可以通过MAP DICOM数据加载器进行处理。使用DICOMizeImageSet()函数,我们创建了一个连接器,用于从AWS HealthImaging加载图像数据,基于MAPDICOM数据加载器

class AHIDataLoaderOperator(Operator):    def __init__(self, ahi_client, must_load: bool = True, *args, **kwargs):        self.ahi_client = ahi_client        …        def _load_data(self, input_obj: string):            study_dict = {}            series_dict = {}            sop_instances = self.ahi_client.DICOMizeImageSet(input_obj['datastoreId'], input_obj['imageSetId'])

在上述代码中,ahi_client是AHItoDICOM DICOM导出器类的一个实例,其中包含了演示数据检索功能。我们将此新数据加载器操作符包含在MONAI Deploy App SDK创建的3D脾脏分割AI应用程序中。您可以首先探索如何在本地笔记本实例上创建和运行此应用程序,然后将此MAP应用程序部署到SageMaker托管推理终端点。

SageMaker异步推理

使用SageMaker 异步推理终端点处理具有大容量负载(高达1 GB)、长处理时间(高达15分钟)和接近实时延迟要求的请求。当没有要处理的请求时,这种部署选项可以将实例数量降为零以节省成本,非常适合医学图像ML推理工作负载。按照示例笔记本中的步骤创建和调用SageMaker异步推理终端点。要创建异步推理终端点,您需要首先创建一个SageMaker模型和端点配置。要创建SageMaker模型,您需要将带有定义的目录结构的model.tar.gz包加载到Docker容器中。model.tar.gz包括一个预训练的脾脏分割model.ts文件和一个自定义的inference.py文件。我们使用了一个预构建的容器,其中包含Python 3.8和PyTorch 1.12.1框架版本,以加载模型并运行预测。

在自定义的inference.py文件中,我们从AHItoDICOMInterface实例化一个AHItoDICOM帮助类,并在model_fn()函数中使用它来创建MAP实例,然后在predict_fn()函数中对每个推理请求运行MAP应用程序:

from app import AISpleenSegAppfrom AHItoDICOMInterface.AHItoDICOM import AHItoDICOMhelper = AHItoDICOM()def model_fn(model_dir, context):    …    monai_app_instance = AISpleenSegApp(helper, do_run=False,path="/home/model-server")def predict_fn(input_data, model):    with open('/home/model-server/inputImageSets.json', 'w') as f:        f.write(json.dumps(input_data))        output_folder = "/home/model-server/output"        if not os.path.exists(output_folder):            os.makedirs(output_folder)            model.run(input='/home/model-server/inputImageSets.json', output=output_folder, workdir='/home/model-server', model='/opt/ml/model/model.ts')

要调用异步端点,请将请求输入负载上传到Amazon Simple Storage Service(Amazon S3),该负载是指定要在其中运行推理的AWS HealthImaging数据存储ID和ImageSet ID的JSON文件:

sess = sagemaker.Session()InputLocation = sess.upload_data('inputImageSets.json', bucket=sess.default_bucket(), key_prefix=prefix, extra_args={"ContentType": "application/json"})response = runtime_sm_client.invoke_endpoint_async(EndpointName=endpoint_name, InputLocation=InputLocation, ContentType="application/json", Accept="application/json")output_location = response["OutputLocation"]

输出也可以在Amazon S3中找到。

SageMaker多模型实时推理

SageMaker实时推理端点满足交互式、低延迟的需求。此选项可以在一个端点后面的一个容器中托管多个模型,是部署多个机器学习模型的可扩展和具有成本效益的解决方案。SageMaker多模型端点使用带有GPU的NVIDIA Triton推理服务器来运行多个深度学习模型的推理。

在本部分中,我们将介绍如何创建和调用一个多模型端点,适应您自己的推理容器,在下面的示例笔记本中进行演示。不同模型可以在相同资源群上的共享容器中提供服务。多模型端点减少了部署开销,并根据端点的流量模式来扩展模型推理。我们使用了包括AWS开发工具在内的一组工具,包括Amazon CodeCommitAmazon CodeBuildAmazon CodePipeline来构建用于SageMaker模型推理的定制容器。我们准备了一个model_handler.py来使用您自己的容器代替前面示例中的inference.py文件,并实现了initialize()、preprocess()和inference()函数:

from app import AISpleenSegAppfrom AHItoDICOMInterface.AHItoDICOM import AHItoDICOMclass ModelHandler(object):    def __init__(self):        self.initialized = False        self.shapes = None    def initialize(self, context):        self.initialized = True        properties = context.system_properties        model_dir = properties.get("model_dir")        gpu_id = properties.get("gpu_id")        helper = AHItoDICOM()        self.monai_app_instance = AISpleenSegApp(helper, do_run=False, path="/home/model-server/")    def preprocess(self, request):        inputStr = request[0].get("body").decode('UTF8')        datastoreId = json.loads(inputStr)['inputs'][0]['datastoreId']        imageSetId = json.loads(inputStr)['inputs'][0]['imageSetId']        with open('/tmp/inputImageSets.json', 'w') as f:            f.write(json.dumps({"datastoreId": datastoreId, "imageSetId": imageSetId}))        return '/tmp/inputImageSets.json'    def inference(self, model_input):        self.monai_app_instance.run(input=model_input, output="/home/model-server/output/", workdir="/home/model-server/", model=os.environ["model_dir"]+"/model.ts")

在构建和推送容器到Amazon Elastic Container Registry(Amazon ECR)之后,您可以使用它创建SageMaker模型,并在给定的Amazon S3路径上添加不同的模型包(tar.gz文件):

model_name = "DEMO-MONAIDeployModel" + strftime("%Y-%m-%d-%H-%M-%S", gmtime())model_url = "s3://{}/{}/".format(bucket, prefix)container = "{}.dkr.ecr.{}.amazonaws.com/{}:dev".format( account_id, region, prefix )container = {"Image": container, "ModelDataUrl": model_url, "Mode": "MultiModel"}create_model_response = sm_client.create_model(ModelName=model_name, ExecutionRoleArn=role, PrimaryContainer=container)

值得注意的是,在这里,model_url只指定tar.gz文件夹的路径,您可以在调用端点时指定要用于推理的模型包,如以下代码所示:

Payload = {"inputs": [ {"datastoreId": datastoreId, "imageSetId": next(iter(imageSetIds))} ]}response = runtime_sm_client.invoke_endpoint(EndpointName=endpoint_name, ContentType="application/json", Accept="application/json", TargetModel="model.tar.gz", Body=json.dumps(Payload))

我们可以向现有的多模型推理端点添加更多模型,而无需更新端点或创建新端点。

清理

别忘了在lab-3lab-4笔记本中完成“删除托管资源”步骤,删除SageMaker推理端点。同时,为了节省成本,应关闭SageMaker笔记本实例。最后,可以调用AWS HealthImaging API函数或使用AWS HealthImaging控制台删除先前创建的图像集和数据存储:

for s in imageSetIds.keys():    medicalimaging.deleteImageSet(datastoreId, s)medicalimaging.deleteDatastore(datastoreId)

结论

本文向您展示了如何在使用MONAI Deploy App SDK构建的应用程序中创建一个MAP连接器到AWS HealthImaging,并加速从云原生DICOM存储到医学成像AI工作负载的图像数据检索。MONAI Deploy SDK可用于支持医院运营。我们还展示了两种在SageMaker上扩展部署MAP AI应用程序的托管选项。

请在GitHub存储库中查看示例笔记本,了解更多关于如何在SageMaker上使用存储在AWS HealthImaging中的医学图像部署MONAI应用程序的信息。要了解AWS可以为您提供什么服务,请联系AWS代表

有关其他资源,请参考以下内容:

Leave a Reply

Your email address will not be published. Required fields are marked *