프로그래밍

[Tensorflow] TF.Function

Victory_HA 2024. 2. 20. 16:58

https://www.tensorflow.org/guide/function?hl=ko#%EC%B6%94%EC%A0%81
https://notebook.community/tensorflow/docs-l10n/site/ko/guide/function

추적 (Tracing)

  • Function은 TensorFlow Graph에서 프로그램을 실행합니다.
  • 그러나 tf.Graph는 사용자가 즉시 실행 TensorFlow 프로그램에서 작성하고자 하는 모든 요소를 나타낼 수는 없습니다.
  • 예를 들어 Python은 다형성을 지원하지만 tf.Graph는 입력에 데이터 유형과 차원의 지정을 요구합니다.
    • tf.Graph는 정적인 dtype과 shape 차원이 필요합니다.
    • tf.function은 올바른 그래프를 생성하기 위해 필요하면 함수를 재트레이싱(retracing)하여 이 문제를 해결하지만, 문제점이 발생할 수 있다.
  • 또는 사용자가 명령줄 인수 읽기, 오류 발생 또는 더 복잡한 Python 객체 작업과 같은 부수적인 작업을 수행할 수도 있지만,
    이 중 어떤 작업도 tf.Graph에서 실행할 수 없습니다.

Function은 코드를 두 단계로 분리하여 이러한 문제를 해결

  1. "추적"이라고 하는 첫 번째 단계에서 Function은 새 tf.Graph를 만듭니다.
  • Python 코드는 정상적으로 실행되지만 모든 TensorFlow 연산(예: 두 개의 텐서 추가)이 지연되어,
  • 결국 실행되지 않고 tf.Graph에 의해 캡처됩니다.
  1. 두 번째 단계에서는 첫 번째 단계에서 지연된 모든 부분을 포함하는 tf.Graph가 실행됩니다.
  • 이 단계는 추적 단계보다 훨씬 빠릅니다.

언제 다시 트레이싱되나요?

  • 트레이싱으로 생성된 콘크리트 함수를 캐싱한다.
  • 파이썬 타입에서 키는 id()를 기반으로 합니다, 따라서 클래스 메서드는 인스턴스마다 독립적으로 트레이싱됩니다.

트레이싱 피하기

EX 1 - 매개변수를 Tensor로 변환

  • 하이퍼파라미터 조작하고 그래프를 구성하기 위해 파이썬 매개변수가 자주 사용됩니다.
  • 파이썬 매개변수가 바뀌면 그래프가 다시 트레이싱됩니다.
  • 파이썬 매개변수가 그래프 구성에 사용되지 않을 수 있습니다
  • 이런 경우 파이썬 값이 변하면 불필요한 재트레이싱을 일으킵니다.
  • 다중 트레이싱이 되었지만 생성된 그래프는 실제로 동일하기 때문에 조금 비효율적입니다.
def train_one_step():
  pass

@tf.function
def train(num_steps):
  print("트레이싱 num_steps = {}".format(num_steps))
  for _ in tf.range(num_steps):
    train_one_step()

train(num_steps=10)
train(num_steps=20)
  • 해결하는 간단한 방법은 생성된 그래프에 영향을 미치지 않도록 매개변수를 Tensor로 바꾸는 것. *
train(num_steps=tf.constant(10))
train(num_steps=tf.constant(20))

EX 2 - input_signature 사용

  • 새로운 tf.function 생성
  • 객체마다 트레이싱이 발생
def f():
  print('트레이싱!')
  tf.print('실행')

tf.function(f)()        # tracing 발생
tf.function(f)()        # tracing 발생
  • get_concrete_function 메서드를 사용해 트레이싱된 특정 함수를 얻을 수 있습니다.
  • tf.function에 input_signature를 지정하여 트레이싱을 제한
@tf.function(input_signature=(
    tf.TensorSpec(shape=[None, None, None, 3], dtype=tf.float32),  # image_array 입력
    tf.TensorSpec(shape=[None], dtype=tf.int64)  # step_oh 입력
))
def predict_multi_step(model, image_array, step_oh):
    predictions, _ = model([step_oh, image_array], training=False)
    return predictions

오토그래프 변환

  • 오토그래프(AutoGraph)는 tf.function안에 기본으로 활성화되어 있습니다.
  • 파이썬의 실행 코드를 그래프 호환 텐서플로 연산으로 변환합니다.