Tensorflow r1.5 윈도우10에서 C++ 컴파일 수행기 (x64)


Tensorflow r1.3 버젼에서는 CUDA Toolkit 8을 이용하였으나, Tensorflow 1.5 Version에서는 CUDA Toolkit 9를 찾음.


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

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

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

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

D:\Workspace\tensorflow\tensorflow\contrib\cmake\build>cmake .. -A x64 -DCMAKE_BUILD_TYPE=Release ^

More? -DSWIG_EXECUTABLE=D:/Workspace/swigwin-3.0.10/swigwin-3.0.10/swig.exe ^

More? -DPYTHON_EXECUTABLE=C:/Anaconda3/python.exe ^

More? -DPYTHON_LIBRARIES=C:/Anaconda3/libs/python35.lib ^

More? -Dtensorflow_ENABLE_GPU=ON ^

More? -DCUDNN_HOME="D:\Workspace\cudnn-8.0-windows10-x64-v5.1\cuda" ^

More? -Dtensorflow_WIN_CPU_SIMD_OPTIONS=/arch:AVX

-- Building for: Visual Studio 14 2015

-- The C compiler identification is MSVC 19.0.24215.1

-- The CXX compiler identification is MSVC 19.0.24215.1

-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/x86_amd64/cl.exe

-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/x86_amd64/cl.exe -- works

-- Detecting C compiler ABI info

-- Detecting C compiler ABI info - done

-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/x86_amd64/cl.exe

-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/x86_amd64/cl.exe -- works

-- Detecting CXX compiler ABI info

-- Detecting CXX compiler ABI info - done

-- Detecting CXX compile features

-- Detecting CXX compile features - done

-- Performing Test COMPILER_OPT_ARCH_NATIVE_SUPPORTED

-- Performing Test COMPILER_OPT_ARCH_NATIVE_SUPPORTED - Failed

-- Performing Test COMPILER_OPT_WIN_CPU_SIMD_SUPPORTED

-- Performing Test COMPILER_OPT_WIN_CPU_SIMD_SUPPORTED - Success

CMake Error at C:/Program Files/CMake/share/cmake-3.6/Modules/FindPackageHandleStandardArgs.cmake:148 (message):

  Could NOT find CUDA: Found unsuitable version "8.0", but required is at

  least "9.0" (found C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v8.0)

Call Stack (most recent call first):

  C:/Program Files/CMake/share/cmake-3.6/Modules/FindPackageHandleStandardArgs.cmake:386 (_FPHSA_FAILURE_MESSAGE)

  C:/Program Files/CMake/share/cmake-3.6/Modules/FindCUDA.cmake:958 (find_package_handle_standard_args)

  CMakeLists.txt:278 (find_package)



-- Configuring incomplete, errors occurred!

See also "D:/Workspace/tensorflow/tensorflow/contrib/cmake/build/CMakeFiles/CMakeOutput.log".

See also "D:/Workspace/tensorflow/tensorflow/contrib/cmake/build/CMakeFiles/CMakeError.log".


CUDA Toolkit 9.1 다운 및 설치

https://developer.nvidia.com/cuda-downloads



cudnn-9.1-windows10-x64-v7 다운 및 압축 해제후, CUDA Toolkit 디렉토리에 복사 수행

https://developer.nvidia.com/rdp/cudnn-download



Cmd 명령수행


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

set PATH=%PATH%;C:\Program Files\Git\bin\


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


cmake .. -A x64 -DCMAKE_BUILD_TYPE=Release ^

-DSWIG_EXECUTABLE=D:/Workspace/swigwin-3.0.10/swigwin-3.0.10/swig.exe ^

-DPYTHON_EXECUTABLE=C:/Anaconda3/python.exe ^

-DPYTHON_LIBRARIES=C:/Anaconda3/libs/python35.lib ^

-Dtensorflow_ENABLE_GPU=ON ^

-DCUDNN_HOME="C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.1" ^

-DCUDA_SDK_ROOT_DIR="C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.1" ^

-Dtensorflow_WIN_CPU_SIMD_OPTIONS=/arch:AVX



