Автоматически создавайте впечатления на основе результатов в радиологических отчетах с помощью генеративного искусственного интеллекта на платформе AWS

Автоматичесные впечатления на основе радиологических отчетов с помощью ГИИ на платформе AWS

Рентгенологические отчеты – это всесторонние, длинные документы, которые описывают и интерпретируют результаты рентгенологического исследования. В типичном рабочем процессе рентгенолог наблюдает, читает и интерпретирует изображения, а затем кратко резюмирует ключевые результаты. Резюмирование (или вывод) является самой важной частью отчета, поскольку оно помогает врачам и пациентам сосредоточиться на критических сведениях отчета, содержащих информацию для клинического принятия решений. Создание четкого и впечатляющего впечатления требует гораздо больше усилий, чем просто повторение результатов. Весь процесс является трудоемким, тратит много времени и подвержен ошибкам. Часто врачам требуется годы обучения, чтобы накопить достаточно опыта в написании кратких и информативных резюмирований рентгенологических отчетов, что еще больше подчеркивает важность автоматизации процесса. Кроме того, автоматическое создание кратких выводов из отчетов является важным для рентгенологии. Оно позволяет переводить отчеты на понятный человеку язык, тем самым облегчая пациентам чтение длинных и непонятных отчетов.

Для решения этой проблемы мы предлагаем использование генеративного искусственного интеллекта (AI), типа AI, который может создавать новый контент и идеи, включая разговоры, истории, изображения, видео и музыку. Генеративный искусственный интеллект работает на основе моделей машинного обучения (ML) – очень больших моделей, которые предварительно обучаются на огромных объемах данных и обычно называются фундаментальными моделями (FMs). Последние достижения в области ML (в частности, изобретение архитектуры нейронных сетей на основе трансформеров) привели к появлению моделей с миллиардами параметров или переменных. Предлагаемое решение в этом сообщении использует настройку предварительно обученных больших моделей языка (LLMs), чтобы помочь генерировать выводы на основе результатов в рентгенологических отчетах.

В этом сообщении демонстрируется стратегия для настройки публично доступных LLM для задачи краткого изложения рентгенологических отчетов с использованием услуг AWS. LLM показали замечательные возможности в понимании и генерации естественного языка, служа как фундаментальные модели, которые могут быть адаптированы к различным областям и задачам. Использование предварительно обученной модели имеет значительные преимущества. Оно уменьшает вычислительные затраты, уменьшает углеродный след и позволяет использовать передовые модели, не требуя их обучения с нуля.

Наше решение использует модель FLAN-T5 XL FM с использованием Amazon SageMaker JumpStart, который представляет собой центр машинного обучения, предлагающий алгоритмы, модели и решения ML. Мы демонстрируем, как это сделать с помощью блокнота в Amazon SageMaker Studio. Настройка предварительно обученной модели включает дополнительное обучение на конкретных данных для улучшения производительности по другой, но связанной задаче. В данном решении производится настройка модели FLAN-T5 XL, которая является усовершенствованной версией модели T5 (Text-to-Text Transfer Transformer) общего назначения LLMs. T5 переформулирует задачи обработки естественного языка (NLP) в унифицированный текстовый формат, в отличие от моделей стиля BERT, которые могут выводить только классификационную метку или диапазон входных данных. Она настроена для задачи краткого изложения на основе 91 544 свободных текстовых рентгенологических отчетов, полученных из набора данных MIMIC-CXR.

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

В этом разделе мы обсудим основные компоненты нашего решения: выбор стратегии для задачи, настройка LLM и оценка результатов. Мы также иллюстрируем архитектуру решения и шаги для его реализации.

Определение стратегии для задачи

