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ą:
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:
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:
- 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
Brak komentarzy.