Esta publicación está coescrita con Ming (Melvin) Qin, David Bericat y Brad Genereaux de NVIDIA.
Los investigadores y desarrolladores de IA de imágenes médicas necesitan un marco empresarial escalable para construir, implementar e integrar sus aplicaciones de IA. AWS y NVIDIA se han unido para hacer realidad esta visión. AWS, NVIDIA y otros socios crean aplicaciones y soluciones para hacer que la atención médica sea más accesible, asequible y eficiente al acelerar la conectividad en la nube de las imágenes empresariales. Implementación de MONAI es uno de los módulos clave dentro MONJES (Red Médica Abierta para Inteligencia Artificial) desarrollada por un consorcio de líderes académicos y de la industria, incluido NVIDIA. AWS HealthImaging (AHI) es un almacén de imágenes médicas rentable, altamente escalable y apto para HIPAA. Hemos desarrollado un conector MONAI Deploy para AHI para integrar aplicaciones de IA de imágenes médicas con latencias de recuperación de imágenes de menos de un segundo a escala impulsadas por API nativas de la nube. Los modelos y aplicaciones de IA de MONAI se pueden alojar en Amazon SageMaker, que es un servicio totalmente administrado para implementar modelos de aprendizaje automático (ML) a escala. SageMaker se encarga de configurar y administrar instancias para inferencia y proporciona métricas y registros integrados para puntos finales que puede usar para monitorear y recibir alertas. También ofrece una variedad de instancias de GPU NVIDIA para inferencia de aprendizaje automático, así como múltiples opciones de implementación de modelos con escalado automático, incluida la inferencia en tiempo real, la inferencia sin servidor, la inferencia asíncrona y la transformación por lotes.
En esta publicación, demostramos cómo implementar un paquete de aplicaciones (MAP) MONAI con el conector para AWS HealthImaging, utilizando un punto final multimodelo de SageMaker para inferencia en tiempo real e inferencia asincrónica. Estas dos opciones cubren la mayoría de los casos de uso de canales de inferencia de imágenes médicas casi en tiempo real.
Descripción general de la solución
El siguiente diagrama ilustra la arquitectura de la solución.
Requisitos previos
Complete los siguientes pasos previos:
- Utilice una cuenta de AWS con una de las siguientes regiones donde AWS HealthImaging está disponible: Virginia del Norte (
us-east-1
), Oregón (us-west-2
), Irlanda (eu-west-1
), y Sídney (ap-southeast-2
). - Cree un dominio y un perfil de usuario de Amazon SageMaker Studio con permiso de AWS Identity and Access Management (IAM) para acceder a AWS HealthImaging.
- Habilite la extensión JupyterLab v3 e instale Imjoy-jupyter-extension si desea visualizar imágenes médicas en el cuaderno SageMaker de forma interactiva usando widgets.
Conector MAP para AWS HealthImaging
AWS HealthImaging importa archivos DICOM P10 y los convierte en ImageSets, que son una representación optimizada de una serie DICOM. AHI proporciona acceso API a los metadatos de ImageSet e ImageFrames. Los metadatos contienen todos los atributos DICOM en un documento JSON. Los ImageFrames se devuelven codificados en el JPEG2000 de alto rendimiento (HTJ2K) formato sin pérdidas, que se puede decodificar extremadamente rápido. Los ImageSets se pueden recuperar mediante la interfaz de línea de comandos de AWS (AWS CLI) o los SDK de AWS.
MONAI es un marco de IA para imágenes médicas que lleva los avances de la investigación y las aplicaciones de IA al impacto clínico. MONAI Deploy es el proceso de procesamiento que permite el flujo de trabajo de un extremo a otro, incluido el empaquetado, las pruebas, la implementación y la ejecución de aplicaciones de IA de imágenes médicas en la producción clínica. Comprende el MONJES Implementar el SDK de la aplicación, Implementación rápida de MONAI, Administrador de flujo de trabajoy Portal de informática. El SDK de la aplicación MONAI Deploy proporciona algoritmos listos para usar y un marco para acelerar la creación de aplicaciones de IA para imágenes médicas, así como herramientas de utilidad para empaquetar la aplicación en un contenedor MAP. Las funcionalidades integradas basadas en estándares en el SDK de la aplicación permiten que MAP se integre sin problemas en las redes de TI sanitarias, lo que requiere el uso de estándares como DICOM, HL7 y FHIR, y en entornos de centros de datos y de nube. Los MAP pueden utilizar operadores predefinidos y personalizados para la carga de imágenes DICOM, selección de series, inferencia de modelos y posprocesamiento.
Hemos desarrollado un módulo de pitón utilizando el SDK Boto3 de Python de AWS HealthImaging. Puede instalarlo y usar la función auxiliar para recuperar instancias de par de objetos-servicio (SOP) DICOM de la siguiente manera:
!pip install -q AHItoDICOMInterface
from AHItoDICOMInterface.AHItoDICOM import AHItoDICOM
helper = AHItoDICOM()
instances = helper.DICOMizeImageSet(datastore_id=datastoreId , image_set_id=next(iter(imageSetIds)))
Las instancias de SOP de salida se pueden visualizar utilizando los itkwidgets del visor interactivo de imágenes médicas en 3D en los siguientes computadora portátil. El AHItoDICOM La clase aprovecha múltiples procesos para recuperar fotogramas de píxeles de AWS HealthImaging en paralelo, y descodificar el Blobs binarios HTJ2K utilizando el Biblioteca Python OpenJPEG. Los ImageSetIds provienen de los archivos de salida de un trabajo de importación de AWS HealthImaging determinado. Dado el DatastoreId y el Import JobId, puede recuperar el ImageSetId, que es equivalente al UID de la instancia de la serie DICOM, de la siguiente manera:
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)=1
except ClientError:
pass
Con ImageSetId, puede recuperar los metadatos del encabezado DICOM y los píxeles de la imagen por separado utilizando las funciones nativas de la API AWS HealthImaging. El Agregados exportadores DICOM los encabezados DICOM y los píxeles de la imagen en el Pydicom conjunto de datos, que puede ser procesado por el Operador del cargador de datos MAP DICOM. Usando la función DICOMizeImageSet(), hemos creado un conector para cargar datos de imágenes desde AWS HealthImaging, basado en el MAP Operador de cargador de datos DICOM:
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'))
En el código anterior, ahi_client
es una instancia de la clase exportadora DICOM AHItoDICOM, con funciones de recuperación de datos ilustradas. Hemos incluido este nuevo operador de cargador de datos en un Aplicación de IA de segmentación del bazo en 3D creada por el SDK de la aplicación MONAI Deploy. Primero puede explorar cómo crear y ejecutar esta aplicación. en una instancia de cuaderno localy luego implemente esta aplicación MAP en los puntos finales de inferencia administrados por SageMaker.
Inferencia asincrónica de SageMaker
Se utiliza un punto final de inferencia asíncrona de SageMaker para solicitudes con tamaños de carga grandes (hasta 1 GB), tiempos de procesamiento prolongados (hasta 15 minutos) y requisitos de latencia casi en tiempo real. Cuando no hay solicitudes para procesar, esta opción de implementación puede reducir el recuento de instancias a cero para ahorrar costos, lo cual es ideal para cargas de trabajo de inferencia de aprendizaje automático de imágenes médicas. Siga los pasos del cuaderno de muestra para crear e invocar el punto final de inferencia asincrónica de SageMaker. Para crear un punto final de inferencia asincrónica, primero deberá crear un modelo de SageMaker y una configuración de punto final. Para crear un modelo de SageMaker, necesitará cargar un paquete model.tar.gz con un estructura de directorio definida en un contenedor Docker. El paquete model.tar.gz incluye un archivo model.ts de segmentación del bazo previamente entrenado y un archivo inference.py personalizado. Hemos utilizado un contenedor prediseñado con las versiones de framework Python 3.8 y PyTorch 1.12.1 para cargar el modelo y ejecutar predicciones.
en lo personalizado inferencia.py archivo, creamos una instancia de una clase auxiliar AHItoDICOM desde AHItoDICOMInterface y la usamos para crear una instancia MAP en el model_fn()
función, y ejecutamos la aplicación MAP en cada solicitud de inferencia en el predict_fn()
función:
from app import AISpleenSegApp
from AHItoDICOMInterface.AHItoDICOM import AHItoDICOM
helper = 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")
Para invocar el punto final asíncrono, deberá cargar la carga útil de entrada de la solicitud en Amazon Simple Storage Service (Amazon S3), que es un archivo JSON que especifica el ID del almacén de datos de AWS HealthImaging y el ID del ImageSet para ejecutar la inferencia:
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")
El resultado también se puede encontrar en Amazon S3.
Inferencia en tiempo real multimodelo de SageMaker
Los puntos finales de inferencia en tiempo real de SageMaker cumplen con requisitos interactivos y de baja latencia. Esta opción puede alojar varios modelos en un contenedor detrás de un punto final, lo cual es una solución escalable y rentable para implementar varios modelos de ML. Un punto final multimodelo de SageMaker utiliza NVIDIA Triton Inference Server con GPU para ejecutar múltiples inferencias de modelos de aprendizaje profundo.
En esta sección, explicamos cómo crear e invocar un punto final multimodelo adaptando su propio contenedor de inferencia en lo siguiente cuaderno de muestra. Se pueden servir diferentes modelos en un contenedor compartido en la misma flota de recursos. Los puntos finales multimodelo reducen la sobrecarga de implementación y escalan las inferencias del modelo en función de los patrones de tráfico hacia el punto final. Utilizamos herramientas de desarrollo de AWS, incluidas Amazon CodeCommit, Amazon CodeBuild y Amazon CodePipeline, para crear el contenedor personalizado para la inferencia del modelo de SageMaker. preparamos un model_handler.py para traer su propio contenedor en lugar del archivo inference.py en el ejemplo anterior, e implementó las funciones inicializar(), preproceso() e inferencia():
from app import AISpleenSegApp
from AHItoDICOMInterface.AHItoDICOM import AHItoDICOM
class 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")
Después de crear el contenedor y enviarlo a Amazon Elastic Container Registry (Amazon ECR), puede crear un modelo de SageMaker con él, además de diferentes paquetes de modelos (archivos tar.gz) en una ruta determinada de 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)
Es de destacar que el model_url
aquí solo especifica la ruta a una carpeta de archivos tar.gz, y usted especifica qué paquete de modelo usar para la inferencia cuando invoca el punto final, como se muestra en el siguiente código:
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))
Podemos agregar más modelos al punto final de inferencia multimodelo existente sin tener que actualizar el punto final o crear uno nuevo.
Limpiar
No olvides completar el Eliminar los recursos de hosting paso en el laboratorio-3 y laboratorio-4 cuadernos para eliminar los puntos finales de inferencia de SageMaker. También debe rechazar la instancia del cuaderno SageMaker para ahorrar costos. Finalmente, puede llamar a la función API de AWS HealthImaging o utilizar la consola de AWS HealthImaging para eliminar los conjuntos de imágenes y el almacén de datos creados anteriormente:
for s in imageSetIds.keys():
medicalimaging.deleteImageSet(datastoreId, s)
medicalimaging.deleteDatastore(datastoreId)
Conclusión
En esta publicación, le mostramos cómo crear un conector MAP para AWS HealthImaging, que es reutilizable en aplicaciones creadas con el SDK de la aplicación MONAI Deploy, para integrarse y acelerar la recuperación de datos de imágenes desde un almacén DICOM nativo de la nube hasta cargas de trabajo de IA de imágenes médicas. . El SDK de MONAI Deploy se puede utilizar para respaldar las operaciones del hospital. También demostramos dos opciones de alojamiento para implementar aplicaciones MAP ai en SageMaker a escala.
Revise los cuadernos de ejemplo en el repositorio de GitHub para obtener más información sobre cómo implementar aplicaciones MONAI en SageMaker con imágenes médicas almacenadas en AWS HealthImaging. Para saber qué puede hacer AWS por usted, comuníquese con un Representante de AWS.
Para recursos adicionales, consulte lo siguiente:
Sobre los autores
Ming (Melvin) Qin es un colaborador independiente del equipo de atención médica de NVIDIA, enfocado en desarrollar un marco y una plataforma de aplicación de inferencia de IA para llevar la IA a los flujos de trabajo de imágenes médicas. Antes de unirse a NVIDIA en 2018 como miembro fundador de Clara, Ming pasó 15 años desarrollando Radiology PACS y Workflow SaaS como ingeniero/arquitecto líder en Stentor Inc., posteriormente adquirida por Philips Healthcare para formar Enterprise Imaging.
David Bericat es gerente de producto para atención médica en NVIDIA, donde dirige el grupo de trabajo Project MONAI Deploy para llevar la IA desde la investigación a las implementaciones clínicas. Su pasión es acelerar la innovación sanitaria a nivel mundial traduciéndola en un verdadero impacto clínico. Anteriormente, David trabajó en Red Hat, implementando principios de código abierto en la intersección de la IA, la nube, la informática de punta y la IoT. Sus momentos de mayor orgullo incluyen ir al campamento base del Everest y jugar fútbol durante más de 20 años.
Brad Generéaux es líder global de alianzas sanitarias en NVIDIA, donde es responsable de las relaciones con los desarrolladores con especial atención en imágenes médicas para acelerar la inteligencia artificial y las soluciones de aprendizaje profundo, visualización, virtualización y análisis. Brad evangeliza la adopción e integración ubicuas de flujos de trabajo de imágenes médicas y atención médica sin interrupciones en la práctica clínica diaria, con más de 20 años de experiencia en TI para el cuidado de la salud.
pandilla fu es arquitecto de soluciones sanitarias en AWS. Tiene un doctorado en Ciencias Farmacéuticas de la Universidad de Mississippi y tiene más de 10 años de experiencia en investigación biomédica y en tecnología. Le apasiona la tecnología y el impacto que puede tener en la atención sanitaria.
JP Leger es un arquitecto senior de soluciones que brinda soporte a centros médicos académicos y flujos de trabajo de imágenes médicas en AWS. Tiene más de 20 años de experiencia en ingeniería de software, TI para atención médica e imágenes médicas, con amplia experiencia en arquitectura de sistemas para rendimiento, escalabilidad y seguridad en implementaciones distribuidas de grandes volúmenes de datos en las instalaciones, en la nube e híbridos con análisis e inteligencia artificial. .
Chris Hafey es arquitecto principal de soluciones en Amazon Web Services. Tiene más de 25 años de experiencia en la industria de imágenes médicas y se especializa en la construcción de sistemas escalables de alto rendimiento. Es el creador del popular proyecto de código abierto CornerstoneJS, que impulsa el popular visor de huella cero de código abierto OHIF. Contribuyó a la especificación DICOMweb y continúa trabajando para mejorar su rendimiento para la visualización basada en web.