TF 2.0 beta로 사내 모델 두 개 옮겼다. 절반은 수월, 절반은 개고생. 기록 겸.
바뀐 것 핵심
- eager execution 기본
session.run, placeholder, global_variables 이런 거 안 씀- tf.contrib 사라짐. slim 썼던 코드는 전부 리팩터
@tf.function으로 감싼 함수는 graph로 컴파일됨
tf_upgrade_v2 돌려보기
tf_upgrade_v2 --infile model.py --outfile model_v2.py
이 스크립트가 있는 건 다행. 변수 rename 같은 건 잘 바꾸는데, tf.contrib.slim 의존 코드는 "이건 니가 고쳐라" 주석만 박아둠. 결국 keras로 다시 쓰는 게 빠름.
@tf.function 주의
@tf.function
def train_step(x, y):
with tf.GradientTape() as tape:
pred = model(x, training=True)
loss = loss_fn(y, pred)
grads = tape.gradient(loss, model.trainable_variables)
optimizer.apply_gradients(zip(grads, model.trainable_variables))
return loss
파이썬 side effect (print, list.append 등)는 graph 만들 때만 실행되고 이후엔 무시된다. 디버깅할 땐 tf.print 써야 함. 이거 모르고 한참 헤맴.
결론
2.0 안 가도 되면 1.14에 머무는 게 당분간은 안전. 다만 eager 기반으로 코드 짜는 게 진짜 편하긴 하다. 프로덕션 모델은 9월 GA 되면 옮기기로.