נתונים לבינה מלאכותית גנרטיבית באמצעות Spanner ו-Vertex AI Imagen API

1. מבוא

ב-Codelab הזה נסביר איך ליצור גנרטור תנוחות מבוסס-AI באמצעות Java,‏ Spring Boot, מסד נתונים של Cloud Spanner ו-Vertex AI Imagen API. המשתמש יזין הנחיה, והאפליקציה תיצור תנוחה על סמך ההנחיה הזו. נשתמש גם בנתונים ממסד הנתונים של Spanner שנחשף כ-API בארכיטקטורת REST. זו דרך כיפית וחינוכית להדגים את היכולות של AI גנרטיבי עם Spring Boot ב-Google Cloud.

רשימת השירותים שנעשה בהם שימוש:

  1. Cloud Spanner
  2. Vertex AI Imagen API
  3. Cloud Run

תרשים זרימה ברמה גבוהה

60192bcbff4c39de.png

מה תפַתחו

תצרו

  • אפליקציית Java Spring Boot ל-Spanner data as a service API
  • אפליקציית Java Spring Boot לתרחיש לדוגמה של יצירת תמונות באמצעות Imagen
  • ממשק משתמש אינטראקטיבי לקלט של ההנחיה ולתגובה

2. דרישות

  • דפדפן, כמו Chrome או Firefox
  • פרויקט ב-Google Cloud שהחיוב בו מופעל

לפני שמתחילים

  1. ב-מסוף Google Cloud, בדף לבחירת הפרויקט, בוחרים או יוצרים פרויקט ב-Google Cloud.
  2. הקפידו לוודא שהחיוב מופעל בפרויקט שלכם ב-Cloud. כך בודקים אם החיוב מופעל בפרויקט
  3. מוודאים שכל ממשקי ה-API הנדרשים (Cloud Spanner API, ‏ Vertex AI API, ‏ Cloud Run API, ‏ Cloud Functions API) מופעלים.
  4. תשתמשו ב-Cloud Shell, סביבת שורת פקודה שפועלת ב-Google Cloud וכוללת את bq. אפשר לעיין במאמרי העזרה בנושא פקודות gcloud ושימוש בהן.

בפינה הימנית העליונה של Cloud Console, לוחצים על 'הפעלת Cloud Shell':

51622c00acec2fa.png

אם הפרויקט לא מוגדר, משתמשים בפקודה הבאה כדי להגדיר אותו:

gcloud config set project <YOUR_PROJECT_ID>
  1. כדי להתחיל, עוברים לדף Cloud Spanner עם הפרויקט הפעיל ב-Google Cloud.

3. הכנת נתונים באמצעות Spanner

לפני שיוצרים את האפליקציה, צריך להשלים את הגדרת מסד הנתונים על ידי יצירת מופע, מסד נתונים וטבלה של Cloud Spanner. בבלוג הזה אפשר לקרוא מידע נוסף ומפורט על התכונות של Cloud Spanner, על DDL, על DML ועוד. כדי ליצור את אובייקטי מסד הנתונים שנדרשים לפרויקט הזה, פועלים לפי השלבים הבאים:

  1. כדי ליצור מכונה, לוחצים על CREATE INSTANCE (יצירת מכונה) בדף המכונות.
  2. מזינים את הפרטים כמו שמוצג בתמונה הבאה ולוחצים על CREATE (יצירה):

f869fcbb922027a5.png

  1. אחרי שיוצרים את המכונה, בדף הסקירה הכללית של המכונה לוחצים על CREATE DATABASE (יצירת מסד נתונים).
  2. מזינים את שם מסד הנתונים בתור first-spanner-db, מזינים את ה-DDL הבא בקטע DDL TEMPLATES ולוחצים על SUBMIT:
CREATE TABLE Yoga_Poses(
  Pose_Id   INT64 NOT NULL,
  Name  STRING(1024),
  Breath STRING(1024),
  Description STRING(1024)
) PRIMARY KEY(Pose_Id);

מסד הנתונים והטבלה אמורים להיווצר כתוצאה מהשלב האחרון. עכשיו נוסיף כמה שורות לטבלה Yoga_Poses כדי שנוכל להתחיל לבנות את אפליקציית Spring Boot.

  1. לוחצים על Spanner Studio בחלונית Database (מסד נתונים) בצד ימין ופותחים כרטיסייה חדשה של עורך שאילתות, כמו שמוצג בתמונה שלמטה:

