1편에서는 프로젝트의 목표를 수립하고,
훈련을 방해하던 치명적인 CUDA Assert Error(max_length=512)와 AttributeError(시각화 오타) 등의
초기 버그를 모두 해결했습니다.
그리고 본격적으로 학습을 진행했는데
A100에서 본격적으로 실행하자마자 '뭘 해도 1시간 46분'이라는 두 번째 벽에 부딪혔습니다.
이번엔 A100 GPU의 한계 성능을 끌어내는 최적화 과정과,
그렇게 훈련된 모델의 충격적인 '과거 데이터' 성능 분석을 기록합니다.
1. 🚀 [로그 1] A100 최적화: "뭘 해도 1시간 46분"
A100(80GB VRAM)이라는 머신을 할당받았음에도, 훈련 속도가 기대만큼 나오지 않았습니다.
- [훈련 1차] (1시간 46분 소요)
- 증상: A100 GPU임에도 VRAM을 15GB/80GB밖에 사용하지 않았습니다.
- 1차 진단: batch_size=64가 너무 작아 GPU가 놀고 있음.
- 조치: batch_size를 256으로, num_workers를 8로 상향.
- [최적화 2차] (여전히 1시간 46분)
- 증상: batch_size=256으로 올리자 VRAM을 55GB/80GB까지 사용. 하지만 속도 향상 없음.
- 2차 진단: VRAM이 25GB나 남았으니, 한계까지 밀어붙여 보기로 함.
- 조치: batch_size를 352로 상향. VRAM 74GB/80GB 도달.
- [최적화 3차] (또! 1시간 46분)
- 증상: VRAM을 90% 이상 채웠음에도 훈련 속도가 동일.
- 3차 진단: CPU 병목 의심. A100 GPU가 너무 빨라서 CPU의 데이터 로딩 속도를 기다리고 있음.
- 조치: num_workers를 16으로 상향.
- [최적화 4차] (1시간 46분...)
- 증상: num_workers=16으로 올리자 UserWarning: Our suggested max number of worker in current system is 12 경고 발생.
- 최종 진단: Disk I/O Bottleneck (디스크 병목)
- VRAM(352), CPU(12) 모두 한계까지 올렸는데도 속도가 같다면, 남은 범인은 디스크뿐.
- A100 GPU가 느린 Colab의 /content/ 디스크에서 데이터를 읽어오는 것을 기다리느라 놀고 있었던 것.
- [해결] RAM Disk (/dev/shm/) 적용
- A100 런타임의 167GB 시스템 RAM을 활용하기로 결정.
- 훈련 스크립트 3번 섹션을 수정하여, combined_articles.parquet 파일을 느린 /content/가 아닌 초고속 RAM 디스크(/dev/shm/)로 복사 후 훈련.
- [훈련 3차] (훈련 및 저장 성공)
- RAM 디스크 + batch_size=352 + num_workers=12로 최종 튜닝된 스크립트를 실행.
- (이 과정에서 1편의 AttributeError 버그로 11번(저장) 섹션이 실행 안 된 것을 인지, 10번 코드 수정 후 재실행)
- 최종 결과: best_news_classifier 폴더에 DL/LR 모델 및 전처리기 5종 세트 저장 성공.
2. 🕵️ [로그 2] 모델 검증: 딥러닝 모델의 배신, 54%
이렇게게 훈련한 딥러닝 모델이 2020년 이후 Test Set(테스트 데이터)에 대해서는 80%가 넘는 높은 F1 Score를 달성했음을 확인했습니다.

