داده ها به هوش مصنوعی مولد با Spanner و Vertex AI Imagen API

۱. مقدمه

در این آزمایشگاه کد، یک مولد ژست مبتنی بر هوش مصنوعی با استفاده از جاوا، Spring Boot، پایگاه داده Cloud Spanner و API Vertex AI Imagen بسازید. کاربر یک اعلان وارد می‌کند و برنامه بر اساس آن اعلان، یک ژست تولید می‌کند. ما همچنین از داده‌های پایگاه داده Spanner که به عنوان یک API REST ارائه شده است، استفاده خواهیم کرد. این یک روش سرگرم‌کننده و آموزشی برای نشان دادن قابلیت‌های هوش مصنوعی مولد با Spring Boot در Google Cloud است.

لیست سرویس‌های مورد استفاده عبارتند از:

  1. آچار ابری
  2. API تصویر ورتکس هوش مصنوعی
  3. اجرای ابری

نمودار جریان سطح بالا

60192bcbff4c39de.png

آنچه خواهید ساخت

تو خلق خواهی کرد

  • یک برنامه‌ی Spring Boot جاوا برای Spanner data as a service API
  • یک برنامه Java Spring Boot برای مورد استفاده تولید تصویر با استفاده از Imagen
  • رابط کاربری تعاملی برای ورودی و پاسخ سریع

۲. الزامات

  • یک مرورگر، مانند کروم یا فایرفاکس
  • یک پروژه گوگل کلود با قابلیت پرداخت صورتحساب

قبل از اینکه شروع کنی

  1. در کنسول گوگل کلود ، در صفحه انتخاب پروژه، یک پروژه گوگل کلود را انتخاب یا ایجاد کنید
  2. مطمئن شوید که صورتحساب برای پروژه ابری شما فعال است. یاد بگیرید چگونه بررسی کنید که آیا صورتحساب در یک پروژه فعال است یا خیر
  3. مطمئن شوید که تمام APIهای لازم (Cloud Spanner API، Vertex AI API، Cloud Run API، Cloud Functions API) فعال هستند.
  4. شما از Cloud Shell ، یک محیط خط فرمان که در Google Cloud اجرا می‌شود و bq از قبل روی آن بارگذاری شده است، استفاده خواهید کرد. برای دستورات و نحوه استفاده از gcloud به مستندات مراجعه کنید.

از کنسول ابری، روی فعال کردن پوسته ابری در گوشه بالا سمت راست کلیک کنید:

51622c00acec2fa.png

اگر پروژه شما تنظیم نشده است، از دستور زیر برای تنظیم آن استفاده کنید:

gcloud config set project <YOUR_PROJECT_ID>
  1. برای شروع، به صفحه Cloud Spanner با پروژه فعال Google Cloud خود بروید.

۳. آماده‌سازی داده‌ها با Spanner

قبل از ایجاد برنامه، بیایید با ایجاد یک نمونه Cloud Spanner، پایگاه داده و جدول، تنظیمات پایگاه داده را تکمیل کنیم. برای مطالعه جزئیات بیشتر در مورد ویژگی‌های Cloud Spanner، DDL، DML و موارد دیگر، می‌توانید به این وبلاگ مراجعه کنید. می‌توانید مراحل زیر را برای ایجاد اشیاء پایگاه داده مورد نیاز برای این پروژه دنبال کنید:

  1. با کلیک روی CREATE INSTANCE در صفحه نمونه‌ها، یک نمونه ایجاد کنید.
  2. اطلاعات را مطابق تصویر زیر وارد کنید و روی CREATE کلیک کنید:

f869fcbb922027a5.png

  1. پس از ایجاد، از صفحه نمای کلی نمونه، روی ایجاد پایگاه داده کلیک کنید
  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، پایگاه داده، جدول و داده‌های ما ایجاد شده و آماده استفاده در برنامه هستند.

۴. ساخت یک REST API با Spring Boot و Spanner برای داده‌های پوز

برای آشنایی با Spring Boot و کنسول Google Cloud، به این وبلاگ مراجعه کنید.

  1. بوت‌استرپ کردن برنامه Spring Boot برای بوت‌استرپ کردن این برنامه از ابتدا، این وبلاگ را دنبال کنید. برای کلون کردن از مخزن و شروع به کار، فقط دستور زیر را در ترمینال پوسته ابری خود اجرا کنید:
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 را فهرست کند.

۵. یک برنامه تولیدکننده ژست را با Spring Boot، Spanner و Imagen بوت‌استرپ کنید

در این مرحله، بخش بالایی نمودار جریان را تکمیل کرده‌ایم، یعنی داده‌های Spanner را به عنوان یک سرویس (REST API) در دسترس قرار داده‌ایم. حال بیایید یک برنامه کلاینت ایجاد کنیم که داده‌های 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

کلاس جاوای PromptController فراخوانی سرویس پایگاه داده، پیاده‌سازی منطق کسب‌وکار و فراخوانی رابط برنامه‌نویسی کاربردی هوش مصنوعی Imagen را نیز دارد. این کلاس با قالب‌های Thymeleaf که وظیفه ادغام داده‌ها با رابط کاربری را بر عهده دارند، تعامل دارد. در این کلاس ۳ متد سرویس وجود دارد - ۱) برای دریافت ورودی prompt ۲) برای پردازش درخواست و فراخوانی رابط برنامه‌نویسی کاربردی Imagen و ۳) برای پردازش پاسخ imagen.

Prompt و Yoga کلاس‌های POJO هستند که به ترتیب شامل فیلدها، getterها و setterها برای ارتباط با Imagen API و Spanner data server API می‌باشند.

