Python derin/makine öğrenmesi alanında geliştirme yapanların %57‘si tarafından tercih edilen bir programlama dili olarak karşımıza çıkmaktadır. Buna elbette üssel artan yeni paketler, öğrenme kolaylığı vb. etkenler katkı sağlamaktadır. Programlama dili seçiminden sonra geliştirme ortamının oluşturulması ve geliştirme arayüzünün (IDE-Integrated Developmnent Envirment) kurulması gerekmetedir. Geliştirme ortamının oluşturulması hakkında NVIDIA-Docker Kullanımı isimli yazım da ayrıntılı bilgiye ulaşabilirsiniz. Özellikle de akademisyenler ve öğrenciler özellikle de sunum imkanlarını da değerlendirilerek geliştirme arayüzü olarak Jupyter tercih edilmektedir. NVIDIA-Docker Kullanımı isimli yazımda da görebileceğiniz gibi Docker konteynerini çalıştırdığımızda bizi tarayıcı üzerinden Jupyter Notebook sayfasına ulaşabiliyoruz. Ben de kişisel tercih olarak hem geliştirme hem de sunum maksatlı olarak Jupyter Notebook ile çalışıyorum ve oldukça da keyif alıyorum. Bu yazıda Docker/NVIDIA-Docker üzerinde koşacak Jupyter Notebook ile ilgili ayarlama (config) işlemlerini aktarmaya çalışacağım.

Ana Başlıklar

  1. Ayar Dosyasının Oluşturulması
  2. Şifre Oluşturulması
  3. Güvenlik, SSL Bağlantısı Oluşturulması

1. Ayar Dosyasının Oluşturulması

Terminal ekranından Docker görüntüsünü bash açılacak şekilde çalıştırmak için aşağıdaki komutu kullanıyoruz:

$ sudo nvidia-docker run -it  -p 8888:8888  -p 6006:6006 gcr.io/tensorflow/tensorflow:latest-gpu_changed bash
root@2fc479bed67f:/notebooks#

Konteyner içinde notebooks dizinin içindeyiz. Jupyter her çalıştırıldığında tüm ayarları üzerinde barındıran ~/.jupyter dizinin altında bulunan jupyter_notebook_config.py isimli bir dosyayı okur. Bu dosya mevcut değil ise ilk olarak terminal ekranından:

$ jupyter notebook --generate-config

komutu ile ayar dosyasını kolaylıkla oluşturabiliriz.

2. Şifre Oluşturulması

Jupyter Notebook‘a erişimi şifrelemek doğru bir tercih olacaktır. Bu işlem oldukça basittir. sha1 (Secure Hash Algorithm 1) ile şifrelenmiş bir şifrenin doğrulama kodunu jupyter_notebook_config.py dosyasının içeriğine eklememiz yeterli olacaktır. Bunun için ilk önce terminal ekranından ipython (etkileşimli olarak Python kodları yazıp çalıştırabildiğimiz bir program) çalıştırılır:

$ ipython

Daha sonra bize sha1 ile şifrelenmiş şifremizi oluşturalacak modülü import edip passwd() metodunu çağıracağız. Dilediğimiz şifreyi girip hücreyi çalıştırdığımızda çıktı olarak sha1 ile şifrelenmiş doğrulama kodunu elde etmiş olacağız. Doğrulama kodunu kopyalayıp ipython‘dan exit metodu ile çıkabiliriz.

In [1]: from IPython.lib import passwd

In [2]: passwd()
Enter password: 
Verify password:  
Out[2]: 'sha1:004ca25bc95e:13156f91c50e71b8e5fd6f7f3a92527dc735bdc2'

In [3]: exit

vi ile jupyter_notebook_config.py dosyasını düzenlemek için açıyoruz:

$ vi ~/.jupyter/jupyter_notebook_config.py

