DEV Community

Cover image for pytorch cuDNN 버전 충돌 해결
h.json
h.json

Posted on

pytorch cuDNN 버전 충돌 해결

PyTorch cuDNN 버전 충돌 문제 해결

문제 상황

PyTorch 프로그램 실행 시 다음 에러 발생:

RuntimeError: cuDNN version incompatibility:
PyTorch was compiled against (8, 9, 2) but found runtime version (8, 1, 0)
Enter fullscreen mode Exit fullscreen mode

실행 환경:

  • PyTorch: 2.1.0+cu121 (CUDA 12.1)
  • PyTorch 요구 cuDNN: 8.9.2
  • 시스템 cuDNN: 8.1.0 (CUDA 11.8)

원인 분석

문제의 핵심

$ echo $LD_LIBRARY_PATH
/usr/local/cuda-11.8/lib64

$ grep "LD_LIBRARY_PATH" ~/.bashrc
export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
Enter fullscreen mode Exit fullscreen mode

동적 라이브러리 탐색 순서:

  1. LD_LIBRARY_PATH (최우선)
  2. /etc/ld.so.conf에 설정된 경로
  3. 시스템 기본 경로
  4. 프로그램 번들 라이브러리 (PyTorch 포함)

발생 과정:

  1. .bashrcLD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64 설정됨
  2. 해당 경로에 cuDNN 8.1.0 존재
  3. PyTorch는 cuDNN 8.9.2를 번들로 포함하지만, LD_LIBRARY_PATH가 우선순위가 높아 구버전 로드
  4. 버전 불일치로 런타임 에러 발생

Conda 환경 격리의 한계

격리되는 것:

  • Python 실행 파일 (/path/to/env/bin/python)
  • Python 패키지 (site-packages)
  • Python import 경로

격리되지 않는 것:

  • LD_LIBRARY_PATH (시스템 레벨 환경 변수)
  • 동적 라이브러리 (.so) 탐색 경로

Conda 가상환경을 사용해도 LD_LIBRARY_PATH는 전역적으로 공유됨

권장 해결 방법: Conda Hook 시스템 활용

핵심 개념

시스템 설정은 건드리지 않고, Conda 환경마다 독립적인 환경 변수를 설정할 수 있습니다.

  • .bashrc, .bash_profile시스템 설정 파일은 전혀 수정하지 않음
  • Conda 환경 내부에 activate/deactivate 스크립트 추가
  • 환경 활성화 시 자동으로 LD_LIBRARY_PATH 제거
  • 환경 비활성화 시 자동으로 복원

Conda Hook 디렉토리 구조

Conda는 각 환경마다 특별한 디렉토리를 지원합니다:

/home/user/anaconda3/envs/naml/
├── bin/
│   └── python
├── lib/
│   └── python3.10/site-packages/
└── etc/
    └── conda/
        ├── activate.d/     ← 환경 활성화 시 실행되는 스크립트들
        │   └── *.sh        (모든 .sh 파일이 자동 실행됨)
        └── deactivate.d/   ← 환경 비활성화 시 실행되는 스크립트들
            └── *.sh        (모든 .sh 파일이 자동 실행됨)
Enter fullscreen mode Exit fullscreen mode

동작 원리:

  • conda activate namlactivate.d/ 내 모든 .sh 파일 실행
  • conda deactivatedeactivate.d/ 내 모든 .sh 파일 실행

설정 방법 (Step by Step)

1단계: Hook 디렉토리 생성

mkdir -p /home/user/anaconda3/envs/naml/etc/conda/activate.d
mkdir -p /home/user/anaconda3/envs/naml/etc/conda/deactivate.d
Enter fullscreen mode Exit fullscreen mode

설명:

  • 본인의 환경 이름에 맞게 경로 수정 (여기서는 naml)
  • -p 옵션: 부모 디렉토리도 함께 생성

2단계: Activate 스크립트 생성

cat > /home/user/anaconda3/envs/naml/etc/conda/activate.d/env_vars.sh << 'EOF'
#!/bin/sh
export OLD_LD_LIBRARY_PATH=$LD_LIBRARY_PATH
unset LD_LIBRARY_PATH
EOF
Enter fullscreen mode Exit fullscreen mode

스크립트 내용 설명:

#!/bin/sh                                    # 쉘 스크립트 선언
export OLD_LD_LIBRARY_PATH=$LD_LIBRARY_PATH  # 현재 값을 백업 (복원용)
unset LD_LIBRARY_PATH                        # LD_LIBRARY_PATH 제거
Enter fullscreen mode Exit fullscreen mode
  • 1줄: 쉘 스크립트로 실행되도록 선언
  • 2줄: 기존 LD_LIBRARY_PATH 값을 OLD_LD_LIBRARY_PATH에 백업
  • 3줄: LD_LIBRARY_PATH를 제거하여 PyTorch 번들 cuDNN 사용

