머릿속에 박아둘 가장 중요한 모델 한 가지
TF 2.x는 목적에 따라 두 mode를 왔다 갔다 해. 디버깅은 eager, 속도는 graph. 둘 사이를 뒤집는 데코레이터가 @tf.function이야. 이 정신모델만 제대로 잡으면 나머지 TF가 다 말이 돼.
Eager mode: op 하나하나가 즉시 돌고, concrete tensor 돌려주고, .numpy() 호출 가능. print(x) 작동. pdb 작동. x.shape가 실제 데이터 반영. TF 2.x default이고 진짜 Python처럼 느껴지는 유일한 mode.
Graph mode: 함수에 @tf.function 씌우면 TF가 첫 호출에 tracing해 — symbolic placeholder tensor로 한 번 돌리면서 static computation graph 기록. 두 번째부터는 컴파일된 graph가 runtime에 직접 돌아서 Python overhead 건너뛰고 op fusion + XLA 가능. tight inner loop는 보통 2–10배 빨라져.
함정:
@tf.function 안의 print()는 tracing 중에만 돌고, 매 호출 때 안 돌아. print가 갑자기 안 찍힌다면 이게 원인. tf.print()로 바꿔 — 이건 traced graph의 일부로 들어가.