「初めに、AWS上でMONAI Deployを使用して医療画像AI推論パイプラインを構築しましょう!」

「医療画像AI推論パイプラインを構築するために、AWS上でMONAI Deployを使いましょう!」

この記事は、NVIDIAのMing(Melvin)Qin、David Bericat、Brad Genereauxと共同執筆されました。

医療画像AIの研究者や開発者は、スケーラブルなエンタープライズフレームワークを必要としています。これにより、AIアプリケーションを構築し、展開し、統合することができます。AWSとNVIDIAは、このビジョンを現実のものにするために協力しています。 AWS、NVIDIA、およびその他のパートナーは、エンタープライズ画像のクラウド接続を加速することで、医療のアクセシビリティ、費用対効果、効率を向上させるためのアプリケーションとソリューションを構築しています。 MONAI Deployは、NVIDIAを含む学術および業界のリーダーからなるコンソーシアムによって開発された< a href=”/?s=MONAI”>MONAI(Medical Open Network for Artificial Intelligence)内の主要なモジュールの1つです。 AWS HealthImaging(AHI)は、HIPAAに適合し、高スケーラビリティで高いパフォーマンスを発揮し、費用対効果に優れた医療イメージストアです。私たちは、クラウドネイティブなAPIを利用してスケール化されたサブセカンドの画像検索待ち時間で医療画像AIアプリケーションを統合するためのMONAI DeployコネクタをAHIに開発しました。 MONAI AIモデルとアプリケーションは、スケールできるフルマネージドサービスであるAmazon SageMakerにホストできます。 SageMakerは推論のためのインスタンスのセットアップと管理を担当し、モニタリングとアラートのための組み込みのメトリクスとログを提供します。また、ML推論用にさまざまなNVIDIA GPUインスタンスを提供し、リアルタイム推論、サーバーレス推論、非同期推論、およびバッチ変換を含む自動スケーリングを備えた複数のモデル展開オプションを提供します。

この記事では、MONAI Application Package(MAP)をAWS HealthImagingに接続するためのSageMakerマルチモデルエンドポイントを使用して、リアルタイム推論と非同期推論の両方でMONAIを展開する方法を示します。これらの2つのオプションは、ほとんどリアルタイムの医療画像推論パイプラインの大部分をカバーしています。

ソリューションの概要

以下のダイアグラムは、ソリューションアーキテクチャを示しています。

AWS上のMONAI Deployアーキテクチャダイアグラム

前提条件

以下の前提条件の手順を完了してください:

  1. AWS HealthImagingが利用可能な以下のリージョンのいずれかを使用したAWSアカウントを使用します:北バージニア(us-east-1)、オレゴン(us-west-2)、アイルランド(eu-west-1)、およびシドニー(ap-southeast-2)。
  2. AWS HealthImagingにアクセスするためのAmazon SageMaker Studio ドメインとユーザープロファイルを持つAWS Identity and Access Management(IAM)の権限を持つユーザーを作成します。
  3. JupyterLab v3拡張機能を有効にし、itkwidgetsを使用してSageMakerノートブック上で医療画像を対話的に視覚化するためにImjoy-jupyter-extensionをインストールします。

MAPコネクターからAWS HealthImagingへの接続

AWS HealthImagingはDICOM P10ファイルをインポートし、DICOMシリーズの最適化された表現であるImageSetに変換します。AHIはImageSetメタデータとImageFramesへのAPIアクセスを提供します。メタデータには、すべてのDICOM属性がJSONドキュメントで含まれています。ImageFramesは、非常に高速にデコードできるHigh-Throughput JPEG2000 (HTJ2K)無損失形式でエンコードされて返されます。ImageSetは、AWS Command Line Interface(AWS CLI)またはAWS SDKを使用して取得できます。

MONAIは、研究の突破口とAIアプリケーションを臨床の影響に取り込む医療画像AIフレームワークです。MONAI Deployは、パッケージング、テスト、展開、および臨床生産での医療画像AIアプリケーションの実行を可能にする処理パイプラインです。それには、MONAI Deploy App SDK、MONAI Deploy Expressワークフローマネージャー、およびインフォマティクスゲートウェイが含まれます。MONAI Deploy App SDKには、即座に使用できるアルゴリズムと医療画像AIアプリケーションの構築を加速するフレームワークが提供されており、アプリケーションをMAPコンテナにパッケージングするためのユーティリティツールも備えています。アプリSDKの組み込みの標準ベースの機能により、MAPはDICOM、HL7、FHIRなどの標準を使用して、ヘルスITネットワークにスムーズに統合できます。これには、データセンターおよびクラウド環境をまたいで行います。MAPは、DICOM画像の読み込み、シリーズの選択、モデルの推論、および事後処理において、事前定義済みおよびカスタマイズ済みのオペレータを使用できます。

AWS HealthImagingのPython SDK Boto3を使用してPythonモジュールを開発しました。それをpip installして、ヘルパー関数を使用してDICOM Service-Object Pair(SOP)インスタンスを取得できます:

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

