TensorBoard

TensorBoard

TensorBoard는 TensorFlow 프로그램을 이해하고, 디버깅하고, 최적화하는 데 쓰는 시각화 도구 모음이에요. 머신러닝 실험에서 손실(loss)이나 정확도(accuracy) 같은 지표를 추적하고, 모델 그래프(연산과 레이어)를 시각화하며, 가중치·편향·다른 텐서들의 히스토그램이 시간에 따라 어떻게 변하는지 보고, 임베딩을 저차원 공간으로 투영해 볼 수 있어요. 이미지, 텍스트, 오디오 데이터를 표시하고 TensorFlow 프로그램을 프로파일링하는 기능까지 갖추고 있어요. 설계상 완전히 오프라인으로만 동작해서, 로컬 머신이든 사내 방화벽 뒤든 데이터센터든 인터넷 접근 없이도 실행돼요.

출처: 문서

본문

TensorBoard는 웹 애플리케이션 모음으로, TensorFlow 모델을 실행하기 전에 먼저 로그 디렉터리에 요약(summary) 데이터를 만들어 줘야 해요. 요약 데이터는 summary writer를 통해 생성합니다.

# sess.graph contains the graph definition; that enables the Graph Visualizer.

file_writer = tf.summary.FileWriter('/path/to/logs', sess.graph)

이벤트 파일이 준비되면 TensorBoard를 실행하면서 로그 디렉터리를 지정해 주면 돼요. 미리 컴파일된 TensorFlow 패키지(예: pip으로 설치한 경우)라면 이렇게 실행합니다.

tensorboard --logdir path/to/logs

소스에서 빌드했다면 이렇게 실행해요.

bazel build tensorboard:tensorboard
./bazel-bin/tensorboard/tensorboard --logdir path/to/logs

# or even more succinctly
bazel run tensorboard -- --logdir path/to/logs

이렇게 하면 TensorBoard가 시작됐다는 메시지가 출력되고, http://localhost:6006으로 접속하면 돼요. TensorBoard는 로그를 읽기 위해 logdir이 필요하며, 설정 방법은 tensorboard --help로 확인할 수 있어요. TensorBoard는 Google Chrome이나 Firefox에서 사용하는 게 좋아요. 다른 브라우저도 대부분 동작하지만 버그나 성능 문제가 있을 수 있어요.

TensorBoard가 데이터를 얻는 방식: summary ops

TensorBoard 사용의 첫 단계는 TensorFlow 실행에서 데이터를 얻는 일이에요. 이를 위해 summary ops가 필요해요. summary ops는 tf.matmul이나 tf.nn.relu처럼 텐서를 받고 텐서를 만들어 내는, 그래프 안에서 평가되는 연산이에요. 다만 한 가지 다른 점은, 이들이 만들어 내는 텐서가 직렬화된 protobuf를 담고 있어서 디스크에 쓰이고 TensorBoard로 전송된다는 점이에요. 요약 데이터를 시각화하려면 summary op를 평가하고, 결과를 가져와서 summary.FileWriter로 디스크에 써야 해요.

지원되는 summary ops는 다음과 같아요.

Tags: 데이터에 이름 붙이기

summary op를 만들 때 tag도 함께 지정해요. tag는 해당 op가 기록하는 데이터의 이름으로, 프런트엔드에서 데이터를 정리하는 데 쓰여요. 스칼라·히스토그램 대시보드는 tag별로 데이터를 정리하고, 디렉터리(/) 같은 계층 구조에 따라 tag를 폴더로 묶어요. tag가 많다면 슬래시(/)로 그룹을 만들어 주는 걸 권장해요.

Event Files & LogDirs: TensorBoard가 데이터를 불러오는 방식

