• 텐서플로우로 이미지인식 모바일앱 만들어보기 - 2 (가상환경에 텐서플로우 설치하기) [머신러닝/딥러닝]
  • 공돌이
    조회 수: 10858, 2017.04.24 14:55:13
  • 필요한 환경은 (아마도...^^;;) 다 갖추어졌으니 이제 가상환경을 생성하고, 최신버전의 텐서플로우를 설치할 차례입니다.

     

    이 장은 아래와 같은 순서로 설명하겠습니다.

     

    1) 가상환경 생성 (virtualenv)

    2) 최신버전의 텐서플로우 설치

    3) 깃허브에서 최신버전의 텐서플로우 소스 설치

    4) 학습 / 테스트 / 모바일용 그래프 만드는데 필요한 파일들 빌드하기

     

    1) 가상환경 생성 (Virtualenv 기준)

    앞으로 텐서플로우관련한 작업은 모두 가상환경을 만들어 그 안에서 진행할 예정입니다.

    Virtualenv 이외에도 Anaconda 나 Docker 등의 가상환경을 이용하는 방법과 native pip 로 설치하는 방법이 있으며, 각각의 장단점이 있습니다.

    Docker 는 제일 간단하지만 현재로서는 GPU버전의 텐서플로우를 사용할 수가 없고,

    Anaconda는 GPU버전을 사용할 수 있는 가상환경이지만, 공식적으로 텐서플로우에서 지원하는 환경은 아니라는 단점이 있습니다.

    기존에 파이썬을 사용하지 않는 분들은 native pip를 쓰셔도 좋습니다만, 나중에라도 다른 패키지를 사용하실 때 버전상의 충돌이 일어나는 상황이 있을 수 있습니다.

     

    여튼, virtualenv로 가상환경을 만드는 명령어는 심플합니다.

     

     

    터미널을 열어서

     

    $ virtualenv -p python3.6 --system-site-packages 디렉토리이름

     

    -p 는 가상환경에서 사용할 파이썬 실행파일(버전)을 지정해주는 역할을 합니다. 파이썬3을 쓰시려면 python3.6 을, 파이썬2를 쓰시려면 python2.7 을 지정해주시면 됩니다. (이건 맥 기준이고, 윈도우나 리눅스에서는 버전별 실행파일경로를 적어주시면 되겠지요)

    디렉토리이름에서 지정한 이름으로 새로운 디렉토리가 생성되며 가상환경에서 사용할 시스템파일들이 다 설치가 됩니다. 

     

    가상환경이라고 해서 virtualBox나 패럴랠즈 처럼 완벽히 분리된 그런 환경이 아니고, 파이썬과 관련한 패키지관리, 파이썬실행파일 등을 별도로 관리해주는 환경정도로 생각하시면 될겁니다. 

     

    디렉토리가 생성되면

     

    다음의 명령어로 가상환경으로 진입하실 수 있습니다. (디렉토리명을 tensor 라고 했다고 가정하겠습니다)

     

    $ source tensor/bin/activate

     

    그러면 앞부분의 프롬프트가 아래와 같이 가상환경임을 알 수 있도록 (가상환경명) 이렇게 표시됩니다.

     

    (tensor) $

     

    앞으로 텐서플로우 관련해서 작업을 하실 때는 이 가상환경 내에서 진행하시면 되고, 작업이 완료되어 가상환경에서 빠져나오시려면, 간단히 deactivate 라고 해주시면 됩니다.

     

    (tensor) $ deactivate

     

    2-1) 최신버전의 텐서플로우 설치

     

    이제 최신버전의 텐서플로우 파이썬패키지를 설치해야겠지요.

    저는 python3.6 을 설치했다고 가정하고 pip3 를 이용해서 패키지를 설치하겠습니다 (python2.7을 쓰신다면 pip3 대신 pip 명령을 이용하세요)

     

    가상환경이 실행된 상태에서,

     

    (tensor) $ pip3 install --upgrade tensorflow-gpu   #GPU버전으로 설치할 경우. 자신의 맥북이 NVIDIA 그래픽카드로 GPU버전을 지원하는지 확인필요

     

    혹은

     

    (tensor) $ pip3 install --upgrade tensorflow-cpu   (CPU버전으로 설치할 경우. 대부분의 일반 맥을 쓰는 경우)

     

    그리고 잠시 기다리면 설치가 완료되었다는 메시지가 뜹니다.

     

    혹시 제대로 설치가 안되거나 오류가 발생한다면 여기 를 참고하셔서 직접 whl 파일을 다운받아서 설치하세요.

     

     

    2-2) 제대로 설치되었는지 확인해보기

     

    텐서플로우 설치가 정상적으로 되는지 확인하시려면, 아래와 같이 python을 실행시켜서 tensorflow를 import 해서 제대로 동작하는지 확인해보시면 됩니다.

     

    (tensor) $ python

    >>> import tensorflow as tf

    >>> hello = tf.constant('Hello, TensorFlow!')

    >>> sess = tf.Session() 

    >>> print(sess.run(hello))

     

    Hello, TensorFlow! 가 나오면 잘 된거겠지요.


    * GPU버전으로 설치했다면 tensorflow를  import 할 때 아래와 비슷한 메시지가 뜹니다. cuda 관련 라이브러리를 로딩했다는 메시지인데요,

     

    I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcublas.8.0.dylib locally

    I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcudnn.5.dylib locally

    I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcufft.8.0.dylib locally

    I tensorflow/stream_executor/dso_loader.cc:126] Couldn't open CUDA library libcuda.1.dylib. LD_LIBRARY_PATH: /usr/local/cuda/lib:

    I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcuda.dylib locally

    I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcurand.8.0.dylib locally

     

    Couldn't Open 어쩌구 하는 부분이 보인다면, 그건 해당 파일을 못찾아서 나는 오류인데 대부분 버전별 라이브러리 이슈입니다. 메시지를 잘 보고 없는 것들은 원본파일에서 심링크를 생성하거나 복사해주시면 됩니다.

    위의 메시지를 예를 들면 , libcuda.1.dylib 이 없다고 하네요... 이경우 /usr/local/cuda/lib 밑의 libcuda.dylib 에 대해 libcuda.1.dylib 으로 심링크를 만들어주세요.

     

    (tensor) $ sudo ln -sf /usr/local/cuda/lib/libcuda.dylib /usr/local/cuda/lib/libcuda.1.dylib

     

    그리고 다시한번 import tensorflow 해보시면 전부 잘 오픈했다고 메시지가 나올겁니다.

     

    * 그리고, 세션을 만들거나 관련 명령을 실행할때 앞으로도 보면 가끔 "The TensorFlow library wasn't compiled to use XXXX instructions, 어쩌구저쩌구" 하는 메시지들이 나올 수 있습니다. 이것은 자신의 맥북(혹은 PC) 가 SSE4.1, SSE4.2, AVX, AVX2, FMA등의 명령어셋을 잘 수행할 수 있기때문에, 이걸 지원하도록 컴파일하면 성능이 훨씬 좋아질텐데 지금 현재 설치된 텐서플로우패키지는 그 명령어를 지원하지 않도록 컴파일되었다는 안내메시지입니다.

    귀찮은거 싫으시면 그냥 신경 안쓰셔도 되구요, 조금이라도 성능을 올리고 싶다 하는분은 3)에서 깃헙에서 소스전체를 내려받았을 때 소스에서부터 새로 컴파일하셔도 됩니다.

    (여기서 소스 전체를 새로 컴파일하는 방법은 다루지 않겠습니다...)

     

    일단 여기까지 해서 import 및 Session생성, run 하실 때 오류없이 잘 돌아간다면 (안내메시지나 약간의 워닝은 무시하셔도 상관없습니다) 텐서플로우패키지까지 잘 설치가 되었고, 이제 텐서플로우로 새로운 모델을 만드시거나 가지고 노실 기반이 마련된 겁니다.

     

    그러나, 통계학과 파이썬, 텐서플로우 자체에 대해 깊은 지식을 가지고 있는게 아니라면 사실 여기서 더 뭘 해야될지 모르는 상황이 발생하죠....^^

    처음부터 텐서플로우로 뭘 만드는건 기본적인 지식이 없으면 쉽지 않죠.

     

    그래서 이 글에서는 그런사람들을 위해서 텐서플로우에서 기본적으로 예제형태로 만들어놓은 인셉션엔진을 활용한 이미지인식/학습기능을 가져다가 어떻게 활용할 수 있지를 설명하도록 하겠습니다.  

    그러기 위해서는 약간의 노력을 더 투자해야 합니다...만 별로 어렵진 않습니다. 시간이 걸릴 뿐이죠...ㅎㅎ

     

    우선 얘네들이 잘 만들어서 공개해놓은 깃헙의 소스를 다운로드 받도록 하겠습니다.

     

    3) 깃허브에서 최신버전의 텐서플로우 소스 설치

     

    설치는 어느 디렉토리에 하든 큰 상관은 없겠지만, 관리상의 편의를 위해서 아까 만들어놓은 가상환경디렉토리 안에 깃헙소스를 다운로드 받도록 하겠습니다.

     

    이미 터미널을 닫으셨다면, 다시 터미널을 열고

     

    $ cd tensor

    $ source bin/activate

     

    하신 후

     

    (tensor) $ git clone https://github.com/tensorflow/tensorflow

     

    하시면 tensor 폴더 안에 tensorflow 디렉토리가 만들어지면서 깃헙의 소스가 통째로 다운로드받아집니다.

    (에디터 로직땜에 clone과 url 부분이 줄바꿈되어있는데 그냥 붙여서 쓰시면 됩니다)

    여기는 앞으로 우리가 사용할 학습, 모바일용 파일빌드, 모바일용 예제 등 모든 소스들이 다 들어가있습니다. 완전 handy 하죠!

     

     

    4) 학습 / 테스트 / 모바일용 그래프 만드는데 필요한 파일들 빌드하기

     

    이제 본격적으로 학습을 하기....전에 몇개 파일들을 빌드해서 실행파일로 만들어줘야 합니다...^^

     

    이 파일들의 빌드는 시간이 꽤 오래 걸립니다. 빌드 걸어놓고 큰 이상 없으면 커피나 식사하고 오시는게 좋을듯...ㅎㅎ

     

    만들어야 하는 파일은 아래와 같습니다.

     

    - retrain

    - optimize_for_inference

    - quantize_graph

    - convert_graphdef_memmapped_format

    - label_image

     

    각각의 파일들이 어떤 역할을 하는지 간단하게 설명하고, 빌드하는 방법을 말씀드리겠습니다.

     

    4-1) 각 빌드된 파일들의 역할

    a) retrain

    : 이미지파일들을 입력받아서 실제 학습을 진행하고, 학습한 결과를 그래프파일( .pb) 과 라벨파일(.txt) 로 생성해주는 역할을 합니다.

     

    b) optimize_for_inference

    : retrain 에 의해 생성된 그래프파일은 모바일에서 사용하기에는 맞지 않습니다. retrain에서 나온 pb파일에서 모바일버전에서 호환되지 않는 부분 (DecodeJpeg)을 삭제해서 모바일에 호환되는 버전으로 바꿔줍니다.

     

    c) quantize_graph

    : optimized 된 것은 일단 모바일에서 읽을 수는 있지만 파일사이즈가 커서 로딩하다가 메모리 크래쉬가 날 수 있다고 하네요. 그래서 quantize(연산상에서 float숫자들을 일부 반올림)라는 과정을 통해 약간~의 정확도를 희생하고 압축하기 좋은 형태로 만들어줍니다. 실제로 optimzed_for_inference 에서 나온 그래프는 압축이 거의 되지 않지만, quantize하고 나면 압축했을때 원래크기의 거의 20~30% 크기로 줄어듭니다.

     

    d) convert_graphdef_memmapped_format

    : quantize된 그래프를 모바일메모리에 매핑시켜 안정성과 속도가 향상되도록 한번 더 변경해줍니다. 이 그래프파일은 모바일메모리에 매핑시키는 버전이다 보니 PC에서는 읽을수가 없습니다. iOS에서는 로딩시키는 방법이 있는데, 아직 안드로이드에서는 이 파일을 로딩하는 방법을 못찾았네요 ㅠㅜ... 일단 optimized나 quantized된 그래프도 충분히 잘 동작하니 안드로이드는 일단 그걸로 만족을...(혹시 방법을 아시는분 계시면 알려주세요!).

     

    e) label_image

    : 만들어진 그래프파일이 잘 동작하는지 테스트해볼 수 있습니다.

     

    4-2) 빌드하는 방법

    터미널을 열고,  가상환경을 설정해둔 디렉토리로 가서 텐서플로우 가상환경을 activate 합니다.

    (위에선 생략했기 때문에 혹시나 헷갈리실까봐, $ 프롬프트 앞의 My-MacBook:~ jpkim 부분은 bash 환경에서 컴퓨터명과 현재폴더, 사용자명을 나타냅니다. 환경마다 다르겠죠. 그리고 activate 하면 가상환경임을 나타내도록 제일앞쪽에 괄호와 함께 가상환경명이 표시됩니다)

     

    My-MacBook:~ jpkim$ cd tensor

    My-MacBook:~ tensor jpkim$ source bin/activate

    (tensor) My-MacBook:~ tensor jpkim$

     

    그리고 위에서 받아놓은 텐서플로우 깃헙 소스폴더로 들어갑니다.

     

    (tensor) My-MacBook:~ tensor jpkim$ cd tensorflow

     

    ./configure 를 실행해서 빌드환경을 설정해줍니다.

     

    (tensor) My-MacBook:~ tensor jpkim$ ./configure

     

    몇가지 선택하거나 입력을 해야 하는데, 대부분 디폴트값을 선택하시면 됩니다.

     - GPU 연산을 활용 하시려면 CUDA support 를 Y로 선택하셔야 합니다. 이경우도 clang을 사용할 건지 여부와 제일 마지막에 compute capability ( 여기를 참조해서 하드웨어에 맞게 입력)부분만 제대로 입력해주시면 됩니다.

     

    다음은 ./configure를 했을때 나오는 메시지 예시입니다. 제가 엔터로 넘어가지 않고 별도로 입력한 부분은 붉은색으로 표시했습니다.

     

    (tensor) My-MacBook:tensor jpkim$ ./configure

    Please specify the location of python. [Default is /Users/jpkim/tensorflow/bin/python]: 

    Please specify optimization flags to use during compilation when bazel option "--config=opt" is specified [Default is -march=native]: 

    Do you wish to build TensorFlow with Google Cloud Platform support? [y/N] 

    No Google Cloud Platform support will be enabled for TensorFlow

    Do you wish to build TensorFlow with Hadoop File System support? [y/N] 

    No Hadoop File System support will be enabled for TensorFlow

    Do you wish to build TensorFlow with the XLA just-in-time compiler (experimental)? [y/N] 

    No XLA support will be enabled for TensorFlow

    Found possible Python library paths:

      /Users/jpkim/tensorflow/lib/python3.6/site-packages

    Please input the desired Python library path to use.  Default is [/Users/jpkim/tensorflow/lib/python3.6/site-packages]

     

    Using python library path: /Users/jpkim/tensorflow/lib/python3.6/site-packages

    Do you wish to build TensorFlow with OpenCL support? [y/N] 

    No OpenCL support will be enabled for TensorFlow

    Do you wish to build TensorFlow with CUDA support? [y/N] y

    CUDA support will be enabled for TensorFlow

    Do you want to use clang as CUDA compiler? [y/N] y

    Clang will be used as CUDA compiler

    Please specify which clang should be used as device and host compiler. [Default is /usr/bin/clang]: 

    Please specify the CUDA SDK version you want to use, e.g. 7.0. [Leave empty to use system default]: 

    Please specify the location where CUDA  toolkit is installed. Refer to README.md for more details. [Default is /usr/local/cuda]: 

    Please specify the cuDNN version you want to use. [Leave empty to use system default]: 

    Please specify the location where cuDNN  library is installed. Refer to README.md for more details. [Default is /usr/local/cuda]: 

    Please specify a list of comma-separated Cuda compute capabilities you want to build with.

    You can find the compute capability of your device at: https://developer.nvidia.com/cuda-gpus.

    Please note that each additional compute capability significantly increases your build time and binary size.

    [Default is: "3.5,5.2"]: 3.0

     

    그러면 이제 차례차례 빌드를 진행해주시면 됩니다.

     

    (tensor) My-MacBook:tensor jpkim$ bazel build tensorflow/examples/image_retraining:retrain

    (tensor) My-MacBook:tensor jpkim$ bazel build tensorflow/python/tools:optimize_for_inference

    (tensor) My-MacBook:tensor jpkim$ bazel build tensorflow/examples/label_image:label_image

    (tensor) My-MacBook:tensor jpkim$ bazel build tensorflow/tools/quantization:quantize_graph

    (tensor) My-MacBook:tensor jpkim$ bazel build tensorflow/contrib/util:convert_graphdef_memmapped_format

     

    몇몇 파일은 빌드하는데 상당히 오랜시간이 걸립니다 (특히 위의 3가지 - 1시간 내외 소요)

    빌드하면 워닝이나 정보가 계속 뜨는데 일단은 오류가 아니면 그냥 넘어가셔도 괜찮습니다. 오류가 발생했다면 빌드에 필요한 파일이 제대로 경로에 포함되어 있지 않거나 버전이 안맞는 등의 이유일 가능성이 높습니다. 오류메시지를 잘 살펴보시면 대부분 해결이 가능한 문제입니다. 뭐 자세한 부분은 여기서는 생략하고, 진행하겠습니다 ㅎㅎ

     

    팁)

    1. 만약 오류가 났다면, 조치 후 bazel clean --expunge 해주시고 다시 build 하시는게 좋습니다.

    2. 빌드가 잘 됐는데, 실행시 워닝이 뜰 수 있습니다. 이중 "The TensorFlow library wasn't compiled to use XXX ~~~어쩌구" 하는 워닝이 뜬다면, 빌드시에 아래처럼 옵션을 줘서 다시 빌드하시면 학습및 연산성능을 올릴 수 있습니다.(모든 빌드에 대해 각각, 워닝에 나오는 인스트럭션명을 넣어주시면 됩니다)

     

    (tensor) My-MacBook:tensor jpkim$ bazel build -c opt --copt=-msse4.1 --copt=-msse4.2 --copt=-mavx --copt=-mavx2 --copt=-mfma tensorflow/examples/image_retraining:retrain

     

    3. 유닉스쉘에 익숙하신 분들은  && 이용해서 한방에 빌드 걸어놓고 다른 일 보셔도 괜찮겠죠 ...^^ 

     

     

    빌드가 다 되었다면 디렉토리를 살펴보시면

    bazel-bin

    bazel-out

    bazel-genfiles

    bazel-tensorflow

    bazel-testlogs

     

    라는 폴더가 생성되었고, 각각 /priavate/tmp 밑의 템프디렉토리를 심링크 하고 있다는걸 아실 수 있을겁니다.

    아마 빌드를 여러번 다른 조건으로 할 수 있어서 임시폴더를 만들어 거기서 빌드파일을 관리하는거 같은데, (build clean 하면 사라짐)

    저같은 경우는 그것도 모르고  build clean 했다가 첨부터 다시 빌드했던 아픈기억이...ㅠㅜ

    그래서 아예 임시폴더를 통째로 카피해서 썼슴다...빌드 다시 해도 이전것도 쓸 수 있도록

     

     

     

    자, 이제 필요한 소스들이 다 갖춰졌으니, 학습을 시작해볼 차례입니다. 그건 다음시간에...^^