Bu yazıda Colab içerisinde geliştirdiğimiz TensorFlow ya da Keras projesinde TensorBoard’u çalıştırmak için bir yöntem anlatılacaktır.
Bildiğiniz üzere Colab (colab.research.google.com) derin öğrenme uygulamaları geliştirmek için bizlere GPU (Nvidia Tesla K80 GPU) hesaplama ortamı sunan, içerisinde bir çok Python ve derin öğrenme kütüphanesi hazır bulunan ücretsiz bir ortam. Aslında bir Jupyter/iPython notebook. Bu ortam sadece bize fiziksel olarak tahsis edilmeyen bir sanal makina ortamı olduğu için verilerimizi yüklemek ve istediğimiz programları çalıştırmak için bazı aşamaları kendimiz gerçekleştirmemiz gerekmektedir (bir kaç küçük “trick”).
Tensorflow veya Keras ile uygulama geliştirirken en çok yararlandığımız araçlardan birisi TensorBoard’dur. TensorBoard sayesinde kara kutu gibi çalışan yapay sinir ağları içerisindeki hesaplama aşamalarının içerisine bir ışık tutmuş oluyoruz. Grafiksel ekranda accuracy, loss gibi değişkenlerin iterasyonlar boyunca değişimini canlı olarak web arayüzünden izleyerek programın istenildiği gibi davranıp davranmadığını gözlemleyebiliyoruz.
Colab’da TensorBoard çalıştırmam gerektiğinde bu işi oldukça kolaylaştıran bir script’e denk geldim.: colab_utils https://github.com/mixuala/colab_utils . Colab notebook’unu çalıştırdığınız makinada sizin için ngrok yazılımını yüklüyor. ngrok aracılığıyla da o makine local’inde çalışan tensorboard portuna tarayıcı üzerinden bağlanabileceğiniz güvenli bir URL:PORT sunuyor. Bunun dışında farklı bir kaç kolaylık sağlayan bu projeyi TensorBoard’u aktif etmek için gerekli minimal adımlar şu şekilde:
Notebook en üst kısımda aşağıdaki fonksiyonları daha sonra çağırmak üzere ekliyoruz:
import os import requests import shutil import subprocess import tensorflow as tf __all__ = [ 'install_ngrok', 'launch_tensorboard', ] def __shell__(cmd, split=True): # get_ipython().system_raw(cmd) result = get_ipython().getoutput(cmd, split=split) if result and not split: result = result.strip('\n') return result # tested OK def install_ngrok(bin_dir="/tmp"): """ download and install ngrok on local vm instance Args: bin_dir: full path for the target directory for the `ngrok` binary """ TARGET_DIR = bin_dir CWD = os.getcwd() is_grok_avail = os.path.isfile(os.path.join(TARGET_DIR,'ngrok')) if is_grok_avail: print("ngrok installed") else: import platform plat = platform.platform() # 'Linux-4.4.64+-x86_64-with-Ubuntu-17.10-artful' if 'x86_64' in plat: os.chdir('/tmp') print("calling wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip ..." ) get_ipython().system_raw( "wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip" ) print("calling unzip ngrok-stable-linux-amd64.zip ...") get_ipython().system_raw( "unzip ngrok-stable-linux-amd64.zip" ) os.rename("ngrok", "{}/ngrok".format(TARGET_DIR)) os.remove("ngrok-stable-linux-amd64.zip") is_grok_avail = os.path.isfile(os.path.join(TARGET_DIR,'ngrok')) os.chdir(TARGET_DIR) if is_grok_avail: print("ngrok installed. path={}".format(os.path.join(TARGET_DIR,'ngrok'))) else: # ValueError: ERROR: ngrok not found, path= raise ValueError( "ERROR: ngrok not found, path=".format(TARGET_DIR) ) else: raise NotImplementedError( "ERROR, ngrok install not configured for this platform, platform={}".format(plat)) os.chdir(CWD) return # tested OK def launch_tensorboard(bin_dir="/tmp", log_dir="/tmp", retval=False): install_ngrok(bin_dir) if not tf.gfile.Exists(log_dir): tf.gfile.MakeDirs(log_dir) # check status of tensorboard and ngrok ps = __shell__("ps -ax") is_tensorboard_running = len([f for f in ps if "tensorboard" in f ]) > 0 is_ngrok_running = len([f for f in ps if "ngrok" in f ]) > 0 print("status: tensorboard={}, ngrok={}".format(is_tensorboard_running, is_ngrok_running)) if not is_tensorboard_running: get_ipython().system_raw( 'tensorboard --logdir {} --host 0.0.0.0 --port 6006 &' .format(log_dir) ) is_tensorboard_running = True if not is_ngrok_running: get_ipython().system_raw('{}/ngrok http 6006 &'.format(bin_dir)) is_ngrok_running = True import time time.sleep(3) retval = requests.get('http://localhost:4040/api/tunnels') tensorboard_url = retval.json()['tunnels'][0]['public_url'].strip() print("tensorboard url=", tensorboard_url) if retval: return tensorboard_url
Bu aşamadan sonra TensorBoard için gerekli olan log diziniyle birlikte ngrok kurulumu için yukarıda yazdığımız launch_tensorboard fonksiyonunu çağırıyoruz:
# TensorFlow programının sonuçlarını kaydedeceği dizin ROOT = %pwd LOG_DIR = os.path.join(ROOT, 'log1') # gerekliyse ngrok kurulumunu yap, TensorBoard'a bağlan ve url'i ekrana yazdır launch_tensorboard( bin_dir=ROOT, log_dir=LOG_DIR )
Yukarıdaki işlemler hatasız bir şekilde gerçekleştiği taktirde
('tensorboard url=', u'http://13add4aa.ngrok.io')
Şeklinde bize bir bağlantı adresi verecektir. Program yürütüldüğü esnada bu bağlantı aracılığıyla tarayıcımızdan TensorBoard ortamını görüntüleyebileceğiz.
TensorBoard’ın Colab’da çalışması için gerekli kurulum ve konfigürasyon bu kadar. Bundan sonra kendi makinamızda çalışır gibi yukarda tanımladığımız LOG_DIR’i kullanabiliriz:
tensorboard = TensorBoard(log_dir=<strong>LOG_DIR</strong>, histogram_freq=0, write_graph=True, write_images=True)
CIFAR görüntülerinin sınıflandırılması örneği üzerinden bu aşamaların tamamına ait kodlar
https://github.com/irhallac/deep_learning_examples/blob/master/CIFAR_TENSORBOARD_COLAB.ipynb bağlantısında mevcuttur.
İbrahim R. HALLAÇ