Существует несколько стратегий для автоматизации краткого изложения клинических отчетов. Например, мы могли бы использовать специализированную модель языка, обученную на клинических отчетах с нуля. В качестве альтернативы мы могли бы напрямую настраивать публично доступную модель общего назначения для выполнения клинической задачи. Использование настроенной модели, универсальной для домена, может быть необходимо в случаях, когда обучение модели языка с нуля слишком дорого. В данном решении мы демонстрируем последний подход, используя модель FLAN-T5 XL, которую мы настраиваем для задачи краткого изложения рентгенологических отчетов. Ниже приведена схема работы модели.

Типичный рентгенологический отчет хорошо структурирован и лаконичен. Такие отчеты часто имеют три основных раздела:

  • Фон – предоставляет общую информацию о демографии пациента с основной информацией о пациенте, клинической истории и соответствующей медицинской истории и подробностях процедур экзамена
  • Результаты – представляют подробный диагноз и результаты экзамена
  • Вывод – кратко резюмирует наиболее значимые результаты или интерпретацию результатов с оценкой их значимости и возможным диагнозом на основе наблюдаемых аномалий

Используя раздел результатов в отчетах радиологии, решение генерирует раздел выводов, который соответствует суммированию врачей. Ниже приведен пример отчета радиологии .

Настройка общей модели LLM для клинической задачи

В этом решении мы настраиваем модель FLAN-T5 XL (настраивая все параметры модели и оптимизируя их для задачи). Мы настраиваем модель, используя набор данных MIMIC-CXR в клинической области, который является общедоступным набором данных рентгенографии грудной клетки. Для настройки этой модели через SageMaker Jumpstart необходимо предоставить помеченные примеры в виде пар {подсказка, завершение}. В данном случае мы используем пары {Находки, Впечатление} из оригинальных отчетов в наборе данных MIMIC-CXR. Для вывода мы используем подсказку, как показано в следующем примере:

Модель настраивается на экземпляре ускоренных вычислений ml.p3.16xlarge с 64 виртуальными ЦП и 488 ГиБ памяти. Для проверки 5% набора данных было случайным образом выбрано. Прошедшее время обучения SageMaker с настройкой составило 38 468 секунд (приблизительно 11 часов).

Оценка результатов

Когда обучение завершено, важно оценить результаты. Для количественного анализа сгенерированного вывода мы используем метрику ROUGE (Recall-Oriented Understudy for Gisting Evaluation), наиболее часто используемую метрику для оценки суммирования. Эта метрика сравнивает автоматически созданное резюме с справочным или набором справочных (созданных человеком) резюме или переводов. ROUGE1 относится к перекрытию униграмм (каждого слова) между кандидатом (выход модели) и справочными резюме. ROUGE2 относится к перекрытию биграмм (двух слов) между кандидатом и справочными резюме. ROUGEL – это метрика на уровне предложения и относится к наибольшей общей подпоследовательности (LCS) между двумя текстовыми фрагментами. Она игнорирует переводы строки в тексте. ROUGELsum – это метрика на уровне резюме. Для этой метрики переводы строки в тексте не игнорируются, но трактуются как предложения. Затем вычисляется LCS между каждой парой предложений справочного и кандидатского, а затем вычисляется объединение-LCS. Для агрегации этих оценок по заданному набору предложений справочного и кандидатского среднее значение вычисляется.

Обзор и архитектура

Общая архитектура решения, как показано на следующей фигуре, в основном состоит из среды разработки моделей с использованием SageMaker Studio, развертывания модели с использованием конечной точки SageMaker и панели управления отчетностью с использованием Amazon QuickSight.

В следующих разделах мы демонстрируем настройку LLM, доступного в SageMaker JumpStart, для суммирования задач, специфичных для области, с использованием программного интерфейса SageMaker Python SDK. В частности, мы рассмотрим следующие темы:

  • Шаги по настройке среды разработки
  • Обзор наборов данных отчетов радиологии, на которых модель настраивается и оценивается
  • Демонстрация настройки модели FLAN-T5 XL с использованием SageMaker JumpStart программно с использованием SageMaker Python SDK
  • Вывод и оценка предварительно обученных и настроенных моделей
  • Сравнение результатов предварительно обученной модели и настроенных моделей

