Path: blob/master/site/ko/tensorboard/migrate.ipynb
25115 views
Copyright 2019 The TensorFlow Authors.
tf.summary 사용법을 TF 2.x으로 마이그레이션
참고: 이 문서는 TensorFlow 1.x TensorBoard에 이미 익숙하고 대규모 TensorFlow 코드 베이스를 TensorFlow 1.x에서 2.x으로 마이그레이션하려는 사람들을 위한 것입니다. TensorBoard를 처음 사용하는 경우라면 먼저 시작하기 문서를 참조하세요.
tf.keras
를 사용하는 경우, TensorFlow 2.x으로 업그레이드하기 위해 취해야 할 조치가 없을 수 있습니다.
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에서 기본적으로 처리되는 즉시 실행의 사용 예입니다.
다음은 tf.function 그래프 실행을 사용한 예입니다.
다음은 레거시 TF 1.x 그래프 실행의 사용 예입니다.
코드 변환하기
기존 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 요약 작성기가 설정되었습니다.
작성기에 대해 비어 있지 않은 값의 단계가 설정되었습니다(
tf.summary.SummaryWriter.as_default
,tf.summary.experimental.set_step
또는tf.compat.v1.train.create_global_step
사용).
TF 2.x 요약 구현이 호출되면 반환 값은 중복된 요약 작성을 피하기 위해 빈 바이트열 텐서가 됩니다. 또한 입력 인수 전달이 최선이며 모든 인수가 보존되지는 않습니다(예: family
인수는 지원되지만 collections
는 제거됨).
tf.compat.v1.summary.scalar
에서 tf.summary.scalar
동작을 호출하는 예제:
전체 마이그레이션
TF 2.x로 완전히 마이그레이션하려면 다음과 같이 코드를 조정해야 합니다.
요약 ops를 사용하려면
.as_default()
를 통해 설정된 기본 작성기가 있어야 합니다.즉, ops를 즉시 실행하거나 ops를 그래프 구성에서 사용합니다.
기본 작성기가 없으면 요약 ops가 자동 ops가 됩니다.
기본 작성자는 (아직)
@tf.function
실행 경계를 넘어 전파되지 않으며 함수가 추적될 때만 감지됩니다. 따라서 함수 본문 내에서writer.as_default()
를 호출하고@tf.function
이 사용되는 동안 작성기 객체가 계속해서 존재하도록 하는 것이 최선의 방법입니다.
step
인수를 통해 "스텝" 값을 각 op로 전달해야 합니다.TensorBoard에서 데이터를 시계열로 렌더링하려면 스텝 값이 필요합니다.
TF 1.x의 전역 스텝이 제거되었기 때문에 명시적 전달이 필요하므로 각 op가 읽어야 하는 스텝 변수를 알아야 합니다.
상용구를 줄이기 위해 기본 스텝 값을 등록하기 위한 실험적 지원이
tf.summary.experimental.set_step()
으로 제공되지만 이는 예고 없이 변경될 수 있는 잠정적 기능입니다.
개별 요약 ops의 함수 서명이 변경되었습니다.
반환 값은 이제 부울입니다(요약이 실제로 작성되었는지 여부를 나타냄).
두 번째 매개변수 이름(사용된 경우)이
tensor
에서data
로 변경되었습니다.collections
매개변수가 제거되었습니다. collections는 TF 1.x 전용입니다.family
매개변수가 제거되었습니다.tf.name_scope()
를 사용하세요.
[레거시 그래프 모드/세션 실행 사용자만 해당]
먼저,
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 패턴을 대체합니다.
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로 변환할 수 있습니다.