Powrót do strony głównej

Rosyjskojęzyczny AI do analizy rentgena: budowa modelu ViT + ruGPT-3

Artykuł opisuje praktyczne doświadczenie tworzenia multimodalnej sieci neuronowej do analizy zdjęć rentgenowskich i generowania medycznych wniosków w języku rosyjskim. Omówiono etapy łączenia modeli ViT i ruGPT-3, przygotowania danych, uczenia i wdrożenia rozwiązania.

Zebrałem rosyjskojęzycznego AI-rentgenologa: od architektury po inferencję
Advertisement 728x90

Budowa wielomodalnego modelu AI do analizy zdjęć rentgenowskich w języku rosyjskim: Praktyczny przewodnik

Rozwój rozwiązań sztucznej inteligencji w medycynie w języku rosyjskim napotyka na brak gotowych narzędzi i zbiorów danych. W tym artykule omawiamy praktyczny przypadek konstrukcji i szkolenia modelu VisionEncoderDecoder do generowania opisów medycznych na podstawie zdjęć rentgenowskich, łączącego wizualny enkoder ViT i model językowy ruGPT-3.

Decyzje architektoniczne i modyfikacja modeli

Tworzenie modelu wielomodalnego od podstaw wymaga znaczących zasobów obliczeniowych. Alternatywnym podejściem jest połączenie wstępnie wytrenowanych komponentów za pomocą architektury VisionEncoderDecoderModel od Hugging Face. Jako enkoder wybrano google/vit-base-patch16-224-in21k do ekstrakcji cech wizualnych. Dekoderem jest rosyjskojęzyczny model ai-forever/rugpt3small_based_on_gpt2.

Kluczowy problem: ruGPT-3 początkowo nie obsługuje uwagi krzyżowej do odbierania danych z enkodera. Rozwiązanie wymaga modyfikacji konfiguracji modelu przed inicjalizacją:

Google AdInline article slot
from transformers import AutoConfig, AutoModelForCausalLM, AutoModel

encoder = AutoModel.from_pretrained("google/vit-base-patch16-224-in21k")

decoder_config = AutoConfig.from_pretrained("ai-forever/rugpt3small_based_on_gpt2")
decoder_config.is_decoder = True
decoder_config.add_cross_attention = True

decoder = AutoModelForCausalLM.from_pretrained("ai-forever/rugpt3small_based_on_gpt2", config=decoder_config)

Po złożeniu modelu inicjalizowane są nowe wagi dla warstw uwagi krzyżowej i warstw projekcyjnych, które podlegają dalszemu treningowi.

Przygotowanie i przetwarzanie danych

Brak rosyjskojęzycznych zbiorów danych par "zdjęcie rentgenowskie – opis medyczny" wymaga kreatywnych rozwiązań. Jako podstawę wykorzystano anglojęzyczny zbiór danych Indiana University Chest X-Ray (IU X-Ray), zawierający około 7500 zdjęć i raportów. Tłumaczenie opisów medycznych na rosyjski wykonano za pomocą modelu tłumaczenia maszynowego Helsinki-NLP/opus-mt-en-ru bezpośrednio w środowisku Kaggle.

Praca z plikami w Kaggle wiąże się ze specyficznymi trudnościami. Standardowe metody ładowania obrazów często widzą tylko pliki podglądu. Do poprawnego mapowania wymagane jest głębokie skanowanie systemu plików:

Google AdInline article slot
import os

file_map = {}
for root, dirs, files in os.walk('/kaggle/input'):
    for file in files:
        if file.lower().endswith(('.png', '.jpg', '.jpeg')):
            base_name = os.path.splitext(file)[0]
            file_map[base_name] = os.path.join(root, file)

To podejście zapewnia stabilne powiązanie identyfikatorów z plików CSV z rzeczywistymi ścieżkami do obrazów.

Proces szkolenia i rozwiązywanie problemów technicznych

Szkolenie przeprowadzono na dwóch GPU NVIDIA T4 z użyciem mieszanej precyzji (fp16) i akumulacji gradientów (gradient_accumulation_steps=4) dla efektywnego wykorzystania pamięci przy wirtualnym rozmiarze batcha 32.

Typowe problemy i ich rozwiązania:

Google AdInline article slot
  • Awarie przy zapisie punktów kontrolnych: Seq2SeqTrainer w niektórych wersjach transformers powoduje błędy przy próbie automatycznego zapisu złożonych modeli z niestandardowymi parametrami. Rozwiązanie: wyłączenie pośredniego zapisu (save_strategy="no") i ręczne zarządzanie parametrami generacji przez GenerationConfig przed finalnym zapisem modelu.
  • Timeouty sesji Kaggle: Aby zapobiec automatycznemu zakończeniu długotrwałych procesów szkolenia z powodu braku aktywności, można użyć prostego skryptu JavaScript w konsoli przeglądarki, symulującego okresowe kliknięcia.

Wyniki, inferencja i wdrożenie

Po 15 epokach szkolenia model demonstruje zdolność do generowania spójnych opisów medycznych w języku rosyjskim, poprawnie używając terminologii zawodowej. Model nauczył się identyfikować podstawowe wzorce, takie jak czyste płuca, oznaki odmy opłucnowej i kardiomegalii. Ograniczenia małego zbioru danych objawiają się sporadycznymi halucynacjami – na przykład model może wskazać obecność urządzeń medycznych, których nie ma na zdjęciu.

Podstawowy przykład inferencji:

import torch
from transformers import VisionEncoderDecoderModel, ViTImageProcessor, AutoTokenizer
from PIL import Image

model_id = "livadies/Russian-Radiologist-ruGPT-ViT"
model = VisionEncoderDecoderModel.from_pretrained(model_id)
feature_extractor = ViTImageProcessor.from_pretrained(model_id)
tokenizer = AutoTokenizer.from_pretrained(model_id)

image = Image.open("xray.jpg").convert("RGB")
pixel_values = feature_extractor(images=image, return_tensors="pt").pixel_values

generated_ids = model.generate(pixel_values, max_length=128, num_beams=4)
print(tokenizer.decode(generated_ids[0], skip_special_tokens=True))

Do demonstracji możliwości modelu wdrożono aplikację Gradio na platformie Hugging Face Spaces, działającą na CPU z czasem generowania odpowiedzi 10–15 sekund. Cały kod źródłowy, włącznie z potokami przygotowania danych i notebookami szkoleniowymi, jest dostępny w otwartym repozytorium.

Co jest istotne

  • Architektura hybrydowa: Skuteczne połączenie wstępnie wytrenowanego enkodera wizualnego ViT i rosyjskojęzycznego modelu językowego ruGPT-3 przez modyfikację konfiguracji dla wsparcia uwagi krzyżowej.
  • Rozwiązywanie problemów z danymi: Pokonanie braku rosyjskojęzycznych danych medycznych przez tłumaczenie istniejących danych anglojęzycznych i obejście specyficznych ograniczeń platformy Kaggle przy pracy z plikami.
  • Praktyczne poprawki: Wyłączenie problematycznego automatycznego zapisu w Seq2SeqTrainer i ochrona przed timeoutami sesji dla stabilnego długotrwałego szkolenia.
  • Weryfikacja żywotności: Model wytrenowany na ograniczonym zbiorze danych demonstruje działalność architektury „Wizja + Język” do generowania strukturalnych tekstów medycznych w języku rosyjskim.
  • Otwartość i dostępność: Pełny kod projektu i interaktywna demonstracja są publicznie dostępne do badania, testowania i dalszego rozwoju przez społeczność.

— Editorial Team

Advertisement 728x90

Czytaj dalej