Transcript for:
Model Deployment Machine Learning dengan API

Mungkin teman-teman masih bingung, setelah teman-teman berhasil membuat model dengan akurasi yang bagus, apa yang harus dilakukan selanjutnya? Kalau misalnya teman-teman berhenti sampai situ, maka model yang teman-teman buat hanya bisa dibuka oleh kita sendiri. Padahal, bisa jadi model yang kita buat itu berimpak baik kepada orang-orang di sekitar kita. Nah, di video kali ini kita akan membahas bagaimana caranya kita membuat model machine learning mulai dari development, sampai deployment hingga menjadi API sehingga model kita bisa diakses oleh orang lain. Nah sebelum gue mulai tutorialnya, gue mau mengucapkan terima kasih dulu nih kepada ID Cloud Host yang udah mensponsori video ini. Dan di video kali ini, kita akan mendeploy model yang kita buat di ID Cloud Host. Yuk kita bahas. Nah sekarang apa sih yang akan kita lakukan atau yang kita siapkan dalam model deployment ini? Tentunya hal yang pertama adalah kita lakukan modeling. Modeling ini mencakup semua step yang harus dilakukan ketika kita melakukan pemodelan. Mulai dari kita melakukan data cleansing, terus kita melakukan fitur engineering. Terus kita melakukan normalisasi, preprocessing, sampai modeling. Dan yang terakhir kita melakukan evaluasi. Beberapa langkah ini sudah sempat gue bikin videonya. Silahkan cek di channel Modding Python mengenai langkah apa saja yang kita lakukan saat melakukan modeling. Nah biasanya ketika kita baru belajar data science atau machine learning. Ini stop sampai sini. Padahal ini baru langkah pertama. Dan saat kita selesai melakukan ini, model kita masih belum bisa digunakan oleh orang banyak. Nah, oleh karena itu kita akan masuk ke fase deployment. Nah, apa yang harus disiapkan ketika kita melakukan deployment? Dari sini kita diharapkan mendapatkan sebuah... Binary modelnya. Dengan perkataan lain, kita coba simpan modelnya. Sehingga kita bisa load modelnya ini saat kita melakukan deployment. Jadi fokus di deployment ini, kita load modelnya. Habis itu kita lakukan serving. Serving ini bisa dengan apa saja. Misalkan jadi report. Boleh ya, batch scoring dan lain sebagainya. Bisa juga jadi API, bisa. Atau bisa jadi satu aplikasi stand alone, bisa juga. Nah, dalam video ini kita akan fokus melakukan serving yang berupa API. Oke, kita langsung mulai coding aja. Nah, sebelum kita mulai pastikan kita memiliki library-library yang kita butuhkan. Di sini gue coba cek. library-library numpy, pandas, dan scikit-learn. Di sini saya sudah punya semua, jadi kita bisa langsung masuk ke tahap pertama, yaitu proses pembuatan modelnya. Di sini kita akan menggunakan model yang sederhana, yaitu model iris. Kita langsung mulai load datanya. Sambil kita load datanya, teman-teman perlu perhatikan bahwa ini mungkin adalah kasus yang sederhana. Karena kita tahu bahwa data iris itu adalah data yang paling sederhana di dalam machine learning. Tapi jangan dilihat sederhananya, fokus kepada konsep yang kita pelajari. Kenapa? Karena ketika kita punya basic yang kuat, fondasi yang kuat, itu membantu kita untuk men-solve sesuatu yang nantinya lebih kompleks, yang lebih variatif lagi. Seperti kata philosopher Kurt Lewin, There is no more practical. Dan a good theory. Jadi nggak ada yang salah ketika kita mempelajari suatu teori atau suatu hal yang basic. Namun kadang-kadang kita pengen buru-buru sehingga kita tidak menikmati proses pembelajaran itu. Skip. Kita lanjut lagi ya. Oke, ketika kita nge-load data iris seperti ini. Mungkin kita coba ekstrak dulu ya. Iris data dan iris targetnya. Nah, ini tipe datanya adalah tipe data numpy array. Kita coba lihat dulu type-nya. Dia itu adalah tipe data 6.4.3. Di dalam mode deployment, kita harus tahu dulu input datanya ketika kita melakukan training model itu tipenya apa. Biasanya, tipe data yang masuk ke dalam model training dengan menggunakan scikit-learn. Itu kalau nggak nampai array, pandas data frame. Nah, hal ini penting untuk kita ketahui. Kenapa? Karena kalau model ini ditrain dari data nampai, maka secara default model ini harus menerima data dengan tipe data nampai untuk di-fit ke dia. Jadi nanti saat kita melakukan model deployment, kita harus pastikan yang masuk ke dalam situ harus... 6PyArray. Begitu juga kalau misalnya Pandas, Pandas DataFrame. Ini kalau misalnya kita gunakan Pandas DataFrame untuk ngetrain model tersebut, maka saat model deployment atau saat ngeload modelnya, kita harus pastikan bahwa yang masuk ke situ harus Pandas DataFrame. Nah, untuk Circuit Learn versi baru, ini memang kita bisa ngetrain dengan menggunakan Pandas DataFrame, tapi nanti masukinnya 6PyArray atau kebalikannya. Ditrain dengan data numpy array, nanti bisa dimasukin data pandas data frame. Tapi tetap tidak disarankan. Kenapa? Karena pandas data frame itu punya nama kolom. Sedangkan kalau numpy array, itu kolomnya direpresentasikan dengan indeks. Kolom ke 0, kolom ke 1, kolom ke 2, kolom ke 3, dan seterusnya. Jadi kita harus tahu nih, data apa yang kita gunakan untuk training. Apakah... Bertipe data numpy array atau bertipe data pandas data frame. Tenang aja, disini kita akan coba contohkan untuk kedua tipe data tersebut. Disini kita coba kasih keterangan aja ya. Disini tipe data numpy array. Nah disini kita print aja contoh 5 data teratas dan label teratas ya. Dengan jumlah 5 juga. Oke? Datanya bentuknya seperti ini ya Jelas-jelas dia ini adalah berbentuk seperti list Tapi sebenarnya adalah dia nampai array Nah sekarang kita juga siapkan juga data dengan tipe data pandas data frame Nah tentunya kita perlu pandas dulu Oke kita scroll dulu ke bawah ya Nah disini kita akan coba bikin data frame PD data frame. Lalu kita coba masukkan data irisnya. Dengan nama kolomnya adalah iris.featurenames. Ini adalah data yang disimpan di scikit-learn. Yang mana dia punya salah satu entity-nya featurenames. Ini adalah nama kolom atau keterangan fitur dari si datanya. Terus di sini kita juga tambahkan satu kolom lagi yaitu kolom target. Yang mana ini adalah si iris target. Oke kita coba lihat datanya sekarang. Nah ini ya beda bentuk datanya. Tapi kalau misalnya kita lihat datanya sama. Kita lihat ya di baris pertama dan seterusnya. Dan di sini. Dengan menggunakan pandas data frame kita bisa menggabungkan antara si datanya dengan si labelnya. Oke sekarang kita akan masuk ke part modelingnya. Sebenarnya data ini sudah bisa langsung dimasukkan ke dalam model machine learning. Karena sudah memenuhi syarat. Apa syaratnya? Yang pertama tidak ada nulnya. Sudah. Yang kedua bentuknya adalah matrix. Apa arti matrix? Semuanya berupa angka. Sudah juga. Berarti harusnya sudah bisa masuk dong. Tapi. Di sini kita ingin ada sedikit enhancement. Sebelum kita masukkan datanya ke dalam machine learning, kita mau scaling dulu. Baru kita masukkan ke dalam model. Model yang kita akan gunakan adalah SVM. Sebenarnya apapun modelnya terserah, ini hanya contoh saja. Kenapa harus di scaling dulu? Sebenarnya ini juga contoh. Karena kita tahu bahwa ketika kita melakukan... pemodelan dengan data real world atau data-data yang di kegel gitu misalkan kita pasti melakukan preprocessing jadi ya ini jadi contoh saja Kalau misalnya kita punya metode-metode seperti ini, preprocessing seperti ini, yang mana kalau kita scaling itu kan pakai dot fit juga ya. Dot fit, gitu ya. Pokoknya segala sesuatu yang pakai dot fit ya, imputasi kek, normalisasi kek, atau bahkan misalkan dimensionality reduction kan pakai fit semua kan. Ini kita bisa gabungkan dengan modelnya. Dengan menggunakan apa? Dengan menggunakan... Sesuatu yang disebut dengan pipeline. Jadi nanti hasil akhirnya adalah si data ini dimasukkan ke dalam pipeline. Yang mana isi dari pipeline-nya adalah scaling dan modeling. Teman-teman bisa masukin apapun di dalam pipeline-nya. Ada scaling-nya atau mungkin sebelum scaling ada misalkan imputasinya gitu ya. Oke. Sekarang kita akan mulai bikin pipeline-nya. Dan karena kita punya dua tipe data, jadi kita akan membuat dua pipeline. Pipeline untuk 6Pi dan pipeline untuk Pandas. Nah untuk membuat pipeline-nya di sini gue akan menggunakan cara yang menurut gue gampang. Yaitu dengan menggunakan make pipeline. From sklearn.pipeline import make pipeline. Oke, sekarang kita import scalernya dan juga kita import modelnya. From sklearn.preprocessing import standard scaler. From sklearn.svm import linear svc. Oke, kita bikin dulu aja pipeline-nya. Ini untuk yang 6 pi array. pipe 6pi make pipeline nah disini kita tinggal masukin saja standard scalar kita menggunakan default argument aja ya tapi kalau misalnya teman-teman pengen tambahkan hyper parameter di dalamnya bebas oke terus disini juga linear SVC kita pakai yang default argument kita lakukan hal yang sama untuk pandas Pipeline. Isinya sama, cuma yang dibedakan hanya variable saja. Oke, pipeline sudah terbuat. Selanjutnya saatnya kita melakukan training model. Nah, untuk melakukan training model, kita perlu ngesplit datasetnya, jadi data training dan data testing dong. Supaya apa? Supaya modelnya jadi lebih objektif. Buat yang bingung kenapa harus kita ngesplit data training dan data testing, Bisa nonton video mengenai evaluasi model yang ada di atas. Oke, sekarang kita akan coba import dulu ya. From sklearn.modelselection import train test split. Selanjutnya kita juga import si metriknya. Nah, karena kita menggunakan klasifikasi, kita akan menggunakan classification report untuk metrik kita. Oke, pertama kita split dulu datasetnya. Karena ada 2 dataset, maka kita akan ngesplit 2 kali. Yang satu split untuk nampai array, yang satu split untuk pandas data frame. Oke, kita mulai dari yang nampai dulu. X train, X test, Y train, Y test, sama dengan train test split. Dalamnya adalah X, Y. Di sini kita masukkan. Test size-nya 20% dengan random state-nya adalah 46. Jadi kita pakai 20% porsi datanya untuk data testing dan sisanya adalah data training. Oke, sekarang untuk yang pandas. Untuk yang pandas mungkin ada sedikit berbeda ya. DFTrain, DFTest, tapi sebenarnya sama saja. Train test split, di sini kita masukin DF, test size yang sama. Dan random state yang sama. Loh kenapa yang 6P ini kok returnnya 4? Nilai, sedangkan ini cuma 2 nilai. Karena yang di numpy array itu antara data dan targetnya itu dipisah. X dan Y. Sedangkan yang di pandas, ini data dan targetnya digabungkan di dalam data frame ini. Jadi makanya yang keluar cuma 2. Kita jalanin ya. Oke, datanya sudah ter-split. Oke, sekarang kita masuk ke bagian training. Ini yang bagian atas belum training ya, ini masih splitting aja. Oke, berarti untuk trainingnya di sini ya. Nah, trainingnya juga dua kali. Yang satu untuk data numpy, yang satu untuk pandas. Kita training untuk yang numpy dulu. Untuk training gampang ya. Berarti kita tinggal lakukan pipe numpy.fit cxtrain dan ytrain. Nah, teman-teman bisa lihat di sini. Yang kita panggil di sini adalah pipeline-nya. Jadi secara otomatis ketika kita melakukan fit datanya ke dalam pipeline, dia akan melakukan dua hal ini, yaitu scaling dan juga modelnya sekaligus. Jadi kita nggak perlu nge-fit standard scaler dulu, nanti hasil fitnya baru di-fit lagi ke SVM, nggak perlu. Cukup satu kali aja. Kalau kita melakukan model deployment, ini akan sangat membantu karena kita hanya perlu ngedam satu file saja, yaitu si file pipeline-nya saja. Tidak perlu... Ngedam standar scalar dan SVC secara terpisah. Begitu. Nah sekarang kita langsung evaluasi ya. YPRED sama dengan pipe 6 pi.predict CXTest. Nah nanti kita tinggal print. Ini adalah hasil model 6. Sampai hasil evaluasi ya. Oke. Print. Classification report. Di dalamnya adalah y test. Dan y thread. Oke. Sekarang kita coba jalankan dulu ya. Default value of dual will change from true to auto. Ini ada warning untuk si. scikit-learn versi yang gue pakai sekarang jadi supaya ini hilang kita coba tambahkan parameter dual ya di sini kita bikin dual sama dengan auto di sini juga sama Oke jalanin lalu kita coba train lagi nah warningnya hilang sebenarnya enggak pakai dual auto juga apa sih tapi karena ada warning biar gak risih gitu ya kita hilangin Nah sekarang kita akan coba training untuk data yang pakai pandas data frame. Ini kita tulis di bawahnya ya, pandas df. Nah kita tahu bahwa data yang ada di pandas df ini, antara data dan targetnya berada dalam satu variable. Nah berarti kita harus pisah dulu nih. Jadi di sini kita bikin x train df dan y train df. Nah untuk yang X train DF ini adalah semua yang ada di DF train. Lalu kita drop si kolom target. X is sama dengan 1 karena kita pengen ngedrop kolomnya. Selanjutnya untuk yang Y train DF ini adalah DF train si target. Nah sekarang kita coba pisahkan juga untuk yang data test. Oke, setelah terpisah, kita coba copy yang ada di sini. Kita ganti di sini dengan pipe pandas. Di sini kita tambahkan df. Ini juga kita tambahkan df. Di sini kita juga tambahkan df. Ini boleh deh, tambahkan df untuk membedakannya. Df. Di sini juga kita tambahkan df pandas. Dan jangan lupa yang di sini kita ganti pipe pandas untuk prediknya. Kita jalankan. Oke, kalau kita lihat di sini modelnya mendapatkan hasil evaluasi yang sama persis baik itu pandas maupun numpy. Tidak mengherankan karena memang pertama splitnya itu. Sama persis ya karena menggunakan random state yang sama. Dan yang kedua ini datanya juga sedikit. Jadi modelnya bisa lebih konsisten. Mungkin kalau datanya lebih banyak lagi ada kemungkinan modelnya akan menghasilkan hal yang berbeda. Oke setelah training selesai dan kita sudah lihat evaluasinya. Kita save modelnya. Save model. Kita akan menggunakan pickle. Kalau teman-teman prefer menggunakan joblib silahkan. Yang jelas apapun metodenya. Kita harus membuat si model ini menjadi sebuah binary file yang bisa kita load saat kita melakukan model deployment. Di sini kita coba save yang numpy. With open, kita bikin nama filenya misalkan model numpy.pkl. Di sini metodenya pastikan wb atau write binary as model file. Lalu selanjutnya pickle dump. Model yang ingin kita simpan adalah pipe numpy disimpan ke dalam model file. Kita coba dulu ya. Oke, di sini kita sudah berhasil menyimpan model numpy. Dan ini kalau misalnya kita buka directory kita, kita bisa lihat bahwa di sini ada model numpy pkl. Ini adalah binary file dari model kita yang sudah kita train tadi. Nah, sekarang kita coba. jalankan atau simpan yang pandas version. Kita ganti jadi pandas. Ini kita ganti jadi pandas. Kita jalankan. Oke, kita coba balik lagi ke home. Refresh. Nah, model pandas.pkl. Kita lihat di sini yang model pandas ini memang lebih besar sedikit dibandingkan yang model 6.4. Oke, sekarang kita masuk ke load. Ini adalah bridging yang penting di antara model development ke model deployment. Oke, nah sekarang kita akan coba yang numpy dulu nih. Kita copy aja ya. Nah, di sini kita ubah sedikit. Yang pertama adalah modenya adalah RB. Ingat, saat kita membaca modelnya, jangan salah modenya. Kalau kita nggak sengaja mengubah ini jadi WB, maka model numpy ini akan otomatis ter... override dan hilang. Karena apa? Karena di sini kita pengen nge-load di sini, bukan pengen nge-dump. Nah, karena di sini WB, terus tiba-tiba di sini error, otomatis modelnya hilang. Jadi, hati-hati sekali ketika kita membaca, pastikan ini RB atau read binary. Silahkan disesuaikan kalau teman-teman menggunakan joblib. Nah, di sini kita tinggal pikel load, di sini kita tinggal masukin model file saja. Ini kita masukin ke dalam variable misalnya loaded numpy model. Nah model numpy sudah terload. Sekarang gimana cara kita makainya? Nah yang perlu kita ingat model ini dimasukin berapa fitur nih supaya bisa menghasilkan prediksi. Data iris itu punya 4 fitur ya. Ini kalau kita lihat disini ada 4 kolom. Berarti kita harus memasukkan 4 fitur ke dalam. Model ini, kalau modelnya ingin menghasilkan prediksi. Nah, untuk menampilkan model, kita harus pastikan posisi fiturnya itu benar. Jadi, kalau misalnya di posisi pertama, ini adalah sepal length. Posisi kedua, sepal width. Dilanjutkan petal length, lalu petal width. Tidak boleh ketukar. Kalau ketukar, pasti artinya beda. Dan bisa jadi nanti hasil prediksinya bisa salah. Misalkan, kita punya new data. New datanya adalah misalkan 1, 1, 1, 1. Sepal lengthnya 1, sepal widthnya 1, petal lengthnya 1, dan petal widthnya 1 cm. Oke, sekarang kita akan coba predict modelnya. Dengan menggunakan loaded numpy model.predict. Nah, untuk predictnya ini kita masukin apa? Coba kita masukin new data ini ya. Kalau new data ini kita masukkan ke sini, maka hasilnya adalah error seperti ini. Kenapa? Karena model machine learning itu ekspektasinya adalah dia dimasukkan data... Majemuk atau data lebih dari 1. Sedangkan kalau kita lihat di sini, data kita itu cuma ada 1 vektor saja. Nah, jadi vektor ini kalau mau dibikin majemuk, walaupun datanya cuma 1, maka kita perlu tambahkan tanda list seperti ini. Jadi misalnya kita punya vektor nih, 1, 1, 1, 1. Nah, ketika kita menambahkan... Kurung seperti ini Maka ini artinya bukan vektor lagi Ini udah berupa matrix Matrix dengan Satu baris dan Empat kolom Jadi walaupun kita nge-predict Cuma satu data saja Harus dimasukkan dalam bentuk matrix Jadi ini kita tambahkan Kurungnya disini boleh Atau kalau mau ditambahkan disini juga boleh Biasanya ada yang nambahin di sini juga nih. Ini juga boleh. Sama saja. Ya tapi supaya lebih enak kita taruhnya di sini aja ya. Hasilnya adalah array 1. Nah 1 ini apa? Nah kita sebagai seorang data scientist harus tahu nih. Maksudnya label 1 itu apa? Maksudnya label 0 apa? Maksudnya label 2 itu apa? Di dalam data iris kita bisa lihat keterangan dari labelnya dari iris. Target names. Setosa, versi color, dan virginica. Berarti kalau 1, yaitu yang ada di indeks ke 1, yaitu versi color. Lo kenapa nggak setosa? Karena Python mulai menghitung dari 0. Berarti si setosa ini adalah 0, versi color itu 1, dan virginica itu 2. Karena dia 1, maka ini adalah label yang diprediksi untuk data ini. Itu untuk yang... Nampai. Nah sekarang gimana kalau yang pandas? Oke kita coba tinggal copy aja ya. Copy lalu kita ganti nampainya dengan pandas. Model pandas sudah terload. Sekarang gimana cara kita nge-predictnya? Sekarang kita coba predict dengan cara yang sama ya. Apa yang terjadi dari sini? Kita ganti jadi ini loaded pandas. Nah, dia akan menghasilkan hasil memang, cuman di sini dia ada warning. Kita coba baca warningnya apa. X does not have valid feature names. Karena model kita di training dengan menggunakan pandas data frame. Yang mana pandas data frame, seperti yang kita tahu di atas, dia punya kolom nama fiturnya. Sedangkan data X yang ada di sini tidak punya nama fitur di dalamnya. Kalau kita menggunakan. bahkan scikit-learn yang versi lebih lama dari ini, dia akan menghasilkan error. Tapi bukan berarti hasil ini tuh pasti benar, belum tentu. Karena dia butuh data yang punya valid feature name sebenarnya, yang ada di dalam sini. Jadi, kalau kita menggunakan pandas data frame untuk ngetrain modelnya, maka untuk prediknya, kita juga butuh mengubahnya menjadi pandas data frame. Supaya modelnya bisa... Menghasilkan prediksi sesuai dengan apa yang kita inginkan. Nah, jadi gimana dari sini? Yaudah, kita ubah saja ke dalam pandas data frame. Oke, new data sama dengan pd.data frame. Ya, si new data itu sendiri. Nah, columns-nya kita memang harus menyimpan nama kolom dari si datanya. Jadi jangan lupa kalau kita ngetrain model. Pastikan kita mengingat si kolom names-nya. Tapi di sini kita tinggal pakai iris feature names. Oke. Sekarang kita coba jalankan. Nah sekarang dia sudah tidak keluar warning lagi. Yang artinya. Kita sudah nge-predict modelnya sesuai dengan data yang diminta oleh si modelnya. Nah, mungkin kita coba lihat hasil new datanya ya. Biar enak gitu ya. Nah ini, datanya bentuknya seperti ini. Dan harus seperti ini. Jadi nanti di dalam scriptnya, pastikan ketika dia mendapatkan data baru, harus diubah dulu ke dalam data frame sebelum di-predict ke model yang dilatih dengan tipe data pandas. Ini kita sudah selesai bagian development modelnya. Sekarang kita akan masuk ke bagian deployment model. Biasanya ketika kita melakukan model deployment. Itu kita menuliskan scriptnya di dalam script.py. Bukan di notebook. Walaupun sebenarnya bisa saja di notebook. Tapi untuk mempermudah kita nge-deploy nanti. Lebih baik di script.py saja. Jadi di sini gue ngebuka directory yang tadi gue gunakan. Untuk. ngedevelop model. Ini adalah notebook yang tadi sebenarnya. Dan di sini kita akan bikin script Python-nya. Nah sebelum itu mungkin kita pisahkan dulu ya antara notebook dan script-nya. Notebook-nya gue taruh di sini ya. Di folder notebook. Jadi nanti gue push ke GitHub. Teman-teman tinggal cari directory notebook aja untuk ngeliat notebook-nya. Nah terus di sini gue tambahkan folder lagi untuk script. Deployment. Nah ini akan gue masukin script deployment disini. Dan untuk model numpy dan pandas yang tadi udah kita bikin di development. Kita masukkan ke dalam script deployment. Oke. Mungkin disini kita bikin folder baru aja ya. Model. Nah modelnya dimasukin sini. Oke. Ya. Terus di dalam script deployment. Kita masukin file namanya app.py. Jadi strukturnya begini ya nanti untuk kode kita. Oke kita akan menggunakan Flask. Jadi sebelum kita mulai kita buka terminal dulu. Pastikan kita di virtual environment yang sudah disiapkan. Kita pip install Flask. Sebenarnya teman-teman boleh pakai apapun ya. Misalkan pakai Fast API boleh. Atau bahkan kalau mau pakai Django juga boleh. Tapi Flush biasanya adalah yang paling mudah digunakan kalau misalnya teman-teman baru mulai untuk belajar deployment. Oke, sekarang kita akan coba buka website-nya si Flush. Lalu kita coba copy starter code-nya untuk memulai coding-an kita. From Flush, import Flush. Lalu kita definisikan aplikasinya. Lalu kita definisikan di... Homepage-nya atau si root page-nya itu kalau misalnya kita akses kita akan mendapatkan hello world. Buat teman-teman yang belum familiar dengan Flash, gue udah bikin walaupun cuma ada 2 episode ya. Tapi lumayan untuk mengetahui struktur si Flash-nya, videonya ada di atas. Kalau teman-teman setuju untuk seri Flash-nya dilanjutkan, tulis komentar di bawah ini. Kalau lebih dari 10 komentar aja, gue akan lanjutkan. video flashnya Oke untuk bisa jalanin ini kita tambahin potongan kode lagi appran di back sama dengan truk karena kita masih proses development kita save lalu kita coba klik play atau bisa python spasi app.py ya oke lalu masuk ke local host 5000 kita coba lihat oke hello world ya kelihatan ya kita gedein nah hello world kelihatan ya Oke sekarang kita coba balik lagi ke sini. Kita stop dulu. Ctrl C. Oke selanjutnya mungkin disini kita ubah dikit. Misalkan index. Terus disini kita kasih respon JSON. Biasanya kalau misalnya endpointnya berhasil. Ini kodenya 200 ya. Jadi kita tambahin kode 200. Ini adalah status code. Biasanya kalau teman-teman sering temuin tuh 404. Berarti tidak ditemukan 500. 200 berarti internal server error, nah 200 itu adalah sukses seperti ini. Nah sebelum kita membuat endpoint prediksi, kita load dulu modelnya di environment global. Supaya kalau script Python-nya ini dijalankan, maka modelnya langsung di-load di RAM. Dan proses prediksinya nanti seharusnya bisa jadi lebih cepat. Oke, pertama berarti kita perlu import pickle. Selanjutnya kita buka file modelnya. Jangan lupa modelnya adalah rb. Lalu model nampai sama dengan pickle load model file. Kita lakukan hal yang sama untuk... Pandas model. Oke. Nice. Nah ini sedikit intermezzo ya. Kalau teman-teman langsung ngejalanin ini. Harusnya sih akan keluar error. Ya. No such file or directory. Kenapa? Karena kita sekarang sedang berada di folder model deployment. Which is ada di root folder ini. Sedangkan. Si script deploymentnya ada di dalam folder script deployment. Dan. Saat kita nge-load model ini, asumsinya kita membuka ini di dalam folder script deployment. Nah, karena kita berada di model deployment, maka ini nggak ketemu nih. Karena di dalam folder model deployment nggak ada folder model. Folder model adanya di script deployment. Jadi, kita masuk dulu ke script deployment dengan cara cd seperti ini. Nah, ketika kita masuk di sini, kita bisa jalanin pythonapp.py. Programnya bisa jalan. Oke, ini kita stop dulu ya. Ctrl C. Nah, selanjutnya kita akan coba buat endpointnya. Tapi sebelum kita bikin endpointnya, kita diskusi dulu mengenai API. Nah, di dalam API ini ada beberapa metode yang bisa teman-teman gunakan. Dalam kasus ini, misalnya kita bisa pakai get, bisa juga pakai post. Sebenarnya ada metode lagi namanya update dan delete. Nah, itu fungsinya adalah untuk mengupdate data atau menghapus data. Nah, Get dan post ini, kalau get seperti namanya ya, kita meminta data dari si API. Jadi misalnya nih, kita buka Facebook, facebook.com. Itu kita memanggil API get sebenarnya. Yang mana nanti si API akan memberikan sesuatu gitu, balikan. Nah balikannya dalam kasus ini adalah sesuatu yang kita lihat di browser. Nah kalau post, ini berarti kita mengirim sesuatu. Contoh, misalkan... kita pengen login Facebook. Kita menuliskan username dan password kita. Lalu saat kita klik button login, maka username dan password kita akan dikirim via API itu. Dan nanti kita akan dapat kembalian apakah dia itu loginnya berhasil atau gagal. Nah, mungkin teman-teman berpikir, oh berarti kita harus pakai POS nih, karena kita butuh memasukkan data-data Sepaleng, Sepaluit, Petaleng, Petaluit. Bisa juga pakai POS. Tapi untuk kasus ini kita pakai get saja. Dengan tambahan parameter atau argumen. Kita akan coba untuk kasus ini bikin API get. Loh kenapa nggak post aja? Kalau kita pengen pakai post, ini kita ngetesnya nggak bisa langsung di browser. Kita harus butuh bantuan software lain. Misalkan pakai postman. Atau bisa juga kita buka notebook, pakai library request, terus kita coba request post ke API kita. Tapi kan... repot ya, dan mungkin nanti kita akan bahas di video lain, untuk kasus ini kita fokus ke gate saja dengan tambahan parameter, nah parameter bentuknya gimana, misalkan ini url kita nih, localhost nah, misalkan disini ada endpoint predict nah gimana caranya kita memberikan parameter kesini, kita kasih aja tanda tanya, lalu parameternya apa, misalkan nama sama dengan afif ... Nah ini adalah parameter kita. Nah ini nanti bisa di-consume oleh si flush-nya. Kita coba dulu kali ya. Nah pertama-tama kita butuh request dari library flush. Selanjutnya kita coba bikin endpoint baru. Misalkan sapa. Oke. Dev sapa nama. Kita tangkap si argument-nya atau si parameter-nya di variable args. Sama dengan request.args. Nah, selanjutnya di sini nama kita ekstrak dari si args. Nah, nama inilah yang nanti kita harus specify di URL-nya. Oke. Selanjutnya kita coba return. Nah, terus kita sapa namanya di sini. Halo nama. Di sini kita tambahin f depannya. F string. Oke. Kita coba jalankan ya programnya. Kita coba... Balik lagi ke sini. Ini kita coba jalankan dengan URL ini ya. Localhost 5000. Garis miring Sapa. Tanda tanya. Nama sama dengan Afif. Kita coba. Oh sorry. Arcs-nya jangan ditambahkan kurung. Kita save. Dia akan otomatis nge-reload. Kita coba balik lagi. Kita refresh. Nah. Sekarang muncul seperti ini. Halo Afif, status sukses. Kalau kita ganti belakangnya jadi Budi, maka dia akan berubah jadi Halo Budi. Nah, kalau misalnya kita nggak kasih argumen apa yang terjadi, nah, bad request key error. Nah, mungkin kita tambah sedikit adjustment di sini ya. Di sini misalkan, oh jangan gini deh. Jangan RGS nama, tapi RGS get nama Ini sama aja kayak tadi Cuma disini kita bisa tambahkan default value-nya adalah misalkan afif Kita save Nah dia akan ngerestart Kita balik lagi kesini Kita refresh Nah default-nya itu adalah afif Tapi kalau kita mau override misalnya namanya jadi budi Bisa juga Jadi dia nggak akan terkena error walaupun kita nggak masukin namanya. Terus gimana kalau misalnya argumennya ada dua? Misalnya di sini job. Kita bikin argumen lagi. Job title, biar beda dengan variabelnya. Default data scientist. Oke, kita coba tambahin di sini. Halo Budi, pekerjaan Anda adalah job. Oke, kita save. Dia akan restart otomatis. Kita balik lagi ke sini. Lalu kita refresh. Halo Budi, pekerjaan Anda adalah data scientist. Nah, bagaimana kalau misalnya ada dua parameter yang perlu kita masukkan? Kita tinggal tambahkan tanda done di sini. Lalu kita masukin job title. Misalkan CEO. Nah, pekerjaan Anda adalah CEO. Kita balik lagi ke sini. Lalu kita close dulu ya. Oke, kita lanjut ya. Sekarang kita akan coba bikin endpoint-nya. Ini biarin aja ya, yang sapa ya. Biar jadi contoh aja. App.route. Nah, di sini kita coba bikin predict. Nampai. Nah, dev, predict, nampai. Sama seperti yang tadi di atas, kita tangkap dulu si argumennya. Nah, lalu kita ekstrak satu-satu parameternya. Ada 4 parameter ya. SL, SW, PL, PW. Jadi kita singkat aja biar gampang. SL sama dengan args.get. SL, defaultnya kita bikin 0 saja. Terus kita tambahkan type biar memastikan bahwa tipe yang dimasukin ke sini adalah float. Kita lakukan dengan parameter yang lainnya ya. Selanjutnya setelah sampai sini kita tinggal predict aja kan. Ini udah tak sama dengan ingat karena dia nampai kita masukin kurungnya di sini. Ada di notebook yang tadi ya. Gue nggak ulang. Silahkan dilihat lagi notebooknya kalau lupa. Oke, selanjutnya di sini kita tinggal predict result sama dengan model numpy.predict si new data. Nah, ini kan hasilnya adalah array kan ya. Kita coba lihat lagi deh di notebooknya. Oke, di sini kan hasilnya begini ya. Nah, kita pengen ambil elemen si angkanya saja. Lalu kita ubah angka tersebut. menjadi si labelnya jadi kita tambahkan di atas sama dengan iris setosa iris versi color dan iris virginica nah selanjutnya disini kita tinggal ambil saja res sama dengan label res elemen ke 0 ingat ya karena dia itu adalah list hasilnya dan list elemen yang paling pertama Jadi list 0 Oke Semoga jelas ya Nah si elemen ini Si angka ini Akan menjadi Indeks yang ada di sini, kalau hasil dari prediksinya 0, dia akan otomatis langsung ambil elemen ini. Kalau 1, ambil elemen ini. Dan kalau 2, ambil elemen ini. Sekarang kita tinggal keluarkan return-nya. Status success, message, atau di sini kita jangan message, result adalah si rest. Oke, kita coba dulu yang nampak ya. Kita save. Nah sekarang kita coba jalankan programnya. Kita balik lagi ke browser. Lalu kita ganti dengan predict numpy. Lalu kita masukkan parameternya. Kita coba jalanin. Yang keluar di sini adalah iris versi color. Mungkin kita tambahkan input kali ya. Jadi biar memastikan bahwa input kita udah benar gitu Ya disini kita tambahkan input Oke inputnya adalah berupa dictionary juga Sepal length Sepal lengthnya adalah si sl Lalu kita lakukan ke semua parameternya Oke ini udah gue tambahin input Jadi nanti di responnya akan ada inputnya juga Untuk memastikan input kita udah bener gitu ya Kita coba refresh lagi yang disini Ah bener ya Sepal lengthnya 2 Betul ya Sepal widthnya Betul Petal lengthnya 1 Dan petal widthnya Oke Dan hasilnya adalah iris versi color Mungkin kalau misalnya kita hapus semuanya Dia akan otomatis jadi 0 semua Oke Misalnya kita ganti Ganti lagi jadi 4. Ini kita ganti jadi 2. Nah berubah ya. Airis atau sat. Jadi memang tergantung dari inputnya. Nah kita bisa lakukan hal yang sama untuk yang pandas. Kita coba copy aja dari sini ya. Karena tadi udah dijelaskan perbedaan antara numpy dan pandas. Di sini gue akan cepat aja untuk mengubah ini semua. Satu, terus selanjutnya di new datanya kita ubah jadi pd.dataframe. Nah, data frame di sini adalah new data. Nah, karena kita nggak punya nama kolomnya, berarti kita harus definisikan secara manual. Nah, biar nggak repot mungkin kita coba buka notebook yang tadi. Ini masih jalan nggak kernelnya ya? Kita coba keluarkan ini. Oke. Ini kita copy. Kita copy, kita masukkan ke dalam feature. Sama dengan, nah ini. Nah, ini nanti kita jadikan features. Oke. Pandasnya belum di-import, kita import dulu. Selanjutnya datanya udah jadi data frame. Model yang kita gunakan model pandas. Terus kita masukin ke label dan harusnya udah. Oke kita save. Lalu kita coba jalankan lagi. Tadi sempat error ya soalnya. Nah sekarang kita balik lagi ke sini. Lalu kita ganti jadi predik pandas. Oke, hasilnya sama ya. Oh, mungkin kita tambahkan satu lagi deh. Biar kelihatan kita pakai model yang mana. Input type. Kita kasih di sini data frame. Nah, untuk yang di atas. Kita kasih nampai array. Kita save. Oke, lalu kita coba jalankan lagi. Nah. Input type-nya Pandas DataFrame, sedangkan yang di... Sini kalau kita ganti dengan numpy, hasilnya adalah numpy array. Oke model kita sudah dibungkus di dalam API dengan menggunakan flush. Sekarang waktunya kita deploy API ini ke hosting. Yang mana kita akan menggunakan hosting yang menjadi sponsor dari video kali ini. Yaitu id cloud host. Dimana id cloud host ini menyediakan berbagai macam produk hosting sesuai dengan kebutuhan teman-teman. Mulai dari 15 ribuan aja per bulan. Nah untuk kasus ini gue akan menggunakan paket yang harganya 50 ribu ini ya. CPU 2 core dan virtual memory 2 giga. Ini adalah rekomendasi gue. Karena kita menggunakan flash, ini juga model machine learning. Jadi paling gak kita coba menggunakan mesin dengan minimal 2 giga RAM. Nah gue udah sempat bikin videonya untuk teman-teman yang pengen memesan hosting di ID Cloud Host. atas ini. Dan buat teman-teman yang ingin mendaftar ID Cloud Host dan mulai menyewa hosting dengan harga yang terjangkau, silakan klik link yang ada di kolom deskripsi. Oke, kita mulai aja. Masuk ke client area. Jadi silakan nanti teman-teman tinggal login ke akun ID Cloud Hostnya. Scroll ke bawah, pilih service, lalu masuk ke Cloud Hosting Cpanel Entrepreneur Pro yang Rp50.000 per bulan ini ya. Lalu klik klik Login to cPanel. Nah sebelum kita mulai, ada beberapa hal yang perlu disiapkan. Yang pertama adalah kita siapkan requirement.txt-nya, yaitu library yang digunakan untuk project ini. Kita close dulu. Di sini, gue akan coba jalankan pip freeze requirements.txt. Nah di sini gue gak akan... menggunakan semua library yang diinstal virtual environment ini, gue akan pilihkan beberapa. Oke, dari beberapa library yang tadi keluar, gue pilihkan 4 ini. Tapi teman-teman tenang aja, nggak usah milihin satu-satu kayak tadi. Semuanya ada di GitHub, tinggal dipakai aja. Yang kedua, kita harus tahu dulu versi Python yang kita gunakan di sini. Kita coba jalankan Python di sini. Nah, kita pakai versi 3.10.5. Nah, nanti di hostingnya kita akan coba. Cari versi Python yang dekat dengan ini. Kita coba exit dulu. Lalu kita balik lagi ke si panel yang tadi. Nah, di sini kita cari Python. Setup Python app. Kita klik. Nah, ini sebenarnya caranya mirip dengan video yang sebelumnya ya. Tapi karena yang kemarin tidak pakai Flash dan ini pakai Flash, mungkin agak sedikit berbeda. Oke, kita create application. Nah, sekarang kita coba pilih versi Python-nya. Tadi kan kita pakai Python versi 3.10.5 kan? Dan kalau kita lihat di sini ada nih yang terdekat 3.10.9. Tapi masalahnya di sini kita menggunakan cPanel dan Lightspeed sebagai web servernya. Dan somehow ini masih kurang stabil di Lightspeed. Jadi kita pakai yang versi 3.9.16 saja yang lebih stabil. Nah sebenarnya kalau kita udah tahu nih di... Environment production kita pakai 3.9.16 gitu misalnya. Alangkah lebih baiknya lagi kalau dev-nya juga pakai ini. Supaya nanti library-nya punya versi yang sama dan python-nya juga pakai versi yang sama. Tapi harusnya untuk yang sekarang sih nggak masalah. Oke, untuk application root-nya kita tulis model deployment flask. Nah, ini nanti dia akan membuat folder dengan nama ini. Sehingga nanti kita... masukin kode-kode yang udah kita tulis di VS Code ini ke dalam folder ini. Nah untuk application URL-nya, gue pengen di home. Jadi ini gue kosongin, ini gue kosongin, dan ini gue kosongin juga. Lalu kita create. Kita tunggu sampai dia selesai. Oke, dia udah selesai. Selanjutnya kita akan masuk ke folder ini dari file manager supaya kita bisa upload kode yang udah kita buat di lokal. Kita balik ke home cpanelnya. Lalu di sini kita masuk ke pengelola file atau file manager. Nah di sini kita akan mendapatkan folder model deployment flush. Kita buka. Nah di sini kita akan upload file-file yang ada di dalam folder script deployment ini. Kita coba langsung upload aja dulu ya. Unggah. Nah di sini kita coba upload. Oke kita harus upload satu-satu nih kayaknya ya. Kita upload app dulu. Lalu. Upload requirements. Lalu kita bikin folder model dulu ya. Di sini ya. Kita bikin folder. Namanya adalah model. Nah di dalam model ini kita upload lagi model yang udah kita bikin di lokal. Model nampai dan model pandas. Oke, kita balik lagi. Nah, sekarang file-filenya sudah di-upload ya. Sekarang kita akan edit beberapa hal. Yang pertama adalah si passenger.wsgi kita edit. Nah, ini kita hapus. Sekarang kita akan coba bikin si passenger.wsgi ini untuk menjalankan file app kita. Nah, di sini kan nama file kita kan app.py ya. Berarti kita import. From app, nah dari app ini kita import si flashnya. Kalau kita lihat di aplikasi kita, si flashnya ini didefinisikan di dalam variable app. Nah berarti di sini kita masuk import app. Nah jadi jangan bingung ya, ini apa nih? From app, import app. Nah app yang pertama ini adalah nama file si app kita. Dan app yang kedua ini adalah variable tempat si flash itu didefinisikan. Nah, di sini kita tambahkan as application. Nah, kenapa as application? Karena kalau kita lihat di sini tadi ya. Nah, ini ya. Application entry point-nya namanya adalah application. Makanya ini kita kasih alias application. Oke, kita simpan perubahan. Nah, file selanjutnya yang perlu kita update adalah app.py. Ini kita edit. Sebenarnya editnya sederhana saja. Yang bagian bawah ini kita... Kita hapus atau kita komen. Kita komen aja deh ya. Kalau kita menjalankan script ini di lokal dengan menggunakan python spasi app.py. Kita butuh ini. Tapi karena ini kita akan jalankan di server. Kita nggak perlu menjalankan ini. Jadi cukup kodenya aja. Karena semuanya sudah diwakili oleh si variable app yang ada di sini. Jadi biarkan sih. Passenger WSGI-nya yang menjalankan file ini. Tanpa perlu kita tambahkan ini. Oke, kita save ya. Lalu kita close aja. Setelah itu kita balik lagi ke setup Python app kita. Kita scroll ke bawah ya. Nah ini Passenger WSGI yang tadi kita edit. Dan application ini adalah yang tadi kita masukin ke dalam Passenger WSGI ya. Nah di sini kita... Tadi sudah upload si requirement.txt nya Sekarang kita coba tuliskan requirements.txt Lalu kita add Dan disini kita klik dan install semua yang ada di dalam requirement.txt Kita tunggu sampai selesai Oke, sudah selesai ini kita install Nah, sekarang kita akan coba scroll ke atas Kita restart Oke, lalu kita save. Kita tunggu sampai dia selesai. Sudah selesai. Selanjutnya kita akan coba open URL ini. Kita jalankan. Oke, service is up status sukses. Nah, sekarang kita akan coba tambahkan endpoint dan parameter yang sudah kita coba di lokal. Kita coba paste di sini. Nah kita akan lihat apa yang terjadi. Nah kita bisa lihat dia sudah menghasilkan hasil yang sama seperti yang ada di sini. Walaupun kalau secara tampilan memang lebih bagus di lokal ya. Tapi dari sini kita bisa lihat bahwa model kita sudah terserve dengan baik. Nah kita coba pakai yang pandas ya. Pandas. Nah endpoint pandas juga sudah bekerja dengan baik. Nah dengan ini kita sudah selesai melakukan deployment model sehingga orang lain bisa menggunakan model yang kita buat. Sekali lagi terima kasih untuk ID Cloud Host yang sudah mensponsori video ini. Dan buat teman-teman yang ingin coba deploy model teman-teman di ID Cloud Host silahkan register dan pesan hostingnya sekarang di link yang ada di kolom deskripsi di bawah. Ya lumayan panjang juga ya tutorial kali ini. Tapi semoga dari tutorial ini teman-teman bisa mendapatkan insight. Bagaimana caranya kita melakukan modeling end-to-end mulai dari development sampai deploy hingga bisa model kita diakses oleh orang banyak. Nah, walaupun konsep yang kita bahas kali ini sederhana, tapi gue yakin ketika teman-teman bisa memahami konsep utama dari apa yang kita bahas kali ini, teman-teman bisa melakukan deployment model apapun, sekompleks apapun, di environment apapun. Makasih banyak buat teman-teman yang udah nonton video kali ini. Jangan lupa like dan share video ini apabila video ini bermanfaat. Dan jangan lupa juga subscribe channel ini. Terima kasih atas perhatiannya dan sampai jumpa di video selanjutnya.