3단계: Deactivate 스크립트 생성

cat > /home/user/anaconda3/envs/naml/etc/conda/deactivate.d/env_vars.sh << 'EOF'
#!/bin/sh
export LD_LIBRARY_PATH=$OLD_LD_LIBRARY_PATH
unset OLD_LD_LIBRARY_PATH
EOF
Enter fullscreen mode Exit fullscreen mode

스크립트 내용 설명:

#!/bin/sh                                    # 쉘 스크립트 선언
export LD_LIBRARY_PATH=$OLD_LD_LIBRARY_PATH  # 백업한 값 복원
unset OLD_LD_LIBRARY_PATH                    # 백업 변수 제거
Enter fullscreen mode Exit fullscreen mode
  • 1줄: 쉘 스크립트로 실행되도록 선언
  • 2줄: 백업해둔 원래 값을 복원 (다른 환경에 영향 없도록)
  • 3줄: 임시 백업 변수 제거

4단계: 실행 권한 부여

chmod +x /home/user/anaconda3/envs/naml/etc/conda/activate.d/env_vars.sh
chmod +x /home/user/anaconda3/envs/naml/etc/conda/deactivate.d/env_vars.sh
Enter fullscreen mode Exit fullscreen mode

설명:

  • chmod +x: 스크립트에 실행 권한 부여
  • 권한이 없으면 Conda가 스크립트를 실행하지 못함

5단계: 설정 확인

# 생성된 파일 확인
ls -la /home/user/anaconda3/envs/naml/etc/conda/activate.d/
ls -la /home/user/anaconda3/envs/naml/etc/conda/deactivate.d/

# 파일 내용 확인
cat /home/user/anaconda3/envs/naml/etc/conda/activate.d/env_vars.sh
cat /home/user/anaconda3/envs/naml/etc/conda/deactivate.d/env_vars.sh
Enter fullscreen mode Exit fullscreen mode

기대 출력:

  • 파일이 -rwx--x--x 권한으로 존재
  • 파일 내용이 위에서 작성한 스크립트와 동일

동작 흐름 상세 설명

[터미널 시작]
    ↓
[.bashrc 자동 실행]
    ↓
LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64  ← CUDA 11.8, cuDNN 8.1.0
    ↓
    ↓
[conda activate naml 실행]
    ↓
[activate.d/env_vars.sh 자동 실행]
    ↓
OLD_LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64  (백업)
LD_LIBRARY_PATH=(제거됨)  ← PyTorch 번들 cuDNN 8.9.2 사용
    ↓
    ↓
[python main.py 실행]  ✅ 정상 작동
    ↓
    ↓
[conda deactivate 실행]
    ↓
[deactivate.d/env_vars.sh 자동 실행]
    ↓
LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64  (복원)
OLD_LD_LIBRARY_PATH=(제거됨)
    ↓
[원래 환경으로 복구 완료]
Enter fullscreen mode Exit fullscreen mode

핵심 포인트

항목 내용
시스템 설정 변경 ❌ 없음 (.bashrc, .bash_profile 그대로)
변경 범위 naml 환경 내부만 (/home/user/anaconda3/envs/naml/etc/conda/)
다른 환경 영향 ❌ 없음 (환경별로 독립적)
자동 적용 conda activate naml 시 자동
자동 복원 conda deactivate 시 자동

설정 후 사용법

Conda Activate가 작동하는 경우

# 환경 활성화
conda activate naml

# 프로그램 실행
python main.py --dataset=eb-nerd --news_encoder=NAML --user_encoder=ATT \
  --batch_size=128 --epoch=16

# 환경 비활성화
conda deactivate
Enter fullscreen mode Exit fullscreen mode

Conda Activate가 작동하지 않는 경우

# 수동으로 activate 스크립트 실행
source /home/user/anaconda3/envs/naml/etc/conda/activate.d/env_vars.sh

# 환경의 Python으로 프로그램 실행
/home/user/anaconda3/envs/naml/bin/python main.py --dataset=eb-nerd \
  --news_encoder=NAML --user_encoder=ATT --batch_size=128 --epoch=16

# 수동으로 deactivate 스크립트 실행
source /home/user/anaconda3/envs/naml/etc/conda/deactivate.d/env_vars.sh
Enter fullscreen mode Exit fullscreen mode

검증 방법

1. 환경 변수 확인

# 활성화 전
echo $LD_LIBRARY_PATH
# 출력: /usr/local/cuda-11.8/lib64

