[V2] Gemma 3 4B 텍스트 생성 실패 이슈 분석 보고서 - 100-hours-a-week/6-nemo-ai GitHub Wiki

✅ 임베딩 정상 작동 확인

  • 모든 임베딩 요청(user-activity, group-info)에 대해 로그상 정상 처리됨:
    • 평균 응답 시간: 0.3~0.5초
    • 모든 POST 요청이 200 OK로 성공
    • 벡터 DB에 문서가 정상적으로 저장됨 (성공적으로 추가되었습니다. 로그 다수 확인)
    • 이는 임베딩 모델 자체는 안정적으로 작동 중임을 의미함

❌ 텍스트 생성 실패 이슈 (Gemma 3B)

📍 증상

  • 특정 시점 이후 generate_summary() 함수에서 출력 결과가 전혀 생성되지 않음
  • 📦 생성된 텍스트: 아래 아무 결과도 없음
  • 예외(Exception)는 발생하지 않음
  • torch.Size([1, xxx]) 형태로 output tensor 크기만 존재하나 실제 내용 없음

정상 (debug) 예시

[AI] 2025-06-08 16:46:23,573 INFO: [Chatbot] 유저 쿼리 수신
[AI] 2025-06-08 16:46:23,584 INFO: [Chatbot] 유저 참여 모임 조회 완료
[AI] 2025-06-08 16:46:23,590 INFO: [AI] [임베딩 요청]
[AI] 2025-06-08 16:46:23,818 INFO: [AI] [임베딩 완료]
[AI] 2025-06-08 16:46:23,826 INFO: [Chatbot] 유사한 모임 검색 완료
W0608 16:46:55.642000 3010 torch/_inductor/utils.py:1137] [0/0] Not enough SMs to use max_autotune_gemm mode
[AI] 2025-06-08 16:47:49,877 INFO: [Chatbot] 요약 생성 완료
[AI] 2025-06-08 16:47:49,879 INFO: [AI] POST /ai/v2/chatbot/freeform - 200 - 86.3087s
📏 Input Tokens: 236, Output Tokens: torch.Size([1, 478])
📦 생성된 텍스트:
안녕하세요! 시끄럽지 않고 조용한 분위기의 모임을 찾으시는군요. 사용자의 취향에 딱 맞는 모임을 몇 가지 추천해 드릴게요.

**1. [모임 이름] 요가와 스트레칭:** 몸과 마음의 균형을 찾고 싶으시다면 요가 모임이 정말 좋을 것 같아요. 공원에서 조용히 진행되는 만큼, 시끄럽거나 활기찬 분위기가 아닌 차분하고 편안한 시간을 보내실 수 있을 거예요. 매일 아침 시작하는 만큼, 하루를 시작하기 전에 몸과 마음을 이완시키는 데 도움이 될 거예요.

**2. [모임 이름] 영어 회화 스터디:** 조용한 분위기 속에서 새로운 것을 배우고 싶으시다면 영어 회화 스터디도 좋은 선택이 될 수 있습니다. 영어 카페에서 진행되는 만큼, 1:1 대화나 소규모 그룹으로 진행되어 자연스럽게 영어로 말하는 연습을 할 수 있을 거예요. 초보자를 위한 기초부터 시작한다는 점도 부담 없이 참여할 수 있다는 장점이 있습니다.

어떤 모임이 더 끌리시나요? 😊
🧠 GPU 메모리 사용량: 16599.60 MB

문제 예시:

INFO:     115.138.49.226:0 - "POST /ai/v2/chatbot/freeform HTTP/1.1" 200 OK
[AI] 2025-06-08 16:48:43,096 INFO: [Chatbot] 유저 쿼리 수신
[AI] 2025-06-08 16:48:43,105 INFO: [Chatbot] 유저 참여 모임 조회 완료
[AI] 2025-06-08 16:48:43,112 INFO: [AI] [임베딩 요청]
[AI] 2025-06-08 16:48:43,401 INFO: [AI] [임베딩 완료]
[AI] 2025-06-08 16:48:43,405 INFO: [Chatbot] 유사한 모임 검색 완료
[AI] 2025-06-08 16:50:02,183 INFO: [Chatbot] 요약 생성 완료
[AI] 2025-06-08 16:50:02,227 INFO: [AI] POST /ai/v2/chatbot/freeform - 200 - 79.1315s
[❗️generate_summary 에러] 

🔍 시도한 해결/디버깅 방법

  1. AMP 비활성화 (torch.autocast 제외)
    • autocast()를 제거하고 inference_mode()만 사용하여도 증상 동일
    • AMP가 원인이 아닌 것으로 판단
  2. 캐시 초기화 시도
    • torch.cuda.empty_cache()를 매 실행 전에 호출했으나 증상 유지
  3. 텍스트 생성 옵션 수정
    • do_sample=False, temperature=0.7, max_new_tokens=600으로 설정 → 증상 동일
    • max_new_tokens 충분히 확보했음에도 출력 텍스트가 잘리는 현상 아님으로 추정됨
  4. 출력 강제 디코딩 디버깅
    • model.generate() 이후 텐서가 존재함에도 processor.decode() 결과는 빈 문자열
    • 해당 케이스에 대해 디코딩 시 내부적으로 에러 없이 skip된 것으로 보임
    • 디버깅 코드에서도 빈 문자열만 반환됨 (exemplar 기반)
  5. 출력 없을 시 원시 텐서 출력 코드 삽입
    • 디코딩 실패 시에도 출력 텐서를 강제로 로그 출력 시도 → tensor([[], ...]) 빈 배열로 출력되거나 decode 후 empty string
  6. CPU 모드에서 정상 작동 확인
    • bfloat16 대신 CPU에서 float 형으로 실행 시 텍스트가 완벽히 생성됨
    • 이는 Colab GPU 환경에서만 간헐적으로 text generation이 실패한다는 근거
  7. 공식 예제 그대로 실행한 경우에도 동일 현상
    • Gemma3ForConditionalGeneration + AutoProcessor + apply_chat_template 그대로 사용
    • 출력이 없음 (빈 문자열) + 예외도 없음

📌 잠정 결론

  • Colab의 GPU 리소스 문제 (예: 낮은 VRAM, 느린 GPU 할당 등)로 인해 특정 설정에서 Gemma 모델의 generate()텍스트는 생성하지만 디코딩 가능한 유효 토큰이 없게 나오는 현상이 발생한 것으로 보임
  • CPU 환경에서는 완전히 정상 작동하기 때문에 모델 또는 코드 문제보다는 실행 환경(GPU 인스턴스 또는 torch 인덕터 내부 최적화 실패) 이 유력

🚫 제외한 해결법

  • float32 사용은 메모리 오버헤드 문제로 제외 (명시적으로 사용자가 원하지 않음)

📝 후속 조치 제안

  • GCP 등 Colab 외 환경에서의 실행 테스트 (현재 GPU 인스턴스 1개 제약으로 미진행 상태)
  • decode() 후 결과가 빈 문자열일 경우 원시 텐서 로그 및 input_ids, attention_mask 함께 저장하는 로깅 도입
  • 토큰 생성은 되었으나 skip-special-tokens 또는 pad-only 텐서가 나왔을 가능성도 고려 필요
  • 예외는 없지만 “빈 텍스트가 생성되는 경우”에 대해 별도로 warning을 로깅하도록 구현 추천