이제 프로젝트의 두 번째 질문, "이 '최신 전문가' 모델이 1990-2019년 과거 데이터에서도 잘 작동할까?"를 검증할 차례였습니다.
- [문제] 정답지 부재: 1990-2019년 데이터에는 '정답 라벨'이 없었습니다.
- [해결] gpt-4o-mini를 이용한 가상 정답지 1,000개 생성: gpt-4o-mini를 '임시 정답 심판'으로 활용, 1,000개의 과거 데이터를 샘플링하여 '가상 정답지'를 만들었습니다. 이때 API 비용과 노이즈를 줄이기 위해 content[:1000](기사 앞부분 1000자)만 사용했습니다.
SYSTEM_PROMPT = f"""당신은 한국어 뉴스 기사 분류 전문가입니다. 기사의 헤드라인과 본문을 읽고, 6개의 카테고리 중 가장 적합한 것 하나로 분류합니다. 6개 카테고리는 [경제, 정치, 사회, 국제, 문화/스포츠, 기타] 입니다. 반드시 6개 카테고리 중 하나로만 대답해야 하며, 그 외의 설명이나 문장은 절대 포함하지 마십시오.""" - USER_PROMPT = f"""[헤드라인]: {headline} [본문 요약]: {str(content)[:1000]} [분류]: """
- [ChatGPT API 프롬프트]
- [스크립트 디버깅]: '평가 전용 스크립트'를 실행하는 과정에서도 여러 버그를 만났습니다.
- [오류 5] FileNotFoundError: 1990-2019 데이터를 별도 파일로 잘못 가정. -> 전체 데이터(combined_articles.parquet)에서 필터링하도록 수정.
- [오류 6] KeyError: 'chatgpt_label': GPT-4o API 결과 컬럼명(label)을 rename하는 로직 누락. -> rename 코드 추가.
- [검증 실행 및 결과]: 이 1,000개의 'GPT 정답지'를 기준으로, 우리가 훈련한 DL/LR 모델의 정확도를 측정했습니다.
- 🤖 [로지스틱 회귀] 정확도: 51.01%
- 🔥 [딥러닝 RoBERTa] 정확도: 54.85%
2020년 이후 데이터에서 87%가 넘는 성능을 보였던 딥러닝 모델이,
1990년대 데이터에서는 단순 LR 모델과 거의 유사한 50%대로 성능이 추락했습니다.
3. 📉 결론: "시계열 드리프트(Temporal Drift)"라는 진짜 범인
A100 GPU로 수 시간 동안 최적화한 딥러닝 모델이, 단순 키워드 기반의 로지스틱 회귀 모델과 동일한 수준(54%)으로 성능이 추락했습니다.
이는 '시계열 드리프트(Temporal Drift)' 때문입니다.
모델이 훈련한 2020-2025년 데이터와, 예측해야 할 1990-2019년 데이터는 사용하는 어휘와 토픽의 '규칙'이 완전히 달랐습니다.
- 1990년대: 損保社(손보사), 한자 혼용, ...줄이어 같은 예스러운 문체.
- 2020년대: NFT, 코인베이스, 메타버스 등 새로운 기술 용어.
결국 '2020년대 전문가'로 과적합(Overfitting)된 딥러닝 모델은, 낯선 1990년대 기사를 만나자 '깊은 문맥'을 이해하는 능력을 상실하고 50%대의 단순 분류기 수준으로 전락한 것입니다.
4. 🔜 현재 상태 및 다음 단계 (Next Steps)
이 54%라는 충격적인 결과는 '실패'가 아니라, "이 모델이 과거 데이터를 모른다"는 명확한 '진단'입니다.
- 현재 상태: 1,000개 샘플 검증 결과, '시계열 드리프트' 현상을 명확히 확인했습니다.
- 다음 단계: 이 문제를 해결하기 위해, gpt-4o-mini를 이용해 '가상 정답지'를 3,000개로 확장하는 [대규모 라벨링 작업]을 진행합니다. (이 작업은 429 에러 재시도, 병렬 처리 로직이 포함된 label_with_gpt.py 스크립트로 수행합니다.)
- 최종 목표: '과거 기출문제(GPT 라벨)'와 '현재 기출문제(사람 라벨)'를 통합한 '전 시대 통합 데이터셋'을 구축하여, 1990년부터 2025년까지 모든 시대를 이해하는 '진짜' 뉴스 분류기 모델을 재훈련할 계획입니다.