出力されたSOPインスタンスは、インタラクティブな3D医療画像ビューアーitkwidgetsを使用して視覚化できます。次のノートブックで使用します。AHItoDICOMクラスは、複数のプロセスを利用してAWS HealthImagingからピクセルフレームを並列に取得し、HTJ2KバイナリブロブPython OpenJPEGライブラリを使用してデコードします。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

ImageSetIdを使用すると、ネイティブのAWS HealthImaging API関数を使用してDICOMヘッダのメタデータと画像ピクセルを別々に取得することができます。 DICOMエクスポータは、DICOMヘッダと画像ピクセルをPydicomデータセットに集約し、MAP DICOMデータローダオペレータで処理することができます。DICOMizeImageSet()関数を使用して、MAP DICOMデータローダオペレータに基づいて、AWS HealthImagingから画像データを読み込むコネクタを作成しました:

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非同期推論

サイズが大きい(最大1 GB)、処理時間が長い(最大15分)、およびほぼリアルタイムのレイテンシー要件があるリクエストに対して、SageMaker 非同期推論エンドポイントが使用されます。処理するリクエストがない場合、この展開オプションはコスト削減のためにインスタンス数をゼロにダウンスケールすることができ、医療画像のML推論ワークロードに適しています。SageMaker非同期推論エンドポイントを作成して呼び出すための手順については、サンプルノートブックを参照してください。非同期推論エンドポイントを作成するには、まずSageMakerモデルとエンドポイント構成を作成する必要があります。SageMakerモデルを作成するには、定義済みのディレクトリ構造を持つmodel.tar.gzパッケージをDockerコンテナに読み込む必要があります。model.tar.gzパッケージには、事前学習済みの脾臓セグメンテーションモデル.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のリアルタイム推論エンドポイントは、インタラクティブで低遅延の要件を満たします。このオプションでは、1つのエンドポイントの背後に1つのコンテナで複数のモデルをホストすることができます。これは、複数のMLモデルを展開するためのスケーラブルで費用効果の高いソリューションです。SageMakerのマルチモデルエンドポイントでは、NVIDIA Triton Inference Serverを使用して、複数のディープラーニングモデルの推論を実行します。

このセクションでは、以下のサンプルノートブックで、独自の推論コンテナを適応するマルチモデルエンドポイントを作成し呼び出す方法を説明します。異なるモデルを共有コンテナで同じリソースのフリート上で提供することができます。マルチモデルエンドポイントは、展開のオーバーヘッドを削減し、エンドポイントへのトラフィックパターンに基づいてモデルの推論をスケーリングします。このために、Amazon CodeCommitAmazon CodeBuildAmazon CodePipelineなどのAWS開発者ツールを使用して、SageMakerモデル推論用のカスタマイズされたコンテナを構築しました。前の例でのinference.pyファイルの代わりに、model_handler.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モデルを作成し、さまざまなモデルパッケージ(tar.gzファイル)を適切なAmazon S3パスに配置できます:

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ノートブックインスタンスを停止してください。最後に、以下のAPI関数を呼び出すか、AWS HealthImagingコンソールを使用して、前に作成したイメージセットとデータストアを削除できます:

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

結論

この記事では、MONAI Deploy App SDKで構築されたアプリケーションと統合し、クラウドネイティブなDICOMストアから医療画像AIワークロードへの画像データの取得を統合し、加速するためのAWS HealthImagingへのMAPコネクタを作成する方法を紹介しました。MONAI Deploy SDKは、病院の業務をサポートするために使用することができます。また、SageMaker上でMAP AIアプリケーションをスケールアップするための2つのホスティングオプションも紹介しました。

GitHub リポジトリの例のノートブックを見て、AWS HealthImagingに格納された医療画像を使用してSageMakerでMONAIアプリケーションを展開する方法についてさらに詳しく学びましょう。AWSがあなたに何ができるかを知るには、AWS 代表までお問い合わせください。

追加リソースについては、以下を参照してください:

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

機械学習

OpenAIのモデレーションAPIを使用してコンテンツのモデレーションを強化する

プロンプトエンジニアリングの台頭や、言語モデルの大規模な成果により、私たちの問いに対する応答を生成する際の大変な成果...

AIニュース

「MITのPhotoGuardは、AI画像操作に対抗するためにAIを使用します」

人工知能(AI)が進化するにつれて、ハイパーリアルな画像の生成と操作がますます利用可能になっています。生成AI技術は創造...

機械学習

AIがYouTubeの多言語吹替を開始します

世界最大の動画共有プラットフォームであるYouTubeは、AI技術の統合により、コンテンツクリエイターが世界中の観客と接触する...

機械学習

「LLMプロンプティングにおける思考の一端:構造化されたLLM推論の概要」

スマートフォンやスマートホームの時代に、単なる指示に従うだけでなく、私たちと同様に複雑な論理を扱い、実際に考えるAIを...

機械学習

中国における大量生産自動運転の課題

自律走行は、世界でも最も困難な運転の一つが既に存在する中国では、特に難しい課題です主に3つの要因が関係しています:動的...

データサイエンス

「変化の風を操る:2024年の主要なテクノロジートレンド」

AIの進歩からインフラのイノベーション、メールセキュリティの要件など、将来の展望を把握し、組織を戦略的に導くための理解...