Решение доступно в репозитории GitHub “Генерация отчета радиологии Impression с использованием генеративного ИИ с моделью большого языка на AWS”.

Предварительные требования

Для начала работы вам понадобится учетная запись AWS, в которой вы можете использовать SageMaker Studio. Если у вас еще нет учетной записи, вам нужно создать профиль пользователя для SageMaker Studio.

Используемый тип экземпляра для обучения в этом посте – ml.p3.16xlarge. Обратите внимание, что для типа экземпляра p3 требуется увеличение лимита квоты службы.

Набор данных MIMIC CXR можно получить по соглашению об использовании данных, которое требует регистрации пользователя и прохождения процесса аккредитации.

Настройка среды разработки

Для настройки среды разработки выполните следующие действия:

  1. Запустите SageMaker Studio из консоли SageMaker или интерфейса командной строки AWS (AWS CLI).

Дополнительную информацию о присоединении к домену см. в разделе Присоединение к домену Amazon SageMaker.

  1. Создайте новую записную книжку SageMaker Studio для очистки данных отчета и настройки модели. Мы используем экземпляр записной книжки ml.t3.medium 2vCPU+4GiB с ядром Python 3.
  1. Внутри записной книжки установите соответствующие пакеты, такие как nest-asyncio, IPyWidgets (для интерактивных виджетов для записной книжки Jupyter) и SageMaker Python SDK:
!pip install nest-asyncio==1.5.5 --quiet 
!pip install ipywidgets==8.0.4 --quiet 
!pip install sagemaker==2.148.0 --quiet

Создание конечных точек и развертывание моделей для вывода

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

  1. Создайте объект модели из класса Model, который может быть развернут на конечную точку HTTPS.
  2. Создайте конечную точку HTTPS с использованием предварительно созданного объекта модели и его метода deploy():
from sagemaker import model_uris, script_uris
from sagemaker.model import Model
from sagemaker.predictor import Predictor
from sagemaker.utils import name_from_base

# Получите URI предварительно обученной модели
pre_trained_model_uri =model_uris.retrieve(model_id=model_id, model_version=model_version, model_scope="inference")

large_model_env = {"SAGEMAKER_MODEL_SERVER_WORKERS": "1", "TS_DEFAULT_WORKERS_PER_MODEL": "1"}

pre_trained_name = name_from_base(f"jumpstart-demo-pre-trained-{model_id}")

# Создайте экземпляр модели SageMaker предварительно обученной модели
if ("small" in model_id) or ("base" in model_id):
    deploy_source_uri = script_uris.retrieve(
        model_id=model_id, model_version=model_version, script_scope="inference"
    )
    pre_trained_model = Model(
        image_uri=deploy_image_uri,
        source_dir=deploy_source_uri,
        entry_point="inference.py",
        model_data=pre_trained_model_uri,
        role=aws_role,
        predictor_cls=Predictor,
        name=pre_trained_name,
    )
else:
    # Для больших моделей мы уже перепаковали скрипт вывода и модельные артефакты,
    # поэтому аргумент `source_dir` для Model не требуется.
    pre_trained_model = Model(
        image_uri=deploy_image_uri,
        model_data=pre_trained_model_uri,
        role=aws_role,
        predictor_cls=Predictor,
        name=pre_trained_name,
        env=large_model_env,
    )

# Разверните предварительно обученную модель. Обратите внимание, что при развертывании модели
# через класс Model необходимо передать класс Predictor, чтобы иметь возможность выполнять вывод через API SageMaker
pre_trained_predictor = pre_trained_model.deploy(
    initial_instance_count=1,
    instance_type=inference_instance_type,
    predictor_cls=Predictor,
    endpoint_name=pre_trained_name,
)

