Mencoba Menggunakan VPS untuk Deep Learning

By | August 23, 2024
638 Views

VPS virtual private server bisa kita gunakan untuk menjalankan sebuah deep learning. Walapun hal ini tidak direkomendasikan mengingat ketersediaan GPU nya tidak ada. Tapi mari kita coba saja, saya telah menggunakan VPS untuk iseng2 melakukan training walaupun banyak sekali kendala karena RAM nya selalu habis. Sehingga dikurangi dataset nya sebagai solusi awal.

Untuk VPS yang saya gunakan dengan spek sebagai berikut

(base) root@upbeat-turing:~# screenfetch
                          ./+o+-       root@upbeat-turing.202-10-41-225.plesk.page
                  yyyyy- -yyyyyy+      OS: Ubuntu 22.04 jammy
               ://+//////-yyyyyyo      Kernel: x86_64 Linux 5.15.0-46-generic
           .++ .:/++++++/-.+sss/`      Uptime: 4h 54m
         .:++o:  /++++++++/:--:/-      Packages: 1162
        o:+o+:++.`..```.-/oo+++++/     Shell: bash 5.1.16
       .:+o:+o/.          `+sssoo+/    Disk: 33G / 158G (22%)
  .++/+:+oo+o:`             /sssooo.   CPU: Intel Xeon E5-2680 v3 @ 4x 2.5GHz
 /+++//+:`oo+o               /::--:.   GPU: Cirrus Logic GD 5446
 \+/+o+++`o++o               ++////.   RAM: 7770MiB / 7949MiB
  .++.o+++oo+:`             /dddhhh.
       .+.o+oo:.          `oddhhhh+
        \+.++o+o``-````.:ohdhhhhh+
         `:o+++ `ohhhhhhhhyo++os:
           .o:`.syhhhhhhh/.oo++o`
               /osyyyyyyo++ooo+++/
                   ````` +oo+++o\:
                          `oo++.

berdasarkan cpuinfo sebagai berikut

Python Version: 3.11.5.final.0 (64 bit)
Cpuinfo Version: 8.0.0
Vendor ID Raw: GenuineIntel
Hardware Raw:
Brand Raw: Intel(R) Xeon(R) CPU E5-2680 v3 @ 2.50GHz
Hz Advertised Friendly: 2.5000 GHz
Hz Actual Friendly: 2.5000 GHz
Hz Advertised: (2500000000, 0)
Hz Actual: (2499996000, 0)
Arch: X86_64
Bits: 64
Count: 4
Arch String Raw: x86_64
L1 Data Cache Size: 64 KiB (2 instances)
L1 Instruction Cache Size: 64 KiB (2 instances)
L2 Cache Size: 512 KiB (2 instances)
L2 Cache Line Size: 256
L2 Cache Associativity: 6
L3 Cache Size: 31457280
Stepping: 2
Model: 63
Family: 6
Processor Type:

tentu langkah awal yang saya lakukan setelah login via ssh yaitu

  1. menambah kapasitas SWAP
  2. nambah user buat akses FTP
  3. nambah session timeout login SSH

kemudian langkah selanjutnya adalah install anaconda3 via CLI dengan mengikuti langkah sesuai link https://docs.anaconda.com/anaconda/install/linux/yaitu

install package pendahuluan sebagai kebutuhan awal

apt-get install libgl1-mesa-glx libegl1-mesa libxrandr2 libxrandr2 libxss1 libxcursor1 libxcomposite1 libasound2 libxi6 libxtst6

kemudian menggunakan wget untuk download anaconda nya

curl -O https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.sh

kemudian menggunakan bash untuk lakukan install, pada langkah dibawah ini saya letakan *.sh nya di folder /home/bejo

bash /home/bejo/Anaconda3-2023.09-0-Linux-x86_64.sh

nanti biasanya akan terinstall secara default di /root/Anaconda3. Kemudian kita akan buat virtual environment nya

source /root/anaconda3/bin/activate
conda init

biar nanti python yang digunakan menggunakan anaconda secara otomatis, kita panggil script berikut

conda config --set auto_activate_base True

karena linux/ubuntu secara bawaan sudah mempunyai python3

Setting time Out SSH

Contents

See also  Model Bahasa LLaMA (Large Language Model Meta AI)

Ketikan perintah berikut

nano /etc/ssh/sshd_config

Cari baris perintah berikut

#ssh timeout 
ClientAliveInterval 120 
ClientAliveCountMax 720

Kalau sudah, restart

service sshd restart
Penjelasan pada tambahan baris itu ialah
– Pada baris pertama ialah agar server mengirimkan

null packets

ke clients (dalam hal ini software PuTTy) setiap 120 detik (2 menit), dan
– Pada baris kedua ialah agar server menutup koneksi SSH client yang inactive untuk interval ke 720 (720*120 = 86400 seconds = 24 hours)

 

ref: https://kb.kencengsolusindo.co.id/article/cara-menambahkan-ssh-connection-timeout/

 

Upload file via FTP

Saya sengaja tidak menggunakan plesk atau control cpanel karena boros memory sehingga saya lebih suka menggunakan FTP sebagai sarana untuk upload. Untuk FTP bisa menggunakan Filezilla karena lebih bagus dari coreftp/cyberduck. Cara install FTP https://kb.biznetgio.com/id_ID/instalasi/cara-install-ftp-server-di-ubuntu,-centos,-debian-9

https://www.rumahweb.com/journal/cara-membuat-ftp-server-di-vps-ubuntu/

Cara setting VPS

Install FTP Server di VPS

Langkah pertama, Anda perlu memperbarui repositori menjadi latest package dan dilanjutkan dengan install ftp server menggunakan perintah dibawah:

$ sudo apt update

$ sudo apt install vsftpd

Konfigurasi Firewall FTP Server

Pada langkah kedua, silahkan sesuaikan konfigurasi firewall untuk mengijinkan proses koneksi dan transfer data pada protokol tcp dengan port 20 dan 21 menggunakan perintah dibawah:

$ sudo ufw allow 20:21/tcp

$ sudo ufw status

Status: active 20:21/tcp ALLOW Anywhere

*Note:

Port 20 adalah FTP data transfer,
Port 21 adalah FTP C2 (command and control) .

Setelah konfigurasi firewall diatas selesai, langkah selanjutnya yaitu konfigurasi vsftpd

Konfigurasi VSFPTD FTP Server

Pada langkah ketiga, Anda harus memperhatikan setiap rules yang akan digunakan pada settingan vsftpd dengan cermat, agar dapat digunakan dengan baik.

Berikut daftar rules yang akan diaktifkan:

  • Akses FTP:
    anonymous_enable=NO
    local_enable=YES
    local_umask=022
  • File Uploads:
    write_enable=YES
  • Chroot Jail:
    chroot_local_user=YES
    allow_writeable_chroot=YES

Silahkan langsung lakukan penyetingan vsftpd dengan perintah dibawah:

$ sudo nano /etc/vsftpd.conf

Pada file konfig vsftpd, apabila tidak menemukan rules sesuai daftar diatas, maka Anda perlu menambahkannya secara manual dan pastikan simbol # dihapus agar rules dapat aktif.

Restart vsftpd untuk mengaktifkan konfigurasi:

$ sudo systemctl enable vsftpd

$ sudo systemctl restart vsftpd

$ sudo systemctl status vsftpd

Menggunakan Service

Setelah kalian upload file yang diperlukan dan install package deep learning menggunakan pip via terminal – ssh. Langkah selanjutnya kalian bisa langsung

  1. menggunakan python untuk memanggil script.py nya
  2. atau menggunakan service
See also  Tools Label Annotasi Terbaik

Untuk pilihan no 1 tidak saya gunakan karena ssh nya akan terputus secara otomatis walaupun masih running, sudah pernah saya coba naikan batas limit session nya agar tidak otomatis terputus namun tetap saja off. Kalian bisa baca how to increase SSH connection time out https://www.tecmint.com/increase-ssh-connection-timeout/

sehingga solusi point 2 yang kita akan gunakan, bisa kalian gunakan tutorial https://medium.com/codex/setup-a-python-script-as-a-service-through-systemctl-systemd-f0cc55a42267

langkah yang kita gunakan yaitu  install systemd

apt-get install -y systemd

misalkan kita berikan nama test.service

nano /etc/systemd/system/test.service

saya isi dengan kode berikut

[Unit]
Description=My test service
After=multi-user.target
[Service]
Type=simple
Restart=always
ExecStart= /root/anaconda3/bin/python "/home/bejo/Model Stardist/train.py"
[Install]
WantedBy=multi-user.target

jangan lupa save ya

lalu kita ketikan perintah berikut

systemctl daemon-reload
systemctl enable test.service

bila sudah Ok semua, kita jalankan service nya

systemctl start test.service

sedangkan untuk perintah yang lainnya bisa kalian gunakan yaitu

systemctl stop name_of_your_service
systemctl restart name_of_your_service

 

Cek status service

Untuk mengecek status service cukup mudah kok

systemctl status test.service

hasilnya service tersebut dimulai dari time 05:58:08.

(base) root@upbeat-turing:~# systemctl status test.service
● test.service - My test service
     Loaded: loaded (/etc/systemd/system/test.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2024-07-17 05:58:08 WIB; 4h 15min ago
   Main PID: 1454 (pt_main_thread)
      Tasks: 13 (limit: 9405)
     Memory: 7.4G
        CPU: 2h 22min 13.006s
     CGroup: /system.slice/test.service
             └─1454 /root/anaconda3/bin/python "/home/bejo/Model Stardist/train.py"

Jul 17 05:58:08 upbeat-turing.202-10-41-225.plesk.page systemd[1]: Started My test service.
Jul 17 06:06:01 upbeat-turing.202-10-41-225.plesk.page python[1454]: cpu
Jul 17 06:06:01 upbeat-turing.202-10-41-225.plesk.page python[1454]: /home/bejo/Model Stardist/dataset/raw/C1.jpg
Jul 17 06:06:01 upbeat-turing.202-10-41-225.plesk.page python[1454]: 3
Jul 17 06:06:01 upbeat-turing.202-10-41-225.plesk.page python[1454]: cpu

itu sudah berjalan 4 jam 15 menit. Kalian bisa cek no PID nya yaitu 1454 Kita panggil perintah top pada terminal akan nampak sedang proses berjalan

karena merupakan service tentu akan jalan terus menerus walaupun koneksi SSh kita terputus!

Sehingga kalian harus bisa melakukan saving checkpoint tiap epoch. Saya biasanya menggunakan 2 algoritma yaitu

  • akan simpan epoch current dan
  • epoch yang terbaik dari sisi nilai loss nya

Nah biasanya akan saya cek via FTP saja untuk melihat progress nya

kalian bisa melihat ada 2 model yaitu model.pt dan model_current.pt yaitu

  1. model.pt untuk menyimpan the best model berdasarkan loss terkecil
  2. model_current.pt untuk menyimpan model saat ini

Kondisi Ideal

Seperti yang sudah pernah saya jelaskan diatas VPS berbasis CPU saja tidak akan cocok untuk training deep learning karena akan memakan waktu yang lama. Tapi tutorial ini hanya mencoba menggunakan VPS apakah bisa buat training atau tidak dan tentu VPS seperti ini sangat murah harganya! alias sama saja kalian menggunakan PC desktop dirumah hanya saja ini versi online.

See also  Akhirnya Torch versi R telah tersedia - Framework Machine Learning

Tapi bila kalian punya PC Desktop yang mumpuni dan ingin bisa diakses online via TCP SSH kalian bisa langganan ngrok. Membuat Server dirumah untuk diakses Secara Online

SWAP

Apa yang terjadi ketika loading dataset melebihi kapasitas RAM! tentu memory akan di SWAP kan tapi ini rawan sekali restart service nya sehingga percuma dibuat service karena script yang kita jalankan akan restart terus menerus yang ditandai dengan time start service nya. Berikut cara membuat swap file, misalkan dengan ukuran 1GB, kalian pastikan sedang di root directory dengan nama swapfile

sudo fallocate -l 1G /swapfile

kemudian kita ubah permission nya

sudo chmod 600 /swapfile

kemudian kita tandai swapfile diatas sebagai swap

sudo mkswap /swapfile

Lanjut dengan perintah berikut

sudo swapon /swapfile

 

Kalian bisa cek dengan mengetikan perintah berikut

 

sudo swapon --show

Agar perubahan tersebut bersifat permanent, kalian bisa mengetikan perintah berikut

sudo cp /etc/fstab /etc/fstab.bak

pengaturan lebih lanjut bisa kalian pelajari di https://www.digitalocean.com/community/tutorials/how-to-add-swap-space-on-ubuntu-20-04

https://kb.biznetgio.com/id_ID/neo-virtual-compute/konfigurasi-swap-memory-pada-ubuntu

Sedangkan untuk delete swapfile bila tidak diperlukan lagi atau mau nambah, bisa menggunakan perintah berikut

sudo swapoff -a -v
sudo rm /swapfile
#back up /etc/fstab:
sudo cp /etc/fstab /etc/fstab.bak
sudo sed -i '/\/swapfile/d' /etc/fstab

Lebih jelasnya bisa baca https://askubuntu.com/questions/969296/how-to-delete-a-swap-file-in-ubuntu

 

Menggunakan Jupyterlab

Selain menggunakan service diatas, bisa kok pakai jupyterlab yang dibuat service server. Caranya cukup mudah. Kita buat script *.sh dulu saja saya simpan di /home/bejo/script.sh dengan isi sebagai berikut

/root/anaconda3/bin/jupyter notebook --ip='*' --port=8080 --no-browser --NotebookApp.token='111222' --allow-root

argument –NotebookApp.token=’111222′ bebas kalian menggunakan isinya, karena untuk akses token

kemudian seperti biasa, kita akan menggunakan service untuk memanggil script diatas dengan membuat test4.service

dengan mengetikan kode berikut

nano /etc/systemd/system/test4.service

 

dengan isi sebagai berikut

[Unit]
Description=coba notebook
After=multi-user.target
[Service]
Type=simple
WorkingDirectory=/home/bejo
ExecStart=/bin/bash /home/bejo/script.sh
[Install]
WantedBy=multi-user.target

 

jangan lupa simpan dan panggil

systemctl daemon-reload

dan seterusnya

jangan lupa kalau sudah cek status servicenya, kalian bisa panggil kok no ip:port nya untuk kasus diatas saya menggunakan port 8080

 

dan ketika close pun browser akan senantiasa running terus menerus jadi nggak usah kuatir kalau tiba2 close session!