summary.FileWriter는 TensorFlow의 요약 데이터를 받아 logdir이라고 하는 지정된 디렉터리에 써요. 데이터는 "tfevents"가 파일명에 들어 있는 append-only 레코드 덤프로 기록돼요. TensorBoard는 전체 디렉터리를 읽어 단일 TensorFlow 실행의 이력으로 정리해요. 디렉터리 전체를 읽는 이유는, 예를 들어 supervisor가 모델을 실행하다가 TensorFlow가 크래시하면 체크포인트에서 재시작하고 새 이벤트 파일에 쓰기 시작하는데, TensorBoard가 여러 이벤트 파일을 이어 붙여 일관된 이력을 만들어 주기 때문이에요.

Runs: 여러 실행 비교하기

모델의 실행 결과를 여러 번 시각적으로 비교하고 싶을 때가 있어요. 예를 들어 하이퍼파라미터를 바꿔서 더 빨리 수렴하는지 확인하고 싶은 경우죠. TensorBoard는 "runs"을 통해 이를 지원해요. 시작할 때 logdir을 전달하면, TensorBoard는 logdir을 루트로 하는 디렉터리 트리를 재귀적으로 탐색하면서 tfevents 데이터가 있는 하위 디렉터리를 찾아요. 그런 하위 디렉터리를 만날 때마다 새 run으로 불러오고, 프런트엔드가 데이터를 그에 맞춰 정리해요.

예를 들어 run1, run2 두 개의 run을 가진 잘 정리된 로그 디렉터리는 다음과 같아요.

/some/path/mnist_experiments/
/some/path/mnist_experiments/run1/
/some/path/mnist_experiments/run1/events.out.tfevents.1456525581.name
/some/path/mnist_experiments/run1/events.out.tfevents.1456525585.name
/some/path/mnist_experiments/run2/
/some/path/mnist_experiments/run2/events.out.tfevents.1456525385.name
/tensorboard --logdir /some/path/mnist_experiments

여러 로그 디렉터리를 쉼표로 구분해 전달할 수도 있고, 이름과 경로 사이에 콜론을 붙여 개별 로그 디렉터리에 이름을 붙일 수도 있어요.

tensorboard --logdir_spec name1:/path/to/logs/1,name2:/path/to/logs/2

--logdir_spec 플래그는 권장되지 않아요. TensorBoard는 로그 디렉터리를 재귀적으로 탐색하므로, 더 세밀한 제어가 필요하면 symlink 트리를 쓰는 게 좋아요. --logdir_spec 대신 --logdir을 쓰면 더 안정적이에요.

대시보드 종류

Scalar Dashboard는 시간에 따라 변하는 스칼라 통계(예: 모델의 loss나 learning rate)를 시각화해요. 여러 run을 비교할 수 있고 데이터는 tag별로 정리돼요. 차트 왼쪽 아래의 파란 아이콘을 클릭하면 차트가 펼쳐지고, 차트 위에 사각형을 드래그하면 확대, 더블 클릭하면 축소, 마우스를 올리면 십자선이 나타나 왼쪽 run 선택기에 값이 기록돼요.

Histogram Dashboard는 텐서의 통계적 분포가 시간에 따라 어떻게 변했는지 보여줘요. tf.summary.histogram으로 기록된 데이터를 시각화하며, 각 차트는 특정 step에서의 텐서 히스토그램인 시간적 "조각(slice)"들을 보여줘요. 가장 오래된 타임스텝이 뒤쪽, 가장 최근 타임스텝이 앞쪽에 놓여요. Histogram Mode를 "offset"에서 "overlay"로 바꾸면 각 히스토그램 조각이 선으로 렌더링되어 서로 겹쳐져 보여요.

Distribution Dashboardtf.summary.histogram의 히스토그램 데이터를 다른 방식으로 시각화해요. 분포의 상위 수준 통계를 보여주는데, 각 선은 데이터 분포의 백분위수를 나타내요. 위에서부터 [maximum, 93%, 84%, 69%, 50%, 31%, 16%, 7%, minimum]을 의미하고, 이를 정규분포의 표준편차 경계 [maximum, μ+1.5σ, μ+σ, μ+0.5σ, μ, μ-0.5σ, μ-σ, μ-1.5σ, minimum]로 볼 수도 있어요.

Image Dashboardtf.summary.image로 저장된 png를 표시해요. 각 행은 서로 다른 tag, 각 열은 run에 대응돼요. 임의의 png를 지원하므로 matplotlib 산점도 같은 커스텀 시각화를 TensorBoard에 넣을 수도 있고, 항상 각 tag의 최신 이미지를 보여줘요.

Audio Dashboardtf.summary.audio로 저장된 오디오를 재생 가능한 위젯으로 삽입해요. 각 행은 tag, 각 열은 run에 대응되고 각 tag의 최신 오디오를 항상 삽입해요.

Graph Explorer는 TensorBoard 그래프를 시각화해서 TensorFlow 모델을 검사할 수 있게 해줘요. 그래프 시각화를 제대로 쓰려면 name scope로 그래프의 ops를 계층적으로 그룹화해야 해요. 그렇지 않으면 그래프를 해독하기 어려울 수 있어요.

Embedding Projector는 고차원 데이터를 시각화해요. 예를 들어 모델이 고차원 공간에 임베딩한 입력 데이터를 볼 수 있어요. 임베딩 프로젝터는 모델 체크포인트 파일에서 데이터를 읽고, vocabulary 파일이나 sprite 이미지 같은 추가 메타데이터로 구성할 수 있어요.

Text Dashboardtf.summary.text로 저장된 텍스트 조각을 표시하는데, 하이퍼링크·목록·테이블 같은 Markdown 기능을 모두 지원해요.

Time Series Dashboardtf.summary.scalar, tf.summary.image, tf.summary.histogram으로 저장한 모든 Scalars·Histograms·Images를 담은 통합 인터페이스를 보여줘요. 예를 들어 'accuracy' 선 그래프를 활성화 히스토그램, 학습 예제 이미지와 나란히 볼 수 있어요. run 선택기에서 run 색상을 바꾸거나, 카드의 pin 아이콘으로 상단 고정 영역에 추가해 빠르게 비교하는 등 기능이 있어요.

자주 묻는 문제

아무 데이터도 안 보여요. 먼저 --logdir에 전달한 디렉터리가 맞는지 확인해요. 이벤트 파일이 있는지 확인하려면 다음을 실행해 보세요.

find DIRECTORY_PATH | grep tfevents

이벤트 파일에 실제 데이터가 있는지 확인하려면 inspect 모드로 실행할 수 있어요.

tensorboard --inspect --logdir DIRECTORY_PATH

데이터가 일부만 보이거나 갱신이 안 돼요. TensorBoard는 tfevents 파일을 타임스탬프 순서대로 진행하며 한 번에 하나의 파일만 읽어요. 두 개 이상의 summary writer가 같은 디렉터리에 동시에 쓰고 있다면 문제가 생길 수 있어요. 여러 summary writer가 있다면 각각 별도 디렉터리에 쓰도록 해야 해요.

데이터가 겹쳐 보여요. 여러 TensorFlow 실행이 같은 로그 디렉터리에 썼거나, FileWriter.add_summary에 전달하는 global_step이 잘못 유지되고 있거나, 크래시 후 이전 체크포인트에서 재시작됐을 수 있어요. 임시 해결책으로 x축 표시를 steps에서 wall_time으로 바꿔 보면 해결되는 경우가 많아요.

TensorBoard 없이 TensorFlow 없이 실행할 수 있나요? TensorBoard 1.14 이상은 TensorFlow가 설치되어 있지 않아도 축소된 기능으로 실행할 수 있어요. 다만 scalars, images, graph, projector(부분), histograms, text 등 일부 플러그인만 지원하고 Google Cloud Storage의 로그 디렉터리는 지원하지 않아요.

데이터는 어떻게 내보내나요? Scalar Dashboard는 "enable download links" 옵션을 켜면 각 플롯에 데이터 다운로드 링크를 제공해요. 전체 데이터셋이 필요하면 summary_iterator 메서드로 이벤트 파일을 읽을 수 있어요.

더 알아보기 (Learn more)