Создание панели QuickSight

Создайте панель QuickSight с источником данных Athena с результатами вывода в Amazon Simple Storage Service (Amazon S3), чтобы сравнить результаты вывода с истиной. Ниже приведен скриншот примера нашей панели управления.

Наборы данных радиологических отчетов

Модель теперь настроена, все параметры модели настроены на основе 91 544 отчетов, загруженных из набора данных MIMIC-CXR v2.0. Поскольку мы использовали только текстовые данные радиологических отчетов, мы загрузили только один сжатый файл отчета (mimic-cxr-reports.zip) с веб-сайта MIMIC-CXR. Теперь мы оцениваем настроенную модель на 2000 отчетах (называемых набором данных dev1) из отдельного подмножества этого набора данных. Мы используем еще 2000 радиологических отчетов (называемых dev2) для оценки настроенной модели из коллекции рентгеновских снимков груди из сети больниц Индианского университета. Все наборы данных считываются как файлы JSON и загружаются во вновь созданный бакет S3 llm-radiology-bucket. Обратите внимание, что по умолчанию все наборы данных не содержат никакой конфиденциальной информации о состоянии здоровья (PHI); вся конфиденциальная информация заменяется тремя подряд идущими подчеркиваниями (___) от поставщиков.

Настройка модели с помощью SageMaker Python SDK

Для настройки модели параметр model_id указывается как huggingface-text2text-flan-t5-xl из списка моделей SageMaker JumpStart. training_instance_type устанавливается как ml.p3.16xlarge, а inference_instance_type – как ml.g5.2xlarge. Тренировочные данные в формате JSON считываются из бакета S3. Следующим шагом является использование выбранного model_id для извлечения ресурсов SageMaker JumpStart, включая image_uri (URI Amazon Elastic Container Registry (Amazon ECR) для образа Docker), model_uri (URI предварительно обученной модели Amazon S3) и script_uri (URI скрипта обучения):

from sagemaker import image_uris, model_uris, script_uris

# Для экземпляра обучения будет использоваться этот образ
train_image_uri = image_uris.retrieve(
    region=aws_region,
    framework=None,  # автоматически выведено из model_id
    model_id=model_id,
    model_version=model_version,
    image_scope="training",
    instance_type=training_instance_type,
)

# Предварительно обученная модель
train_model_uri = model_uris.retrieve(
    model_id=model_id, model_version=model_version, model_scope="training"
)

# Скрипт для выполнения на экземпляре обучения
train_script_uri = script_uris.retrieve(
    model_id=model_id, model_version=model_version, script_scope="training"
)

output_location = f"s3://{output_bucket}/demo-llm-rad-fine-tune-flan-t5/"

Кроме того, устанавливается местоположение вывода в виде папки в бакете S3.

Изменяется только один гиперпараметр, эпохи, на значение 3, все остальные устанавливаются по умолчанию:

from sagemaker import hyperparameters

# Получение гиперпараметров по умолчанию для настройки модели
hyperparameters = hyperparameters.retrieve_default(model_id=model_id, model_version=model_version)

# Мы переопределим некоторые гиперпараметры по умолчанию с пользовательскими значениями
hyperparameters["epochs"] = "3"
print(hyperparameters)

Определяются и перечисляются метрики обучения, такие как eval_loss (для потерь валидации), loss (для потерь обучения) и epoch:

from sagemaker.estimator import Estimator
from sagemaker.utils import name_from_base

model_name = "-".join(model_id.split("-")[2:])  # получение наиболее информативной части ID
training_job_name = name_from_base(f"js-demo-{model_name}-{hyperparameters['epochs']}")
print(f"{bold}имя работы:{unbold} {training_job_name}")

training_metric_definitions = [
    {"Name": "val_loss", "Regex": "'eval_loss': ([0-9\\.]+)"},
    {"Name": "train_loss", "Regex": "'loss': ([0-9\\.]+)"},
    {"Name": "epoch", "Regex": "'epoch': ([0-9\\.]+)"},
]

