반응형

Tensorflow.org의 링크 내용을 정리함.


TensorFlow Graph 검사하기

    텐서보드의 Graph dashboard는 텐서플로 모델 검사를 위한 강력한 도구이다. 이를 이용하여 모델의 구조를 개념적 그래프로 빠르게 볼 수 있고 의도한 디자인과 일치하는지 확인할 수 있다. 또한 텐서플로가 프로그램을 어떻게 이해하는지를 이해할 수도록 하는 op-level (관리자 레벨) 그래프도 볼 수 있다. Op-level 그래프를 검사하는 것은 모델이 어떻게 변화는지에 관한 안목을 얻을 수 있다.

    이 글에서는 그래프 진단 데이터를 생성하고 텐서보드의 Graph dashboard에서 이를 시작화하는 방법을 빠르게 훑어 본다. 여기서 Fashion-MNIST 데이터셋에 대한 케라스 Sequential을 정의하하고 훈련하며 어떻게 로그를 남기는지와 모델의 그래프를 검사하는 방법을 배운다. 또한 새로운 tf.function 어노테이션(annotation)을 사용하여 생성된 함수에 대한 그래프 데이터를 생성하기 위한 추적 API(tracing API)도 사용한다.


Setup

Source>>

    from datetime import datetime
    from packaging import version

    import tensorflow as tf
    from tensorflow import keras

    print("TensorFlow version: ", tf.__version__)
    assert version.parse(tf.__version__).release[0] >= 2, \
        "This notebook requires TensorFlow 2.0 or above."

Result>>

    TensorFlow version:  2.1.0

Source>>

    import tensorboard
    tensorboard.__version__

Result>>

    '2.1.0'


케라스 모델 정의

    아래 예제에서 분류기는 간단한 4레이어 Sequential 모델이다

Source>>

    # Define the model.
    model = keras.models.Sequential([
        keras.layers.Flatten(input_shape=(28, 28)),
        keras.layers.Dense(32, activation='relu'),
        keras.layers.Dropout(0.2),
        keras.layers.Dense(10, activation='softmax')
    ])

    model.compile(
        optimizer='adam',
        loss='sparse_categorical_crossentropy',
        metrics=['accuracy'])

    훈련 데이터를 다운로드 하고 준비한다.

Source>>

    (train_images, train_labels), _ = keras.datasets.fashion_mnist.load_data()
    train_images = train_images / 255.0


모델 훈련 및 테이터 로그 남기기

    훈련 전에, 케라스 TensorBoard 콜백을 로그 디렉토리를 지정하여 정의하자. 이 콜백이 Model.fit()에 전달되는 것으로, 그래프 데이터가 텐서보드에 시각화를 위해 로그로 기록되게 된다.

Soruce>>

    # Define the Keras TensorBoard callback.
    logdir="logs\\graph\\" + datetime.now().strftime("%Y%m%d-%H%M%S")
    tensorboard_callback = keras.callbacks.TensorBoard(log_dir=logdir)

    # Train the model.
    model.fit(
        train_images,
        train_labels, 
        batch_size=64,
        epochs=5, 
        callbacks=[tensorboard_callback])

Result>>

    Train on 60000 samples
    Epoch 1/5
    60000/60000 [==============================] - 2s 25us/sample - loss: 0.6915 - accuracy: 0.7618
    Epoch 2/5
    60000/60000 [==============================] - 1s 21us/sample - loss: 0.4944 - accuracy: 0.8249
    Epoch 3/5
    60000/60000 [==============================] - 1s 21us/sample - loss: 0.4533 - accuracy: 0.8383
    Epoch 4/5
    60000/60000 [==============================] - 1s 21us/sample - loss: 0.4289 - accuracy: 0.8464
    Epoch 5/5
    60000/60000 [==============================] - 1s 22us/sample - loss: 0.4141 - accuracy: 0.8510


Op-level graph

    텐서보드를 시작하고 'Graph' 탭을 눌러 Graph dashboard를 선택한다.

