1. परिचय
इस कोडलैब में, Java, Spring बूट, Cloud Spanner डेटाबेस, और Vertex AI Imagen API का इस्तेमाल करके, एआई से चलने वाला पोज़ जनरेटर बनाएं. इसमें उपयोगकर्ता कोई प्रॉम्प्ट डालेगा और ऐप्लिकेशन उस प्रॉम्प्ट के आधार पर एक पोज़ जनरेट करेगा. हम स्पैनर डेटाबेस के उस डेटा का भी इस्तेमाल करेंगे जो REST API के तौर पर दिखता है. यह Google Cloud पर, Spring बूट में जनरेटिव एआई की क्षमताओं को दिखाने का एक मज़ेदार और शिक्षा देने वाला तरीका है.
यहां इस्तेमाल की जाने वाली सेवाओं की सूची दी गई है:
- Cloud Spanner
- Vertex AI Imagen API
- Cloud Run
हाई लेवल फ़्लो का डायग्राम
आपको क्या बनाना होगा
आपको यह बनाना होगा
- सेवा API के रूप में स्पैनर डेटा के लिए Java स्प्रिंग बूट ऐप्लिकेशन
- Imagen का इस्तेमाल करके इमेज जनरेट करने के लिए Java स्प्रिंग बूट ऐप्लिकेशन
- प्रॉम्प्ट के इनपुट और जवाब के लिए एक इंटरैक्टिव यूज़र इंटरफ़ेस
2. ज़रूरी शर्तें
- Chrome या Firefox जैसा ब्राउज़र
- आपके पास ऐसा Google Cloud प्रोजेक्ट होना चाहिए जिसमें बिलिंग की सुविधा चालू हो
शुरू करने से पहले
- Google Cloud Console में, प्रोजेक्ट चुनने वाले पेज पर, Google Cloud प्रोजेक्ट चुनें या बनाएं
- पक्का करें कि आपके Cloud प्रोजेक्ट के लिए बिलिंग की सुविधा चालू हो. किसी प्रोजेक्ट के लिए बिलिंग की सुविधा चालू है या नहीं, यह देखने का तरीका जानें
- पक्का करें कि सभी ज़रूरी एपीआई (Cloud Spanner API, Vertex AI API, Cloud Run API, Cloud Functions API) चालू हैं
- आपको Cloud Shell का इस्तेमाल करना होगा. यह Google Cloud में चलने वाला एक कमांड-लाइन एनवायरमेंट है. यह bq के साथ पहले से लोड होता है. gcloud के लिए कमांड और इसके इस्तेमाल के बारे में जानने के लिए, दस्तावेज़ देखें
Cloud Console में, सबसे ऊपर दाएं कोने में 'Cloud Shell को चालू करें' पर क्लिक करें:
अगर आपका प्रोजेक्ट सेट नहीं है, तो इसे सेट करने के लिए नीचे दिए गए कमांड का इस्तेमाल करें:
gcloud config set project <YOUR_PROJECT_ID>
- शुरू करने के लिए, अपने चालू Google Cloud प्रोजेक्ट के साथ Cloud Spanner पेज पर जाएं
3. स्पैनर की मदद से डेटा तैयार करना
ऐप्लिकेशन बनाने से पहले, Cloud Spanner इंस्टेंस, डेटाबेस, और टेबल बनाकर डेटाबेस सेटअप पूरा करते हैं. Cloud Spanner, डीडीएल, डीएमएल वगैरह के बारे में ज़्यादा जानने के लिए, यह ब्लॉग देखें. इस प्रोजेक्ट के लिए ज़रूरी डेटाबेस ऑब्जेक्ट बनाने के लिए, यह तरीका अपनाएं:
- इंस्टेंस के पेज पर जाकर, 'INSTANCE बनाएं' पर क्लिक करके, कोई इंस्टेंस बनाएं.
- नीचे दी गई इमेज में दिखाई गई जानकारी डालें और 'बनाएं' पर क्लिक करें:
- इंस्टेंस की खास जानकारी देने वाले पेज से बनने के बाद, 'डेटाबेस बनाएं' पर क्लिक करें
- डेटाबेस का नाम "first-spanner-db" के तौर पर दें और डीडीएल टेंप्लेट सेक्शन में जाकर, यहां दिया गया डीडीएल डालें और 'सबमिट करें' पर क्लिक करें:
CREATE TABLE Yoga_Poses(
Pose_Id INT64 NOT NULL,
Name STRING(1024),
Breath STRING(1024),
Description STRING(1024)
) PRIMARY KEY(Pose_Id);
आखिरी चरण के नतीजे के तौर पर डेटाबेस और टेबल बनाई जानी चाहिए. अब Yoga_Poses टेबल में कुछ पंक्तियां जोड़ देते हैं, ताकि हम स्प्रिंग बूट ऐप्लिकेशन बनाने का तरीका जान सकें.
- बाईं ओर मौजूद डेटाबेस पैनल में, Spanner Studio पर क्लिक करें. इसके बाद, एक नया क्वेरी एडिटर टैब खोलें, जैसा कि यहां दी गई इमेज में दिखाया गया है:
- नीचे दी गई INSERT क्वेरी चलाएं:
INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(1, 'STAND', 'INHALE AND EXHALE',
'STAND WITH YOUR FEET HIP WIDTH APART AND ARMS RESTING BY THE SIDES');
INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(2, 'PLANK', 'INHALE OR EXHALE',
'PLANT YOUR TOES AND PALMS ON THE MAT WITH BODY PARALLEL TO THE GROUND');
INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(3, 'SIT', 'INHALE AND EXHALE',
'SIT ON THE FLOOR LEGS CROSSED');
INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(4, 'BEND', 'EXHALE',
'FOLD FORWARD AS YOU STAND, HANDS REACHING TO THE FLOOR');
INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(5, 'PUSH UP', 'EXHALE',
'PLANK WITH ELBOWS ON MAT');
INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(6, 'SEATED FORWARD BEND', 'EXHALE',
'FOLD FORWARD AS YOU SIT, HANDS TRYING TO REACH THE FEET');
INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(7, 'LUNGE', 'EXHALE',
'ONE LEG TO THE FRONT 90 DEGREES TO THE FLOOR AND THE BACK LEG STRAIGHT');
INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(8, 'COURTESY LUNGE', 'INHALE',
'ONE LEG TO THE FRONT 90 DEGREES TO THE FLOOR AND THE BACK KNEE TOUCHING THE FLOOR');
INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(9, 'BANK BEND', 'INHALE',
'STAND WITH ARMS UP AND BODY BENT BACKWARDS, ARCHING YOUR SPINE, LOOKING AT THE SKY');
INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(10, 'BICEP ACTION', 'INHALE AND EXHALE',
'CURL, PRESS AND WORK YOUR BICEPS');
अब हमारा स्पैनर इंस्टेंस, डेटाबेस, टेबल, और डेटा तैयार है और ऐप्लिकेशन के लिए तैयार है.
4. पोज़ डेटा के लिए स्प्रिंग बूट और स्पैनर की मदद से REST API बनाएं
Spring बूट और Google Cloud कंसोल के बारे में जानने के लिए, यह ब्लॉग देखें.
- Spring बूट ऐप्लिकेशन को बूटस्ट्रैप करें इस ऐप्लिकेशन को शुरुआत से बूटस्ट्रैप करने के लिए, इस ब्लॉग को फ़ॉलो करें. रेपो से क्लोन बनाने और गतिविधि शुरू करने के लिए, अपने क्लाउड शेल टर्मिनल में नीचे दिया गया कमांड चलाएं:
git clone https://github.com/AbiramiSukumaran/spanner-springb
इससे आपकी क्लाउड शेल मशीन में प्रोजेक्ट स्प्रिंग-स्प्रिंग बन जाना चाहिए था. ऐप्लिकेशन के कॉम्पोनेंट को समझने के लिए, ब्लॉग देखें.
- ऐप्लिकेशन बनाएं और चलाएं. ऐसा करने के लिए, Cloud Shell टर्मिनल से यहां दिए गए कमांड चलाएं:
cd spanner-springb
./mvnw package
./mvnw spring-boot:run
- ऐप्लिकेशन को Cloud Run में डिप्लॉय करें, ताकि वह पोज़ जनरेटर ऐप्लिकेशन के लिए उपलब्ध हो. ऐसा करने के लिए, क्लाउड शेल टर्मिनल से नीचे दिया गया निर्देश चलाएं:
gcloud run deploy –source .
ज़रूरी पैरामीटर पास करें और पक्का करें कि आपका ऐप्लिकेशन डिप्लॉय हो गया है. जनरेट किया गया सेवा का यूआरएल, स्पैनर में बनाए गए डेटा की सूची में शामिल होना चाहिए.
5. Spring बूट, स्पैनर, और Imagen की मदद से पोज़ जनरेटर ऐप्लिकेशन को बूटस्ट्रैप करें
यहां तक, हमने फ़्लो डायग्राम के सबसे ऊपरी हिस्से को पूरा कर लिया है. इसका मतलब है कि स्पैनर डेटा को सेवा के तौर पर उपलब्ध कराना (REST API). अब एक क्लाइंट ऐप्लिकेशन बनाते हैं, जो स्पैनर डेटा को शुरू करता है, प्रॉम्प्ट के साथ IMAGEN API को कॉल करता है, और यूज़र इंटरफ़ेस में Base64 कोड में बदली गई स्ट्रिंग को इमेज के तौर पर दिखाता है.
- अब तक आपको पता चल गया है कि Spring बूट प्रोजेक्ट की बनावट और इसकी अहमियत क्या है. इसलिए, आपके क्लाउड शेल टर्मिनल में नीचे दिए गए निर्देश को चलाकर, सीधे अपनी क्लाउड शेल मशीन में रेपो की क्लोनिंग पर पहुंचा जा सकता है:
git clone https://github.com/AbiramiSukumaran/genai-posegen
इससे आपकी क्लाउड शेल मशीन में genai-posegen
प्रोजेक्ट बन जाना चाहिए था. क्लोन किए गए प्रोजेक्ट का स्ट्रक्चर, क्लाउड शेल एडिटर में इस तरह दिखता है:
PromptController Java क्लास में, डेटाबेस सर्विस को शुरू करने, बिज़नेस लॉजिक को लागू करने, और Imagen के जनरेटिव एआई एपीआई को शुरू करने की सुविधा भी होती है. यह क्लास, Thymeleaf टेंप्लेट के साथ इंटरैक्ट करती है. टेंप्लेट, यूज़र इंटरफ़ेस में डेटा इंटिग्रेशन का काम करती है. इस क्लास में सेवा के तीन तरीके हैं — 1) प्रॉम्प्ट इनपुट पाने के लिए 2) अनुरोध प्रोसेस करने और Imagen API को शुरू करने के लिए और 3) इमेजिंग रिस्पॉन्स को प्रोसेस करने के लिए.
Prompt और Yoga, POJO क्लास हैं. इनमें फ़ील्ड, गेटर, और सेटर की मदद से Imagen API और Spanner डेटा सर्वर एपीआई का इस्तेमाल किया जाता है.
टेंप्लेट फ़ोल्डर में मौजूद इंडेक्स और getImage एचटीएमएल फ़ाइलों में यूज़र इंटरफ़ेस के लिए टेंप्लेट मौजूद होते हैं. साथ ही, ये फ़ाइलें उनसे जुड़े फ़ोल्डर में JS और css स्क्रिप्ट पर निर्भर करती हैं.
Vertex AI Imagen API इंटिग्रेशन इमेज जनरेट करने के लिए, हम Vertex AI के Imagen API का इस्तेमाल इस फ़ॉर्मैट में कर रहे हैं:
https://<<region>>-
aiplatform.googleapis.com/v1/projects/
<<your-project-id>>/locations/<<region>>/publishers/google/models/imagegeneration:predict
Imagen की सुविधाओं के बारे में ज़्यादा जानने के लिए, यहां क्लिक करें. यह जवाब, Base64 कोड में बदले गए स्ट्रिंग फ़ॉर्मैट में जवाब देता है. इसे इसकी इमेज में बदलने के लिए, हमने इमेज ऑब्जेक्ट पर JavaScript setattribute तरीके (getImage.js फ़ाइल में) का इस्तेमाल किया है. इसका इस्तेमाल getImage.HTML फ़ाइल में किया गया है:
poseImage.setAttribute('src', "data:image/jpg;base64," + baseStr64);
अनुमति देना Imagen API को ऐक्सेस करने के लिए, यह ज़रूरी है कि आपने बियरर टोकन की पुष्टि करने की सुविधा चालू की हो. इस मामले में, मैंने ऐप्लिकेशन डिफ़ॉल्ट क्रेडेंशियल JSON तरीके का इस्तेमाल किया है. इसे लागू करने के लिए, Cloud Shell टर्मिनल से यहां दिए गए कमांड को चलाएं और टर्मिनल में दिए गए निर्देशों का पालन करें:
gcloud auth application-default login
"Y" डालें पर जाएं. ऐक्सेस की अनुमति दें और पॉप-अप में दिखने वाले ऑथराइज़ेशन कोड को कॉपी करें. ऐसा करते ही, आपको JSON फ़ाइल में ऐप्लिकेशन के डिफ़ॉल्ट क्रेडेंशियल मिलेंगे, जो इस तरह की जगह पर सेव होंगे: /tmp/tmp.Fh0Gf4yF0V/application_default_Credentials.json.
cat कमांड (cat /tmp/tmp.Fh0Gf4yF0V/application_default_Credentials.json) चलाकर, फ़ाइल डाउनलोड करें या JSON फ़ाइल का कॉन्टेंट कॉपी करें. इसके बाद, उसका इस्तेमाल PromptController.java क्लास के callImagen() तरीके में ऐप्लिकेशन में करें. पुष्टि करने के बारे में ज़्यादा जानने के लिए, यहां जाएं.
यूज़र इंटरफ़ेस हमने Thymeleaf का इस्तेमाल टेंप्लेट इंजन के तौर पर किया है. इसका इस्तेमाल फ़्रंट एंड टेंप्लेट फ़ाइलों में डेटा को पार्स और रेंडर करने और यूज़र इंटरफ़ेस में शानदार डिज़ाइन जोड़ने के लिए किया जाता है. यह एचटीएमएल की तरह है. हालांकि, रेंडर किए गए डेटा के साथ काम करने के लिए, ज़्यादा एट्रिब्यूट इस्तेमाल किए जा सकते हैं. index.html में लैंडिंग पेज के डिज़ाइन से जुड़े कॉम्पोनेंट शामिल होते हैं और यह उपयोगकर्ता को विषय चुनने और पसंदीदा इमेज जनरेट करने के लिए ओवरराइडिंग प्रॉम्प्ट जोड़ने की अनुमति देता है.
6. बनाएं और डिप्लॉय करें
कोड को क्लोन करने और अपने प्रोजेक्ट, इलाके, और पुष्टि करने के क्रेडेंशियल पर लागू होने वाले प्लेसहोल्डर की वैल्यू बदलने के बाद, अब ऐप्लिकेशन बनाने और डिप्लॉय करने के बारे में बात करते हैं. कमांड और बिल्ड का इस्तेमाल करके, क्लाउड शेल टर्मिनल में प्रोजेक्ट फ़ोल्डर पर जाएं. इसके बाद, एक-एक करके तीन निर्देशों की मदद से, क्लाउड शेल मशीन में जांच के लिए डिप्लॉय करें:
cd genai-posegen
./mvnw package
./mvnw spring-boot:run
ऐप्लिकेशन को Cloud Run में डिप्लॉय करें, ताकि यह क्लाउड पर उपलब्ध हो. ऐसा करने के लिए, प्रोजेक्ट फ़ोल्डर में क्लाउड शेल टर्मिनल से नीचे दिया गया कमांड चलाएं:
gcloud run deploy –source .
ज़रूरी पैरामीटर पास करें और पक्का करें कि आपका ऐप्लिकेशन डिप्लॉय हो गया है.
7. डेमो
ऐप्लिकेशन डिप्लॉय होने के बाद, आपको टर्मिनल में सेवा का यूआरएल दिखेगा. लिंक पर क्लिक करें और पोज़ देने के लिए इमेज जनरेट करने वाला अपना ऐप्लिकेशन, बिना सर्वर के Google Cloud पर चल रहा देखें!
8. व्यवस्थित करें
इस पोस्ट में इस्तेमाल किए गए संसाधनों के लिए, आपके Google Cloud खाते पर शुल्क न लगे, इसके लिए यह तरीका अपनाएं:
- Google Cloud Console में, संसाधन मैनेज करें पेज पर जाएं
- प्रोजेक्ट की सूची में, वह प्रोजेक्ट चुनें जिसे आपको मिटाना है. इसके बाद, 'मिटाएं' पर क्लिक करें
- डायलॉग बॉक्स में, प्रोजेक्ट आईडी टाइप करें. इसके बाद, प्रोजेक्ट मिटाने के लिए 'शट डाउन करें' पर क्लिक करें
- अगर आपको यह प्रोजेक्ट नहीं मिटाना है, तो इस प्रोजेक्ट के लिए अभी बनाए गए इंस्टेंस पर जाकर, स्पैनर इंस्टेंस को मिटाएं. इसके बाद, इंस्टेंस की खास जानकारी देने वाले पेज पर, सबसे ऊपर दाएं कोने में मौजूद, INSTANCE बटन मिटाएं पर क्लिक करें
- इसके अलावा, Cloud Run सेवाएं पेज पर जाकर भी इस प्रोजेक्ट में बनाई गई सेवाएं चुनी जा सकती हैं. इसके बाद, 'मिटाएं' बटन पर क्लिक करके इन सेवाओं को मिटाया जा सकता है.
9. बधाई हो
इस ब्लॉग में, हम फ़ुल स्टैक Spring बूट ऐप्लिकेशन को लाने में सफल रहे हैं. यह ऐप्लिकेशन Cloud Spanner में डेटा को स्टोर और मैनेज करता है. इससे Cloud Run में डिप्लॉय किए गए इंटरैक्टिव क्लाइंट ऐप्लिकेशन में Google Cloud Vertex AI के Imagen API का इस्तेमाल करके पोज़ जनरेट करने में मदद मिलती है. इस ब्लॉग के आर्किटेक्चर डायग्राम सेक्शन में, आपको Cloud Functions (Java) कॉम्पोनेंट दिख रहा है, जो हमें कभी नहीं करना था? अगर आपको योगदान देना है, तो यह बहुत मुश्किल बात है. getimage.html फ़ाइल में मौजूद दो तरीकों को लागू करने के लिए, आप दो Java Cloud Functions लागू कर सकते हैं: पोज़ को डेटाबेस में सेव करें और इमेज के तरीके अपलोड करें. मॉडल के बारे में ज़्यादा जानने के लिए, Vertex AI के दस्तावेज़ में दी गई इमेज देखें.