ML 환경을 구축 하기 위해서는 

python 개발 환경과 jupyter (anaconda)

tensorflow 설치와 gpu lib 설치 (cuda + cudnn) 등의 구축이 필요하다

또한 그것을 돌리기 위한 gpu 와 linux 서버 또는 window 개발 환경이 필요한데,

 

나는 근무환경상 데스크탑 구입이 어려워, 노트북 + egpu 환경으로 구성하였다.

 

많은 글들을 찾아보아야 했지만 정확히 어떤식으로 환경을 구성하면 된다! 라는 명확한 답이 없었다.

 나의 목표는 구매 되는 비용을 최소화 + 노트북 환경으로 구축

 

1. egpu 환경을 구축 하기 위해서는 노트북의 썬더볼트 지원 이 중요 했고 아래 리스트에서 노트북을 고를 필요가있다.

 

https://www.ultrabookreview.com/10579-laptops-thunderbolt-3/

 

The complete list of portable laptops with a Thunderbolt 3 port

We've seen Thunderbolt ports on enthusiast computers for a while now, but these days Thunderbolt is becoming the port everyone wants on a new laptop,

www.ultrabookreview.com

이때 같은 thunderbolt3 의 경우에도 2 lane 과 4 lane 의 bandwidth 차이로 인하여 1.5배정도 성능차이가 나오게되고

이것은 고유 gpu 의 성능을 다끌어 오지 못하는 것을 의미한다.

 

데스크탑(노트북) + 직접연결된 gpu 6042.68 mib/s >> 4-lane tb3 2431.87 mib/s  > 2-lane tb3  1597.91 mib/s

으로 성능 차이가 나온다.

나의경우에는 thunder bolt3 4lane 슬롯 2개를 지원하는 lennova yoga 730 모델을 선택 하였다.

 

2. egpu 를 구성하기 위해서는 gpu 를 담고 power 를 공급하는 egpu box 가 필요했다.

https://egpu.io/external-gpu-buyers-guide-2019/

 

Best eGPU Enclosures Reviewed - External GPU Buyer's Guide 2019

Find the best eGPU enclosures using our daily updated Buyer's Guide. We provide hands-on unboxing and in-depth review of the top external GPU enclosures.

egpu.io

여기에서 각각 지원하는 gpu 모델등과 성능 등이 있는데 . 모두 직접 수입해야 되는 리스크가 있었다.

 

이 중에 한성컴퓨터에서 수입 해주는 akito node pro model AS 측면에서 유리할 것 같아, 이 모델로 구입을 하였다.

각 gpu box 별로 지원하는 gpu 들은 제조사 홈페이지에 정확 히 명시 되어있다.

 

egpu 를 썼을 때 좋은 점은 gpu- box 에서 지원 하는 리스트로 gpu 모델을 계속 업그레이드 할 수 있다는점

단점은 장기적으로 호환성이 떨어 질 수 있으며, 직접연결보다 성능이  저하 될 수 있다는 점이다.

그밖에 휴대성이나 

 

대략 egpu box - 40만원 yoga730 - 100만원 중고 gtx 1060(6GB) -15만원 정도 비용이 소모되었다.

 

3.  그래픽 Nvida 드라이버와 cuda / cudnn 라이브러리 설치 삽질기

cuda + cudnn 의 환경을 설치하는 사람이 전세계적으로 몇십만명은 될텐데

미묘한 버그가있다.

물론 window10 에서 개발하기떄문에 생기는 문제이지만..

 

tensorflow 1.13 의 경우 cuda 10.0 과 cudnn 7.5 으로  맞춰주지 않으면 no lib 에러가난다.

tensorflow 1.12 의 경우 cuda 9.0 과 cudnn 7.5 로 맞춰주지 않으면 호환이 안된다.

 

공식홈페이지의 경우 어떤 버전을 설치해도 지원이 된다는 식으로 나와있는데.

실제 설치해보면 라이브러리를 못불러오는 세새한 문제가 있다.

 

 이러한 문제들은 버전 업되면서 해결될 것으로 보이지만, 개발 되는 버전에 따라서 호환성에 문제가 있는듯 하다.

'Machine.Learning' 카테고리의 다른 글

rtx 3080 - ubuntu 20.04 개발환경 설치기  (0) 2021.01.22
머신러닝 족보 ! scikit learn algorithm cheat sheet  (0) 2019.09.04
machine Learning Automation  (0) 2019.04.08
fast cnns (yolo, R-CNN, SSD)  (0) 2019.02.12
tensorframes  (0) 2018.11.20

machine learning automation

General Machine Learning Flow

1. Data ingestion

2.ETL > EDA

3.Supervised Learning > EDA

4.Feature Engineering > EDA

5.model building (model ingest)

6.model traing with a scale

7.model tuning

8.evaluation (testing)

총 8가지 정도의 단계로 ML 단계를 나누어 보았다.

이 8가지 단계에 대해서 모든 것을 항상 그때 그때 코딩 해주어야 할까?

라는 관점에서 자동화 될 수 있는 것은 무엇이 있을까 라고 스스로 정리 해보았다.

생각해보면 각 단계마다 라이브러리가 존재하고, 각 단계에서 최대한 자동화를 해주어서,

실제 머신러닝에서 중요한 4/5 번에 집중 할 수 있도록 도움을 줄 수 있지 않을까

  1. Data ingestion

MQ / DB Connector 등을 통한 data get

  1. ETL > EDA

 Train / Test set 분리

-padding

-drop out

-liminate outlier

-n-fold data seperate

-random noise data generating

-범주형/수치형 변수 분리

-Embedding

-nomarlization

일반적인 방법

RankGauss

-위 과정을 포함/배제 한 EDA

3.Supervised Learning > EDA

-kmeans

-knn

-Auto Encoding

-Hierachical Clustering

-DB scan

-..etc 위과정을 포함 한 EDA

4.Feature Engineering > EDA

**Feature Selection**

-Correlation / AutoCorrelation

**Feature Etraction**

-PCA

-t-sne

-nMF

**Feature adding**

-Target Enconding

-lag data

-Feature combine (파생변수 생성)

5.model building (model ingest)

-기존 학습 모델 가져오기

-새로운 모델 정의하기

-Framework 설정 (모델 설정)

-layer/loss function / Optimizer / Regularziation

6.model traing with a scale

-horonvod

-kuberflow

-자체적인 Multi GPU 학습 (PyTorch,,)

7.model tuning

학습에서 중요한 부분이라 이미 어느정도 자동화가 진행 되어있음

-hyperParameter

-Optimizer

-regularization factor

-drop out factor

-Ensemble model

8.evaluation (testing)

-MAP7

-AB test

-F1 score

-FOC

붉은 색글씨 에 역할을 하는 부분들은 어느정도

form 을 맞추어서 자동화를 진행 해줄 수 있을 것 같다.

특히 2,3,4번을 자동화 해서 EDA 를 해주게되면

머신러닝 모델링을 하는사람은 모델링과 학습률만 생각하여 작업 하면된다.

이 단계들도 모두 서비스전에 자동화 되면 좋지 않을까?

Cnns in image segmentation (yolo, R-CNN, SSD)

