PyTorch cuDNN 버전 충돌 문제 해결
문제 상황
PyTorch 프로그램 실행 시 다음 에러 발생:
RuntimeError: cuDNN version incompatibility:
PyTorch was compiled against (8, 9, 2) but found runtime version (8, 1, 0)
실행 환경:
- 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}}
동적 라이브러리 탐색 순서:
- LD_LIBRARY_PATH (최우선)
-
/etc/ld.so.conf에 설정된 경로 - 시스템 기본 경로
- 프로그램 번들 라이브러리 (PyTorch 포함)
발생 과정:
-
.bashrc에LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64설정됨 - 해당 경로에 cuDNN 8.1.0 존재
- PyTorch는 cuDNN 8.9.2를 번들로 포함하지만,
LD_LIBRARY_PATH가 우선순위가 높아 구버전 로드 - 버전 불일치로 런타임 에러 발생
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 파일이 자동 실행됨)
동작 원리:
-
conda activate naml→activate.d/내 모든.sh파일 실행 -
conda deactivate→deactivate.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
설명:
- 본인의 환경 이름에 맞게 경로 수정 (여기서는
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
스크립트 내용 설명:
#!/bin/sh # 쉘 스크립트 선언
export OLD_LD_LIBRARY_PATH=$LD_LIBRARY_PATH # 현재 값을 백업 (복원용)
unset LD_LIBRARY_PATH # LD_LIBRARY_PATH 제거
- 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
스크립트 내용 설명:
#!/bin/sh # 쉘 스크립트 선언
export LD_LIBRARY_PATH=$OLD_LD_LIBRARY_PATH # 백업한 값 복원
unset OLD_LD_LIBRARY_PATH # 백업 변수 제거
- 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
설명:
-
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
기대 출력:
- 파일이
-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=(제거됨)
↓
[원래 환경으로 복구 완료]
핵심 포인트
| 항목 | 내용 |
|---|---|
| 시스템 설정 변경 | ❌ 없음 (.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
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
검증 방법
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 (복원됨)
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())
"
정상 출력:
PyTorch version: 2.1.0+cu121
CUDA available: True
CUDA version: 12.1
cuDNN version: 8902 ← 8.9.2 (정상)
Device count: 2
비정상 출력 (설정 실패 시):
RuntimeError: cuDNN version incompatibility:
PyTorch was compiled against (8, 9, 2) but found runtime version (8, 1, 0)
3. 프로그램 실행 테스트
conda activate naml
# 짧은 시간 테스트 (30초)
timeout 30 python main.py --dataset=eb-nerd --news_encoder=NAML \
--user_encoder=ATT --batch_size=128 --epoch=16
기대 결과:
- 에러 없이 학습 시작
-
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
왜 이 방법이 좋은가?
- 시스템 안전성: 전역 설정을 건드리지 않음
- 환경 격리: 각 Conda 환경마다 독립적인 설정 가능
-
자동화:
conda activate만으로 자동 적용 -
복원 가능:
conda deactivate로 원래 환경 복구 - 다른 프로젝트 영향 없음: CUDA 11.8이 필요한 다른 환경과 공존 가능
추가 팁
- 여러 환경에 일괄 적용: 위 스크립트를 반복 실행
-
Git으로 관리 불가: Conda 환경은 일반적으로
.gitignore에 포함 - 환경 재생성 시: 스크립트를 다시 생성해야 함
- PyTorch 재설치해도: 이 설정은 유지됨
Top comments (0)