Colab’da TensorBoard Çalıştırma (colab_utils)

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Ç