Tensorflow 라이브러리를 이용하여 Windows Third party 응용프로그램 빌드를 위한 환경 설정

enuSpace for jupiter - work note


Tensorflow 소스 빌드 : http://enuspace.tistory.com/entry/Tensorflowwindow10build



Tensorflow를 이용하여 윈도우환경에서 64bit release용 라이브러리 및 obj 파일이 생성되었다면, 라이브러리를 이용하여 응용 프로그램 개발 환경에 설정을 위한 셋업과정이다.


본장에서는 Tensorflow의 라이브러리를 새로운 dll프로젝트에 추가하여 외부 응용프로그램과 연동하기 위한 플로그인 프로젝트를 목적으로 한다.



dll 프로젝트 생성 및 호출


- Visual Studio를 이용하여 dll 프로젝트를 생성 : Win32 Console Application -> Application type : dll 선택 및 생성


- 기본적으로 dll의 예시코드가 생성된다.


BOOL APIENTRY DllMain( HMODULE hModule,

                       DWORD  ul_reason_for_call,

                       LPVOID lpReserved

)

{

switch (ul_reason_for_call)

{

case DLL_PROCESS_ATTACH:

case DLL_THREAD_ATTACH:

case DLL_THREAD_DETACH:

case DLL_PROCESS_DETACH:

break;

}

return TRUE;

}


- dll은 외부와 연동할 함수를 추가


extern "C" __declspec(dllexport) bool OnInit();

extern "C" __declspec(dllexport) bool OnLoad();

extern "C" __declspec(dllexport) bool OnUnload();

extern "C" __declspec(dllexport) bool OnTask();


- dll의 프로젝트의 작업 환경은 64bit, relese, multibyte옵션 설정을 수행한다. 


- Tensorflow r1.1 윈도우10에서 C++ 컴파일 방법 (x64)에 따라서 생성된 환경을 이용 : http://enuspace.tistory.com/entry/Tensorflowwindow10build


- DLL project 환경에 include 디렉토리 내용을 추가


D:\Workspace\tensorflow

D:\Workspace\tensorflow\tensorflow\contrib\cmake\build

D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\external\zlib_archive

D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\external\gif_archive\giflib-5.1.4

D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\external\png_archive

D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\external\jpeg_archive

D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\external\eigen_archive

D:\Workspace\tensorflow\third_party\eigen3

D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\gemmlowp\src\gemmlowp

D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\jsoncpp\src\jsoncpp

D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\external\farmhash_archive

D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\external\farmhash_archive\util

D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\external\highwayhash

D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\protobuf\src\protobuf\src

D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\grpc\src\grpc\include


- DLL project 환경에 라이브러리 내용 추가.


D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\tf_cc_framework.dir\Release\tf_cc_framework.lib

D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\tf_cc_ops.dir\Release\tf_cc_ops.lib

D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\tf_core_cpu.dir\Release\tf_core_cpu.lib

D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\tf_core_direct_session.dir\Release\tf_core_direct_session.lib

D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\tf_core_framework.dir\Release\tf_core_framework.lib

D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\tf_core_kernels.dir\Release\tf_core_kernels.lib

D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\tf_core_lib.dir\Release\tf_core_lib.lib

D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\tf_core_ops.dir\Release\tf_core_ops.lib

D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\Release\tf_protos_cc.lib

D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\protobuf\src\protobuf\Release\libprotobuf.lib

D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\protobuf\src\protobuf\Release\libprotoc.lib

D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\tf_cc.dir\Release\tf_cc.lib

D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\zlib\install\lib\zlibstatic.lib

D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\gif\install\lib\giflib.lib

D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\png\install\lib\libpng12_static.lib

D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\jpeg\install\lib\libjpeg.lib

D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\jsoncpp\src\jsoncpp\src\lib_json\Release\jsoncpp.lib

D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\farmhash\install\lib\farmhash.lib

D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\highwayhash\install\lib\highwayhash.lib

D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\grpc\src\grpc\Release\grpc++_unsecure.lib

D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\grpc\src\grpc\Release\grpc_unsecure.lib

D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\grpc\src\grpc\Release\gpr.lib


- Tensorflow 프로젝트 라이브러리를 빌드하다보면, 매번 전체 컴파일을 수행한다. 본 dll프로젝트는 reference 항목에 관련 라이브러리를 추가하지 않고 참조 라이브러에 추가를 수행한다. 


- Preprocessor Definitions 항목에 다음 내용을 추가.


NDEBUG

_WINDOWS

_USRDLL

ENUTENSORFLOW_EXPORTS

EIGEN_AVOID_STL_ARRAY

NOMINMAX

_WIN32_WINNT=0x0A00

LANG_CXX11

COMPILER_MSVC

OS_WIN

_MBCS

WIN64

WIN32_LEAN_AND_MEAN

NOGDI

PLATFORM_WINDOWS

TENSORFLOW_USE_EIGEN_THREADPOOL

EIGEN_HAS_C99_MATH

_ITERATOR_DEBUG_LEVEL=0

TF_COMPILE_LIBRARY

CMAKE_INTDIR="Release"

_CRT_SECURE_NO_WARNINGS


위와같이 환경설정을 하고 난후 샘플 tutorial 샘플 코드를(tf_tutorials_example_trainer)참조하여 빌드를 수행한다.


#include "tensorflow/cc/ops/standard_ops.h"

#include "tensorflow/core/framework/graph.pb.h"

#include "tensorflow/core/framework/tensor.h"

#include "tensorflow/core/graph/default_device.h"

#include "tensorflow/core/graph/graph_def_builder.h"

#include "tensorflow/core/lib/core/threadpool.h"

#include "tensorflow/core/lib/strings/stringprintf.h"

#include "tensorflow/core/platform/init_main.h"

#include "tensorflow/core/platform/logging.h"

#include "tensorflow/core/platform/types.h"

#include "tensorflow/core/public/session.h"


extern "C" __declspec(dllexport) bool OnLoad()

{

tensorflow::example::Options opts;

tensorflow::example::ConcurrentSessions(opts);


return true;

}


빌드가 정상적으로 처리된 후 생성된 dll의 OnLoad()함수를 호출하고 나면 다음과 같은 메세지가 나타나며 비정상 종료된다. 
No session factory registered for the given session option: .....

빌드된 dll의 사이즈와 tf_tutorials_example_trainer의 실행 프로그램의 사이즈에 상당한 차이가 있음을 확인할 수 있다.
dll의 프로젝트와 tf_tutorials_example_trainer 플로젝트의 솔루션을 비교해보면 Object Libraries 항목에 obj 파일이 포함되어 있지 않음을 확인할 수 있다. 

워크스페이스에 Object Libraries 항목에 관련 obj 파일을 추가하고, 다시 빌드를 수행한다. 수행결과 dll의 사이즈가 tutorial의 실행프로그램 사이즈와 비슷해졌음을 확인할 수 있다.

다시 호출을 수행하면, 정상적으로 Tensorflow의 응용 프로그램(dll)이 호출됨을 확인할 수 있다. 


---------

참고로 Tensorflow 홈페이지에서 제공하는 basic 코드를 삽입하였을 경우 추가적인 라이브러리 생성 및 추가를 수행한다.


tensorflow 솔루션 오픈, tf_cc 프로젝트 컴파일 수행.

D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\tf_cc.dir\Release 디렉토리 tf_cc.lib 생성.

D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\tf_cc.dir\Release\tf_cc.lib 라이브러리 추가.


+ Recent posts