tf.function and AutoGraph

https://www.tensorflow.org/alpha/tutorials/eager/tf_function

https://www.tensorflow.org/alpha/guide/autograph

  • 위의 두 링크에 비슷한 내용을 다루는데 페이지는 분할 되어 있다?! 두 페이지 짬뽕으로 정리하겠다.
  • TF 2.0에서 eager execution이 default 이다. eager 모드는 매우 직관적으로 유연한 UI를 제공하지만 performance와 deploy함에 있어서 expense를 갖는다. 즉 더 나은 performance와 deployability를 위해 graph모드를 병행 해야 하는데, tf.function을 활용해 코드에서 graph를 만들 수 있게 한다.
  • 즉, TF 2.0은 TF 1.0의 연산 효율(graph)와 구현 용이(eager)를 통합하며 그 중심에 tf.function()이 있다
  • @tf.function을 사용하면 파이썬 함수를 TF operation처럼 정의 할 수 있다. eagerly 실행 할 수 있고, graph 내에서 사용 할 수 있으며 물론 gradients도 갖는다.
  • @tf.function annotation을 사용하면 함수처럼 호출 되지만 graph로 컴파일 된다. 그 말인 즉슨, GPU나 TPU위에서 빠른 실행을 시킬 수 있고 SaveModel을 통해 export도 가능하단 것.
  • Functions, not Sessions. 이 링크에서 컨셉을 자세히 확인 가능

  • 함수 내에서 다른 함수가 불리는 등 여러 함수가 연결 되어 있을 때, 각각 다 @tf.function annotation을 달아줄 필요는 없다. annoted function에서 불린 다른 함수는 마찬가지로 graph모드에서 돌아 간다.

  • 아래 코드는 같은 레이어에 대해서 eager 모드로 레이어를 연산 했을 때와, @tf.function을 사용하여 연산 했을 경우 속도차를 보여 줌.

Eager conv: 0.04675138997845352

Function conv: 0.040303099900484085

Note how there's not much difference in performance for convolutions

eager lstm: 0.03037528390996158

function lstm: 0.006685963831841946

  • Polymorphism (다형성) - 일반 python 코드처럼, 동적으로, generic 하고자 함.

  • State in tf.function - 예전 set graph -> run 방식과 다르게 tf.function에서는 같은 변수에 대해서 순차적으로 변화를 주어도 의도에 맞는 순서대로 실행이 된다. 아래 코드의 경우, 이런 코드 순서에 따른 실행이 보장 되지 않는다면 10이라는 값이 나오지 않을 것이다. assign은 = 이고 assign_add는 += 를 나타내는듯.

  • Variables

  • 위의 에러나는 코드의 경우, graph context에서 반복 실행 되면 계속 값이 증가해야하고, eager 모드로 실행하면 한번 실행으로 2가 나온다. 즉 모호한 경우기 때문에 이렇게 코딩하지 못하게 되어있음. 아래의 경우는 괜찮음. 아래 같은 경우엔 tf.function 안에서 변수 선언이 가능.

  • Contorl flow and autograph
    • python의 조건문, 반복문을 파이썬 코드 형식으로 쓸 수 있음
    • Autograph는 tf.function에 완전 통합되어 있고, graph에서 tensor를 돌리기 위한 코드 방식으로 뒷단에서 바꿔 준다. tf.autograph.to_code(f) 를 통해 어떤 식으로 코드가 바뀌나 확인 할 순 있지만 매우 복잡하고 굳이 확인 할 필요 없는듯.

  • Autograph가 파이썬 형태 코드를 graph용으로 자동으로 바꿔주는 범위에는 한계가 있다. (if, for, while, break, continue, return) 같은 것, 그리고 대상이 Tensor로 하는 코드인 경우에나 바꿔주지, 아래와 같은 경우엔 바꿔주지 않는다.

  • 마찬가지로, 파이썬의 print assert 를 쓸 것이 아니라 아래처럼 tf에 포함 된 것을 써야 정상 동작이 보장 됨.

  • 링크에, Autograph가 지원하는 것과 안하는 것이 명시 되어 있음.
  • Keras and AutoGraph
    • tf.function을 객체 메소드에도 사용 할 수 있는데, 가령 keras model의 call 함수를 annotation해서 쓸 수 있다.
  • Batching
    • AutoGraph로 바꾸기 좋은 코드는 control flow가 batch 레벨에서 결정 될 때임

    • 파이썬에서 위와 같은 코드를 짜듯이, TF에서 짜보면 아래처럼 생각 할 것이다 (동작은함)

    • 그러나 이 경우 아래처럼 작성해도 됨. 결과는 당연 같음

    •