c86774e8fd32eca0.png

  1. מריצים את שאילתות ה-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');

עכשיו יש לנו את המופע, מסד הנתונים, הטבלה והנתונים של Spanner שנוצרו ומוכנים לשימוש באפליקציה.

4. יצירת API בארכיטקטורת REST באמצעות Spring Boot ו-Spanner לנתוני תנוחות

כדי להכיר את Spring Boot ואת מסוף Google Cloud, כדאי לעיין בבלוג הזה.

  1. אתחול אפליקציית Spring Boot כדי לאתחל את האפליקציה הזו מאפס, פועלים לפי ההוראות בבלוג הזה. כדי לשכפל ממאגר ולהתחיל לפעול, פשוט מריצים את הפקודה הבאה בטרמינל של Cloud Shell:
git clone https://github.com/AbiramiSukumaran/spanner-springb

הפעולה הזו אמורה ליצור את הפרויקט spanner-springb במכונת Cloud Shell. כדי להבין את הרכיבים של האפליקציה, אפשר לעיין בבלוג.

  1. כדי ליצור ולהריץ את האפליקציה, מריצים את הפקודות הבאות מטרמינל Cloud Shell:
cd spanner-springb

./mvnw package

./mvnw spring-boot:run
  1. פורסים את האפליקציה ב-Cloud Run כדי שהיא תהיה זמינה לאפליקציה ליצירת תנוחות. כדי לעשות זאת, מריצים את הפקודה הבאה מטרמינל Cloud Shell:
gcloud run deploy source .

מעבירים את הפרמטרים הנדרשים ומוודאים שהאפליקציה נפרסה. כתובת ה-URL של השירות שנוצרה צריכה לאפשר הצגה של הנתונים שנוצרו ב-Spanner.

5. Bootstrap a pose generator app with Spring Boot, Spanner and Imagen

בשלב הזה, סיימנו את החלק העליון של תרשים הזרימה, כלומר, הנתונים ב-Spanner זמינים כשירות (API בארכיטקטורת REST). עכשיו ניצור אפליקציית לקוח שמפעילה את נתוני Spanner, קוראת ל-Imagen API עם הנחיה ומחזירה את המחרוזת המקודדת ב-Base64 כתמונה לממשק המשתמש.

  1. עד עכשיו כבר למדתם על מבנה הפרויקט של Spring Boot ועל החשיבות שלו. כדי לשכפל את המאגר ישירות למכונת Cloud Shell, מריצים את הפקודה הבאה במסוף Cloud Shell:
git clone https://github.com/AbiramiSukumaran/genai-posegen

הפעולה הזו אמורה ליצור את הפרויקט genai-posegen במכונת Cloud Shell. מבנה הפרויקט המשוכפל מוצג כך בכלי העריכה של Cloud Shell:

b19a94f895f74c62.png

במחלקת Java‏ PromptController יש קריאה לשירות מסד הנתונים, הטמעה של הלוגיקה העסקית וקריאה ל-API של ה-AI הגנרטיבי של Imagen. המחלקות האלה פועלות עם תבניות Thymeleaf שמטפלות בשילוב נתונים בממשק המשתמש. יש 3 שיטות שירות במחלקה הזו – 1) לקבלת קלט ההנחיה 2) לעיבוד הבקשה ולהפעלת Imagen API ו-3) לעיבוד התגובה של Imagen.

Prompt ו-Yoga הם מחלקות POJO שמכילות את השדות, את שיטות ה-getter ואת שיטות ה-setter לצורך אינטראקציה עם Imagen API ועם Spanner data server API בהתאמה.

קובצי ה-HTML של Index ו-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. כדי להמיר אותו לתמונה, השתמשנו בשיטה setattribute של JavaScript (בקובץ getImage.js) באובייקט התמונה באופן הבא בקובץ getImage.HTML:

poseImage.setAttribute('src', "data:image/jpg;base64," + baseStr64);

הרשאה כדי לגשת ל-Imagen API, צריך להפעיל אימות באמצעות אסימון bearer. במקרה שלנו, השתמשתי בגישת ה-JSON של Application Default Credentials. כדי להטמיע את התכונה, מריצים את הפקודה הבאה ממסוף Cloud Shell ופועלים לפי ההוראות שמופיעות במסוף:

gcloud auth application-default login

