Построить конвейер медицинского AI-сопоставления изображений с помощью MONAI Deploy на AWS

Создание конвейера для медицинского AI-сопоставления изображений с использованием MONAI Deploy на платформе AWS

В этом посте мы пишем совместно с Мином (Мелвином) Чином, Дэвидом Берикатом и Брэдом Геневро из NVIDIA.

Исследователям и разработчикам искусственного интеллекта в медицинской диагностике требуется масштабируемый корпоративный фреймворк для создания, развертывания и интеграции их приложений искусственного интеллекта. AWS и NVIDIA объединились, чтобы сделать эту задумку реальностью. AWS, NVIDIA и другие партнеры разрабатывают приложения и решения, делающие оказание медицинской помощи доступнее, экономически выгоднее и эффективнее путем ускорения облачного подключения в рамках предприятий в области медицинской диагностики. MONAI Deploy – это один из ключевых модулей в рамках MONAI (Medical Open Network for Artificial Intelligence), который разработан консорциумом ведущих академических и индустриальных лидеров, включая NVIDIA. AWS HealthImaging (AHI) – это масштабируемое, эффективное по производительности и стоимости ХИПАА-совместимое хранилище медицинских изображений. Мы разработали коннектор MONAI Deploy для интеграции медицинских приложений искусственного интеллекта с масштабируемым получением изображений за доли секунды, который работает в облаке, основываясь на облачных API. Модели и приложения MONAI могут быть размещены на Amazon SageMaker, который является полностью управляемым сервисом для развертывания моделей машинного обучения (ML) в масштабе. SageMaker берет на себя настройку и управление экземплярами для вывода результатов и предоставляет встроенные метрики и журналы для конечных точек, которые можно использовать для мониторинга и получения уведомлений. Он также предлагает различные типы экземпляров с графическими процессорами NVIDIA для вывода моделей ML, а также несколько вариантов развертывания моделей с автоматическим масштабированием, включая вывод в режиме реального времени, безсерверный вывод, асинхронный вывод и пакетное преобразование.

В этом посте мы покажем, как развернуть пакет приложений MONAI (MAP) с коннектором для AWS HealthImaging, используя многообъектную конечную точку SageMaker для вывода результатов в реальном времени и асинхронного вывода результатов. Эти два варианта покрывают большинство применений конвейера вывода результатов медицинской диагностики почти в реальном времени.

Обзор решения

На следующей диаграмме представлена архитектура решения.

Диаграмма архитектуры MONAI Deploy на AWS

Необходимые условия

Выполните следующие предварительные шаги:

  1. Используйте учетную запись AWS с одним из следующих регионов, где доступен AWS HealthImaging: Северная Вирджиния (us-east-1), Орегон (us-west-2), Ирландия (eu-west-1) и Сидней (ap-southeast-2).
  2. Создайте домен Amazon SageMaker Studio и профиль пользователя с системой контроля доступа и управления AWS Identity and Access Management (IAM), чтобы получить доступ к AWS HealthImaging.
  3. Активируйте расширение JupyterLab v3 и установите Imjoy-jupyter-extension, если хотите визуализировать медицинские изображения на интерактивной записной книжке SageMaker, используя itkwidgets.

MAP коннектор в AWS HealthImaging

AWS HealthImaging импортирует файлы DICOM P10 и преобразует их в ImageSetы, которые являются оптимизированным представлением серии DICOM. AHI предоставляет доступ к метаданным ImageSetа и ImageFrameов через API. Метаданные содержат все атрибуты DICOM в формате JSON документа. ImageFrameы возвращаются в кодировке без потерь (HTJ2K), которая может быть раскодирована очень быстро. ImageSetы можно получить, используя командную строку интерфейса AWS Command Line Interface (AWS CLI) или AWS SDKs.

MONAI – это фреймворк искусственного интеллекта для медицинского изображения, который позволяет применять научные открытия и приложения ИИ в клинической практике. MONAI Deploy – это обработчик, который обеспечивает комплексный рабочий процесс, включая упаковку, тестирование, развертывание и запуск медицинских приложений с использованием искусственного интеллекта на базе изображений. Он включает MONAI Deploy App SDK, MONAI Deploy Express, Менеджер рабочего процесса и Шлюз информатики. MONAI Deploy App SDK предоставляет готовые алгоритмы и фреймворк для ускоренного создания медицинских приложений искусственного интеллекта на базе изображений, а также вспомогательные инструменты для упаковки приложения в контейнер MAP. Встроенные возможности стандартов в SDK приложения позволяют MAP плавно интегрироваться в сети здравоохранения, что требует использования стандартов, таких как DICOM, HL7 и FHIR, а также работу в центрах обработки данных и в облачных средах. MAP может использовать как предопределенные, так и настраиваемые операторы для загрузки изображений DICOM, выбора серий, вывода модели и послепроцессинга

Мы разработали модуль Python, используя SDK Boto3 для Python AWS HealthImaging. Вы можете установить его с помощью pip и использовать вспомогательную функцию для получения экземпляров 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. Идентификаторы ImageSet получаются из выходных файлов заданного задания импорта AWS HealthImaging. Зная идентификаторы Datastore и JobId импорта, можно получить идентификатор ImageSet, который эквивалентен UID экземпляра серии DICOM, следующим образом:

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 вы можете отдельно получить метаданные заголовка DICOM и пиксели изображения с использованием нативных функций API HealthImaging AWS. Экспортер DICOM-изображений объединяет заголовки DICOM и пиксели изображений в набор данных Pydicom, который может быть обработан оператором загрузчика данных DICOM-карты MAP DICOM. С помощью функции DICOMizeImageSet() мы создали соединитель для загрузки изображений из AWS HealthImaging на основе оператора загрузчика данных DICOM-карты MAP 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'])

В представленном коде ahi_client является экземпляром класса экспортера DICOM-изображений AHItoDICOM со стандартизованными функциями извлечения данных. Мы включили этот новый оператор загрузчика данных в приложение искусственного интеллекта по сегментации селезенки в 3D-изображении, созданное с помощью MONAI Deploy App SDK. Вы можете сначала изучить, как создать и запустить это приложение на локальном экземпляре блокнота, а затем развернуть это приложение MAP на управляемые конечные точки SageMaker.

Асинхронный вывод SageMaker

Асинхронная конечная точка вывода SageMaker используется для запросов с большими размерами полезной нагрузки (до 1 ГБ), долгими временем обработки (до 15 минут) и требованиями к близкому к реальному времени задержке. Если нет запросов для обработки, эта опция развертывания может уменьшить количество экземпляров до нуля для экономии затрат, что является идеальным для нагрузок медицинских изображений обработки машинного обучения. Следуйте инструкциям в образцовом блокноте для создания и вызова асинхронной конечной точки вывода SageMaker. Чтобы создать асинхронную конечную точку вывода, вам необходимо сначала создать модель SageMaker и конфигурацию конечной точки. Чтобы создать модель SageMaker, вам необходимо загрузить пакет model.tar.gz с определенной структурой каталогов в контейнер Docker. Пакет model.tar.gz включает файлы модели.ts предварительно обученной модели сегментации селезенки и файла инференса inference.py. Мы использовали предварительно созданный контейнер с версиями фреймворка Python 3.8 и PyTorch 1.12.1 для загрузки модели и выполнения прогнозов.

В настраиваемом файле inference.py мы создаем экземпляр вспомогательного класса AHItoDICOM из интерфейса AHItoDICOMInterface и используем его для создания экземпляра MAP в функции model_fn(), а также для запуска приложения MAP для каждого запроса вывода в функции predict_fn():

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), которая является файлом JSON, задающим идентификатор хранилища данных AWS HealthImaging и идентификатор ImageSet для выполнения вывода:

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 с использованием сервера вывода Triton от NVIDIA и GPU можно выполнять вывод результатов нескольких моделей глубокого обучения.

В этом разделе мы рассмотрим, как создать и вызвать многоцелевую конечную точку адаптируя ваш контейнер вывода в следующем образцовом блокноте. Разные модели могут быть обслужены в общем контейнере на одном наборе ресурсов. Многоцелевые конечные точки снижают накладные расходы на развертывание и масштабируют вывод модели на основе паттернов трафика к конечной точке. Мы использовали инструменты разработчика AWS, включая Amazon CodeCommit, Amazon CodeBuild и Amazon 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 с его помощью, а также разные пакеты моделей (файлы tar.gz) по заданному пути в Amazon S3:

model_name = "ДЕМО-MONAIDeployModel" + strftime("%Y-%m-%d-%H-%M-%S", gmtime())
model_url = "s3://{}/{}/".формат(bucket, prefix)
container = "{}.dkr.ecr.{}.amazonaws.com/{}:dev".формат(account_id, region, prefix)
container = {"Изображение": контейнер, "ModelDataUrl": model_url, "Режим": "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 HealthImaging сервиса AWS, либо использовать консоль AWS HealthImaging для удаления ранее созданных наборов изображений и хранилищ данных:

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

Заключение

В этой статье мы показали, как создать коннектор MAP для AWS HealthImaging, который можно повторно использовать в приложениях, построенных с использованием SDK приложений MONAI Deploy, чтобы интегрировать и ускорить извлечение образов данных из облачного хранилища DICOM в рабочие нагрузки искусственного интеллекта по медицинскому изображению. SDK MONAI Deploy может использоваться для поддержки операций в больницах. Мы также продемонстрировали два варианта размещения для развертывания приложений искусственного интеллекта MAP на SageMaker в масштабе.

Ознакомьтесь с примерными записными книжками в репозитории GitHub, чтобы узнать больше о том, как развернуть приложения MONAI на SageMaker с медицинскими изображениями, хранящимися в AWS HealthImaging. Чтобы узнать, что может сделать AWS для вас, свяжитесь с представителем AWS.

Для получения дополнительных ресурсов обратитесь к следующему: