최근 일주일동안 C++에서 Tensorflow를 사용하기 위해 온갖 삽질을 다 했습니다.
어제가 딱 일주일이 되던 날이었는데 C++에서 직접 Tensorflow를 사용하는 것은 다양한 에러와 싸우며 실패했고
Boost Python을 이용하여 C++와 Tensorflow 사이에 Python을 끼워주는 방법을 찾아서 5시간 만에 성공했습니다.

Vcpkg 에서 Tensorflow를 지원할 때까지 이렇게 쓰려고 합니다.

근 일주일동안, 그리고 앞으로도 신세를 많이 지게 될 것 같은 블로그가 홍 정모 교수님의 블로그(클릭하면 이동)일 것 같습니다.
블로그에서 댓글로도 감사 인사를 남겼는데 제 일기나 다름없는 여기에도 감사 인사를 아끼지 않고 싶습니다.


<구성 환경>


Visual Studio 2015 Community Update 3

boost_1_65

Anaconda Virtual Environment Python 3.5.x


<참고자료>



C++ Boost Library 1.63 빌드 (Python/Numpy 빌드)

http://blog.naver.com/atelierjpro/220965925819


Boost Python으로 Tensorflow를 C++에서 더 쉽게 쓰기

http://blog.naver.com/atelierjpro/221054333725


AttributeError due to sys.argv[0] for 'import tensorflow as tf' inside c

https://stackoverflow.com/questions/41323576/attributeerror-due-to-sys-argv0-for-import-tensorflow-as-tf-inside-c


Boost.PythonおよびBoost.NumpyをWindowsで使うまで

http://tatsyblog.sakura.ne.jp/wordpress/programming/python/1308/



1. VS와 Anaconda를 설치합니다.


2. 미리 Anaconda에서 파이썬 가상 환경을 기호에 맞게 설정합니다. 저는 python 3.5에 tensorflow만 올렸습니다.


(in Anaconda Prompt)


conda create -n py35_tf_cpp python=3.5

activate py35_tf_cpp

pip install --ignore-installed --upgrade tensorflow-gpu


gpu가 마땅치 않은 경우 cpu 버전을 설치해주세요. (--upgrade tensorflow)



3. boost를 다운받고 적당한 곳에 압축을 해제합니다. 저는 boost_1_65_0.zip을 받았습니다.


4. VS 폴더 아래에 있는 vcvars64.bat을 실행하고 3에서 압축을 해제한 boost 폴더 안의 bootstrap을 실행합니다.


(in Anaconda Prompt)


"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64\vcvars64.bat"

bootstrap.bat


5. bootstrap.bat 을 성공적으로 실행하고나면 같은 폴더에 project-config.jam 파일이 생성됩니다. 이 파일을 수정하고 저장한 후 boost를 빌드합니다.


[ project-config.jam ]


import option ; 

 

using msvc ; 

using python : 3.5 : D:\Equip\Anaconda3\envs\py35_tf_cpp : : : <address-model>64 ; 

 

option.set keep-going : false ; 


반드시 64와 ; (세미콜론) 사이의 간격이 띄워져 있어야한다고 합니다.


(in Anaconda Prompt)

b2 -j8 --toolset=msvc-14.0 --build-type=complete architecture=x86 address-model=64 stage


-j 뒤의 숫자는 쓰레드 갯수이니 CPU 사양에 따라 조절해주세요.



6. VS에서 Win32 Console Application의 빈 프로젝트를 하나 생성하고 추가 포함 디렉터리(Additional Include Directories)와 추가 라이브러리 디렉터리(Additional Library Directories)에 boost의 폴더와 python 가상환경의 폴더를 추가합니다. 저는 Release x64 환경에서 진행하였습니다.


예시)


Additional Include Directories (C/C++ / General)

D:\Anaconda3\envs\py35_tf_cpp\include

D:\boost\boost_1_65_0_cpp_tf


Additional Library Directories (Linker / General)

D:\boost\boost_1_65_0_cpp_tf\stage\lib

D:\Anaconda3\envs\py35_tf_cpp\libs


Additional Dependencies (Linker / Input)

python35.lib

libboost_numpy3-vc140-mt-1_65.lib




7. cpp 파일을 하나 만들고 아래의 예시 코드를 참조하여 코드를 완성한 후 빌드합니다. 


#define BOOST_PYTHON_STATIC_LIB
#define BOOST_LIB_NAME "boost_numpy3"
#include <boost/config/auto_link.hpp>
#include <boost/python.hpp>
#include <boost/python/numpy.hpp>
#include <iostream>
 
namespace py = boost::python;
namespace np = boost::python::numpy;
 
int main()
{
    using namespace std;
 
    Py_SetPythonHome(L"D:\\Equip\\Anaconda3\\envs\\py35_tf_cpp");
 
    Py_Initialize();
    np::initialize();
 
    py::object main_module = py::import("__main__");
    py::object main_namespace = main_module.attr("__dict__");
 
    py::object sys_ = py::import("sys");
    PyRun_SimpleString("import sys\n"
        "sys.argv = ['']");
    string version = py::extract<string>(sys_.attr("version"));
    cout << version << endl;
 
    py::object print = py::import("__main__").attr("__builtins__").attr("print");
    print("Hello, Python");
 
    const py::object tf_ = py::import("tensorflow");
 
    const np::ndarray d1 = np::array(py::make_tuple(1.0f, 2.0f, 3.0f, 4.0f));
    const np::ndarray d2 = np::array(py::make_tuple(5.0f, 6.0f, 7.0f, 9.0f));
 
    const py::object x1 = tf_.attr("constant")(d1);
    const py::object x2 = tf_.attr("constant")(d2);
 
    const py::object result = tf_.attr("multiply")(x1, x2);
    const py::object sess = tf_.attr("Session")();
 
    print(sess.attr("run")(result));
 
    sess.attr("close");    
 
    return 0;
}
cs



8. boost 를 빌드했던 폴더 안에 있는 stage\lib 폴더에서 boost_python3-vc140-mt-1_65.dll 과 boost_numpy3-vc140-mt-1_65.dll 를 7에서 빌드한 폴더에 복사합니다.


9. 실행하면 아래와 같은 결과를 얻을 수 있습니다.


3.5.4 |Continuum Analytics, Inc.| (default, Aug 14 2017, 13:41:13) [MSC v.1900 64 bit (AMD64)]

Hello, Python


(GPU 정보 생략)


[  5.  12.  21.  36.]

계속하려면 아무 키나 누르십시오 . . .


'연구 > 딥러닝' 카테고리의 다른 글

C++ 에서 Boost Python으로 MNIST 실습 예제  (1) 2017.08.29

+ Recent posts