Мы используем ресурсы SageMaker JumpStart (image_uri, model_uri, script_uri), определенные ранее, для создания оценщика и настройки модели на тренировочном наборе данных, указав путь S3 к набору данных. Класс Estimator требует параметр entry_point. В данном случае JumpStart использует transfer_learning.py. Если это значение не установлено, тренировочная задача не запускается.

# Создание экземпляра SageMaker Estimator
sm_estimator = Estimator(
    role=aws_role,
    image_uri=train_image_uri,
    model_uri=train_model_uri,
    source_dir=train_script_uri,
    entry_point="transfer_learning.py",
    instance_count=1,
    instance_type=training_instance_type,
    volume_size=300,
    max_run=360000,
    hyperparameters=hyperparameters,
    output_path=output_location,
    metric_definitions=training_metric_definitions,
)

# Запуск задания обучения SageMaker над данными, расположенными в указанном пути S3
# Задания обучения могут занимать несколько часов, рекомендуется установить wait=False,
# и отслеживать статус задания через консоль SageMaker
sm_estimator.fit({"training": train_data_location}, job_name=training_job_name, wait=True)

Это задание обучения может занять несколько часов для завершения; поэтому рекомендуется установить параметр wait в False и отслеживать статус задания обучения в консоли SageMaker. Используйте функцию TrainingJobAnalytics, чтобы отслеживать показатели обучения в разные моменты времени:

from sagemaker import TrainingJobAnalytics

# Подождите несколько минут, чтобы задание начало выполняться, перед запуском этой ячейки
# Это можно вызывать, пока задание еще выполняется
df = TrainingJobAnalytics(training_job_name=training_job_name).dataframe()

Развертывание точек входа для вывода

Для сравнения разверните точки входа для вывода как для предварительно обученных, так и для дообученных моделей.

Сначала получите URI Docker-образа вывода с использованием model_id и используйте этот URI для создания экземпляра модели SageMaker предварительно обученной модели. Разверните предварительно обученную модель, создав HTTPS-точку входа с помощью предварительно созданного объекта модели deploy(). Для выполнения вывода через SageMaker API убедитесь, что передаете класс Predictor.

from sagemaker import image_uris
# Получение URI Docker-образа вывода. Это базовый контейнерный образ HuggingFace
deploy_image_uri = image_uris.retrieve(
    region=aws_region,
    framework=None,  # автоматически определяется из model_id
    model_id=model_id,
    model_version=model_version,
    image_scope="inference",
    instance_type=inference_instance_type,
)

# Получение URI предварительно обученной модели
pre_trained_model_uri = model_uris.retrieve(
    model_id=model_id, model_version=model_version, model_scope="inference"
)

pre_trained_model = Model(
        image_uri=deploy_image_uri,
        model_data=pre_trained_model_uri,
        role=aws_role,
        predictor_cls=Predictor,
        name=pre_trained_name,
        env=large_model_env,
    )

# Развертывание предварительно обученной модели. Обратите внимание, что нам нужно передать класс Predictor при развертывании модели
# через класс Model, чтобы можно было выполнять вывод через SageMaker API
pre_trained_predictor = pre_trained_model.deploy(
    initial_instance_count=1,
    instance_type=inference_instance_type,
    predictor_cls=Predictor,
    endpoint_name=pre_trained_name,
)

Повторите предыдущий шаг, чтобы создать экземпляр модели SageMaker дообученной модели и создать точку входа для развертывания модели.

Оценка моделей

Сначала установите длину краткого текста, количество модельных выходов (должно быть больше 1, если требуется сгенерировать несколько кратких описаний) и количество лучей для поиска по лучу.

Создайте запрос вывода в виде JSON-полезной нагрузки и используйте его для запроса точек входа для предварительно обученных и дообученных моделей.