Cmd 창으로 돌아와 컴파일 빌드 수행.


D:\...\build> MSBuild /p:Configuration=Release tf_tutorials_example_trainer.vcxproj


빌드 수행후 에러 발생 -> math_functions.hpp를 찾지 못하였다고 나오는 경우.


Visual Studio를 이용하여 프로젝트 오픈후 tf_core_gpu_kernels 프로젝트에 Include 디렉토리에 

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.1\include\crt  추가수행후 재시도





D:\...\build> Release\tf_tutorials_example_trainer.exe

-------------------------------------------------------------------------------------------------------------------------------------------------


Tensorflow C++ r1.3에서 r1.5로 변경작업. (enuSpace-Tensorflow)


Tensorflow r1.5를 이용하여 tf_tutorials_example_tranier의 환경중 참조된 Object Libraries를 복사 수행.


- Visual studio 프로젝트 솔루션에서 tf_tutorials_example_trainer의 Object Libraries를 복사 및 붙여넣기 수행. (release용 obj파일 적용)



빌드 수행시 에러


1>D:\Workspace\tensorflow\tensorflow/core/platform/default/mutex.h(25): fatal error C1083: Cannot open include file: 'nsync_cv.h': No such file or directory


- D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\nsync\install 하위 디렉토리에 include, lib 디렉토리 존재

- D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\nsync\install\include 디렉토리 Additional Include Directories에 추가 수행

- D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\nsync\install\lib\nsync.lib 를 Additional Dependencies에 추가 수행.



1>summary_db_writer.obj : error LNK2001: unresolved external symbol sqlite3_bind_blob64


- D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\sqlite\install 하위 디렉토리에 include, lib 디렉토리 존재

- D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\sqlite\install\include 디렉토리 Additional Include Directories에 추가 수행

- D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\sqlite\install\lib\sqlite.lib 를 Additional Dependencies에 추가 수행.



1>port.obj : error LNK2001: unresolved external symbol "void __cdecl snappy::RawCompress(char const *,unsigned __int64,char *,unsigned __int64 *)" (?RawCompress@snappy@@YAXPEBD_KPEADPEA_K@Z)


- D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\snappy\src\snappy\Release\snappy.lib 를 Additional Dependencies에 추가 수행.


1>cuda_dnn.obj : error LNK2001: unresolved external symbol cudnnSetConvolutionMathType


- C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.1\lib\x64\cudart_static.lib // 8.0에서 9.1로 변경

- C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.1\lib\x64\cuda.lib // 8.0에서 9.1로 변경

- C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.1\lib\x64\cublas.lib // 8.0에서 9.1로 변경

- C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.1\lib\x64\cublas_device.lib // 8.0에서 9.1로 변경

- C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.1\lib\x64\cufft.lib // 8.0에서 9.1로 변경

- C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.1\lib\x64\curand.lib // 8.0에서 9.1로 변경

- C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.1\extras\CUPTI\libx64\cupti.lib // 8.0에서 9.1로 변경

- C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.1\lib\x64\cusolver.lib // 8.0에서 9.1로 변경

- C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.1\lib\x64\cudnn.lib // 8.0에서 9.1로 변경


1>tf_cc.lib(while_gradients.obj) : error LNK2001: unresolved external symbol "class tensorflow::Status __cdecl tensorflow::ops::BuildWhileLoop(class tensorflow::Scope const &,class std::vector<class tensorflow::Output,class std::allocator<class tensorflow::Output> > const &,class std::function<class tensorflow::Status __cdecl(class tensorflow::Scope const &,class std::vector<class tensorflow::Output,class std::allocator<class tensorflow::Output> > const &,class tensorflow::Output *)> const &,class std::function<class tensorflow::Status __cdecl(class tensorflow::Scope const &,class std::vector<class tensorflow::Output,class std::allocator<class tensorflow::Output> > const &,class std::vector<class tensorflow::Output,class std::allocator<class tensorflow::Output> > *)> const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class std::vector<class tensorflow::Output,class std::allocator<class tensorflow::Output> > *,bool,class tensorflow::Output *)" (?BuildWhileLoop@ops@tensorflow@@YA?AVStatus@2@AEBVScope@2@AEBV?$vector@VOutput@tensorflow@@V?$allocator@VOutput@tensorflow@@@std@@@std@@AEBV?$function@$$A6A?AVStatus@tensorflow@@AEBVScope@2@AEBV?$vector@VOutput@tensorflow@@V?$allocator@VOutput@tensorflow@@@std@@@std@@PEAVOutput@2@@Z@6@AEBV?$function@$$A6A?AVStatus@tensorflow@@AEBVScope@2@AEBV?$vector@VOutput@tensorflow@@V?$allocator@VOutput@tensorflow@@@std@@@std@@PEAV45@@Z@6@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@6@PEAV56@_NPEAVOutput@2@@Z)


