본문 바로가기

딥러닝(Deep Learning)/컴퓨터 비전

Tensorflow - 즉시 실행 모드, 그래프 실행 모드(Earger Execution, Graph Execution)(Feat. XML 컴파일러)

TensorFlow는 그래프 기반의 계산 모델을 사용하며, 사용자가 정의한 연산을 그래프로 표현하여 처리합니다.

TensorFlow에서는 그래프가 연산의 구조를 정의하고, 세션에서 그래프가 실행될 때 데이터가 해당 구조에 맞게 흐르게 됩

니다.

즉시 실행 모드(Eager Execution Mode) - tensorflow 2.x 부터는 eager execution mode가 기본값이다.

-> 명시적으로 그래프를 선언하지 않은 모드이며, 코드를 순차적으로 바로바로 실행하는 모드(그냥, 인터프리터 방식)

그러나 Tensorflow는 그래프를 기본 계산 모델로 한다고 하였다. 

코드를 순차적으로 만나면서, 그 즉시 그래프를 정의하여 연산 구조를 정의하고,  그 이후에 즉시 연산도 같이 실행을 한

다.

import tensorflow as tf

# 즉시 실행 모드에서의 계산
a = tf.constant(2)
b = tf.constant(3)
c = tf.add(a, b)
print(c.numpy())  # 5

 

그래프 실행 모드(Graph Execution ModE) - tensorflow은 그래프를 기본 계산 모델로 한다. 

-> 먼저 예시 코드를 보자

import tensorflow as tf

# 그래프 모드에서의 계산
tf.compat.v1.disable_eager_execution()  # 즉시 실행 비활성화(tensorflow 2.x 부터는 즉시 실행이 기본)
a = tf.constant(2) # 그래프 정의 1
b = tf.constant(3) # 그래프 정의 2
c = tf.add(a, b) # 그래프 정의 3

with tf.compat.v1.Session() as sess:
    result = sess.run(c) # 정의된 그래프를 바탕으로 실제 연산이 일어남
    print(result)  # 5

 

위 코드에서는 즉시 실행 모드를 그래프 실행 모드로 변환을 해줬다. 

그래프는 연산자(Operations)와 텐서(Tensors)로 이루어져 있습니다.

그래프는 데이터의 흐름을 나타내며, 각 노드는 연산자를 나타내고, 엣지는 텐서의 흐름(데이터의 흐름)을 나타냅니다.

하지만 그래프는 단순히 연산의 구조를 정의하는 역할을 하고,

실제 데이터는 세션(Session)을 통해 그래프에서 실행될 때 메모리에 저장됩니다.

요약하면 TensorFlow에서는 그래프가 연산의 구조를 정의하고, 세션에서 그래프가 실행될 때 데이터가 해당 구조에 맞게

흐르게 됩니다.

그러나, 위 코드는 틀린 코드이다, 아래가 수정된 정상적인 코드이다. 왜 틀렸는지는 아래의 XLA 컴파일러 설명을 들으면 

알 것이다. 

import tensorflow as tf

# 그래프 모드에서의 계산
tf.compat.v1.disable_eager_execution()  # 즉시 실행 비활성화
tf.config.optimizer.set_jit(True)  # XLA 컴파일러 활성화(그래프 실행 모드는 XLA 컴파일이 필요)

a = tf.constant(2)
b = tf.constant(3)
c = tf.add(a, b)

with tf.compat.v1.Session() as sess:
    result = sess.run(c)
    print(result)  # 5

 

XML( Accelerated Linear Algebra) 컴파일러 - tensorflow에서 제공하는 텐서 연산을 최적화해주는 컴파일러

-> 그래프 실행 모드에서 하나 알아 둬야 할 것이 있다. 바로, 그래프 실행 모드에서는 반드시 XML 컴파일을 사용한다는 점이다. 

import tensorflow as tf

# 그래프 모드에서의 계산
tf.compat.v1.disable_eager_execution()  # 즉시 실행 비활성화
tf.config.optimizer.set_jit(True)  # XLA 컴파일러 활성화

# 노드 1,2,3이 Edge로 연결됨. 
a = tf.constant(2) # 그래프 노드 1
b = tf.constant(3) # 그래프 노드 2
c = tf.add(a, b) # 그래프 노드 3

with tf.compat.v1.Session() as sess:
    result = sess.run(c) # 실행 전에 XLA 컴파일러고 위에서 정의된 그래프 구조(연산 구조)를 최적화!
    print(result)  # 5

그래프 실행 모드는 Session()을 통해 연산을 실행하게 되는데, 그 이전에 정의된 그래프 노드1~3에서 정의해 놓은

연산 구조를 XLA 컴파일러가 보고, 최적화하는 과정을 거친 다음에, run()을 통해 실행을 한다. 

아래는 또다른 형식의 그래프 모드 실행이다. 

import tensorflow as tf

# 그래프 생성
graph = tf.Graph()

# 그래프에 연산 추가
with graph.as_default():
    a = tf.constant(2)
    b = tf.constant(3)
    c = tf.add(a, b)

# 그래프 실행
with tf.Session(graph=graph) as sess:
    # XLA 컴파일러를 사용하도록 설정
    options = tf.ConfigProto()
    options.graph_options.optimizer_options.global_jit_level = tf.OptimizerOptions.ON_1

    # 그래프 실행
    result = sess.run(c, options=options)
    print(result)  # 5