فایل‌های html با نام‌های Index و getImage در پوشه templates حاوی قالب‌های رابط کاربری هستند و وابستگی‌هایی به اسکریپت‌های JS و css در پوشه‌های مربوطه دارند.

ادغام API Imagen با Vertex AI برای مورد استفاده در تولید تصویر، ما از API Imagen مربوط به Vertex AI با فرمت زیر استفاده می‌کنیم:

https://<<region>>- aiplatform.googleapis.com/v1/projects/ <<your-project-id>>/locations/<<region>>/publishers/google/models/imagegeneration:predict

می‌توانید اطلاعات بیشتر در مورد قابلیت‌های Imagen را اینجا بخوانید. این ابزار پاسخ را در قالب رشته کدگذاری شده Base64 برمی‌گرداند. برای تبدیل آن به تصویر، از متد setattribute جاوا اسکریپت (در فایل getImage.js) روی شیء تصویر به صورت زیر در فایل getImage.HTML استفاده کرده‌ایم:

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

مجوزدهی: API مربوط به Imagen برای دسترسی به آن، نیاز به فعال بودن احراز هویت توکن حامل دارد. در مورد ما، من از رویکرد Application Default Credentials 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 را کپی کنید و از آن در برنامه در متد callImagen() از کلاس PromptController.java استفاده کنید. می‌توانید اطلاعات بیشتر در مورد احراز هویت را اینجا بخوانید.

رابط کاربری ما از Thymeleaf به عنوان موتور قالب برای تجزیه و رندر داده‌ها به فایل‌های قالب front end و افزودن طراحی زیبا به رابط کاربری استفاده کرده‌ایم. این موتور شبیه به HTML است اما از ویژگی‌های بیشتری برای کار با داده‌های رندر شده پشتیبانی می‌کند. فایل index.html شامل اجزای طراحی صفحه فرود است و به کاربر اجازه می‌دهد موضوع را انتخاب کند و یک اعلان برجسته برای تولید تصویر مورد نظر اضافه کند.

۶. ساخت و استقرار

حالا که کد را کپی کرده‌اید، مقادیر مربوط به متغیرهای مکان را مطابق با پروژه، منطقه و اعتبارنامه‌های احراز هویت خود جایگزین کرده‌اید، بیایید به سراغ ساخت و استقرار برنامه برویم. با استفاده از دستور زیر به پوشه پروژه در ترمینال پوسته ابری بروید، ساخت را انجام دهید و سپس با استفاده از ۳ دستور زیر، برنامه را به صورت محلی در دستگاه پوسته ابری برای آزمایش مستقر کنید:

cd genai-posegen

./mvnw package

./mvnw spring-boot:run

برنامه را در Cloud Run مستقر کنید تا در فضای ابری در دسترس باشد. برای انجام این کار، دستور زیر را از ترمینال cloud shell در پوشه پروژه اجرا کنید:

gcloud run deploy source .

پارامترهای مورد نیاز را وارد کنید و مطمئن شوید که برنامه شما مستقر شده است.

۷. نسخه آزمایشی

پس از استقرار برنامه، باید URL سرویس را در ترمینال مشاهده کنید. روی لینک کلیک کنید و برنامه تولید تصویر ژست خود را که به صورت بدون سرور در Google Cloud اجرا می‌شود، مشاهده کنید!

92bdb22109b2f756.gif

۸. تمیز کردن

برای جلوگیری از تحمیل هزینه به حساب Google Cloud خود برای منابع استفاده شده در این پست، این مراحل را دنبال کنید:

  1. در کنسول گوگل کلود، به صفحه مدیریت منابع بروید
  2. در لیست پروژه‌ها، پروژه‌ای را که می‌خواهید حذف کنید انتخاب کنید و سپس روی «حذف» کلیک کنید.
  3. در کادر محاوره‌ای، شناسه پروژه را تایپ کنید و سپس برای حذف پروژه، روی خاموش کردن کلیک کنید.
  4. اگر نمی‌خواهید پروژه را حذف کنید، نمونه Spanner را با رفتن به نمونه‌ای که برای این پروژه ایجاد کرده‌اید حذف کنید و روی دکمه DELETE INSTANCE در گوشه سمت راست بالای صفحه نمای کلی نمونه کلیک کنید.
  5. همچنین می‌توانید به صفحه سرویس‌های Cloud Run بروید و سرویس‌های ایجاد شده در این پروژه را انتخاب کرده و روی دکمه حذف کلیک کنید تا سرویس‌ها حذف شوند.

۹. تبریک

در این وبلاگ، ما توانستیم برنامه کامل Spring Boot را که داده‌ها را در Cloud Spanner ذخیره و مدیریت می‌کند، برای تولید پوزها با استفاده از API Imagen مربوط به Google Cloud Vertex AI در یک برنامه کلاینت تعاملی مستقر در Cloud Run، ارائه دهیم. در بخش نمودار معماری این وبلاگ، کامپوننت Cloud Functions (جاوا) را می‌بینید که هرگز نتوانستیم آن را انجام دهیم؟ اگر مایل به مشارکت هستید، می‌توانید آن را دریافت کنید. می‌توانید 2 تابع ابری جاوا را برای انجام 2 روشی که در فایل getimage.html یافت می‌شوند، پیاده‌سازی کنید: روش‌های ذخیره پوز در پایگاه داده و آپلود تصویر. برای کسب اطلاعات بیشتر در مورد مدل، مستندات Imagen on Vertex AI را بررسی کنید.