그래프와 tf.function 이해하기

그래프와 tf.function 이해하기 (Introduction to graphs and tf.function)

TensorFlow 코드가 내부에서 어떻게 실행되는지 궁금할 때가 있죠. 이 가이드는 TensorFlow와 Keras의 표면 아래를 들여다보며 동작 방식을 보여줘요. 흔히 그래프(graph) 라고 부르는 실행 모델을 이해하면, tf.function 이 왜 존재하고 어떻게 쓰는지가 자연스럽게 연결돼요.

출처: TensorFlow 공식 문서 — Introduction to graphs and tf.function

그래프(graph)란 무엇인가

그래프 실행(graph execution) 은 텐서 연산을 tf.Graph 라 불리는 TensorFlow 그래프로 실행하는 방식을 뜻해요. 그래프는 연산의 단위인 tf.Operation 객체들과, 그 연산들 사이를 흐르는 데이터 단위인 tf.Tensor 객체들을 담는 데이터 구조예요. 연산이 어떻게 연결되는지를 미리 정의해 두고 한꺼번에 실행하는 구조죠.

그래프 활용하기

tf.function 을 직접 호출하거나 데코레이터로 사용해 그래프를 만들고 실행해요. 파이썬 함수에서 그래프를 만드는 호출 가능 객체를 PolymorphicFunction 이라고 해요. tf.function 으로 만든 함수는 파이썬 함수처럼 그대로 호출할 수 있어요.

# 파이썬 함수 정의
def a_regular_function(x, y, b):
    x = tf.matmul(x, y)
    x = x + b
    return x

# 이제 이 함수는 PolymorphicFunction이 됨
a_function_that_uses_a_graph = tf.function(a_regular_function)

트레이싱된 결과는 시그니처별로 ConcreteFunction 에 그래프가 저장돼요. 실행 결과 예시를 보면 이렇게 텐서가 돌아와요.

tf.Tensor(5.5, shape=(), dtype=float32)
tf.Tensor([1. 0.], shape=(2,), dtype=float32)
tf.Tensor([3. 0.], shape=(2,), dtype=float32)

파이썬 함수를 그래프로 변환: AutoGraph

tf.function 은 내부적으로 AutoGraph(tf.autograph) 라이브러리를 써서 파이썬 코드를 그래프를 만들어내는 코드로 변환해요. 덕분에 파이썬으로 작성한 제어 흐름도 그래프 안에서 동작할 수 있어요.

다형성: 하나의 tf.function, 여러 그래프

tf.Graph 는 특정 입력 유형(예: 특정 dtype 의 텐서)에 특화돼요. tf.function 은 해당 시그니처에 맞는 그래프를 ConcreteFunction 에 저장하고, 다른 유형의 입력이 오면 새로 트레이싱해 별도 그래프를 만들어요.

그래프 실행과 eager 실행

tf.function 안의 코드는 eager와 그래프 두 방식 모두로 실행될 수 있어요. 기본적으로 tf.function 은 코드를 그래프로 실행해요. 필요하다면 tf.config.run_functions_eagerly(True) 로 eager 실행으로 전환해 디버깅할 수 있고, 끝나면 다시 False 로 되돌려야 해요.

tf.config.run_functions_eagerly(True)
get_MSE(y_true, y_pred)
# <tf.Tensor: shape=(), dtype=int32, numpy=34>
# 끝나면 다시 되돌리기
tf.config.run_functions_eagerly(False)

더 알아보기