# 환경 활성화
conda activate naml

# 활성화 후
echo $LD_LIBRARY_PATH
# 출력: (비어있음)

echo $OLD_LD_LIBRARY_PATH
# 출력: /usr/local/cuda-11.8/lib64

# 비활성화
conda deactivate

# 비활성화 후
echo $LD_LIBRARY_PATH
# 출력: /usr/local/cuda-11.8/lib64 (복원됨)
Enter fullscreen mode Exit fullscreen mode

2. PyTorch cuDNN 버전 확인

conda activate naml

python -c "
import torch
print('PyTorch version:', torch.__version__)
print('CUDA available:', torch.cuda.is_available())
print('CUDA version:', torch.version.cuda)
print('cuDNN version:', torch.backends.cudnn.version())
print('Device count:', torch.cuda.device_count())
"
Enter fullscreen mode Exit fullscreen mode

정상 출력:

PyTorch version: 2.1.0+cu121
CUDA available: True
CUDA version: 12.1
cuDNN version: 8902           ← 8.9.2 (정상)
Device count: 2
Enter fullscreen mode Exit fullscreen mode

비정상 출력 (설정 실패 시):

RuntimeError: cuDNN version incompatibility:
PyTorch was compiled against (8, 9, 2) but found runtime version (8, 1, 0)
Enter fullscreen mode Exit fullscreen mode

3. 프로그램 실행 테스트

conda activate naml

# 짧은 시간 테스트 (30초)
timeout 30 python main.py --dataset=eb-nerd --news_encoder=NAML \
  --user_encoder=ATT --batch_size=128 --epoch=16
Enter fullscreen mode Exit fullscreen mode

기대 결과:

  • 에러 없이 학습 시작
  • Epoch 1/16 진행 확인
  • Loss 값 정상 출력

핵심 요약

항목 내용
문제 LD_LIBRARY_PATH의 구버전 cuDNN(8.1.0)이 PyTorch 번들 cuDNN(8.9.2)보다 우선 로드
원인 .bashrc의 시스템 전역 환경 변수 설정
코드 문제 ❌ 없음 (서버 환경 설정 문제)
해결 방식 Conda 환경별 activate/deactivate Hook 스크립트
변경 위치 /home/user/anaconda3/envs/naml/etc/conda/activate.d/env_vars.sh
/home/user/anaconda3/envs/naml/etc/conda/deactivate.d/env_vars.sh
시스템 변경 ❌ 없음 (.bashrc 등 시스템 설정 파일 그대로)
사용법 conda activate naml → 자동 적용
환경 격리 ✅ 환경별로 독립적 동작

참고 사항

다른 환경에도 적용하기

본인의 환경 이름으로 경로 변경:

# 환경 이름을 YOUR_ENV_NAME으로 변경
ENV_NAME="YOUR_ENV_NAME"
ENV_PATH="/home/user/anaconda3/envs/${ENV_NAME}"

mkdir -p ${ENV_PATH}/etc/conda/activate.d
mkdir -p ${ENV_PATH}/etc/conda/deactivate.d

cat > ${ENV_PATH}/etc/conda/activate.d/env_vars.sh << 'EOF'
#!/bin/sh
export OLD_LD_LIBRARY_PATH=$LD_LIBRARY_PATH
unset LD_LIBRARY_PATH
EOF

cat > ${ENV_PATH}/etc/conda/deactivate.d/env_vars.sh << 'EOF'
#!/bin/sh
export LD_LIBRARY_PATH=$OLD_LD_LIBRARY_PATH
unset OLD_LD_LIBRARY_PATH
EOF

chmod +x ${ENV_PATH}/etc/conda/activate.d/env_vars.sh
chmod +x ${ENV_PATH}/etc/conda/deactivate.d/env_vars.sh
Enter fullscreen mode Exit fullscreen mode

왜 이 방법이 좋은가?

  1. 시스템 안전성: 전역 설정을 건드리지 않음
  2. 환경 격리: 각 Conda 환경마다 독립적인 설정 가능
  3. 자동화: conda activate만으로 자동 적용
  4. 복원 가능: conda deactivate로 원래 환경 복구
  5. 다른 프로젝트 영향 없음: CUDA 11.8이 필요한 다른 환경과 공존 가능

추가 팁

  • 여러 환경에 일괄 적용: 위 스크립트를 반복 실행
  • Git으로 관리 불가: Conda 환경은 일반적으로 .gitignore에 포함
  • 환경 재생성 시: 스크립트를 다시 생성해야 함
  • PyTorch 재설치해도: 이 설정은 유지됨

Top comments (0)