- D:\Workspace\tensorflow\tensorflow\contrib\cmake\build하위에 tf_cc_while_loop.vcxproj 솔루션에 추가하여 컴파일 수행.
- 빌드 결과 D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\tf_cc_while_loop.dir\Release\tf_cc_while_loop.lib 추가.

실행중 No gradient defined for op: MatMul 오류 메세지 나타날경우


- D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\tf_cc.dir\Release\math_grad.obj // Object Libraries에 추가

- D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\tf_cc.dir\Release\nn_grad.obj // Object Libraries에 추가

- D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\tf_cc.dir\Release\array_grad.obj // Object Libraries에 추가


tf_core_kernels (one_hot_op가 포함되지 않은 경우, 포함하여 빌드 수행.


- D:\Workspace\tensorflow\tensorflow\core\kernels\one_hot_op.cc

- D:\Workspace\tensorflow\tensorflow\core\kernels\one_hot_op.h

- D:\Workspace\tensorflow\tensorflow\contrib\cmake\build\tf_core_kernels.dir\Release\one_hot_op.obj // Object Libraries에 추가


Add Object Libraries (포함되지않은 obj 파일이 있는 경우 포함하여 빌드 수행.


- tf_core_kernels.dir\Release\sparse_fill_empty_rows_op.obj

- tf_core_kernels.dir\Release\sparse_reduce_op.obj

- tf_core_kernels.dir\Release\sparse_slice_op.obj



------------------------------------------------------------------------------------------------------------------------------------------------




Solving XOR with a Neural Network in enuSpace-TensorFlow


모델 비교 동영상

Model 1



Cost 계산 Algorithm


Sigmoid 출력값

Cost 출력 값



Model 2



Cost 계산 Algorithm


Sigmoid 값


Cost 값

SoftmaxCrossEntropyWidthLogits - Batch Size 10개, Train 20회 결과 (DataSet : 55000,개 TestSet : 10000개) learning rate = 0.001 

정확도 : 87.72%




SoftmaxCrossEntropyWidthLogits - Batch Size 100개, Train 20회 결과 (DataSet : 55000,개 TestSet : 10000개) learning rate = 0.001 

정확도 : 87.73%



Weight 3차원 결과값 (Range -1 ~ 1)



SoftmaxCrossEntropyWidthLogits - Batch Size 100개, Train 100회 결과 (DataSet : 55000,개 TestSet : 10000개) learning rate = 0.001 

정확도 : 83.25%



Weight 3차원 결과값 (Range -1 ~ 1)



SoftmaxCrossEntropyWidthLogits - Batch Size 1000개, Train 20회 결과 (DataSet : 55000,개 TestSet : 10000개) learning rate = 0.001 

정확도 : 89.04%




Weight 3차원 결과값  (Range -1 ~ 1)



SoftmaxCrossEntropyWidthLogits - Batch Size 1000개, Train 100회 결과 (DataSet : 55000,개 TestSet : 10000개) learning rate = 0.001 

정확도 : 88.03%




Weight 3차원 결과값  (Range -1 ~ 1)



SoftmaxCrossEntropyWidthLogits - Batch Size 10000개, Train 20회 결과 (DataSet : 55000,개 TestSet : 10000개) learning rate = 0.001 

정확도 : 90.63%




Weight 3차원 결과값 (Range -1 ~ 1)



SoftmaxCrossEntropyWidthLogits - Batch Size 10000개, Train 100회 결과 (DataSet : 55000,개 TestSet : 10000개) learning rate = 0.001 

정확도 : 90.69%




Weight 3차원 결과값 (Range -1 ~ 1)



SoftmaxCrossEntropyWidthLogits - Batch Size 55000개, Train 20회 결과 (DataSet : 55000,개 TestSet : 10000개) learning rate = 0.001 

정확도 : 80.57%




Weight 3차원 결과값 (Range -1 ~ 1)




SoftmaxCrossEntropyWidthLogits - Batch Size 55000개, Train 100회 결과 (DataSet : 55000,개 TestSet : 10000개)  learning rate = 0.001 

정확도 : 84.06%




Weight 3차원 결과값 (Range -1 ~ 1)



SoftmaxCrossEntropyWidthLogits - Batch Size 55000개, Train 1000회 결과 (DataSet : 55000,개 TestSet : 10000개) learning rate = 0.000001 

정확도 : 90.20%



cost value : 0.75




Weight 3차원 결과값 (Range -1 ~ 1)



Weight 3차원 결과값 (Range -0.2 ~ 0.2)



SoftmaxCrossEntropyWidthLogits - Batch Size 10000개, Train 500회 결과 (DataSet : 50000,개 TestSet : 10000개) learning rate = 0.0001 

정확도 : 91.60%




Weight 3차원 결과값 (Range -1 ~ 1)






MNIST linear regression


MNIST dataset을 이용하여 linear regression 알고리즘을 enuSpace-Tensorflow를 이용한 사용 방법을 설명합니다.



Python를 이용한 구현

참고 : http://www.xiaoliangbai.com/2017/02/01/tensorflow-applying-linear-regression-on-mnist-dataset

import sys
import time
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow.examples.tutorials.mnist import input_data
%matplotlib inline

%load_ext autoreload
%autoreload 2

MNIST = input_data.read_data_sets("MNIST_data", one_hot=True)

# Define parameters for linear model
learning_rate = 0.01
batch_size = 128
n_epochs = 25

# Create placeholders
X = tf.placeholder(tf.float32, [batch_size, 784], name="image")
Y = tf.placeholder(tf.float32, [batch_size, 10], name="label")

# Create weights and bias
w = tf.Variable(tf.random_normal(shape=[784, 10], stddev=0.01), name="weights")
b = tf.Variable(tf.zeros([1,10]), name='bias')

# calculate scores
logits = tf.matmul(X, w) + b

# Entropy cost function and loss
entropy = tf.nn.softmax_cross_entropy_with_logits(logits, Y)
loss = tf.reduce_mean(entropy)

# Define optimizer
optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate).minimize(loss)

# Run optimization and test
loss_history = []
acc_history = []
init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    n_batches = int(MNIST.train.num_examples/batch_size)
    for i in range(n_epochs):
        for _ in range(n_batches):
            X_batch, Y_batch = MNIST.train.next_batch(batch_size)
            _, loss_value = sess.run([optimizer, loss], feed_dict={X: X_batch, Y:Y_batch})
        loss_history.append(loss_value)

        # Check validation accuracy    
        n_v_batches = int(MNIST.validation.num_examples/batch_size)
        total_correct_preds = 0
        for j in range(n_v_batches):
            X_batch, Y_batch = MNIST.validation.next_batch(batch_size)
            _, loss_batch, logits_batch = sess.run([optimizer, loss, logits], feed_dict={X: X_batch, Y:Y_batch})
            preds = tf.nn.softmax(logits_batch)
            correct_preds = tf.equal(tf.argmax(preds, 1), tf.argmax(Y_batch, 1))
            accuracy = tf.reduce_sum(tf.cast(correct_preds, tf.float32))
            total_correct_preds += sess.run(accuracy)
        validation_accuracy = total_correct_preds/MNIST.validation.num_examples
        acc_history.append(validation_accuracy)


    # Test the model
    n_batches = int(MNIST.test.num_examples/batch_size)
    total_correct_preds = 0
    for i in range(n_batches):
        X_batch, Y_batch = MNIST.test.next_batch(batch_size)
        logits_batch = sess.run(logits, feed_dict={X: X_batch, Y:Y_batch})
        preds = tf.nn.softmax(logits_batch)
        correct_preds = tf.equal(tf.argmax(preds, 1), tf.argmax(Y_batch, 1))
        accuracy = tf.reduce_sum(tf.cast(correct_preds, tf.float32))
        total_correct_preds += sess.run(accuracy)

    print "Test accuracy is {0}".format(total_correct_preds/MNIST.test.num_examples)

enuSpace-Tensorflow를 이용한 구현

Training model 1 (SoftmaxCrossEntropyWidthLogits)

아래 그리픽 모델은 SoftmaxCrossEntropyWidthLogits 객체를 이용하여 그래픽 블럭을 이용하여 각 객체의 핀정보에 대하여 연결선을 수행한 화면이다.

Training model (Subtract)

아래 그래픽 모델은 Subtract객체를 이용하여 그래픽 블럭을 이용하여 각 객체의 핀정보에 대하여 연결선을 수행한 화면이다.

각 블럭별 기능 설명

데이터 셋 불러오기

각 블럭중 데이터셋을 불러와 전달을 수행하기 위한 FIFOQueue , FIFOEnqueue를 활용한다. 한번에 불러올 이미지의 배치 사이즈를 설정한다. 본 모델은 100개를 적용하였다.

Cost값 Gradient

불러온 이미지 데이터 셋을 이용하여 Weight변수와 Bias변수를 생성하여 Training 수행


Traing 결과 저장

Training을 특정 개수에 도달하면, Weight와 Bias의 텐서값을 저장하기 위하여 아래그림과 같이 구성하였다.

Evaluation Model

앞에서 저장된 Weight, Bias의 값을 이용하여 평가를 수행하는 모델이다.

평가용 dataset 가져오기

평가를 수행하기 위해서 평가용 데이터셋의 파일 위치를 지정하여 매 실행마다 불러오기를 수행한다.

Train 결과값 불러오기

앞 Training Model에서 저장한 Weight, Bias 텐서값을 불러오는 불럭이다.

평가하기

평가용 데이터셋과 Weight, bias값을 불러왔다면 평가를 수행한다.

평가 결과 출력하기

평가 결과를 출력하기 위하여 Counter와 판정결과값을 확인하기 블럭을 구성하였다.

3차원 Weight값 실시간 디스플레이

Training 과정을 확인하기 위해서 Weight값을 3차원으로 확인하기 위한 픽쳐를 생성하여 실시간 변화정보에 대하여 확인한다.

SoftmaxCrossEntropyWidthLogits 이용한 모델 결과

Subtract 이용한 모델 결과.




Gradient Descent


Gradient Descent 알고리즘을 enuSpace-Tensorflow를 이용하여 실행 결과입니다.


enuSpace-Tensorflow는 C++ 기반의 API를 이용하여 그래픽 블럭으로 구성되었습니다. Tensorflow의 C++ API를 이용하여 구현하시는 분은 아래링크를 참고하세요.

API 가이드 : https://expnuni.gitbooks.io/enuspacetensorflow/content/


참고 : https://hunkim.github.io/ml/ (모두를 위한 머신러닝/딥러닝 강의)

참고 : https://medium.com/@peteryun/ml-%EB%AA%A8%EB%91%90%EB%A5%BC-%EC%9C%84%ED%95%9C-tensorflow-3-gradient-descent-algorithm-%EA%B8%B0%EB%B3%B8-c0688208fc59

Python를 이용한 구현

import tensorflow as tf

x_data = [1., 2., 3.]
y_data = [1., 2., 3.]

W = tf.Variable(tf.random_uniform([1],-10.0, 10.0))

X = tf.placeholder(tf.float32)
Y = tf.placeholder(tf.float32)

hyphothesis = W * X

cost = tf.reduce_mean(tf.square(hyphothesis - Y))

descent = W - tf.mul( 0.1, tf.reduce_mean(tf.mul( (tf.mul(W,X)-Y), X ) ))

init = tf.initialize_all_variables()

sess = tf.Session()
sess.run(init)

for step in range(20):
    sess.run(W.assign(descent), feed_dict={X:x_data, Y:y_data})
    print( step, sess.run(cost, feed_dict={X:x_data, Y:y_data}), sess.run(W))

enuSpace-Tensorflow를 이용한 구현

Tensorflow의 그래픽 컴포넌트를 이용하여 위와 동일한 코드를 그래픽 컴포넌트를 이용하여 로직을 구성하여 실행한 결과는 아래 그림과 같다. 

X의 초기값에 {1.0f, 2.0f, 3.0f} 입력시 출력 Y {1.0f, 2.0f, 3.0f}에 해당하는 W값을 구현하는 로직이다.

자세한 알고리즘에 대한 설명은 https://hunkim.github.io/ml/ (모두를 위한 머신러닝/딥러닝 강의)를 참고하시기 바랍니다.

ApplyGradientDescent 블럭을 이용한 구현 예시

ApplyGradientDescent Equation (var = var - alpha*delta)


Multi Variable Linear regression 구현 예시

아래의 테이블의 값을 이용하여 W, b의 찾기 위한 그래픽 블럭을 구성하여 예상된 가중치와 바이어스값을 확인.

X1X2X3Y
152179
151222110
351323135
44524171
51553199
6447120
121727132
62028135

미리계산된 W, Bias 값 (W1 = 1, W2 = 2, W3= 3, Bias = 5)

Hypothesis Using matrix

H(x1, x2, x3) = x1w1 + x2w2 + x3w3

Multi variable Python 코드 구현예시

x_data = [[1., 5., 21.], [15., 12., 22.],
         [35., 13., 23.], [4., 45., 24.], [5., 15., 53.],
         [6., 44., 7.], [12., 17., 27.], [6., 20., 28.]]
y_data = [[79.], [110.], [135.], [171.], [199.], [120.], [132.], [135.]]


# placeholders for a tensor that will be always fed.
X = tf.placeholder(tf.float32, shape=[None, 3])
Y = tf.placeholder(tf.float32, shape=[None, 1])

W = tf.Variable(tf.random_normal([3, 1]), name='weight')
b = tf.Variable(tf.random_normal([1]), name='bias')

# Hypothesis
hypothesis = tf.matmul(X, W) + b

그랙픽 블럭 구성 및 실행 결과


W1, W2, W3의 값이 1, 2, 3의 값으로 수렴, Bias 값 5로 수렴

초기값 설정

X = {{1,5,21},{15,12,22},{35,13,23},{4,45,24},{5,15,53},{6,44,7},{12,17,27},{6,20,28}}

Y = {{79 },{110},{135},{171},{199},{120},{132},{135}}

W 초기값 = {{1.5,3.5,0.5}}

b 초기값 = {{0.5}}

ApplyGradientDescent alpha 값 = 0.001



Tensorflow r1.3 윈도우10에서 C++ 컴파일 수행기 (x64)

enuSpace for jupiter - work note


Tensorflow r1.3을 이용한 Third party 프로그램 개발에 있어 소스 빌드과정에 대한 수행 내용이다.



Tensorflow r1.3 컴파일 공식 페이지

https://github.com/tensorflow/tensorflow/blob/r1.3/tensorflow/contrib/cmake/README.md



Step by Step


Run cmd (컴파일 환경 설정)

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


CMake and git Path 추가 (Cmd 창에서 명령  수행이 가능하도록 패스추가)

- D:\Workspace>set PATH=%PATH%;C:\Program Files\Git\bin\


cmake .. -A x64 -DCMAKE_BUILD_TYPE=Release ^

-DSWIG_EXECUTABLE=D:/Workspace/swigwin-3.0.10/swigwin-3.0.10/swig.exe ^

-DPYTHON_EXECUTABLE=C:/Anaconda3/python.exe ^

-DPYTHON_LIBRARIES=C:/Anaconda3/libs/python35.lib ^

-Dtensorflow_ENABLE_GPU=ON ^

-DCUDNN_HOME="D:\Workspace\cudnn-8.0-windows10-x64-v5.1\cuda" ^

-Dtensorflow_WIN_CPU_SIMD_OPTIONS=/arch:AVX


MSBuild /p:Configuration=RelWithDebInfo ALL_BUILD.vcxproj

텐서플로우 실행 절차에 수행시 error : new line constant 에러가 발생합니다.

아래와 같이 조치를 수행합니다.


-----------------------------------------------------------------------------------------------

build\re2\src\re2\CMakeLists.txt 파일 오픈 수행후 AdditionalOptions 을 추가합니다. (/source-charset:utf-8)



# Copyright 2015 The RE2 Authors.  All Rights Reserved.

# Use of this source code is governed by a BSD-style

# license that can be found in the LICENSE file.


# Old enough to support Ubuntu Trusty.

cmake_minimum_required(VERSION 2.8.12)


project(RE2 CXX)

include(CTest)


option(BUILD_SHARED_LIBS "build shared libraries" OFF)

option(USEPCRE "use PCRE in tests and benchmarks" OFF)


# CMake seems to have no way to enable/disable testing per subproject,

# so we provide an option similar to BUILD_TESTING, but just for RE2.

option(RE2_BUILD_TESTING "enable testing for RE2" ON)


set(EXTRA_TARGET_LINK_LIBRARIES)


if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")

  if(MSVC_VERSION LESS 1800)

    message(FATAL_ERROR "you need Visual Studio 2013 or later")

  endif()

  if(BUILD_SHARED_LIBS)

    # See http://www.kitware.com/blog/home/post/939 for details.

    cmake_minimum_required(VERSION 3.4)

    set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)

  endif()

  # CMake defaults to /W3, but some users like /W4 (or /Wall) and /WX,

  # so we disable various warnings that aren't particularly helpful.

  add_compile_options(/source-charset:utf-8 /wd4100 /wd4201 /wd4456 /wd4457 /wd4702 /wd4815)

elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")

  add_compile_options(-std=c++11)

endif()





RELEASE용 컴파일 수행합니다.


D:\...\build> MSBuild /p:Configuration=Release tf_tutorials_example_trainer.vcxproj
D:\...\build> Release\tf_tutorials_example_trainer.exe




enuSpace for jupiter 개발 이야기

  • enuSpace for jupiter deep learning(tensorflow) plugin project 오픈소스 생성


tensorflow 버젼 : r1.2

enuSpace for jupiter 버젼에서는 외부 모듈과 연동하기 위한 plugin 기능이 추가됩니다.

Deep learning 오픈 플랫폼 tensorflow와 연동하기 위한 공개 소프트웨어 저장소를 생성하였습니다.

Project 주소(github) : https://github.com/EXPNUNI/enuSpaceTensorflow


Tensorflow C++ API Guide

#include "tensorflow/cc/client/client_session.h"
#include "tensorflow/cc/ops/standard_ops.h"
#include "tensorflow/core/framework/tensor.h"

int main() 
{
  using namespace tensorflow;
  using namespace tensorflow::ops;
  Scope root = Scope::NewRootScope();

  // Matrix A = [3 2; -1 0]
  auto A = Const(root, { {3.f, 2.f}, {-1.f, 0.f}});
  
  // Vector b = [3 5]
  auto b = Const(root, { {3.f, 5.f}});
  
  // v = Ab^T
  auto v = MatMul(root.WithOpName("v"), A, b, MatMul::TransposeB(true));
  std::vector outputs;
  ClientSession session(root);
  
  // Run and fetch v
  TF_CHECK_OK(session.Run({v}, &outputs));
  
  // Expect outputs[0] == [19; -3]
  LOG(INFO) << outputs[0].matrix();
  return 0;
}

