Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
tensorflow
GitHub Repository: tensorflow/docs-l10n
Path: blob/master/site/ko/tensorboard/migrate.ipynb
25115 views
Kernel: Python 3
#@title Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License.

참고: 이 문서는 TensorFlow 1.x TensorBoard에 이미 익숙하고 대규모 TensorFlow 코드 베이스를 TensorFlow 1.x에서 2.x으로 마이그레이션하려는 사람들을 위한 것입니다. TensorBoard를 처음 사용하는 경우라면 먼저 시작하기 문서를 참조하세요. tf.keras를 사용하는 경우, TensorFlow 2.x으로 업그레이드하기 위해 취해야 할 조치가 없을 수 있습니다.

import tensorflow as tf

TensorFlow 2.x에서는 TensorBoard에서 시각화를 위한 요약 데이터를 작성할 때 사용되는 tf.summary API에 중대한 변경이 이루어졌습니다.

변경된 사항

tf.summary API를 두 개의 하위 API로 생각하면 편리합니다.

  • 모델 코드에서 인라인으로 호출되는 summary.scalar(), summary.histogram(), summary.image(), summary.audio(), summary.text() 등 개별 요약을 기록하기 위한 ops 세트

  • 이러한 개별 요약을 수집하고 특수 형식의 로그 파일에 기록하는(그런 다음 TensorBoard가 읽고 시각화를 생성함) 논리 작성

TF 1.x에서

Session.run()을 통해 요약 op 출력을 가져오고 FileWriter.add_summary(output, step)을 호출하여 두 부분을 수동으로 연결해야 했습니다. v1.summary.merge_all() op가 그래프 모음을 사용하여 모든 요약 op 출력을 집계하는 식으로 이 작업을 더 쉽게 만들었지만, 이 접근 방식은 즉시 실행과 제어 흐름에 여전히 효과적이지 않기 때문에 TF 2.x에 특히 부적합합니다.

TF 2.X에서

두 부분이 긴밀하게 통합되었으며 이제 개별 tf.summary ops가 실행되는 즉시 데이터를 기록합니다. 모델 코드에서 API를 사용하는 것이 여전히 익숙해 보이겠지만 이제는 그래프 모드 호환성을 유지하면서 즉시 실행하기가 원활해졌습니다. API의 두 부분이 통합되면서 summary.FileWriter는 이제 TensorFlow 실행 컨텍스트의 일부가 되었고 tf.summary ops에서 직접 액세스하므로 작성기를 구성하는 것이 가장 큰 차이점으로 보일 것입니다.

다음은 TF 2.x에서 기본적으로 처리되는 즉시 실행의 사용 예입니다.

writer = tf.summary.create_file_writer("/tmp/mylogs/eager") with writer.as_default(): for step in range(100): # other model code would go here tf.summary.scalar("my_metric", 0.5, step=step) writer.flush()
ls /tmp/mylogs/eager

다음은 tf.function 그래프 실행을 사용한 예입니다.

writer = tf.summary.create_file_writer("/tmp/mylogs/tf_function") @tf.function def my_func(step): with writer.as_default(): # other model code would go here tf.summary.scalar("my_metric", 0.5, step=step) for step in tf.range(100, dtype=tf.int64): my_func(step) writer.flush()
ls /tmp/mylogs/tf_function

다음은 레거시 TF 1.x 그래프 실행의 사용 예입니다.

g = tf.compat.v1.Graph() with g.as_default(): step = tf.Variable(0, dtype=tf.int64) step_update = step.assign_add(1) writer = tf.summary.create_file_writer("/tmp/mylogs/session") with writer.as_default(): tf.summary.scalar("my_metric", 0.5, step=step) all_summary_ops = tf.compat.v1.summary.all_v2_summary_ops() writer_flush = writer.flush() with tf.compat.v1.Session(graph=g) as sess: sess.run([writer.init(), step.initializer]) for i in range(100): sess.run(all_summary_ops) sess.run(step_update) sess.run(writer_flush)
ls /tmp/mylogs/session

코드 변환하기

기존 tf.summary 사용법을 TF 2.x API로 변환하는 과정을 안정적으로 자동화할 수는 없기 때문에 tf_upgrade_v2 스크립트는 모든 내용을tf.compat.v1.summary로 다시 작성하며 TF 2.x 동작을 자동으로 활성화하지 않습니다.

부분 마이그레이션

tf.compat.v1.summary.scalar()와 같은 TF 1.x 요약 API 로깅 ops에 여전히 크게 의존하는 모델 코드 사용자가 TF 2.x로 더 쉽게 마이그레이션할 수 있도록, 나중에 모델 코드 내의 개별 TF 1.x 요약 ops를 완전히 마이그레이션할 수 있게 작성자 API만 먼저 마이그레이션할 수 있습니다.

이러한 마이그레이션 스타일을 지원하기 위해 tf.compat.v1.summary는 다음과 같은 조건으로 TF 2.x에 자동으로 전달합니다.

TF 2.x 요약 구현이 호출되면 반환 값은 중복된 요약 작성을 피하기 위해 빈 바이트열 텐서가 됩니다. 또한 입력 인수 전달이 최선이며 모든 인수가 보존되지는 않습니다(예: family 인수는 지원되지만 collections는 제거됨).

tf.compat.v1.summary.scalar에서 tf.summary.scalar 동작을 호출하는 예제:

# Enable eager execution. tf.compat.v1.enable_v2_behavior() # A default TF 2.x summary writer is available. writer = tf.summary.create_file_writer("/tmp/mylogs/enable_v2_in_v1") # A step is set for the writer. with writer.as_default(step=0): # Below invokes `tf.summary.scalar`, and the return value is an empty bytestring. tf.compat.v1.summary.scalar('float', tf.constant(1.0), family="family")

전체 마이그레이션

TF 2.x로 완전히 마이그레이션하려면 다음과 같이 코드를 조정해야 합니다.

  1. 요약 ops를 사용하려면 .as_default()를 통해 설정된 기본 작성기가 있어야 합니다.

    • 즉, ops를 즉시 실행하거나 ops를 그래프 구성에서 사용합니다.

    • 기본 작성기가 없으면 요약 ops가 자동 ops가 됩니다.

    • 기본 작성자는 (아직) @tf.function 실행 경계를 넘어 전파되지 않으며 함수가 추적될 때만 감지됩니다. 따라서 함수 본문 내에서 writer.as_default()를 호출하고 @tf.function이 사용되는 동안 작성기 객체가 계속해서 존재하도록 하는 것이 최선의 방법입니다.

  2. step 인수를 통해 "스텝" 값을 각 op로 전달해야 합니다.

    • TensorBoard에서 데이터를 시계열로 렌더링하려면 스텝 값이 필요합니다.

    • TF 1.x의 전역 스텝이 제거되었기 때문에 명시적 전달이 필요하므로 각 op가 읽어야 하는 스텝 변수를 알아야 합니다.

    • 상용구를 줄이기 위해 기본 스텝 값을 등록하기 위한 실험적 지원이 tf.summary.experimental.set_step()으로 제공되지만 이는 예고 없이 변경될 수 있는 잠정적 기능입니다.

  3. 개별 요약 ops의 함수 서명이 변경되었습니다.

    • 반환 값은 이제 부울입니다(요약이 실제로 작성되었는지 여부를 나타냄).

    • 두 번째 매개변수 이름(사용된 경우)이 tensor에서 data로 변경되었습니다.

    • collections 매개변수가 제거되었습니다. collections는 TF 1.x 전용입니다.

    • family 매개변수가 제거되었습니다. tf.name_scope()를 사용하세요.

  4. [레거시 그래프 모드/세션 실행 사용자만 해당]

    • 먼저, v1.Session.run(writer.init())로 작성기를 초기화합니다.

    • v1.summary.all_v2_summary_ops()를 사용하여 현재 그래프에 대한 모든 TF 2.x 요약 ops를 가져옵니다(예: Session.run()을 통해 실행).

    • v1.Session.run(writer.flush())로 작성기를 플러시하고 close()에 대해서도 플러시합니다.

이와 달리 해당 TF 1.x 코드가 tf.contrib.summary API를 사용했다면 TF 2.x API와 훨씬 비슷하므로 tf_upgrade_v2 스크립트가 대부분의 마이그레이션 단계를 자동으로 처리합니다(완전히 마이그레이션할 수 없는 사용법에 대해서는 경고나 오류를 나타냄). 대부분의 경우tf.compat.v2.summary에 대한 API 호출을 다시 작성하는 것에 지나지 않습니다. TF 2.x와의 호환성만 필요하다면 compat.v2를 제외하고 단순히 tf.summary로 참조할 수 있습니다.

추가 팁

위의 중요한 부분들 외에도 일부 보완적인 변경 사항도 있습니다.

  • 조건부 기록(예: "100개 스텝마다 기록")의 모습이 새롭게 바뀌었습니다.

    • ops 및 관련 코드를 제어하려면 일반 if 문(즉시 실행 모드 및 autograph를 통해 @tf.function에서 동작) 또는 tf. cond에서 이를 래핑합니다.

    • 요약만 제어하려면 새로운 tf.summary.record_if() 컨텍스트 관리자를 사용하고 여기에 선택한 부울 조건을 전달합니다.

    • 다음은 TF 1.x 패턴을 대체합니다.

      if condition: writer.add_summary()
  • tf.compat.v1.Graph를 직접 작성하지 않고 대신 추적 함수를 사용합니다.

    • TF 2.x의 그래프 실행은 명시적 Graph 대신 @tf.function을 사용합니다.

    • TF 2.x에서는 새로운 추적 스타일 API인 tf.summary.trace_on()tf.summary.trace_export()를 사용하여 실행된 함수 그래프를 기록합니다.

  • 더 이상 tf.summary.FileWriterCache를 이용해 logdir별로 전역 작성기 캐싱을 수행하지 않습니다.

    • 사용자는 작성기 객체의 자체 캐싱/공유를 구현하거나 별도의 작성기를 사용해야 합니다(후자에 대한 TensorBoard 지원이 진행 중).

  • 이벤트 파일 이진 표현이 변경되었습니다.

    • TensorBoard 1.x는 이미 새로운 형식을 지원합니다. 이 차이는 이벤트 파일에서 요약 데이터를 수동으로 구문 분석하는 사용자에게만 영향을 미칩니다.

    • 요약 데이터는 이제 텐서 바이트로 저장됩니다. tf.make_ndarray(event.summary.value[0].tensor)를 사용하여 이를 numpy로 변환할 수 있습니다.