מזינים Y כדי לבצע אימות באמצעות החשבון. מאשרים את הגישה ומעתיקים את קוד ההרשאה שמופיע בחלון הקופץ. מיד לאחר מכן, תקבלו את פרטי הכניסה שמוגדרים כברירת מחדל לאפליקציה בקובץ JSON שנשמר במיקום שדומה לזה: /tmp/tmp.Fh0Gf4yF0V/application_default_credentials.json.

מורידים את הקובץ או מעתיקים את התוכן של קובץ ה-JSON על ידי הרצת הפקודה cat ‏ (cat /tmp/tmp.Fh0Gf4yF0V/application_default_credentials.json) ומשתמשים בו באפליקציה בשיטה callImagen() של המחלקה PromptController.java. מידע נוסף על אימות זמין כאן.

ממשק משתמש השתמשנו ב-Thymeleaf כמנוע התבניות כדי לנתח ולעבד נתונים בקבצי התבניות של ממשק הקצה, וכדי להוסיף עיצוב אלגנטי לממשק המשתמש. הוא דומה ל-HTML אבל תומך ביותר מאפיינים לעבודה עם נתונים שעברו עיבוד. הקובץ index.html מכיל את רכיבי העיצוב של דף הנחיתה, והוא מאפשר למשתמש לבחור את הנושא ולהוסיף הנחיה לביטול כדי ליצור את התמונה הרצויה.

6. פיתוח ופריסה

אחרי ששיבטתם את הקוד והחלפתם את ערכי ה-placeholder בהתאם לפרויקט, לאזור ולפרטי האימות, אפשר להמשיך לבנייה ולפריסה של האפליקציה. עוברים לתיקיית הפרויקט במסוף Cloud Shell באמצעות הפקודה, מבצעים את ה-build ואז פורסים לבדיקה באופן מקומי במכונת Cloud Shell באמצעות 3 הפקודות הבאות, אחת אחרי השנייה:

cd genai-posegen

./mvnw package

./mvnw spring-boot:run

פורסים את האפליקציה ב-Cloud Run כדי שהיא תהיה זמינה בענן. כדי לעשות את זה, מריצים את הפקודה הבאה מטרמינל Cloud Shell בתוך תיקיית הפרויקט:

gcloud run deploy source .

מעבירים את הפרמטרים הנדרשים ומוודאים שהאפליקציה נפרסה.

7. הדגמה (דמו)

אחרי פריסת האפליקציה, כתובת ה-URL של השירות אמורה להופיע במסוף. לוחצים על הקישור ורואים את האפליקציה ליצירת תמונות בתנוחה פועלת ב-Google Cloud ללא שרתים.

92bdb22109b2f756.gif

8. הסרת המשאבים

כדי לא לצבור חיובים לחשבון Google Cloud על המשאבים שבהם השתמשתם במאמר הזה:

  1. במסוף Google Cloud, עוברים לדף Manage resources.
  2. ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על סמל המחיקה.
  3. כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.
  4. אם לא רוצים למחוק את הפרויקט, צריך למחוק את מופע Spanner. כדי לעשות את זה, עוברים למופע שיצרתם לפרויקט ולוחצים על הלחצן DELETE INSTANCE (מחיקת המופע) בפינה השמאלית העליונה של דף סקירה כללית של המופע.
  5. אפשר גם לעבור לדף השירותים של Cloud Run, לבחור את השירותים שנוצרו בפרויקט הזה וללחוץ על לחצן המחיקה כדי למחוק את השירותים.

9. מזל טוב

בבלוג הזה הצלחנו להביא את אפליקציית Spring Boot המלאה שמאחסנת ומטפלת בנתונים ב-Cloud Spanner, כדי ליצור תנוחות באמצעות Imagen API של Google Cloud Vertex AI באפליקציית לקוח אינטראקטיבית שנפרסה ב-Cloud Run. בקטע של תרשים הארכיטקטורה בבלוג הזה, אפשר לראות את הרכיב Cloud Functions (Java) שלא הגענו אליו. אם רוצים לתרום, אפשר לקחת את המשימה הזו. אפשר להטמיע 2 פונקציות Java Cloud כדי לבצע את 2 השיטות שמופיעות בקובץ getimage.html: שיטות לשמירת התנוחה במסד הנתונים ולהעלאת התמונה. מידע נוסף על המודל זמין במסמכי Imagen ב-Vertex AI.