「初めに、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つのオプションは、ほとんどリアルタイムの医療画像推論パイプラインの大部分をカバーしています。
ソリューションの概要
以下のダイアグラムは、ソリューションアーキテクチャを示しています。
- 「Amazon CodeWhispererで持続可能性を最適化しましょう」
- テストに合格する:NVIDIAがMLPerfベンチマークでジェネラティブAIのトレーニングをターボチャージします
- NVIDIAはAPECの国々と協力し、人々の生活を変え、機会を増やし、成果を改善します
前提条件
以下の前提条件の手順を完了してください:
- AWS HealthImagingが利用可能な以下のリージョンのいずれかを使用したAWSアカウントを使用します:北バージニア(
us-east-1
)、オレゴン(us-west-2
)、アイルランド(eu-west-1
)、およびシドニー(ap-southeast-2
)。 - AWS HealthImagingにアクセスするためのAmazon SageMaker Studio ドメインとユーザープロファイルを持つAWS Identity and Access Management(IAM)の権限を持つユーザーを作成します。
- 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 CodeCommit、Amazon CodeBuild、Amazon 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-3 と lab-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 代表までお問い合わせください。
追加リソースについては、以下を参照してください:
- AWS 上の医療画像
- AWS HealthImagingの紹介—規模化のために特別に設計された医療画像
- AWS HealthImaging 開発者ガイド
- オンプレミスの医療画像データとAWS HealthImagingの統合
- AWS と NVIDIA
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles
- クラウドウォッチの高度なメトリクス、ダッシュボード、アラートを使用してAWSのコストを最適化する
- 「Google AIがMetNet-3を導入:包括的なニューラルネットワークモデルで天気予報を革新する」
- この中国のAIモデル、Baichuan2-192kモデルはChatGPTやClaude2を超えることができるのか? 最長のコンテキストモデルを持つBaichuan Intelligentが公開した、この中国のスタートアップ「Baichuan Intelligent」のモデルに会いましょう
- サムスンは、「Gauss」という新しいAI言語モデルを発表し、ChatGPTの支配に挑む
- 『circ2CBAを紹介 circRNA-RBP結合サイトの予測を革新する新しい深層学習モデル』
- 「スタンフォードのこのAI論文では、スパースで解釈可能なニューラルネットワークのためのコードブック特徴が紹介されています」
- このAIペーパーは、東京大学で深層学習を超新星シミュレーションの問題に応用しました