20190705

TensorFlow 2.0 beta 마이그레이션

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 되면 옮기기로.