메모

SadTalker 오류 해결사항 (Gradio API 버전 충돌, TTS pip._vendor.resolvelib.resolvers.ResolutionTooDeep: 200000)

어렵지만 2025. 11. 5. 19:38

1. 프로젝트 개요

프로젝트 목표: 오디오 파일(음성)을 기반으로 단일 인물 사진을 3D 안면 애니메이션(Talking Face) 영상으로 생성하는`SadTalker`의 로컬 데모 환경을 구축한다.
최종 결과물: 로컬 GPU를 활용하여 안정적으로 영상을 생성하는 Gradio 웹 UI 실행.
작업 환경:

서버 위치:`hs@hs:/hdd2/

운영체제(OS):** Ubuntu (Linux)

가상 환경:Conda (환경명: `sadtalker`, `python=3.8`)

GPU: NVIDIA GeForce RTX 2070 (8GB VRAM)

2. 초기 설치 및 환경 구성

`README.md` 문서를 기반으로 초기 환경 구성을 진행함.

1. 소스 코드 복제: `git clone https://github.com/OpenTalker/SadTalker.git`
2. Conda 환경 생성 `conda create -n sadtalker python=3.8` 및 `conda activate sadtalker`
3.  라이브러리 설치:
      - pip install torch==1.12.1+cu113 ...` (PyTorch)
      - conda install ffmpeg` (영상/음성 처리를 위한 FFmpeg)
      - pip install -r requirements.txt` (기타 Python 종속성)
4.  사전 학습 모델 다운로드: `bash scripts/download_models.sh` 실행 (Checkpoints, GFPGAN 등)

3. 단계별 장애 조치 및 해결 과정

데모 실행(`python app_sadtalker.py`) 과정에서 발생한 5단계의 주요 문제 및 해결 기록.

3.1. [1차 검증] PyTorch-CUDA 버전 호환성 확인

현상: `nvidia-smi` 명령 실행 결과, 시스템 드라이버가 지원하는 CUDA 버전은 `13.0`으로 확인됨. 반면, 설치된 PyTorch는`cu113` (CUDA 11.3) 버전임.
 분석: 시스템의 CUDA 드라이버 버전(`13.0`)이 PyTorch 라이브러리가 요구하는 CUDA 버전(`11.3`)보다 높으므로, 하위 호환성을 보장함.

조치:문제없음. 정상적인 구성으로 판단하고 설치를 계속 진행함.

3.2. [2차 장애] Gradio API 버전 충돌

현상:`python app_sadtalker.py` 실행 시, Gradio UI 생성 단계에서 프로그램 중단.
오류 로그: `AttributeError: 'Row' object has no attribute 'style'`
분석: `requirements.txt`에 Gradio 버전이 고정(pinned)되어 있지 않아, 최신 `gradio 4.x` 버전이 설치됨. SadTalker 코드는 `gradio 3.x` 버전에서만 호환되는 `.style()` API를 사용하고 있어 충돌 발생.
조치: `pip uninstall gradio`로 최신 버전을 제거하고, `pip install gradio==3.41.2` 명령으로 Gradio 3.x 버전으로 다운그레이드함.

3.3. [3차 장애] `TTS` 모듈 종속성 충돌

현상: 2차 장애 해결 후 재실행 시, `TTS` 모듈을 찾을 수 없다는 오류 발생.
1차 오류: `ModuleNotFoundError: No module named 'TTS'`
분석: `app_sadtalker.py` 코드가 텍스트 음성 변환(TTS) 기능을 위해 `Coqui TTS` 라이브러리를 `import` 하고 있었음.
시도: `pip install TTS`를 실행하여 `TTS` 라이브러리 설치 시도.
2차 오류: `pip._vendor.resolvelib.resolvers.ResolutionTooDeep: 200000`
분석: 종속성 지옥(Dependency Hell)'발생. `TTS` 라이브러리가 요구하는 패키지 버전과, `sadtalker` 환경에 이미 설치된 `gradio==3.41.2` 및 `torch==1.12.1` 등이 요구하는 버전이 서로 충돌하여 `pip`이 해결 가능한 조합을 찾는 데 실패함.
  - 조치:** `TTS` 기능은 (오디오 파일 업로드와 대비해) 부가 기능이라 판단함. `app_sadtalker.py` 파일을 직접 수정하여 TTS 관련 `import` 및 UI 생성 코드 블록(약 48\~55행)을 전체 주석 처리**하여, 해당 기능을 원천적으로 비활성화함.

3.4. [4차 장애] Gradio UI 비디오 표시 오류
현상: 3차 장애 해결 후, `python app_sadtalker.py`가 성공적으로 실행되고 웹 UI(`http://127.0.0.1:7860`)에 접근 가능해짐. 이미지와 오디오를 업로드하고 'Generate' 버튼 클릭 시, 터미널(콘솔)에서는 `Face Renderer:: 100%` 등 모든 작업이 성공적으로 완료되고 결과 `mp4` 파일이 생성되었다는 로그가 출력됨.
문제점:정작 웹 UI에서는 결과 영상이 나오지 않고, 빨간색 Error 상자만 표시됨.
 분석: 백엔드(PyTorch/SadTalker)는 정상 작동했으나, 프론트엔드(Gradio)가 결과 파일을 화면에 렌더링하는 데 실패함. 이는 `gradio==3.41.2` 버전에 존재하는 비디오 컴포넌트 관련 버그로 추정됨.
