Pengembangan Aplikasi AI Berbasis Cloud:
B. Hands-On Penggunaan Cloud Services
B. Hands-On Penggunaan Cloud Services
I. Register ke GCP ¶
https://cloud.google.com/¶
- Usahakan email yang belum pernah digunakan di GCP Sebelumnya
- Disarankan untuk login ke Google hanya 1 email saja (tidak beberapa email bersamaan)
- Ikuti petunjuk pendaftaran hingga selesai, termasuk memasukkan informasi kartu kredit.
- pengguna baru mendapatkan saldo gratis $300,-.
Informasi Kartu Kredit ¶
- Account type pilih individual ==> NPWP jadi tidak wajib.
- Tidak akan digunakan (charge) jika tidak "Aktivasi"
- Selama belum di aktivasi kita bisa menggunakan credit $300 untuk 22 macam service GCP:
- Batasan service free: https://cloud.google.com/free
Selesai Registrasi ¶
- Biasanya <10 menit untuk registrasi dan mendapatkan credit gratis $300,-.
- Setelah selesai klik " My First Project "
GCP Dashboard ¶
Ada beberapa tahapan awal yang akan kita lakukan sebelum mencoba Cloud Services GCP:
- Set budget alert.
- Enable API and services
- Create credentials
- Install Google Cloud SDK & Modules.
Budget Alert ¶
- Sangat penting untuk dilakukan, banyak pengguna pemula mendapat tagihan puluhan juta karena lupa bahwa cloud berbayar.
- Klik "Billing" di sebelah panel sebelah kiri.
- isi dengan nilai yang masih ditolerir sebagai pengeluaran cloud.
- ini untuk ketika akun sudah diaktivasi (credit sudah habis atau masa berlaku sudah habis)
- Saran saya alert 30 dan 50% pilih "actual", tapi 100% Forecasted.
Contoh Cloud Service 01: Mencoba Google Cloud Storage (GCS) ¶
- klik "Cloud Storage di panel kiri, lalu pilih "Bucket"
- Beri nama unik dan isi detail lain.
- Setiap menggunakan service di cloud selalu check biayanya. Dalam hal ini di sisi sebelah kanan.
- Region bisa dipilih Indonesia untuk meminimalisir Latency (dan biaya)
- Storage class pilih sesuai kebutuhan. Masing-masing dioptimasi secara berbeda-beda.
- Set akses kontrol storage ini, apakah mau bisa diakses publik? Apakah setting akses mau ke setiap file (seperti Google Drive files)?
- Object Protection juga disesuaikan dengan kebutuhan. Hati-hati semua ada konsekuensinya, misal versioning artinya akan ada duplikat copy dari file kita yang bisa berpengaruh terhadap biaya.
Menggunakan Service via Browser ¶
- Tentu saja sangat mudah untuk menggunakan layanan GCS via browser.
- Silahkan coba buat folder dan upload sembarang file. Tidak usah hawatir storage murah dan kita memiliki credit $300 yang akan hangus dalam 90 hari jika tidak digunakan.
Menggunakan Service Storage Bucket via Code (Python) ¶
Jarang sekali cloud diakses dalam production level via browser. Oleh karena itu sekarang kita akan coba akses bucket lewat Python.
- Klik https://console.cloud.google.com/iam-admin/serviceaccounts kemudian pilih project kita : "My First Project"
- Klik "create service account"
- Beri sembarang nama lalu beri Role sebagai "owner"
- lewati saja tahap ke-3 (optional, ini diisi kalau kita sudah teamwork dalam membuat solusi cloud) ==> klik "Done"
- Kalau sudah klik service account namenya ==> klik tab "keys" ==> create private key ==> pilih json
- Json key akan automatis terdownload. Pindahkan key ini ke tempat yang "aman". Jangan sampai lupa ada dimana.
- Contoh file saya: "tidy-hold-XXX-a037XXXd003f.json" dan disimpan di "C:\Cloud-AI\gcp"
Alternatifnya kita bisa pakai GCloud CLI: https://cloud.google.com/docs/authentication/provide-credentials-adc#local-dev
The Python Code for GCS Bucket ¶
- install module python untuk GCP (cell dibawah)
- load credentials
- Gunakan code di dokumentasi: https://cloud.google.com/storage/docs/uploading-objects#storage-upload-object-python
- Contoh saya akan upload Photo dengan wajah Einstein: "einstein.png"
- Ketika berhasil di contoh ini nanti duplikat Tab Browser Bucketnya dan jangan di tutup/close. Kita akan menggunakannya lagi di kasus ke-03.
Dari contoh sederhana ini kita mulai mengerti mengapa dokumentasi GCP sulit untuk dipelajari pemula. Langkah-langkah yang kita lakukan ini tidak ada secara jelas di dokumentasi step-by-step-nya.¶
Cara Alternatif: Enable API and Services ¶
- Klik tombol menu paling pojok kiri atas (The hamburger icon, garis horizontal 3), lalu pilih "API & Services"
- https://console.cloud.google.com/apis/library
- Di tengah-atas kita bisa search service yang akan digunakan atau scroll ke bawah untuk memilih service yang akan digunakan
API Key Approach to Cloud Service ¶
- json credential dan API Key punya +/- masing-masing.
- Sekilas API key memudahkan, tapi bahaya jika diketahui orang lain.
- Di panel sebelah kiri klik "Credentials" lalu pilih link diatasnya "Create Credentials" dan pilih "API Key"
- Setelah itu akan muncul (pop-up) API Key-nya.
- Silahkan langsung tutup saja.
Limit API Key ¶
- API Key terlalu unrestrictive. Untuk keamanan kita bisa atur ia hanya bisa untuk service dan akses yang terbatas.
- klik nama API Keynya.
- Pilih akses yang diperbolehkan utk API Key tsb (lihat Gambar).
In [ ]:
# Install module-module python resmi dari Google yang kita butuhkan untuk module ini
!pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
!pip install --upgrade google-cloud-storage
!pip install --upgrade google-cloud-language
!pip install --upgrade google-cloud-vision
!pip install --upgrade google-cloud-dialogflow
In [5]:
import warnings; warnings.simplefilter('ignore')
import os
from google.cloud import storage
os.environ["GOOGLE_APPLICATION_CREDENTIALS"]="c:/Cloud-AI/gcp/tidy-hold-4XXX3-aXXXX03f.json" # perhatikan path ditulis sebagai slash "/" bukan backslash "\"
def upload_blob(bucket_name, source_file_name, destination_blob_name):
storage_client = storage.Client()
bucket = storage_client.bucket(bucket_name)
blob = bucket.blob(destination_blob_name)
generation_match_precondition = 0
blob.upload_from_filename(source_file_name, if_generation_match=generation_match_precondition)
print(f"File {source_file_name} uploaded to {destination_blob_name}.")
bucket_name = "bucket-unsri-taudata" #ini nama bucket kita tadi
source_file_name = "einstein.png"
destination_blob_name = "einstein-gcs.png"
upload_blob(bucket_name, source_file_name, destination_blob_name) # check bucket di browser apakah file telah terupload
File einstein.png uploaded to einstein-gcs.png.
AI Cloud Service ¶
- URL: https://console.cloud.google.com/apis/library/browse?filter=category:machine-learning
- Pada saat module ini dibuat terdapat 12 cloud service terkait Machine learning/AI
- Kita akan mencoba beberapa diantaranya.
Contoh Cloud Service 02: Sentimen Analysis ¶
- Natural Language di GCP bisa dilakukan via AutoML Natural Language ATAU Natural Language API
- Untuk contoh ke-02 ini kita akan menggunakan Natural Language API
- Selain Sentiment Analysis NL API juga bisa untuk NER, Post-Tag, klasifikasi teks, dll: https://cloud.google.com/natural-language/docs/basics
- Supported Language: https://cloud.google.com/dialogflow/es/docs/reference/language
- Contoh sederhana : https://cloud.google.com/natural-language/docs/reference/libraries (Tapi tidak bisa langsung digunakan!!!!)
- Kita harus mengikuti langkah-langkah disini terlebih dahulu: https://cloud.google.com/python/docs/reference/language/latest/index.html
- Jangan lupa cek biaya cloud servicenya: https://cloud.google.com/natural-language#section-7
ini contoh sederhana lain lagi bahwa untuk sekedar menggunakan sebuah cloud service di GCP kita tidak bisa menemukan satu halaman di dokumentasi yang bisa langsung di gunakan.¶
Mempersiapkan Language Service GCP ¶
- Select or create a Cloud Platform project (biasanya sudah terpilih)
- Enable billing for your project (kalau belum klik https://console.cloud.google.com/billing/ lalu enable billing di projectnya)
- Enable the Natural Language ( klik https://console.cloud.google.com/flows/enableapi?apiid=language.googleapis.com ==> Next ==> Enable API)
- Setup Authentication (Kita sudah melakukannya di contoh pertama)
In [6]:
from google.cloud import language_v1
client = language_v1.LanguageServiceClient() # Instantiates a client
text = "Cloud Computing is very challenging, I feel a bit dizzy" # The text to analyze
document = language_v1.types.Document(content=text, type_=language_v1.types.Document.Type.PLAIN_TEXT)
# Detects the sentiment of the text
sentiment = client.analyze_sentiment(request={"document": document}).document_sentiment
print(f"Text: {text}")
print(f"Sentiment: {sentiment.score}, {sentiment.magnitude}")
Text: Cloud Computing is very challenging, I feel a bit dizzy Sentiment: 0.4000000059604645, 0.4000000059604645
Bahasa Indonesia? ¶
- Dokumentasinya: https://cloud.google.com/natural-language/docs/basics
- Contoh yang jelas disini: https://cloud.google.com/natural-language/docs/analyzing-sentiment
In [8]:
from google.cloud import language
text = "mie ayam pakai sirup enak." # The text to analyze
document = language.Document(content=text, language="id", type_=language.Document.Type.PLAIN_TEXT)
encoding_type = language.EncodingType.UTF8
sentiment = client.analyze_sentiment(request={'document': document, 'encoding_type': encoding_type}).document_sentiment
print(f"Text: '{text}'")
print(f"Sentiment score: {sentiment.score}, magnitude {sentiment.magnitude}")
Text: 'mie ayam pakai sirup enak.' Sentiment score: 0.8999999761581421, magnitude 0.8999999761581421
Contoh Cloud Service 03: Computer Vision - Face Emotion Detection ¶
- Enable cloud service ini dan ingat biayanya: https://console.cloud.google.com/marketplace/product/google/vision.googleapis.com
- Halaman Dokumentasi: https://codelabs.developers.google.com/codelabs/cloud-vision-api-python#6
- Kita akan menggunakan file "einstein.png" yang sudah diupload ke GCS bucket kita di contoh kasus pertama.
- Klik nama filenya lalu copy gsUtil URL-nya
In [9]:
from google.cloud import vision
from typing import Sequence
def analyze_image_from_uri(image_uri: str, feature_types: Sequence,) -> vision.AnnotateImageResponse:
client = vision.ImageAnnotatorClient()
image = vision.Image()
image.source.image_uri = image_uri
features = [vision.Feature(type_=feature_type) for feature_type in feature_types]
request = vision.AnnotateImageRequest(image=image, features=features)
response = client.annotate_image(request=request)
return response
def print_faces(response: vision.AnnotateImageResponse):
print("=" * 80)
for face_number, face in enumerate(response.face_annotations, 1):
vertices = ",".join(f"({v.x},{v.y})" for v in face.bounding_poly.vertices)
print(f"# Face {face_number} @ {vertices}")
print(f"Joy: {face.joy_likelihood.name}")
print(f"Exposed: {face.under_exposed_likelihood.name}")
print(f"Blurred: {face.blurred_likelihood.name}")
print("-" * 80)
return face
image_uri = "gs://bucket-unsri-taudata/einstein-gcs.png"
features = [vision.Feature.Type.FACE_DETECTION]
response = analyze_image_from_uri(image_uri, features)
face = print_faces(response)
================================================================================ # Face 1 @ (0,24),(722,24),(722,873),(0,873) Joy: VERY_UNLIKELY Exposed: VERY_UNLIKELY Blurred: VERY_UNLIKELY --------------------------------------------------------------------------------
In [10]:
print(str(face)[4150:])
: 0.4498509 joy_likelihood: VERY_UNLIKELY sorrow_likelihood: VERY_UNLIKELY anger_likelihood: VERY_UNLIKELY surprise_likelihood: POSSIBLE under_exposed_likelihood: VERY_UNLIKELY blurred_likelihood: VERY_UNLIKELY headwear_likelihood: VERY_UNLIKELY
Contoh Service 04: Computer Vision - Object Detection ¶
- Kita menggunakan contoh gambar "gs://cloud-samples-data/vision/label/setagaya.jpeg"
In [11]:
def print_objects(response: vision.AnnotateImageResponse):
print("=" * 80)
objects = []
for obj in response.localized_object_annotations:
nvertices = obj.bounding_poly.normalized_vertices
objects.append(obj)
print(
f"{obj.score:4.0%}",
f"{obj.name:15}",
f"{obj.mid:10}",
",".join(f"({v.x:.1f},{v.y:.1f})" for v in nvertices),sep=" | ",)
return objects
image_uri = "gs://cloud-samples-data/vision/label/setagaya.jpeg"
features = [vision.Feature.Type.OBJECT_LOCALIZATION]
response = analyze_image_from_uri(image_uri, features)
objects = print_objects(response)
================================================================================ 93% | Bicycle | /m/0199g | (0.6,0.6),(0.8,0.6),(0.8,0.9),(0.6,0.9) 92% | Bicycle wheel | /m/01bqk0 | (0.6,0.7),(0.7,0.7),(0.7,0.9),(0.6,0.9) 91% | Tire | /m/0h9mv | (0.7,0.7),(0.8,0.7),(0.8,1.0),(0.7,1.0) 75% | Bicycle | /m/0199g | (0.3,0.6),(0.4,0.6),(0.4,0.7),(0.3,0.7) 51% | Tire | /m/0h9mv | (0.3,0.6),(0.4,0.6),(0.4,0.7),(0.3,0.7)
In [12]:
print(objects[0])
mid: "/m/0199g" name: "Bicycle" score: 0.92585653 bounding_poly { normalized_vertices { x: 0.5604722 y: 0.57445467 } normalized_vertices { x: 0.75201744 y: 0.57445467 } normalized_vertices { x: 0.75201744 y: 0.94803196 } normalized_vertices { x: 0.5604722 y: 0.94803196 } }
Contoh Service 05: ChatBot! ¶
- Link: https://dialogflow.cloud.google.com/#/newAgent
- pilih "Create"
- isi detail App-nya, sesuaikan daerah timezone dan ingat nama appname.
- Kita membutuhkan:
- Project ID lihat dari json
- SESSION_ID bisa pakai user-id lihat di json credential-nya.
Intents? Events? Entities? Context? ¶
Conventional ChatBot VS LLM like Bard/ChatGPT? ¶
In [ ]:
def detect_intent_texts(project_id, session_id, texts, language_code):
from google.cloud import dialogflow
session_client = dialogflow.SessionsClient()
session = session_client.session_path(project_id, session_id)
print("Session path: {}\n".format(session))
#for text in texts:
text_input = dialogflow.TextInput(text=text, language_code=language_code)
query_input = dialogflow.QueryInput(text=text_input)
response = session_client.detect_intent(
request={"session": session, "query_input": query_input}
)
print("=" * 20)
print("Query text: {}".format(response.query_result.query_text))
print(
"Detected intent: {} (confidence: {})\n".format(
response.query_result.intent.display_name,
response.query_result.intent_detection_confidence,
)
)
print("Fulfillment text: {}\n".format(response.query_result.fulfillment_text))
project_id = "vertical-theory-400810"
session_id = "117596086772651342927"
language_code = "id"
texts = "hai"
detect_intent_texts(project_id, session_id, texts, language_code)
Stop dan Monitor Berapa Biaya Cloud yang sudah kita gunakan sejauh ini ¶
Saran dan Diskusi ¶
- Sebaiknya Cloud Programming dilakukan oleh Programmer/Data Engineer bukan Data Scientist/Data Analyst.
- Gunakan hybrid solution: Cloud, Web Hosting sederhana, dan komputasi lokal.
- Gunakan free services seperti Google Drive dan free Quota services untuk menekan biaya.
- Free Quota services bisa menggunakan beberapa akun email.
- ....
- Simpan hasil prediksi dan labelnya di storage lokal atau storage (database) shared hosting yang lebih murah.
- Contoh kasus saya meneliti language detection baru atau pendekatan sentimen baru, bisa gunakan hasil dari Google sebagai benchmark.
No comments:
Post a Comment
Relevant & Respectful Comments Only.