본문 바로가기
프로그래밍 오류해결, 팁!/Python, PyCharm

RTX 3090 텐서플로우 개발환경 구축 (윈도우) & 텐서플로우 2.x에서 1.x코드 사용하기 & SubProcess ended with return code 오류

by 공부하는우니 2021. 11. 30.

 

 

이전 포스팅인 RTX 3090에서의 파이토치 개발환경 구축에 이어, 이번에는 텐서플로우 개발환경을 구축해보겠습니다.

 

 

 

RTX 3090 딥러닝 파이토치 개발환경 구축 (RTX 3090, 윈도우10, Pytorch)

오랜만에 포스팅을 해보네요. 최근 연구용 컴퓨터를 2080Ti에서 3090으로 바꾸면서 개발환경 기록 겸 포스팅을 한번 해봅니당. 2080사용중에 WSL로 잠깐 우분투의 맛을 봤는데 역시나 개발환경 갖추

wooni-research.tistory.com

 

혹시나 RTX 2천번대, 1천번대 사용중이면서 텐서플로우를 사용하고자 하는 분은 아래 포스팅을 참고하시면 됩니다.

 

 

윈도우 - 텐서플로우 GPU 개발환경 구축하기 (윈도우 + 텐서플로우 + 파이썬 + 파이참)

구글링 하면 금방 나오는 내용이지만, 각자의 개발환경에 맞춰 워낙 제각각으로 설명해둔 글들이 많아 초보자용으로 나름(?) 체계적으로 작성해보는 포스팅입니다. 개발환경은 "윈도우" + "텐서

wooni-research.tistory.com


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. 텐서플로우 설치

https://www.tensorflow.org/install/source_windows#tested_build_configurations

 

이전 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코드를 사용할 수 있습니다.

 

 

텐서플로 1 코드를 텐서플로 2로 바꾸기  |  TensorFlow Core

도움말 Kaggle에 TensorFlow과 그레이트 배리어 리프 (Great Barrier Reef)를 보호하기 도전에 참여 텐서플로 1 코드를 텐서플로 2로 바꾸기 Note: 이 문서는 텐서플로 커뮤니티에서 번역했습니다. 커뮤니티

www.tensorflow.org

 

이는 텐서플로우에서 공식 페이지에서 제안하는 방법이긴 하지만,

다만 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와 바꿔주는 것으로 해결하였습니다.

 

 

CUDA Toolkit 11.1 Update 1 Downloads

Please Note: We advise customers updating to Linux Kernel 5.9+ to use the latest NVIDIA Linux GPU driver R455 that will be available for download from NVIDIA website and repositories, starting today. Select Target Platform Click on the green buttons that d

developer.nvidia.com

 

여기까지 해주면 제 코드 기준으로는 TF2.x에서 TF1.x의 코드를 그대로 쓰는 것이 가능했습니다.

 

TF2.x만의 장점이 아직은 무엇인지 모르겠기에 compat을 당분간은 활용할텐데, 큰 문제는 없는 것 같습니다.

 

 

댓글