2017년 2월 8일 수요일

Docker나 가상머신 없이 Window에서 TensorFlow 설치하기: TensorFlow를 Python IDE에서 사용하기

앞선 글을 따라서 TensorFlow도 잘 깔았고, 이제 본격적으로 코딩을 해보고 싶은데 돌아가는지 확인했듯이 명령창에서 python을 실행하여 코딩을 할 수도 없는 노릇이고...원래 코딩을 하듯이 jupyter notebook에서 코드를 실행하거나 pycharm과 같은 IDE에서 돌리고 싶은데 어떻게 해야하는가?.....를 오늘 알아보겠습니다. 일단 저는 IDE를 새로 깔지는 않은 관계로 Anaconda를 깔면 같이 딸려오는 spyder를 사용하겠습니다.

Anaconda 가상환경에서 IDE 실행하기 

명령창에 activate (가상환경이름) 을 실행하여 가상환경으로 들어가고 난 후, 원래 IDE를 실행하던대로 더블클릭해서 spyder를 켰는데 import tensorflow as tf 라고 한 것을 전혀 인식하지 못하고 import error가 뜰 것입니다. 

아니 뭐지?!

..라 하시겠지만 당연한 결과입니다. 가상환경 "위에서spyder를 실행해주지 않았기 때문에 그런 문제가 생기는데요 사실 Anaconda에서 가상환경으로 따로 설정을 해주지 않고 global에 바로 TensorFlow를 설치했다면 위와 같이 IDE를 실행하셨더라도 별다른 오류가 나지 않았을 것입니다. 이미 global(default 환경)에 TensorFlow가 깔려있기 때문이죠.

즉, 가상환경에 들어가신 후, 명령창에서 spyder 라고 실행시켜서 들어가시면 아무 문제 없이 TensorFlow가 import되는 것을 보실 수 있습니다. 혹은 자주 이렇게 실행하다보면 Window 검색에 뜨더군요. 아래 그림과 같이 spyder의 경우는 가상환경 path preference가 고정된 채로 바로 클릭하여 실행하실 수도 있습니다.


그러면 귀찮게 왜 굳이 virtualenv를 만들어서 설치를 하는지에 대해 의문이 들 수 있겠죠. 뭐 추가로 윈도우에서 Python을 이용한 다른 응용을 개발하지 않고 기존 시스템과의 충돌이 걱정되지 않는다면 global에 설치하셔도 아무 문제 없습니다. 

다만, 가상환경을 만들면 기존 시스템과의 충돌을 막을 수 있고 (Python version 등) 가상환경을 지워주기만 하면 깔끔하게 모든 dependency가 삭제되므로 가상환경 위에서 설치하는 것을 권장하는 것으로 보입니다. 

아 참고로 가상환경 삭제는 다음과 같이 하시면 됩니다. 
conda remove tensorflow35

* Pycharm의 경우는 시험해보지 않았습니다만 명령창에서 spyder와 비슷하게 실행하거나 따로 Pycharm을 실행하신 후 가상환경 path 설정을 preference에서 해주면 될 것입니다.
** 구글 검색으로 나온 관련있어 보이는 링크를 하나 첨부하겠습니다. (PyCharm:: virtualenv+pythonz 환경 추가하기)

Anaconda 가상환경에서 jupyter notebook 실행하기

같은 원리로 jupyter notebook도 가상환경 위에서 실행해주시면 아무 문제 없이 import가 되는 것을 보실 수 있습니다. 
(tensorflow35) C:\Users\Jaejun Yoo> jupyter notebook

Trouble shooting

간혹 IDE나 Jupyter notebook에서 다음과 같은 에러가 뜰 경우가 있는데요....
InternalError: Blas SGEMM launch failed : a.shape=(3, 3), b.shape=(3, 1), m=3, n=1, k=3 [[Node: MatMul_3 = MatMul[T=DT_FLOAT, transpose_a=false, transpose_b=false, _device="/job:localhost/replica:0/task:0/gpu:0"](_recv_Placeholder_2_0/_1, Variable_3/read)]]



지금까지 제가 겪어본 바를 바탕으로 말씀드리자면 짐작되는 이유가 세 가지 있습니다.
  1. Jupyter notebook과 IDE가 동시에 켜져있을 경우 
  2. kernel restart가 필요한 경우
  3. tf.one_hot(~) 함수를 사용하고 있는 경우

sol1) 첫 번째 경우라면 둘 중 하나를 끄고 사용하셔야합니다. Kernel이 뭔가 충돌을 일으키는 것으로 보입니다.

sol2) 첫 번째 경우가 아닐 경우 다음으로 시도해볼 수 있는 것이 두 번째와 같이 kernel restart를 해보는 것입니다. IDE와 달리 Jupyter notebook에서는 쉽게 restart가 가능하지만 가장 확실한 것은 아예 IDE 혹은 Jupyter notebook을 종료하고 재시작 해보는 것입니다.

* 이 sol3의 경우 tf 1.0.0.rc2에서 버그가 해결되었습니다.!!
sol3) 마지막으로 tf.one_hot() 함수를 사용하고 있을 경우 입니다. 무슨 이유인지는 정확히 모르겠으나 TensorFlow 1.0.0.rc1(2017.02.04 버전)까지 수정 안 되어있는 버그인 것으로 보입니다. gpu 버전의 tensorflow에서 address가 충돌을 일으키거나 assign이 잘 안되는 것 같은데 자세히 살펴보지는 않았습니다. tensorflow github의 issue로도 등록되어있는 문제인데 일단 우회하는 방법들이 몇 추천되어있습니다. 제가 이 것을 몰라서 매우 삽질을 하였는데....orz....스스로 발견한 one_hot encoder function을 안 쓰고 우회하는 방법을 세 가지 정도 정리해보았으니 필요하시면 제 github의 three ways to avoid tf.one_hot function repository를 찾아주시면 됩니다.

error 관련 참고 링크



댓글 5개:

  1. 안녕하세요 알려주신 사항들 통해서 잘 배우고 있습니다 감사합니다.
    아나콘다 프롬프트 창으로 가상환경 열고 텐서플로우 작동하는 것 까지는 괜찮았고, spyder를 쳐서 창이 뜨는 것 까지는 했는데 작동이 안 됩니다.
    import tensorflow as tf를 치면
    -Error importing tensorflow. Unless you are using bazel,
    you should not try to import tensorflow from its source directory;
    please exit the tensorflow source tree, and relaunch your python interpreter
    from there.-
    위와 같은 에러가 뜨는데 왜 그럴까요?? 바젤도 따로 설치해줘야 하는 건가요??

    답글삭제
    답글
    1. 아니요 혹시 tensorflow source directory에서 python이나 spyder를 실행하셨나요? 말씀해주신 오류를 구글에 쳐보니 몇가지 얘기들이 나오긴 하는데 저나 제 주변 지인들에게는 본 적이 없는 오류네요

      삭제
  2. conda remove tensorflow35 하면
    package not found 가 뜨네요 ㅠㅠㅠ

    답글삭제
    답글
    1. 신의님 혹시 conda info --envs 라고 쳐보시면 뭐라고 뜨나요? tensorflow35라는 가상환경이 보이시는지요? 지금 저 에러대로라면 가상환경을 저 이름으로 설치하지 않았거나 설치가 되지 않은 경우 같은데요. 그리고 가상환경을 지우실 필요가 있어서 실행하신건가요?

      삭제
  3. 가상환경 위에서 실행해도 jupyter notebook에서 import가 되지 않는데 왜 그럴까요? ㅠㅠ

    답글삭제