이번 Tensorflow Summit 2019에서 Tensorflow 2.0 alpha버전이 공개 되었는데요,

기존에 tensorflow를 사용해서 딥러닝을 개발하던 사람이라면,

체감할 수 있는 확 바뀐 부분이 많이 있습니다.

 

이러한 부분에 대해 간단히 소개하고자 합니다.

 

우선, 기본적으로 tensorflow의 동작에 대해 간단히 말씀드리면,

 

1. 학습할 데이터셋 준비

2. 데이터셋을 담을 Computational Graph 준비(tf.placeholder)

3. 가중치랑 바이어스를 담을 Computational Graph 준비(tf.Variable)

4. 손실함수 정의

5. 손실함수를 최소화 해주는 Optimizer정의

6. tf.Session정의

7. Session내에서 파라미터 값 초기화(tf.global_variable_initializer())

8. 학습 수행

9. 평가

10. 예측

 

이러한 단계로 이루어져 있습니다.

 

여기서 computational graph란, 매트릭스 형태의 데이터를 '노드'란 곳에서

계산을 하는 형태를 그래프로 표시한 것 입니다.

 

나름 합리적인 방식이긴 하지만,

여기에는 맹점이 있습니다.

 

바로, define단계에서는 아무것도 실행되지 않는다는 점이죠.

 

아래 예를 볼까요?

 

>> a = 2

>> b = 3

>> c = a + b

 

이 예제에서 a = 2를 정의하는 순간

이미 a라는 변수에는 2의 갑이 할당이 됩니다.

c도 c = a + b 를 수행하는 순간 이미, c에는 5란 값이 들어가겠죠.

 

그런데, 이를 tensorflow의 computational graph로 생성하면,

a = tf.constant(1)

b = tf.constant(2)

 

이런식으로 정의를 하죠.

이때 a의 값을 찍어보면 1이 나오지 않습니다.

그냥 1이란 값이 할당 된 computational graph가 하나 표시될 뿐이죠.

 

Tensor("Const:0", shape=(), dtype=int32)

 

tensorflow에서는 session이란걸 생성해서 실행해야만 해당 되는 연산이 실행 됩니다.

 

이게, '업계'에서는 나름 큰 이슈였습니다.

'지연실행'이라고 하는 문제 입니다.

 

수십계의 계층을 쌓아올린 신경망을 실행할 때,

tensorflow는 이러한 computational graph를 초기에 구성하느라

실행속도가 엄청 느리는 현상이 있었습니다.

 

딥러닝 엔지니어의 불만이 극에 달했었었죠.

 

중원의 딥러닝에는 여러 계보(?)가 있습니다.

 

구글의 텐서플로 파, 프랑소와 숄레의 케라스 파, 그리고 페이스북의 파이토치 파...

이외에도 아파치의 MXNET부터 MS의 CNTK등 ....

수만은 파가 중원에 존재 하고 있습니다.

 

이중 주류는 아무래도 텐서플로, 케라스, 파이토치가 가장 많은 무림의 세력을 차지 하고 있습니다.

텐서플로 >>>>>>>>>>케라스>>>>>>파이토치 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>잡다구리(잡다구리파에겐 죄송합니다...)

대략 개인적으로는 이런 느낌이지 않을까 하는 개인적인 생각입니다.

 

텐서플로는....

아무래도 딥러닝 프레임워크의 초기 주류 이다보니...

그 비급에 아무래도 헛점도 많고, 비급을 익히기에도 기존 프로그래밍의 패러다임과 많이 달라서

익히기에 많은 시간과 내공이 필요했습니다.

 

이에 불만을 품은 프랑소와 숄레는 분파를 결정했죠. 바로 케라스 파 입니다.

처음 딥러닝에 입문하거나 기존 비급을 익히다 주화입마에 걸린 이들도 쉽게 익힐 수 있는,

아주 쉬운 비급을 창시합니다.

 

다만 케라스는 내부적으로는 기존의 텐서플로, 씨아노, CNTK등의 비기를 그대로 이용합니다만,

익히는 사람은 이런걸 알 필요가 없는 신박한 비급이었습니다.

 

텐서플로에는 복잡 다양하고, 입력 데이터의 차원을 맞춰주어야 하는 등

