Tensorboard 詳解(上篇)

Tensorboard 詳解(上篇)

作者 花間提壺華小廚

1. Tensorboard簡介

對大部分人而言,深度神經網絡就像一個黑盒子,其內部的組織、結構、以及其訓練過程很難理清楚,這給深度神經網絡原理的理解和工程化帶來了很大的挑戰。為了解決這個問題,tensorboard應運而生。Tensorboard是tensorflow內置的一個可視化工具,它通過將tensorflow程序輸出的日誌文件的信息可視化使得tensorflow程序的理解、調試和優化更加簡單高效。Tensorboard的可視化依賴於tensorflow程序運行輸出的日誌文件,因而tensorboard和tensorflow程序在不同的進程中運行。

那如何啟動tensorboard呢?下面代碼定義了一個簡單的用於實現向量加法的計算圖。

import tensorflow as tf 
# 定義一個計算圖,實現兩個向量的減法操作
# 定義兩個輸入,a為常量,b為變量
a=tf.constant([10.0, 20.0, 40.0], name='a')
b=tf.Variable(tf.random_uniform([3]), name='b')
output=tf.add_n([a,b], name='add')
# 生成一個具有寫權限的日誌文件操作對象,將當前命名空間的計算圖寫進日誌中
writer=tf.summary.FileWriter('/path/to/logs', tf.get_default_graph())
writer.close()

在上面程序的8、9行中,創建一個writer,將tensorboard summary寫入文件夾/path/to/logs,然後運行上面的程序,在程序定義的日誌文件夾/path/to/logs目錄下,生成了一個新的日誌文件events.out.tfevents.1524711020.bdi-172,如下圖1所示。當然,這裡的日誌文件夾也可以由讀者自行指定,但是要確保文件夾存在。如果使用的tensorboard版本比較低,那麼直接運行上面的代碼可能會報錯,此時,可以嘗試將第8行代碼改為file_writer=tf.train.SummaryWriter('/path/to/logs', sess.graph)

Tensorboard 詳解(上篇)

圖1 日誌目錄下生成的events文件路徑


接著運行如圖2所示命令tensorboard –logdir /path/to/logs來啟動服務。

Tensorboard 詳解(上篇)

圖2 linux下啟動tensorboard服務的命令


注意,當系統報錯,找不到tensorboard命令時,則需要使用絕對路徑調用tensorboard,例如下面的命令形式:

 python tensorflow/tensorboard/tensorboard.py --logdir=path/to/log-directory 


Tensorboard 詳解(上篇)

圖3 tensorflow向量相加程序的計算圖的可視化結果


啟動tensorboard服務後,在本地瀏覽器中輸入http://188.88.88.88:6006/,會看到如上圖3所示的界面。注意,由於本節程序是在Linux服務器上運行的,所以需要輸入該服務器完整的IP地址("188.88.88.88"指本實驗所使用的服務器IP地址,實際操作時需要修改成實際使用的服務器IP),若tensorflow程序是在本機上運行,則需將上述IP地址188.88.88.88替換成localhost。

根據上述內容描述,tensorboard的啟動過程可以概括為以下幾步:

1. 創建writer,寫日誌文件

writer=tf.summary.FileWriter('/path/to/logs', tf.get_default_graph())

2. 保存日誌文件

writer.close() 

3. 運行可視化命令,啟動服務

tensorboard –logdir /path/to/logs 

4. 打開可視化界面

通過瀏覽器打開服務器訪問端口http://xxx.xxx.xxx.xxx:6006

注意:tensorboard兼容Google瀏覽器或Firefox瀏覽器,對其他瀏覽器的兼容性較差,可能會提示bug或出現其他性能上的問題。


Tensorboard 詳解(上篇)

圖4 tensorboard各欄目的默認界面


本文使用tensorboard1.4.1,較以往版本有很多不同。首先從界面上,此版本的tensorboard導航欄中只顯示有內容的欄目,如GRAPHS,其他沒有相關數據的子欄目都隱藏在INACTIVE欄目中,點擊這些子欄目則會顯示一條如圖4所示的提示信息,指示使用者如何序列化相關數據。除此之外,在欄目的數量上也有增加,新增了DISTRIBUTIONS、PROJECTOR、TEXT、PR CURVES、PROFILE五個欄目。

Tensorboard的可視化功能很豐富。SCALARS欄目展示各標量在訓練過程中的變化趨勢,如accuracy、cross entropy、learning_rate、網絡各層的bias和weights等標量。如果輸入數據中存在圖片、視頻,那麼在IMAGES欄目和AUDIO欄目下可以看到對應格式的輸入數據。在GRAPHS欄目中可以看到整個模型計算圖結構。在HISTOGRAM欄目中可以看到各變量(如:activations、gradients,weights 等變量)隨著訓練輪數的數值分佈,橫軸上越靠前就是越新的輪數的結果。DISTRIBUTIONS和HISTOGRAM是兩種不同形式的直方圖,通過這些直方圖可以看到數據整體的狀況。PROJECTOR欄目中默認使用PCA分析方法,將高維數據投影到3D空間,從而顯示數據之間的關係。


2. Tensorflow數據流圖

從tensorboard中我們可以獲取更多,遠遠不止圖3所展示的。這一小節將從計算圖結構和結點信息兩方面詳細介紹如何理解tensorboard中的計算圖,以及從計算圖中我們能獲取哪些信息。

2.1 Tensorflow的計算圖結構

如上圖3展示的是一個簡單的計算圖,圖結構中主要包含了以下幾種元素:

Tensorboard 詳解(上篇)

Namespace,表示命名空間


Tensorboard 詳解(上篇)

OpNode,操作結點


Tensorboard 詳解(上篇)

Constant,常量


Tensorboard 詳解(上篇)

Dataflow edge,數據流向邊


Tensorboard 詳解(上篇)

Control dependency edge,控制依賴邊


Tensorboard 詳解(上篇)

Reference edge,參考邊


除此之外,還有Unconnected series、Connected series、Summary等元素。這些元素構成的計算圖能夠讓我們對輸入數據的流向,各個操作之間的關係等有一個清晰的認識。


Tensorboard 詳解(上篇)

圖5 初始的計算圖結構


如上圖5,是一個簡單的兩層全連接神經網絡的計算圖。僅僅從圖5,我們很難快速瞭解該神經網絡的主體數據流關係,因為太多的細節信息堆積在了一起。這還只是一個兩層的簡單神經網絡,如果是多層的深度神經網絡,其標量的聲明,常量、變量的初始化都會產生新的計算結點,這麼多的結點在一個頁面上,那其對應的計算圖的複雜性,排列的混亂性難以想象。所以我們需要對計算圖進行整理,避免主要的計算節點淹沒在大量的信息量較小的節點中,讓我們能夠更好的快速抓住主要信息。通過定義子命名空間,可以達到整理節點、讓可視化效果更加清晰的目的。

Tensorboard 詳解(上篇)

圖6 整理後的計算圖結構


如上圖6,就是通過定義子命名空間整理結點後的效果。該計算圖只顯示了最頂層的各命名空間之間的數據流關係,其細節信息被隱藏起來了,這樣便於把握主要信息。

圖7為加入子命名空間後的部分代碼截圖。代碼中,將輸入數據都放在了input命名空間中,還使用了perdition、moving_averages、loss、train等命名空間去整理對應的操作過程。

Tensorboard 詳解(上篇)

圖7 用命名空間整理計算圖的代碼截圖



Tensorboard 詳解(上篇)

圖8 手動將節點從主圖中移除

除此之外,我們還可以通過手動將不重要的節點從主圖中移除來簡化計算圖,如上圖8,右鍵點擊想要移除的節點,會出現“Remove from main graph”按鈕,點擊該按鈕,就可以移除對應節點了。

2.2 結點的信息

Tensorboard除了可以展示整體的計算圖結構之外,還可以展示很多細節信息,如結點的基本信息、運行時間、運行時消耗的內存、各結點的運行設備(GPU或者CPU)等。

2.2.1 基本信息

前面的部分介紹瞭如何將計算圖的細節信息隱藏起來,但是有的時候,我們需要查看部分重要命名空間下的節點信息,那這些細節信息如何查看呢?對於節點信息,雙擊圖8中的任意一個命名空間,就會展開對應命名空間的細節圖(再次雙擊就可以收起細節圖)。


Tensorboard 詳解(上篇)

圖9 展開input命名空間節點信息圖


上圖9是input命名空間的展開圖,展開圖中包含了兩個操作節點(x_input和y_input)。除了瞭解具體包含的操作節點以及其他元素外,我們還可以獲取粒度更小的信息。



Tensorboard 詳解(上篇)

圖10 input命名空間的放大的細節圖



Tensorboard 詳解(上篇)

圖11 命名空間的節點信息


Tensorboard 詳解(上篇)

圖12 計算節點的基本信息