Вычислите совокупные значения ROUGE (ROUGE1, ROUGE2, ROUGEL, ROUGELsum) в соответствии с ранее описанным.

Сравните результаты

В таблице ниже приведены результаты оценки для наборов данных dev1 и dev2. Результат оценки на наборе данных dev1 (2,000 записей из отчетов MIMIC CXR Radiology) показывает примерно 38 процентных пунктов улучшения в совокупных средних значениях ROUGE1 и ROUGE2 по сравнению с предварительно обученной моделью. Для dev2 наблюдается улучшение показателей ROUGE1 и ROUGE2 на 31 и 25 процентных пунктов соответственно. В целом, дообучение привело к улучшению показателей ROUGELsum на 38,2 процентных пункта и 31,3 процентных пункта для наборов данных dev1 и dev2 соответственно.

Оценка

Набор данных

Модель с предварительным обучением Модель с дообучением
ROUGE1 ROUGE2 ROUGEL ROUGELsum ROUGE1 ROUGE2 ROUGEL ROUGELsum
dev1 0.2239 0.1134 0.1891 0.1891 0.6040 0.4800 0.5705 0.5708
dev2 0.1583 0.0599 0.1391 0.1393 0.4660 0.3125 0.4525 0.4525

Следующие графики ящика с усами показывают распределение оценок ROUGE для наборов данных dev1 и dev2, оцененных с использованием модели с дообучением.

(a): dev1 (b): dev2

Следующая таблица показывает, что оценки ROUGE для наборов данных имеют примерно одинаковую медиану и среднее значение и, следовательно, симметрично распределены.

Наборы данных Оценки Количество Среднее Стандартное отклонение Минимум 25-й перцентиль 50-й перцентиль 75-й перцентиль Максимум
dev1 ROUGE1 2000.00 0.6038 0.3065 0.0000 0.3653 0.6000 0.9384 1.0000
ROUGE2 2000.00 0.4798 0.3578 0.0000 0.1818 0.4000 0.8571 1.0000
ROUGE L 2000.00 0.5706 0.3194 0.0000 0.3000 0.5345 0.9101 1.0000
ROUGELsum 2000.00 0.5706 0.3194 0.0000 0.3000 0.5345 0.9101 1.0000
dev2 ROUGE 1 2000.00 0.4659 0.2525 0.0000 0.250

Очистка

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

# Удаление ресурсов
pre_trained_predictor.delete_model()
pre_trained_predictor.delete_endpoint()
fine_tuned_predictor.delete_model()
fine_tuned_predictor.delete_endpoint()

Заключение

В этой статье мы продемонстрировали, как настраивать модель FLAN-T5 XL для задачи конкретной клинической доменной суммаризации с использованием SageMaker Studio. Чтобы увеличить уверенность, мы сравнили предсказания с истинными данными и оценили результаты с помощью метрик ROUGE. Мы показали, что модель, настроенная для конкретной задачи, возвращает лучшие результаты, чем модель, предварительно обученная на общей задаче NLP. Мы хотели бы отметить, что настройка общей модели LLM полностью устраняет затраты на предварительное обучение.

Хотя представленная здесь работа сосредоточена на отчетах о рентгеновских снимках грудной клетки, она имеет потенциал для расширения на большие наборы данных с разными анатомическими структурами и модальностями, такими как МРТ и КТ, для которых радиологические отчеты могут быть более сложными с несколькими находками. В таких случаях радиологи могут генерировать заключения в порядке критичности и включать рекомендации по дальнейшему обследованию. Кроме того, настройка обратной связи для этого приложения позволила бы радиологам постепенно улучшать производительность модели.

Как мы показали в этой статье, настроенная модель генерирует заключения для радиологических отчетов с высокими баллами ROUGE. Вы можете попробовать настраивать LLM на других конкретных для области медицинских отчетах из разных отделений.