귀찮고 어려운 절차가 있었지만,

케라스는 그냥 턱턱 신경망을 쌓아놓기만 하면 자동으로 알아서 array의 차원을 맟춰주는

신박한 기능이 있습니다.

 

케라스는 나오자 마자 선풍적인 인기를 끌었고, 현재는 대략 중원에서 두번째정도 되는

주류로 급 상승 합니다.

 

그런데!!!

 

텐서플로파의 장로가 케라스의 비급을 수용하기로 한 것입니다. 바로, tensorflow 2.0에서 말이죠.

이제, 텐서플로의 파도 기존의 익히기 힘들고 주화입마에 빠지기 쉬운 비급 대신에,

표준으로 Keras라는 high level API를 그대로 tensorflow에서 쓸수 있게 된 것입니다.

 

아래 예시를 한번 보시죠.

 

먼저 Tensorflow 소스 입니다.

 

 

흐..보기만 해도 주화입마에 걸릴것 같은 복잡함이 있죠.

 

아래는 케라스 소스 입니다.

 

뭔가 나름 깔끔해 보입니다.

 

이러한 접근 용이성과 빠르게 prototyping할 수 있는 강점 때문에,

금번 Tensorflow 2.0에서는 Keras를 표준 API로 확정한 거죠.

 

기존에 Keras파들에겐...

비급을 잘 익히고 있는데 항상 어디가나 비주류라는 핸디캡을 마음속에 안고 살고 있다가

한 순간에 주류로 편입이 되어버린 상황입니다.

이제 주막에 가도 비주류라는 놀림을 받지 않죠.

 

기존의 Keras 소스코드에 tf만 붙이면 대부분 잘 돌아갑니다.

 

예를 들자면,

import keras.layers.Sequential

 

이러한 소스를,

import tf.keras.layers.Sequential

 

이렇게만 바꿔주면 대부분 잘 돌아갑니다.

 

잠깐. 여기서...

위에 글만 보면 keras가 별도의 파 인듯 보입니다.

keras는 단독으로 돌아가는 api가 원래 아니었습니다.

keras 창시 초기부터, backend로는 tensorflow나, 지금은 멸문화 되어가는 theano, cntk 등을 사용하는

api였습니다.

 

무슨말인고 하니, 이전 편에서 얘기한 computational graph, tensor 연산, session등의

저수준 작업들을 wrapping해서, 좀더 우아해보이는 작업으로 잘 포장했다는 말 입니다.

 

keras에서 우아하게 model.fit 하지만,

실제로는 내부적으로는 tensorflow에서 session을 생성하고, global variable들을 초기화 하고, computational graph를

compile하고, session을 실행하는 등의 저수준 작업을을 한다는 말 입니다.

 

좀더 deep해지는 deep learning이나, 가끔은 이러한 저수준 작업을을

직접 제어해야 할 때가 있지만, 평소에는 우아하게 model.fit하는 keras를 사용하면 됩니다.

 

 

음..쓰다보니...

중딩때 수업시간에 몰래보던 영웅문이 생각이나서

무협스럽게 쓰다보니 글이 조잡해졌네요.

 

이번시간에는...진짜로 Tensorflow 2.0에 대해서 바뀐점을 말씀드리겠습니다.

 

1번. 우선!!!

잡스런 API들을 죄다 정리했습니다.

 

기존 1.x 버전에서는 같은 기능을 구현하기 위해서 다양한 구현 방법이 존재했었으나,

2.0에는 구현하는 가장 좋은 방법 하나만을 놔두고 싸그리 정리했습니다.

입문하는 사람이나, 기존에 구현하던 개발자도 다른 구현소스를 보고 혼동이 올 일이

많이 적어졌습니다.

 

다만...기존 사용자를 위해 호환성이 필요한 부분은 남겨뒀습니다.

tf.compat.v1 패키지 아래, 기존에 쓰던 패키지들이 남아 있습니다.

 

2번. Eager Execution 모드 도입

1편에서 잠깐 소개드렸다시피, tensorflow 구버전에서는 뭔가를 실행하거나 하려면

먼저 computational graph를 생성하고, 이를 session을 생성해야만 그 결과를 볼수 있다고