上圖10所示為圖9中input命名空間展開圖的放大圖。觀察圖10,我們可以瞭解到輸入數據x、y的維度,圖中x的向量維度為784維,y為10維,?表示樣本數量。本節演示中使用的是mnist數據集,mnist數據集是一個針對圖片的10分類任務,輸入向量維度是784,這說明可以通過計算圖上這些信息,來校驗輸入數據是否正確。通過左鍵單擊命名空間或者操作節點,屏幕的右上角會顯示對應的具體信息。

如上圖11中,右上角綠色框標註的部分為命名空間layer2的具體信息。如上圖12中,右上角綠色框標註的部分為節點x_input的具體信息。

2.2.2 其他信息

除了節點的基本信息之外,tensorboard還可以展示每個節點運行時消耗的時間、空間、運行的機器(GPU或者CPU)等信息。本小節將詳細講解如何使用tensorboard展示這些信息。這些信息有助於快速獲取時間、空間複雜度較大的節點,從而指導後面的程序優化。

將2.1節中圖7所展示的代碼的session部分改成如下所示的程序,就可以將程序運行過程中不同迭代輪數中tensorflow各節點消耗的時間和空間等信息寫入日誌文件中,然後通過讀取日誌文件將這些信息用tensorboard展示出來。

#創建writer對象 
writer=tf.summary.FileWriter("/path/to/metadata_logs",\
tf.get_default_graph())
with tf.Session() as sess:
tf.global_variables_initializer().run()
for i in range(TRAINING_STEPS):
x_batch, y_batch=mnist.train.next_batch(BATCH_SIZE)
if i%1000==0:
#這裡通過trace_level參數配置運行時需要記錄的信息,
# tf.RunOptions.FULL_TRACE代表所有的信息
run_options = tf.RunOptions(\
trace_level=tf.RunOptions.FULL_TRACE)
#運行時記錄運行信息的proto,pb是用來序列化數據的
run_metadata = tf.RunMetadata()
#將配置信息和記錄運行信息的proto傳入運行的過程,從而記錄運行時每一個節點的時間、空間開銷信息
_, loss_value, step = sess.run(\
[train_op, loss, global_step], \
feed_dict={x: x_batch, y_: y_batch},\
options=run_options, run_metadata=run_metadata)
#將節點在運行時的信息寫入日誌文件
writer.add_run_metadata(run_metadata, 'step %03d' % i)
else:
_, loss_value, step = sess.run(\
[train_op, loss, global_step], \
feed_dict={x: xs, y_: ys})
writer.close()

運行上面的程序,生成日誌文件存儲在/path/to/metadata_logs/目錄下,啟動tensorboard服務,讀取日誌文件信息,將每一個節點在不同迭代輪數消耗的時間、空間等信息展示出來。

Tensorboard 詳解(上篇)

圖13 選擇迭代輪數對應記錄頁面


如上圖13所示,在瀏覽器中打開可視化界面,進入GRAPHS子欄目,點擊Session runs選框,會出現一個下拉菜單,這個菜單中展示了所有日誌文件中記錄的運行數據所對應的迭代輪數。任意選擇一個迭代輪數,頁面右邊的區域會顯示對應的運行數據。



Tensorboard 詳解(上篇)

圖14 第9000輪迭代時不同計算節點消耗時間的可視化效果圖


Tensorboard 詳解(上篇)

圖15 第9000輪迭代時不同計算節點佔有存儲的可視化效果圖


如上圖14所示,選擇了第9000輪的運行數據,然後選擇Color欄目下的Compute time選項,GRAPHS欄目下就會顯示tensorflow程序每個計算節點的運行時間。圖中使用顏色的深淺來表示運行時間的長短,顏色深淺對應的具體運行時間可以從頁面左側的顏色條看出。由圖14可知,train命名空間運行時所消耗的時間最長,Variable命名空間所消耗的時間比較短,無色表示不消耗時間。

如上圖15展示了tensorflow各個節點所佔用的空間大小。與衡量運行時所消耗的時間方法類似,使用顏色的深淺來標識所佔用內存的大小。顏色條上的數字說明,佔用的最大空間為677MB,最小空間為0B。train命名空間佔用的存儲空間最大。

除了時間和空間指標,tensorboard還可以展示各節點的運行設備(GPU還是CPU)、XLA Cluster、TPU Compatibility等,這些全部都在Color欄目下作為選項供選擇。這些指標都是將節點染色,通過不同顏色以及顏色深淺來標識結果的。如下圖16,是TPU Compatibility展示圖。

Tensorboard 詳解(上篇)

圖16 第9000輪迭代時不同計算節點的TPU Compatibility效果展示圖



對深度學習感興趣,熱愛Tensorflow的小夥伴,歡迎關注我們的網站http://www.panchuang.net 我們的公眾號:磐創AI。


分享到:


相關文章: