<구성 환경>
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
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 |
---|