최종 목적은 단순한 이미지 분류 를 넘어서 실시간 영상에서 물체를 감지하고, 실시간 영역에서 어떤 물체인지 까지 분류 하려고 한다.
이미지 인식 분야에서 cnn 중에도 fast cnn 들에 대한 동향 리뷰를 한다.
가장 고전적인 R-CNN 은 Region Proposals(ex 색칠) 등의 알고리즘을 통해 영역을 나눠서 cnn 을 개별적으로 돌리는 방식
 전체를 합쳐서 Roi(region of interests 방식 으로 폴링하는 fast-rcnn ,box sliding 방식의 faster r-cnn 등이 있다.

이 R-CNN 에서의 단점은 일단 Region Proposal 방식으로 영역을 나누고 CNN 을 돌리거나 box sliding 등의 방식을 거치는 과정중에서 
시간이 많이 소요된다는 점,

이 단점을 보완하기위해서 일련의 과정을 통합한 1개의 네트워크 학습방식 (single shot Detecor) 을 사용하게된다.

대표적인 것이 yolo 와 multibox detector

yolo 는 googlenet 네트워크를 응용( 심화 ?) 한것 인데 
input image - box 를 데이타로 활용하여, labeling 한뒤 

학습된 이미지를 7x7 boundary box 로 나누고 각자 confidence score 과 P ( class | object) 가 학습되도록 네트워크를 설계하였다.
그 방식에 대하여 대략적으로는 이해가 가지만, 네트워크 구성에 대해서 좀 더 정확히 알기 위해서는 소스를 까봐야 될듯 하다.


R-CNN

- basic model

-region proposal

-bounding box

[-selective search](http://www.cs.cornell.edu/courses/cs7670/2014sp/slides/VisionSeminar14.pdf)

Fast R-CNN

-sum up the regions and total CNN

-Region of Interest Pooling(RoIPool)

Faster R-CNN

-scoring with anchor boxes (1:1 / 1:2 / 2:1 ..etc)

YOLO(You only Look Once)

-confidence score : 0 if no object

​ equal to iou if there is object

-improve of googlanet

SSD - CNN Single Shot Detector

!img

-improve of VGG16

-variety of feature map size

PERFORMANCE TESTS

REFERENCE

https://blog.athelas.com/a-brief-history-of-cnns-in-image-segmentation-from-r-cnn-to-mask-r-cnn-34ea83205de4

https://cv-tricks.com/object-detection/faster-r-cnn-yolo-ssd/

yolo paper : https://pjreddie.com/media/files/papers/yolo.pdf

ssd paper : https://arxiv.org/pdf/1512.02325.pdf

메타 데이터의 끝으로 건너뛰기
메타 데이터의 시작으로 이동
  1. Tensorflow 기본 개념

    1. Constant를 이용한 기본 계산


텐서플로우(TensorFlow)는 라이브러리 이름에서 알수있듯이 텐서(Tensor)를 흘려보내면서(Flow) 데이터를 처리하는 라이브러리이다. 여기서 텐서(Tensor)는 다차원 배열을 의미한다. 텐서의 예시는 아래와 같다.


3 # 랭크 0 텐서; shape [] 스칼라
[1., 2., 3.] # 랭크 1 텐서; shape [3] 벡터
[[1., 2., 3.], [4., 5., 6.]] # 랭크 2 텐서; shape [23] 행렬
[[[1., 2., 3.]], [[7., 8., 9.]]] # 랭크 3 텐서; shape [213]


랭크*Rank는 텐서의 차원(Dimension)을 의미한다. 만약 랭크가 0이라면 스칼라, 1이라면 벡터, 2라면 행렬, 3이상이면 텐서라고 부른다.이런 텐서는 계산 그래프 구조(Computational Graph)를 통해 노드에서 노드로 이동(Flow) 한다. 따라서 텐서플로우를 이용해서 프로그램을 작성할 때는 다음의 두 과정을 거쳐야 한다.

        1. 그래프 생성

        2. 그래프 실행

그래프 생성 단계에서는 연산 과정을 그래프 형태로 표현하게 된다. 컴퓨터공학에서 말하는 그래프는 노드(Node)와 엣지(Edge)로 이루어진 자료구조이다. 텐서플로우는 노드에 연산(Operator), 변수(Variable), 상수(Constant) 등을 정의하고, 노드들간의 연결인 엣지를 통해 실제 텐서를 주고받으면서 계산을 수행한다.이제 실제 코드를 통해 텐서플로우에서 어떻게 그래프를 생성하는지 살펴보자.먼저 텐서플로우 라이브러리를 Import한다.


1
import tensorflow as tf


그 다음에 상수 형태의 노드를 두개 정의하고, 파이썬의 print 함수를 이용해서 노드의 값을 출력해 보자.


1
node1 = tf.constant(3.0, dtype=tf.float32) node2 = tf.constant(4.0# 암시적으로 tf.float32 타입으로 선언된다. print(node1, node2)


출력 결과는 다음과 같다.


Tensor("Const:0", shape=(), dtype=float32) Tensor("Const_1:0", shape=(), dtype=float32)


여기까지는 그래프 생성이 된 것 뿐이므로 실제 결과값을 얻으려면 run 단계가 필요하다. 


1
sess = tf.Session() print(sess.run([node1, node2]))


이제 아래와 같은 결과가 출력된다.


[3.04.0]



b. Placeholder 를 이용한 계산


이제 상수의 개념을 알았으면, 다음은 placeholder에 대해서 알아보자.

y = x * 2 를 그래프를 통해서 실행한다고 하자. 입력값으로는 1,2,3,4,5를 넣고, 출력은 2,4,6,8,10을 기대한다고 하자. 이렇게 여러 입력값을 그래프에서 넣는 경우는 머신러닝에서 y=W*x + b 와 같은 그래프가 있다고 할 때, x는 학습을 위한 데이타가 된다.

즉 지금 살펴보고자 하는 데이타 타입은 학습을 위한 학습용 데이타를 위한 데이타 타입이다.


y=x*2를 정의하면 내부적으로 다음과 같은 그래프가 된다.

그러면, x에는 값을 1,2,3,4,5를 넣어서 결과값을 그래프를 통해서 계산해 내야한다. 개념적으로 보면 다음과 같다.

이렇게 학습용 데이타를 담는 그릇을 플레이스홀더(placeholder)라고 한다.

플레이스홀더에 대해서 알아보면, 플레이스 홀더의 위의 그래프에서 x 즉 입력값을 저장하는 일종의 통(버킷)이다.

tf.placeholder(dtype,shape,name) 으로 정의된다.

플레이스 홀더 정의에 사용되는 변수들을 보면

  • dtype : 플레이스홀더에 저장되는 데이타형이다. tf.float32와 같이 실수,정수등의 데이타 타입을 정의한다.

  • shape : 행렬의 차원을 정의한다. shapre=[3,3]으로 정의해주면, 이 플레이스홀더는 3x3 행렬을 저장하게 된다.

  • name : name은 이 플레이스 홀더의 이름을 정의한다. name에 대해서는 나중에 좀 더 자세하게 설명하도록 하겠다.

그러면 이 x에 학습용 데이타를 어떻게 넣을 것인가? 이를 피딩(feeding)이라고 한다.

다음 예제를 보자


1
2
3
4
5
6
7
import tensorflow as tf
input_data = [1,2,3,4,5]
= tf.placeholder(dtype=tf.float32)
= * 2
sess = tf.Session()
result = sess.run(y,feed_dict={x:input_data})
print result

처음 input_data=[1,2,3,4,5]으로 정의하고

다음으로 x=tf.placeholder(dtype=tf.float32) 를 이용하여, x를 float32 데이타형을 가지는 플레이스 홀더로 정의하다. shape은 편의상 생략하였다.

그리고 y=x * 2 로 그래프를 정의하였다.


세션이 실행될때, x라는 통에 값을 하나씩 집어 넣는데, (앞에서도 말했듯이 이를 피딩이라고 한다.)

sess.run(y,feed_dict={x:input_data}) 와 같이 세션을 통해서 그래프를 실행할 때, feed_dict 변수를 이용해서 플레이스홀더 x에, input_data를 피드하면, 세션에 의해서 그래프가 실행되면서 x는 feed_dict에 의해서 정해진 피드 데이타 [1,2,3,4,5]를 하나씩 읽어서 실행한다.

c. 변수형(Variables)

마지막 데이타형은 변수형으로,

y=W*x+b 라는 학습용 가설이 있을때, x가 입력데이타 였다면, W와 b는 학습을 통해서 구해야 하는 값이 된다.  이를 변수(Variable)이라고 하는데, 변수형은 Variable 형의 객체로 생성이 된다.


  • tf.Variable.__init__(initial_value=None, trainable=True, collections=None, validate_shape=True, caching_device=None, name=None, variable_def=None, dtype=None, expected_shape=None, import_scope=None)


변수형에 값을 넣는 것은 다음과 같이 한다.


var = tf.Variable([1,2,3,4,5], dtype=tf.float32)

아래의 예제를 보자.

1
2
3
4
5
6
7
8
import tensorflow as tf
input_data = [1,2,3,4,5]
= tf.placeholder(dtype=tf.float32)
= tf.Variable([2],dtype=tf.float32)
= W*x
sess = tf.Session()
result = sess.run(y,feed_dict={x:input_data})
print result

우리가 기대하는 결과는 다음과 같다. y=W*x와 같은 그래프를 가지고, 


x는 [1,2,3,4,5] 값을 피딩하면서, 변수 W에 지정된 2를 곱해서 결과를 내기를 바란다.

그렇지만 코드를 실행해보면 다음과 같이 에러가 출력되는 것을 확인할 수 있다.


이유는 텐서플로우에서 변수형은 그래프를 실행하기 전에 초기화를 해줘야 그 값이 변수에 지정이 된다. 


세션을 초기화 하는 순간 변수 W에 그 값이 지정되는데, 초기화를 하는 방법은 다음과 같이 변수들을 global_variables_initializer() 를 이용해서 초기화 한후, 초기화된 결과를 세션에 전달해 줘야 한다.


init = tf.global_variables_initializer()

sess.run(init)


그러면 초기화를 추가한 코드를 보자

1
2
3
4
5
6
7
8
9
10
import tensorflow as tf
input_data = [1,2,3,4,5]
= tf.placeholder(dtype=tf.float32)
= tf.Variable([2],dtype=tf.float32)
= W*x
sess = tf.Session()
init = tf.global_variables_initializer()     // initialize!
sess.run(init)
result = sess.run(y,feed_dict={x:input_data})
print result

초기화를 수행한 후, 코드를 수행해보면 다음과 같이 우리가 기대했던 결과가 출력됨을 확인할 수 있다.




2. Tensorframes 개요

Tensorframes는 스칼라와 아파치 스파크를위한 실험적인 TensorFlow 바인딩이다. 
TensorFrames(TensorFlow on Spark Dataframes)를 사용하면 TensorFlow 프로그램을 사용하여 Apache Spark의 DataFrames를 조작 할 수 있다.

기본적인 Tensorflow의 계산 구조는 아래 그림과 같다.

placeholder 로 입력 값을 정의하고 graph 구조 안에서 연산을 수행한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
t1 = tf.placeholder(tf.float32)
t2 = tf.placeholder(tf.float32)
 
# t3: matrix multiplication (m1 x m3)
tp = tf.matmul(t1, t2)
 
 
# setup input matrices
m1 = [[3.2.1.0.]]
m2 = [[-5.], [-4.], [-3.], [-2.]]
 
# Execute the graph within a session
with tf.Session() as s:
     print(s.run([tp], feed_dict={t1:m1, t2:m2}))

그러면 결과값은 아래와 같이 출력된다.

[array([[-26.]], dtype=float32)]

Tensorframes를 사용하면 어떻게 될까?

위의 다이어그램에서 보는 것처럼 TensorFrames는 Spark DataFrames와 TensorFlow 사이에 Bridge 역할을 한다.

이를 통해 DataFrames를 가져 와서 TensorFlow 계산 그래프에 입력으로 적용 할 수 있다. TensorFrames를 사용하면 TensorFlow 계산 그래프 출력을 가져 와서 다시 DataFrames로 밀어 넣을 수 있으므로 다운 스트림 Spark 처리를 계속할 수 있다.

 간단한 예제로, 갖고 있는 데이터의 컬럼에 특정 값을 더하는 아래의 연산을 살펴보자.

1
2
3
4
5
6
7
8
# Import TensorFlow, TensorFrames, and Row
import tensorflow as tf
import tensorframes as tfs
from pyspark.sql import Row
 
# Create RDD of floats and convert into DataFrame `df`
rdd = [Row(x=float(x)) for in range(10)]
df = sqlContext.createDataFrame(rdd)

데이터는 RDD 기반의 dataframe으로 저장되어 있다. 데이터 형태를 보려면 우리가 익히 아는 spark 명령어를 쓰면 된다.

1
df.show()

 이제 tensorflow graph 연산을 해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Run TensorFlow program executes:
#   The 'op' performs the addition (i.e. 'x' + '3')
#   Place the data back into a DataFrame
with tf.Graph().as_default() as g:
 
#   The placeholder that corresponds to column 'x'.
#   The shape of the placeholder is automatically
#   inferred from the DataFrame.
    = tfs.block(df, "x")
     
    # The output that adds 3 to x
    = tf.add(x, 3, name='z')
     
    # The resulting `df2` DataFrame
    df2 = tfs.map_blocks(z, df)
 
# Note that 'z' is the tensor output from the
# 'tf.add' operation
print z
 
## Output
Tensor("z:0", shape=(?,), dtype=float64)

간단하게 코드를 설명하면,

  • x는 tfs.block을 사용한다.이 블록은 DataFrame의 열 내용을 기반으로 블록 자리 표시자를 만든다
  • z는 TensorFlow add 메소드 (tf.add)의 출력 텐서이다.
  • df2는 df DataFrame에 z 텐서 블록 단위로 추가 열을 추가하는 새로운 DataFrame이다.

z는 텐서이므로, 우리가 원하는 데이터 결과값을 보려면 위에서와 같이 df.show() 명령을 쓰면 된다.


+ Recent posts