위와 같이 C++를 이용하여 Tensorflow 코드를 짜야 했던 내용을 enuSpace에서 아래 그림과 같이 로직 블럭을 drag & drop으로 구성하고 연결선을 이용하여 코드를 제작합니다. 

위 프로그램은 실제 Const 입력값에 따라서 MatMul 블럭의 Operation을 수행하여 연산 결과를 출력하는 동작 화면입니다. 

현재단계는 Tensorflow와 메모리 연동에 대한 소프트웨어 설계 및 기초 구현이 되었습니다. 

enuSpace for jupiter 버젼의 진화과정을 github에서 확인하실 수 있습니다. 많은 관심 부탁드립니다.

https://github.com/EXPNUNI/enuSpaceTensorflow


-이엔유 주식회사 developer team - 


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 라이브러리 추가.


Tensorflow r1.1 윈도우10에서 C++ 컴파일 수행기 (x64)

enuSpace for jupiter - work note


Tensorflow r1.1을 이용한 Third party 프로그램 개발에 있어 소스 빌드과정에 대한 수행 내용이다.



준비사항


Known-good configurations (가장 좋은 조합)


컴파일 환경 : Microsoft Windows 10


- Microsoft Visual Studio 2015 with Visual C++ 2015


- Anaconda 4.1.1 (Python 3.5 64-bit) : https://www.continuum.io/downloads