Ve aşağıdaki kodları bu dosyaya ekleyip kaydedip kapatıyoruz. Artık Jupyter Notebook her açılışta bir şifre ekranı bizi karşılayacak ve ipython üzerinden girdiğimiz şifre ile ürettiğimiz doğrulama kodunu kullanarak şifrenin doğru olması halinde Jupyter Notebook ulaşmak mümkün olacak.

c = get_config()  # Eğer daha önceden yoksa bu satır eklenecek.
c.NotebookApp.password = 'sha1:fc216:3a35a98ed980b9...'  #Doğrulama kodunu buraya ekleyeceğiz. 

Bundan sonra Jupyter Notebook her açıldığında bizi aşağıdaki gibi bir ekran karşılayacak.

Jupyter

3. Güvenlik, SSL Bağlantısı Oluşturulması

Bazen Jupyter Notebook ile farklı bilgisayarlardan erişerek çalışmamız gerekebilir. Ben şahsen evdeki bilgisayarımda çalışan NVIDIA-Docker konteynerine uzaktan bağlanmak suretiyle çalışma veya sunum esnasından ulaşarak Jupyter Notebook kullanıyorum. Şu ana kadar yaptığımız ayarlar şifre hariç bağlantının güvenliğine dair bir tedbir barındırmıyor. Bağlantı güvenliği sağlanmaz ise uzak bilgisardan yerel bilgisayara öntanımlı olarak HTTP üzerinden konuşmak mümkün olabilir. Bu noktada SSL ile şifrelenmiş bir bağlantı kullanarak HTTPS üzerinden konuşmak tercih edilmesi tavisye edilmektedir. Son bölümde güvenli bağlantı için gerekli ayarları uygulayacağız.

Öncelikle bağlantının güvenli olması (uçtan uca şifrelenecek olan paketler) için ssl sertifikası üretmemiz gerekiyor. Bunun için:

$ cd
$ mkdir ssl
$ cd ssl
$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout "cert.key" -out "cert.pem" -batch

komutlarını kullanarak sırasıyla ev dizinine gidip orada ssl isimli bir dizin oluşturuyoruz. Bu dizinin içerisinde iken openssl ile 365 gün süreli rsa:1024 ile şifrelenmiş bağlantımız için gerekli olan iki dosyayı (sertifika anahtarı ve sertifika) oluştuyoruz. Şimdi yine jupyter_notebook_config.py ayar dosyamızı düzenleyip aşağıdaki hale dönüştürüyoruz.

c = get_config()  # Eğer daha önceden yoksa bu satır eklenecek.
c.NotebookApp.certfile = u'~/ssl/cert.pem' # sertifika dosyasının yolu
c.NotebookApp.keyfile = u'~/ssl/cert.key' # sertifika anahtar dosyasının yolu
c.NotebookApp.password = 'sha1:fc216:3a35a98ed980b9...'  #Doğrulama kodunu buraya ekleyeceğiz. 

Artık geliştirmeye başlayabiliriz. İlk defa Jupyter sunucusuna bağlandığınızda aşağıdaki ekran ile karşılaşabilirsiniz. Bu sizin ürettiğiniz sertikanın tanınmamasından kaynaklanıyor. Eğer tarayıcınızdan istisna eklerseniz bir daha sizi bu ekran karşılamayacaktır.

Jupyter Bu arada tüm bu yaptıklarınızı çalışan konteynerdan çıktıktan sonra her seferinde çalışabilmesi için içe aktarmayı (commit) unutmayın. Aksi halde Docker görüntüsünü çalıştırdığınız zaman içe aktarılmamış değişikliklerin konteyner de geçerli olmayacaktır.

NOT: Jupyter sunucusunun çalıştığı ağa bağlanmak için bilgisayarınızda/modeminizde/yönlendiricinizde sabit IP, port yönlendirme vb. bir takım ayarlar yapmanız gerekebilir. Bunun için işletim sistemi/modem marka ve modeline uygun ayarlar için ilgili yönergeleri takip edebilirsiniz. Yine de bu konuda dahil bir sorunuz olursa bana ulaşabilirsiniz.