러시아 멀티모달 AI 방사선의사: ViT + ruGPT-3 Kaggle 가이드
러시아어 의료 AI 솔루션 개발은 바로 사용할 수 있는 도구와 데이터셋 부족으로 어려움을 겪습니다. 이 글에서는 X-레이 영상에서 의료 보고서를 생성하는 VisionEncoderDecoder 모델을 조립하고 훈련하는 실습 사례를 단계별로 안내합니다. ViT 시각 인코더와 ruGPT-3 언어 모델을 결합한 접근법입니다.
아키텍처 선택과 모델 수정
멀티모달 모델을 처음부터 구축하려면 막대한 컴퓨팅 자원이 필요합니다. 더 현명한 방법은 Hugging Face의 VisionEncoderDecoderModel 아키텍처를 활용해 사전 훈련된 컴포넌트를 결합하는 것입니다. 시각 특징 추출을 위한 인코더로는 google/vit-base-patch16-224-in21k를 선택했습니다. 디코더는 러시아어 모델 ai-forever/rugpt3small_based_on_gpt2입니다.
주요 과제: ruGPT-3은 기본적으로 인코더로부터 데이터를 받는 크로스 어텐션을 지원하지 않습니다. 해결책은 모델 초기화 전에 설정을 수정하는 것입니다:
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)
조립 후 모델은 크로스 어텐션과 프로젝션 레이어에 새로운 가중치를 초기화하며, 이는 훈련 중 파인튜닝됩니다.
데이터 준비 및 처리
X-레이 영상과 의료 보고서를 쌍으로 매칭한 러시아어 데이터셋은 없어 창의적으로 접근했습니다. 영어 Indiana University Chest X-Ray (IU X-Ray) 데이터셋(~7,500개 영상 및 보고서)을 사용해 Helsinki-NLP/opus-mt-en-ru 모델로 Kaggle 환경에서 직접 보고서를 러시아어로 번역했습니다.
Kaggle 파일 처리는 특이점이 있습니다. 일반 이미지 로더는 썸네일만 인식하는 경우가 많습니다. 정확한 매핑을 위해 파일 시스템을 깊이 스캔합니다:
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)
이렇게 CSV 식별자와 실제 이미지 경로를 안정적으로 연결합니다.
훈련 과정과 문제 해결
훈련은 NVIDIA T4 GPU 2대로 혼합 정밀도(fp16)와 그래디언트 누적(gradient_accumulation_steps=4)을 사용해 가상 배치 크기 32를 효율적으로 처리했습니다.
일반적인 문제와 해결책:
- 체크포인트 저장 오류: 일부 transformers 버전의 Seq2SeqTrainer가 커스텀 복합 모델에서 실패합니다. 해결: 중간 저장 비활성화(save_strategy="no")하고, 최종 저장 전에 GenerationConfig로 생성 파라미터 수동 처리.
- Kaggle 세션 타임아웃: 긴 훈련 중 자동 종료 방지를 위해 브라우저 콘솔에서 주기적 클릭을 시뮬레이션하는 간단한 JavaScript 스니펫 실행.
결과, 추론 및 배포
15 에포크 후 모델은 전문 용어를 올바르게 사용하며 일관된 러시아어 의료 보고서를 생성합니다. 폐 청명, 기흉 징후, 심비대 등 기본 패턴을 식별합니다. 소규모 데이터셋 탓에 가끔 없는 의료 기기를 언급하는 환각 현상이 발생합니다.
기본 추론 예시:
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))
Gradio 데모는 Hugging Face Spaces에서 CPU로 실행되며 생성 시간은 10~15초입니다. 데이터 파이프라인과 훈련 노트북을 포함한 전체 소스 코드는 공개 레포지토리에 있습니다.
주요 교훈
- 하이브리드 아키텍처: 설정 수정으로 사전 훈련된 ViT 시각 인코더와 ruGPT-3 언어 모델을 성공적으로 융합.
- 데이터 우회: 러시아 의료 데이터셋 부족을 영어 데이터 번역과 Kaggle 파일 특성 극복으로 해결.
- 실용적 수정: Seq2SeqTrainer의 버그 저장 비활성화와 세션 타임아웃 방지로 안정적 장기 훈련.
- 개념 증명: 소규모 데이터셋으로 Vision + Language 아키텍처가 구조화된 러시아 의료 텍스트 생성에 적합함을 검증.
- 오픈 & 접근성: 전체 코드와 인터랙티브 데모를 커뮤니티 학습, 테스트, 확장을 위해 공개.
— Editorial Team
아직 댓글이 없습니다.