Console>>

    > tensorboard --logdir=logs

    기본적으로 텐서보드는 op-level graph를 보여준다.(좌측에서 'Default' 태그가 선택되어 있는 것을 확인할 수 있다.) 그래프가 반전되어 있는 것에 주의하자. 데이터 흐름은 아래에서 위로 향한다. 그래서 뒤집어서 코드와 비교된다. 그러나, 그래프가 다른 계산 노드에 추가적인 엣지(edge)를 가진 테라스 모델 정의와 매우 일치한다는 것을 알 수 있다.

    그래프는 때때로 매우 크기 때문에 그래프 시각화를 조작할 수 있다.

  • 줌 인/아웃을 위한 스크롤
  • pan을 위한 drag
  • 노드 확장(node expension)을 토글하는 더블 클릭(노드는 다른 노드의 컨테이너일 수 있다.)

    또한, 노드를 클릭하여 metadata를 볼 수 있다. 이는 입력, 출력, 모양 그리고 다른 상세정보를 볼 수 있게 한다.





개념적(Conceptual) 그래프

    실행 그래프외에 텐서보드는 개념적 그래프를 보여준다. 이는 단지 케라스 모델을 모습이다. 만약 저장된 모델을 재사용하고 이 구조를 검사 및 검증하려는 경우 유용하다.

    개념적 그래프를 보기 위해서는 'keras' 태그를 선택한다. 이 예제에서는 접힌(collapesd) Sequential 노드가 보일 것이다. 모델의 구조를 보기 위해 노드를 더블클릭하자.




tf.functions의 그래프

    지금까지 예제는 케라스 모델의 그래프를 설명했다. 여기서 그래프는 케라스 레이어를 정의하고 Model.fit()을 호출하여 생성되었다.

    그런데 파이썬 계산 함수를 고성능 텐서플로 그래프로 변환하는 'autograph'를 위한 어노테이션인 tf.function을 사용해야할 상황이 발생할 수 있다. 이런 경우, 오토그래프된 함수를 텐서보드에 시각화하기 위해 로그를 기록하기 위한 TensorFlow Summary Trace API를 사용한다.

    Summary Trace API를 사용하기 위해서는

  • 함수를 정의, tf.function으로 어노테이션
  • 함수를 호출하기 바로 전에 tf.summary.trace_on() 사용
  • profiler=True를 전달하여 그래프에 프로파일 정보(메모리, CPU time) 추가
  • Summary file writer로 로그 데이터를 저장하기 위한, tf.summary.trace_export() 호출

    그려면 어떻게 함수가 동작하는지 확인하기 위해 텐서보드를 사용할 수 있다.

Source>>

    # The function to be traced.
    @tf.function
    def my_func(x, y):
        # A simple hand-rolled layer.
        return tf.nn.relu(tf.matmul(x, y))

    # Set up logging.
    stamp = datetime.now().strftime("%Y%m%d-%H%M%S")
    logdir = 'logs\\func\\%s' % stamp
    writer = tf.summary.create_file_writer(logdir)

    # Sample data for your function.
    x = tf.random.uniform((3, 3))
    y = tf.random.uniform((3, 3))

    # Bracket the function call with
    # tf.summary.trace_on() and tf.summary.trace_export().
    tf.summary.trace_on(graph=True, profiler=True)
    # Call only one tf.function when tracing.
    z = my_func(x, y)
    with writer.as_default():
        tf.summary.trace_export(
            name="my_func_trace",
            step=0,
            profiler_outdir=logdir)

Error>> 2020.06.03 : 위 예제 실행시 오류 발생. 하지만, 로그는 기록됨. 해결방법을 찾는 중.

    WARNING:tensorflow:Trace already enabled
    Traceback (most recent call last):

    File "", line 24, in 
        profiler_outdir=logdir)

    File "C:\Users\miris\anaconda3\envs\ML\lib\site-packages\tensorflow_core\python\ops\summary_ops_v2.py", line 1240, in trace_export
        _profiler.save(profiler_outdir, _profiler.stop())

    File "C:\Users\miris\anaconda3\envs\ML\lib\site-packages\tensorflow_core\python\eager\profiler.py", line 99, in stop
        'Cannot stop profiling. No profiler is running.')

    ProfilerNotRunningError: Cannot stop profiling. No profiler is running.

Console>>

    > tensorboard --logdir=logs/func


    텐서보드로 이해된 것 같이 함수의 구조를 볼 수 있다. CPU와 메모리 통계를 보기 위해서는 'Profile' 라디오버튼을 누른다.

그런데 이 예제에서는 차이가 없어 보인다.

반응형

+ Recent posts