YongWook's Notes

<CAFFE> 설치 in Ubuntu 본문

-software/AI

<CAFFE> 설치 in Ubuntu

글로벌한량 2016. 8. 22. 17:25

연구실 PC : Nvidia Geforce GTX 1070 + Ubuntu 14.04 조합
개인 노트북 : Nvidia Geforce GT650M + Ubuntu16.04조합


  1. CUDA (Nvidia GPU tool for performance)
    ~curl 설치
    $>apt-get install curl
        $>apt-get install git
        

    ~apt-get 업그레이드
    $>apt-get upgrade 
        

    ~CUDA8.0 설치 (그래픽카드 드라이버도 포함)
    https://developer.nvidia.com/cuda-downloads - runfile로 다운받기.
    $>chmod +x cuda_8.0.27_linux.run
        $>sudo ./cuda_8.0.27_linux.run --no-opengl-libs 
        #약관 다 읽고 Accept
        #installing the NVIDIA drvier - YES (352.00 이상의 nvidia드라이버가 이미 설치되어있다면 NO)
        #installing CUDA Toolkit + Driver - YES
        #installing CUDA Samples - YES
        #Symbolic link - YES
        #xorg.conf 가 나온다면 이건 NO

    만약 unsupported compiler error가 난다면 다음과 같이 gcc문제를 해결하자.
    sudo apt-get install gcc-4.8
        sudo update-alternatives --remove-all gcc
        sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 10
        

    ~CUDA 환경변수 설정
    $>cd /etc/
        $>sudo gedit bash.bashrc
        
        #다음 환경 변수 추가해줌
        export CUDA_HOME=/usr/local/cuda-8.0
        export LD_LIBRARY_PATH=${CUDA_HOME}/lib64
        PATH=${CUDA_HOME}/bin:${PATH}
        export PATH
        
        $>source ~/.bashrc   #변경된 환경변수 적용 (혹은 재부팅)
        

    ~설치된 NVIDIA driver, CUDA버전 확인
    $>cat /proc/driver/nvidia/version   #Nvidia driver version
        $>nvcc -V   #CUDA driver version
        
        #터미널에서 NVIDIA_CUDA-8.0_Samples 폴더로 이동 후  
        $>make
        
        #NVIDIA_CUDA-8.0_Samples/bin/x86_64/linux/release/ 로 이동 후
        $>./deviceQuery
        $>./bandwidthTest 
        
    + Sample폴더에서 make를 했더니 gcc관련 error가 발생하는 경우가 가끔 있다. gcc version > 5.3인 경우 발생하는 오류인데, 내 gcc버전을 확인($> gcc --version) 했을 때 5.3 이하임을 만족하고 있는 경우가 있다. 심볼릭 링크를 변경하는 등의 방법도 있다고 하지만 잘 먹히지 않을 땐, 그냥 /usr/local/cuda-8.0/include/의 host_config.h를 sudo로 열고 해당 error부분을 삭제해버려도 좋다. 확인된 side effect는 아직 없다고 한다.


  2. Caffe가 사용하는 Dependencies
    $> sudo apt-get install --force-yes libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev protobuf-compiler gfortran libjpeg62 libfreeimage-dev libatlas-base-dev git python-dev python-pip libgoogle-glog-dev libbz2-dev libxml2-dev libxslt1-dev libffi-dev libssl-dev libgflags-dev liblmdb-dev 
  3. Caffe 패키지 소스와 파이썬 requirements 설치
    $> git clone https://github.com/BVLC/caffe.git
        $> cd caffe
        $> cat python/requirements.txt | xargs -L 1 sudo pip install
        
        #usr/local에 해당하는 python library와 numpy에 대한 심볼릭 링크 만들기 - numpy도 설치됨
        $> sudo ln -s /usr/include/python2.7/ /usr/local/include/python2.7
        $> sudo ln -s /usr/local/lib/python2.7/dist-packages/numpy/core/include/numpy /usr/local/include/python2.7/numpy
        
        #scipy설치
        $>apt-get install python-scipy 
  4. Make
    #caffe 패키지의 루트폴더에서
        $>cp Makefile.config.example Makefile.config
        
        #Makefile.config 코드 중 활성화된 PYTHON_INCLUDE 변경
        PYTHON_INCLUDE := /usr/local/include/python2.7 \ /usr/local/include/python2.7/numpy
        
        #위를 완료했다면, 드디어
        $>make pycaffe
        $>make all
        $>make test 
    + make pycaffe 시 hdf5 error가 발생하는 경우 다음과 같이 해결하자.
    cd /usr/lib/x86_64-linux-gnu
        sudo ln -s libhdf5_serial.so.8.0.2 libhdf5.so    #직접 디렉토리에 들어가서 자신의 버전을 확인하여 수정.
        sudo ln -s libhdf5_serial_hl.so.8.0.2 libhdf5_hl.so
        
        #caffe루트 폴더의 Makefile.config 수정
        INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial/
        LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu/hdf5/serial/
        

  5. Test
    #테스트 데이터 다운로드드
        $> python scripts/download_model_binary.py models/bvlc_reference_caffenet
        $> sh data/ilsvrc12/get_ilsvrc_aux.sh
        
        #콘솔창에서 실험결과를 확인하기 위해 caffe/python/classify.py를 편집한다.
        +    import pandas as pd
        
             parser.add_argument( #여러개의 overloading된 함수들
                          ...
             )
        +    parser.add_argument( #추가로 overload시키기
        +        "--print_results",
        +        action='store_true',
        +        help="Write output text to stdout rather than serializing to a file."
        +    )
        +    parser.add_argument(
        +        "--labels_file",
        +        default=os.path.join(pycaffe_dir,"../data/ilsvrc12/synset_words.txt"),
        +        help="Readable label definition file."
        +    )
        + 
        
             # Classify.
             start = time.time()
        +    scores = classifier.predict(inputs, not args.center_only).flatten()
             predictions = classifier.predict(inputs, not args.center_only)
             print("Done in %.2f s." % (time.time() - start))
         
        +    if args.print_results:
        +      with open(args.labels_file) as f:
        +        labels_df = pd.DataFrame([{'synset_id':l.strip().split(' ')[0], 'name': ' '.join(l.strip().split(' ')[1:]).split(',')[0]} for l in f.readlines()])
        +        labels = labels_df.sort('synset_id')['name'].values
        +        
        +        indices =(-scores).argsort()[:5]
        +        predic기tions = labels[indices]
        +        
        +        meta = [(p, '%.5f' % scores[i]) for i,p in zip(indices, predictions)]
        +        print meta
        +
        # Save 
    $>python python/classify.py --print_results examples/images/cat.jpg foo 를 입력하여 테스트

    ValueError가 발생했을 시 대처법
    #caffe/python/caffe/io.py 의 258-259 line
        if ms != self.inputs[in_][1:]:
            raise ValueError('Mean shape incompatible with input shape.')
        #를 다음 코드로 변경 후 저장
        if ms != self.inputs[in_][1:]:
            print(self.inputs[in_])
            in_shape = self.inputs[in_][1:]
            m_min, m_max = mean.min(), mean.max()
            normal_mean = (mean - m_min) / (m_max - m_min)
            mean = resize_image(normal_mean.transpose((1,2,0)),in_shape[1:]).transpose((2,0,1)) * (m_max - m_min) + m_min
            #raise ValueError('Mean shape incompatible with input shape.')
        
  6. 완료되었을 때의 화면
  7. cuDNN 설치 -for performance
    https://developer.nvidia.com/cudnn
    #cuDNN의 파일들을 적절한 디렉토리로 복사
        tar -zxf cudnn-8.0-linux-x64-v5.1.tgz
        $>cd cuda/lib64/
        $>sudo cp lib* /usr/local/cuda/lib64
        
        $>cd cuda/include/
        $>sudo cp cudnn.h /usr/local/cuda/include/
        
  8. OpenBLAS -for performance
    $>git clone git://github.com/xianyi/OpenBLAS
        $>cd OpenBLAS && maek FC=gfortran
        $>sudo make PREFIX=/opt/OpenBLAS install
        $>sudo ldconfig
        
        $>cp /opt/OpenBlas/lib/libopenblas.a /usr/lib
        $>cp /opt/OpenBlas/lib/libopenblas.a /usr/local/lib/
        $>cp /opt/OpenBlas/lib/libopenblas.so* /usr/lib
        $>cp /opt/OpenBlas/lib/libopenblas.s0* /usr/local/lib
        
  9. Makefile.config 수정
    #cuDNN과 OpenBLAS를 모두 설치했다면 caffe폴더의 Makefile.config를 다음과 같이 수정한다.
        USE_CUDNN := 1 #uncomment
        BLAS := open
        


Comments