- Git for Windows version 2.9.2.windows.1


- swigwin-3.0.10 : http://www.swig.org/download.html


- [NVidia CUDA Toolkit 8.0] (https://developer.nvidia.com/cuda-downloads)

- [NVidia CUDNN 5.1] (https://developer.nvidia.com/cudnn)


- CMake 3.6 : https://cmake.org/download/


* 가장 좋은 조합을 따라서 컴파일을 수행하여야 한번에 적용이 용이함.


Step by Step (절차)


Run cmd (컴파일 환경 설정)


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


CMake and git Path 추가 (Cmd 창에서 명령  수행이 가능하도록 패스추가)


- D:\Workspace>set PATH=%PATH%;C:\Program Files\Git\bin\


Tensorflow r1.1 clone (텐서플로우 1.1 다운로드)


- D:\Workspace>git clone -b r1.1 https://github.com/tensorflow/tensorflow.git


- D:\Workspace>cd tensorflow\tensorflow\contrib\cmake
- D:\Workspace\tensorflow\tensorflow\contrib\cmake> mkdir build
- D:\Workspace\tensorflow\tensorflow\contrib\cmake> cd build
- D:\Workspace
\tensorflow\tensorflow\contrib\cmake\build>
D:\...\build> cmake .. -A x64 -DCMAKE_BUILD_TYPE=Release ^
More? -DSWIG_EXECUTABLE=D:/Workspace/swigwin-3.0.10/swigwin-3.0.10/swig.exe ^
More? -DPYTHON_EXECUTABLE=C:/Anaconda3/python.exe ^
More? -DPYTHON_LIBRARIES=C:/Anaconda3/libs/python35.lib 


튜터리얼 샘플 빌드 수행


MSBuild


- D:\...\build>MSBuild /p:Configuration=Release tf_tutorials_example_trainer.vcxproj


위 절차에서 따라서 새성된 옵션은 release 버젼용으로 컴파일이 된다. 정상적으로 동작을 수행하는지 샘플프로그램을 실행한다.


정상적으로 컴파일 완료후, 샘플 프로그램 테스트.


- D:\...\build>Release\tf_tutorials_example_trainer.exe


debug 버젼의 빌드는 동일한 구성으로 시도하였을 경우 빌드가 용이치 않다. 

makefiles를 수정하며 옵션 변경이 필요하다.


Tensorflow r1.1에 대한 64bit용 release에 대해서만 빌드가 정상적으로 수행되었으며, 32bit 컴파일 과정에 일부 라이브러리의 64bit 컴파일 환경에 따라서 정상적으로 빌드가 되지 않음을 확인하였다. 



참고 사이트 : 

https://github.com/tensorflow/tensorflow/blob/r1.1/tensorflow/contrib/cmake/README.md

https://www.facebook.com/notes/hyeon-gab-shin/windows-10-기반-tensorflow-빌드-및-실행하기/1264305280280854/

    

+ Recent posts