조치: `pip uninstall gradio`로 기존 버전을 제거하고, `pip install gradio==3.48.0` 명령을 통해 Gradio 3.x의 다른 안정적인 버전으로 업데이트함.
결과:문제 해결. Gradio 3.48.0 버전에서는 생성된 영상이 웹 UI에 정상적으로 표시됨.

3.5. [5차/현재 장애] CUDA 메모리 부족 (OOM)

현상: 4차 장애 해결 후, 웹 UI에서 영상 생성을 시도하던 중 프로세스가 비정상적으로 중단되며 터미널에 오류 로그 출력.
  - **오류 로그:**
    File "/hdd2/SadTalker/src/facerender/modules/util.py", line 439, in forward
        out = normalized * (1 + gamma) + beta
    RuntimeError: CUDA out of memory. Tried to allocate 512.00 MiB (GPU 0; 7.60 GiB total capacity; 5.00 GiB already allocated; 299.19 MiB free; 6.21 GiB reserved in total by PyTorch) ...
    ```
  분석: 이는 코드 버그가 아닌 하드웨어(VRAM)문제입니다.
    1.  GPU: RTX 2070 (총 VRAM: 8GB, PyTorch 인식: 7.60GiB)
    2.  오류 시점: `facerender` 모듈, 즉 실제 얼굴 영상을 합성하는 딥러닝 모델의 디코더(`generator.py`)가 작동하는 도중 발생.
    3.  메모리 상태:
          - `5.00 GiB already allocated`: 모델 가중치, 입력 데이터 등이 이미 VRAM의 5GB를 사용 중.
          - `299.19 MiB free`: 단편화 등으로 인해 실제 사용 가능한 여유 공간은 299.19 MiB**뿐임.
          - `Tried to allocate 512.00 MiB`: 다음 연산을 위해 512 MiB의 VRAM이 추가로 필요했으나, 가용 공간(299.19 MiB)이 부족하여 오류 발생.
  - 결론: 모델이 요구하는 VRAM(\> 5.5GB)이 RTX 2070의 8GB 한계에 도달함.

4. 현재 상태 및 권장 조치 (OOM 해결)

현재 SadTalker의 로컬 환경은 성공적으로 구축되었으나, 하드웨어 VRAM 한계로 인해 특정 조건에서만 실행 가능한 상태입니다.

`CUDA out of memory` 오류를 해결하고 영상을 성공적으로 생성하기 위한 권장 조치:

1.  배치 크기(Batch Size) 1로 설정 (필수):
      -Gradio 웹 UI의 'Settings' 탭에서 `batch size in generation` 슬라이더를 \*\*`1`\*\*로 설정하십시오.
      - 이유:배치 크기 2(기본값)는 VRAM 사용량을 거의 두 배로 늘립니다. 8GB VRAM 환경에서는 배치 크기 1이 필수적입니다.
2.  얼굴 모델 해상도(Face model resolution) 256 사용:
      - UI에서 `256` 옵션(기본값)을 유지하고, `512`를 선택하지 마십시오.
      - 이유: 512 모델은 훨씬 높은 VRAM을 요구하여 8GB 환경에서는 실행이 불가능합니다.
3.  *Still Mode' 체크박스 활용:
      - `preprocess` 옵션을 `full`로 설정하고, `Still Mode` 체크박스를 활성화하면 머리 움직임이 줄어들어 VRAM 사용량이 소폭 감소할 수 있습니다.