이전 포스팅인 RTX 3090에서의 파이토치 개발환경 구축에 이어, 이번에는 텐서플로우 개발환경을 구축해보겠습니다.
혹시나 RTX 2천번대, 1천번대 사용중이면서 텐서플로우를 사용하고자 하는 분은 아래 포스팅을 참고하시면 됩니다.
RTX 3090 (3천번대) vs RTX 2천, 1천번대의 가장 큰 차이는
"CUDA 11이상"인가 입니다.
앞선 파이토치에서는 이것이 그렇게까지 큰 문제가 되지 않았지만,
CUDA 11이상에서 텐서플로우를 사용하는 경우에는 꽤 문제가 됩니다.
CUDA 11이상에서 텐서플로우가 2.0이상만을 지원한다는 점 때문이죠.
단순한 버전차이가 아닌, TF 2.x에서는 TF 1.x와 사용하는 코드 자체가 다르기 때문에
단순하게 TF 2.x를 설치한다고 해결되는 문제는 아닙니다.
"이 포스팅에서는 RTX3090, CUDA11.0에서 TF 2.x설치 이후 TF 1.x코드를 실행할 수 있게"
개발환경을 구축했습니다. 1.x에서의 약간의 코드 수정은 불가피하지만요.
단순하게 2.x를 설치한다고 1.x코드를 무조건 호환할 수 있는건 아닌 것 같습니다.
우선 RTX3090 파이토치 개발환경 포스팅에서와 똑같이
1~4 순서를 진행합니다.
(CUDA, cuDNN, IDE, conda)
1. 텐서플로우 설치
이전 TF설치 포스팅과 같이
호환 가능한 CUDA와 cuDNN을 체크해줍니다.
현재 제가 세팅해둔 버전은 각각
- CUDA 11.0
- cuDNN 8.0.4
이기에
- TF 2.4.0
을 설치해줘야겠네요.
물론, 파이썬 버전도 3.6~3.8에 맞춰줘야하구요.
설치자체는 간단하죠. 가상환경 구축까지 완료하셨다면
아래의 커맨드로 설치해줍니다.
conda create -n TF1x python=3.7
conda activate TF1x
pip install tensorflow-gpu==2.4.0
저는 파이썬 3.7로 환경을 구성했습니다.
from tensorflow.python.client import device_lib
print(device_lib.list_local_devices())
이후 이러한 코드를 작성하고 실행하면 정상적으로 3090이 감지되는 것을 확인할 수 있습니다.
만약 정상적으로 호환되는 CUDA나 cuDNN, TF를 제대로 준비하지 않았다면
이 부분에서 "/device:GPU:0"이 아닌 "/device:cpu" 형태로 GPU가 감지가 되지 않습니다.
2. 텐서플로우 2.x에서 1.x코드 실행하기
(module 'tensorflow' has no attribute 'placeholder')
이부분이 사실 제일 핵심입니다.
기존 텐서플로우 1.x의 코드를 보면 보통 이런 형태로 구성되어있습니다.
import tensorflow as tf
images = tf.placeholder(tf.float32, [None, 224, 224, 3], name='InputImages')
...
tf.Session()
...
2.x와 가장 차이가 나는 부분이 바로 tf.placeholder입니다. 2.x에서는 placeholder를 지원하지 않는 것 같네요.
1.x의 코드를 그대로 실행하면
이런식으로 tf에서 placeholder를 지원하지 않는다는 오류가 발생합니다.
(위 이미지에서는 placeholder_with_default이지만 placeholder계열 모두가 오류가 납니다)
검색을 해보니, 해결하는 방법이 존재합니다.
우선 가장 먼저 시도했던 방법은
tf.placeholder를 tf.Variable로 변경하는 방법이었습니다.
다만 모든 코드에서 placeholder를 variable로 변경하는건 조금 비효율적이기도 하고, 헷갈리는 면이 있기도 하더라구요.
게다가 단순히 이것만 변환하면 코드가 돌아가는 것도 아니었습니다.
그래서 좀 더 검색해보니
2.x에서 1.x코드를 그대로 사용하는 방법이 있었습니다.
# import tensorflow as tf # 기존
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
이런식으로 tf v1의 코드를 tf v2에서 사용할 수 있도록 선언해주는 것입니다.
코드 상단에 위치하는 import영역만 바꿔주면 되니 한층 수월하게 2.x에서 1.x코드를 사용할 수 있습니다.
이는 텐서플로우에서 공식 페이지에서 제안하는 방법이긴 하지만,
다만 TF 2.x의 장점을 충분히 활용하지는 못하는 방법이라고 하네요.
추후 2.x로의 변환법은 따로 포스팅하겠습니다.
번외. 텐서플로우 2.x 오류 : SubProcess ended with retur code
정말 아쉽게도, 위의 import 변경만으로 끝은 아니었습니다.
코드가 동작하긴 하지만 정상적으로 GPU를 활용하며 동작하지 않고 이러한 메세지가 지속적으로 나타났습니다.
(https://fakecan.tistory.com/30 이미 이 오류를 해결하신 분이 계시더라구요)
CUDA 11.1의 ptxas.exe를 CUDA11.0의 ptxas.exe와 바꿔주는 것으로 해결하였습니다.
여기까지 해주면 제 코드 기준으로는 TF2.x에서 TF1.x의 코드를 그대로 쓰는 것이 가능했습니다.
TF2.x만의 장점이 아직은 무엇인지 모르겠기에 compat을 당분간은 활용할텐데, 큰 문제는 없는 것 같습니다.
'프로그래밍 오류해결, 팁! > Python, PyCharm' 카테고리의 다른 글
파이썬 - 인텔 리얼센스 D435 (Intel RealSense D435) 데이터 획득 (0) | 2022.05.17 |
---|---|
[Pyinstaller] 파이썬 실행파일(exe) 만들기 & 터미널/프로그램 바로 꺼지는 문제 해결 (OpenCV관련) (1) | 2022.05.07 |
RTX 3090 파이토치 개발환경 구축 (윈도우) (0) | 2021.11.29 |
아나콘다, CMD 자주쓰는 명령어 모음 (0) | 2021.09.04 |
Miniconda + Pycharm 개발환경 구축하기 (0) | 2021.09.04 |
댓글