설명드린 바 있습니다.

 

tesorflow 1.x 에서는 덧셈을 아래와 같이 session을 실행해야만 결과를 볼 수 있었습니다.

 

뭔가, 인간의 의식 흐름하고도 잘 안맞죠?

 

tensorflow 2.0에서는 선언 즉시 실행되는 eager execution모드가 default로 되었습니다.

요렇게 간단하게 평상시 파이썬 쓰듯이 쓰면 되죠...

 

이렇게 바뀌면서...

 

기존에 tf.Session()는... 골방(tf.compat.v1)으로 쫓겨났습니다.

기존 방법대로 session을 쓰시고 싶으신 분들은 저기 골방을 찾아 가시면

tf.Session()이 골방을 지키고 있습니다.

 

 

3번. AutoGraph

기존에 session기반의 function은 그대로 사용할 수 있는데,

function 앞에 tf.function 데코레이터만 붙이면, 자동으로 computatioal graph를

생성해 주어, 바로 사용 할 수 있게 됩니다.

 

 

여기서 autograph기능이 나오는데,

Autograph는 funciton 앞에 @tf.function이란 decorator를 붙임으로써

생성이 됩니다. 그런데 단순히 이 function뿐만 아니라,

function 내부에서 call하는 다른 function도 자동으로 computaional graph를 생성해 줍니다.

 

 

deep_next(x)란 function 앞에 @tf.function이란 decorator가 있죠?

저 decorator 덕분에 deep_net은 당연히 computational graph가 자동으로 생성이 되고,

저 deep_net내부에서 호출하는 linear_layer() 함수까지도 자동으로 computational graph를 생성해 줍니다.

 

(저는...이런 방식을 안써봐서 저게 왜 편한지 사실 감이 잘 안옵니다...-_-;;;)

 

4번. High Level API

 

아래 두 소스를 보고 다른점을 찾아보세요.

 

왼쪽은 tesorflow 1.x의 소스이고, 오른쪽은 tensorflow 2.0의 소스 입니다.

 

정답은...

왼쪽은 tensorflow가 high level api를 도입한건 17년 말 부터여서

두 소스는 같습니다만,

 

2.0이 나오기 전 소스는 내부적으로는 tf.Session()을 이용하여 수행이 되고,

오른쪽의 tensorflow 2.0소스는 내부적으로도 eager execution으로 실행이 됩니다.

(tensorflow 2.0 dev summit 2019에서 발표하여 청중들의 웃음을 자아낸 부분 입니다.)

 

그리고, tensorflow가 2.0이 되면서 머신/딥러닝 workflow에도 변화의 바람을 일으켰습니다.

 

1. tf.data를 이용하여 데이터셋 준비

2. tf.keras를 이용하여 모델 생성, 훈련, 검증

3. eager execution을 이용하여 모델 디버깅

4. 분산 traning을 이용하여 distribution strategy 사용

5. savedmodel로 모델 배포

 

아래 그림을 보시면 좀 더 쉽게 이해가 되실 겁니다.

 

 

생성된 모델은 Distribution Strategy에 의해서,

모델을 바꾸지 않고, CPU에서 실행하거나 GPU 또는 TPU에서 실행할 수 있습니다.

 

이러한 분산정책에 의해 생성된 모델은

클라우드에 온프레미스로 제공되는 tensorflow serving으로 배포되거나,

모바일 device를 위한 tensorflow인 tensorflow lite에서 사용하거나,

브라우저 또는 node.js에서 사용하기 위한 tesorflow.js,

그리고 일반적인 개발언어 기반에서 사용할 수 있는 모델로 배포를 할 수 있습니다.

 

이상으로 새로나온 tensorflow 2.0에 대한 소개를 마치겠습니다.

  1. 배우는중 2021.02.23 20:28

    이제 막 배우며, TensorFlow 2.0 을 깔고, 예전 Tensorflow 책을 가지고, 아무것도 되지않던차에 깔끔하게 정리되어있고, 재밌는 글솜씨에 글 남기고 갑니다 ㅎㅎ 복복많이 받으세요 ~

  2. ㅇㅇ 2021.08.09 01:09

    솔직히 무협지에 비유하는거 좀 재밌었습니다.

+ Recent posts