Imagen को Cloud Run पर डिप्लॉय करना

1. इस कोडलैब (कोड बनाना सीखने के लिए ट्यूटोरियल) के बारे में जानकारी

पिछले अपडेट की तारीख: 11-10-2024

लेखक: लॉरी व्हाइट

इमेज जनरेट करना

लार्ज लैंग्वेज मॉडल (एलएलएम) की मदद से इमेज जनरेट करना मज़ेदार हो सकता है. बेशक, प्रॉम्प्ट से इमेज जनरेट करने के लिए, कारोबार से जुड़े कई ऐप्लिकेशन हैं. इनमें, पसंद के मुताबिक विज्ञापन से लेकर आकर्षक प्रज़ेंटेशन तक शामिल हैं. (Google Cloud की वेबसाइट पर, क्रिएटिव एजेंट का इस्तेमाल करने वाली कंपनियों के लिए कई खास इस्तेमाल हैं.) इसके बावजूद, "खुश हरे कुत्ते, मैदान में" की इमेज मांगने पर मिलने वाले नतीजे देखना काफ़ी मज़ेदार हो सकता है.

भले ही, आपको पेशेवर या मनोरंजन के लिए या दोनों वजहों से इमेज जनरेट करने में दिलचस्पी हो, लेकिन इमेज जनरेट करने वाले प्रोग्राम का इस्तेमाल करने और उसे वेब ऐप्लिकेशन में डिप्लॉय करने में कुछ चुनौतियां आती हैं. इस लैब की मदद से, आपको इन चुनौतियों को हल करने में मदद मिलेगी.

आपको क्या बनाना है

इस कोडलैब में, आपको एक ऐसा ऐप्लिकेशन बनाना होगा जो टेक्स्ट प्रॉम्प्ट लेगा और उस प्रॉम्प्ट का इस्तेमाल करके जनरेट की गई इमेज के साथ एक वेब पेज दिखाएगा.

आपको क्या सीखने को मिलेगा

इस लैब में आपको ये चीज़ें सीखने को मिलेंगी:

  • Google Imagen का इस्तेमाल करके, नोटबुक के माहौल में टेक्स्ट प्रॉम्प्ट से इमेज बनाने का तरीका
  • Imagen कोड को नोटबुक से वेब ऐप्लिकेशन में ले जाने में आने वाली समस्याएं
  • इमेज जनरेट करने के लिए Imagen का इस्तेमाल करने वाले Cloud Run ऐप्लिकेशन को डिप्लॉय करने का तरीका
  • Imagen से मिली इमेज को एचटीएमएल में शामिल करने का तरीका

इस कोडलैब में, Imagen और डिप्लॉयमेंट पर फ़ोकस किया गया है. काम के नहीं लगने वाले कॉन्सेप्ट और कोड ब्लॉक को हटा दिया जाता है. साथ ही, उन्हें कॉपी करके चिपकाया जा सकता है.

आपको किन चीज़ों की ज़रूरत होगी

इस कोडलैब का पूरा कोड https://github.com/Annie29/imagen-deployment पर उपलब्ध है .

2. एपीआई चालू करें

इस कोडलैब के लिए इस्तेमाल करने के लिए कोई प्रोजेक्ट चुनें. काम पूरा होने के बाद, अपने सभी काम को आसानी से हटाने के लिए, एक नया प्रोजेक्ट बनाया जा सकता है.

Imagen का इस्तेमाल शुरू करने से पहले, आपको कुछ एपीआई चालू करने होंगे.

  1. Google Cloud Console पर जाएं.
  2. Vertex AI डैशबोर्ड पर जाएं.
  3. "सुझाए गए सभी एपीआई चालू करें" चुनें

a8f336f7380a9eab.png

3. Google Imagen के बारे में जानकारी (ज़रूरी नहीं)

अगर आपको Imagen के बारे में जानकारी है, तो इस सेक्शन को छोड़ा जा सकता है.

Imagen का इस्तेमाल करने वाला वेब ऐप्लिकेशन बनाने से पहले, यह देखना ज़रूरी है कि Imagen क्या-क्या कर सकता है. ज़रूरी नहीं कि आपने पहले से ही Imagen का इस्तेमाल किया हो. ऐसे में, Imagen का आसान कोड चलाने वाली कई नोटबुक उपलब्ध हैं. इसलिए, इनमें से किसी एक से शुरुआत करें.

  1. https://github.com/GoogleCloudPlatform/generative-ai/blob/main/vision/getting-started/image_generation.ipynb पर जाकर, नोटबुक देखें .
  2. Google के नोटबुक सर्वर में नोटबुक खोलने के लिए, 'Colab में खोलें' चुनें.
  3. इस नोटबुक की अपनी कॉपी बनाने के लिए, "फ़ाइल -> Drive में कॉपी सेव करें" को चुनें या पेज पर सबसे ऊपर मौजूद, "Drive में कॉपी करें" पर क्लिक करें.
  4. ओरिजनल कॉपी बंद करें, ताकि आप गलत कॉपी में काम न करें!
  5. आपको सबसे ऊपर दाईं ओर मौजूद 'कनेक्ट करें' बटन पर क्लिक करके, किसी रनटाइम से कनेक्ट करना होगा. 2afdc8fa660a89bd.png
  6. नोटबुक में मौजूद हर सेल पर काम करना शुरू करें.
  7. किसी सेल को चलाने के लिए, सेल की बाईं ओर मौजूद [] या ऐरो पर क्लिक करें. इसके अलावा, रनटाइम मेन्यू (या इसके शॉर्टकट) से, 'चुनी गई वैल्यू चलाएं' विकल्प का इस्तेमाल करें: dfec032ef6c31296.png
  8. मौजूदा रनटाइम को रीस्टार्ट करने पर, आपको एक मैसेज मिलेगा कि आपका सिस्टम क्रैश हो गया है. घबराओ मत. यह आम बात है.
  9. आपको अपनी नोटबुक के एनवायरमेंट की पुष्टि करनी होगी.
  10. कोड की दाईं ओर मौजूद बॉक्स में, अपने प्रोजेक्ट का आईडी (नाम नहीं) और जगह (अगर आपने कोई जगह सेट नहीं की है, तो us-central1 काम करता है) डाला जा सकता है. इसके बाद, Colab आपके लिए कोड में उन्हें डाल देगा.
  11. "इमेज जनरेट करें" पर जाने पर, आपको यह देखने का मौका मिलेगा कि Imagen क्या कर सकता है. प्रॉम्प्ट बदलने और सेल को फिर से चलाने पर, आपको अलग-अलग तरह की इमेज दिख सकती हैं.
  12. अब आपको यह पता चल गया होगा कि Imagen, नोटबुक से इमेज कैसे बना सकता है. इमेज पैरामीटर के बारे में ज़्यादा जानने के लिए, इस नोटबुक को अभी या किसी भी समय पूरा करें.

4. इमेज दिखाने के लिए वेब ऐप्लिकेशन बनाना

हम अपना ऐप्लिकेशन बनाने के लिए, Cloud Run पर Flask फ़्रेमवर्क का इस्तेमाल करके Python का इस्तेमाल करेंगे.

Python Flask ऐप्लिकेशन को फ़ोल्डर में इस तरह सेट अप किया जाता है:

app-folder
    templates
        template.html
        (etc.)
        anothertemplate.html
    main.py
    requirements.txt

टेंप्लेट, एचटीएमएल वाली फ़ाइलें होती हैं. आम तौर पर, इनमें नाम वाले प्लेसहोल्डर होते हैं, जहां प्रोग्राम जनरेट किया गया टेक्स्ट डालेगा. main.py वेब सर्वर ऐप्लिकेशन है और requirements.txt उन सभी गैर-स्टैंडर्ड लाइब्रेरी की सूची है जिनका इस्तेमाल main.py करता है.

ऐप्लिकेशन में दो पेज होंगे. पहला पेज, प्रॉम्प्ट पाने के लिए और दूसरा पेज, इमेज दिखाने और उपयोगकर्ता को दूसरा प्रॉम्प्ट डालने की अनुमति देने के लिए.

सबसे पहले, प्रोजेक्ट फ़्रेमवर्क बनाएं.

फ़ाइल का स्ट्रक्चर बनाना

इस कोडलैब में यह माना गया है कि आपका प्रोजेक्ट imageapp फ़ोल्डर में है. अगर किसी दूसरे नाम का इस्तेमाल किया जाता है, तो निर्देशों को ज़रूरत के हिसाब से अपडेट करना न भूलें.

स्क्रीन पर सबसे ऊपर दाईं ओर मौजूद प्रॉम्प्ट आइकॉन को चुनकर, Cloud Shell में जाएं.

28135f700c5b12b0.png

शेल विंडो के सबसे ऊपर मौजूद ऐरो का इस्तेमाल करके, शेल को नए टैब में ले जाकर, काम करने के लिए ज़्यादा जगह मिल सकती है:

310422ac131813e1.png

Cloud Shell में अपनी होम डायरेक्ट्री से, imageapp फ़ोल्डर बनाएं. इसके बाद, उसमें जाकर templates फ़ोल्डर बनाएं. ऐसा करने के लिए, कमांड लाइन या Cloud Shell एडिटर का इस्तेमाल किया जा सकता है.

टेंप्लेट बनाना

ऐप्लिकेशन में दो पेज होंगे. पहला पेज (जिसे हम home.html कहेंगे) प्रॉम्प्ट पाने के लिए होगा और दूसरा पेज (जिसे हम display.html कहेंगे) इमेज दिखाने और उपयोगकर्ता को दूसरा प्रॉम्प्ट डालने की अनुमति देने के लिए होगा.

Cloud Shell एडिटर या अपनी पसंद के Linux एडिटर का इस्तेमाल करके, दो टेंप्लेट बनाएं. imageapp/templates फ़ोल्डर में, उपयोगकर्ता को दिखने वाला शुरुआती पेज, home.html बनाएं. यह उपयोगकर्ता की ओर से डाली गई जानकारी दिखाने के लिए, वैरिएबल prompt का इस्तेमाल करता है.

templates/home.html

<!DOCTYPE html>
<html>
   <head>
       <title>Let's draw a picture</title>
   </head>
   <body>
       <h1>Let's draw a picture</h1>
       <form  action="/" method="post" >
           <input type="text" id="prompt" name="prompt">
           <input type="submit" value="Send">
       </form>
   </body>
</html>

इसके बाद, display.html बनाएं, जो इमेज दिखाएगा. ध्यान दें कि इमेज की जगह image_url में होगी.

templates/display.html

<!DOCTYPE html>
<html>
   <head>
       <title>Let's draw a picture</title>
   </head>
   <body>
       <h1>Let's draw a picture</h1>

       <div>
           <form  action="/" method="post" >
               <input type="text" id="prompt" name="prompt">
               <input type="submit" value="Send">
           </form>

           <p></p>
       </div>

       <div id="picture">
           <img id="pict" name="pict" alt="The created image" src="{{image_uri}}" style="width:100%;">
       </div>

   </body>
</html>

5. कोड शुरू करना

आपको requirements.txt फ़ाइल बनानी होगी, ताकि यह पक्का किया जा सके कि आपके प्रोग्राम के लिए ज़रूरी सभी लाइब्रेरी उपलब्ध हैं. फ़िलहाल, सिर्फ़ requirements.txt फ़ाइल में flask शामिल करें.

main.py फ़ाइल में वह कोड होता है जो वेब अनुरोधों को पूरा करता है. हमें सिर्फ़ दो अनुरोधों को मैनेज करना है: होम पेज के लिए GET अनुरोध और POST अनुरोध, जिसमें उस इमेज के बारे में जानकारी देने वाला फ़ॉर्म सबमिट किया गया है जिसे जनरेट करना है.

अपनी पसंद के Cloud Shell एडिटर या Linux एडिटर का इस्तेमाल करके, imageapp फ़ोल्डर में main.py फ़ाइल बनाएं. हम नीचे दिए गए स्केलेटन से शुरुआत करेंगे:

main.py

import flask

app = flask.Flask(__name__)

@app.route("/", methods=["GET"])
def home_page():
    return flask.render_template("home.html")

@app.route("/", methods=["POST"])
def display_image():
    # Code to get the prompt (called prompt) from the submitted form
    # Code to generate the image
    # Code to create a URL for the image (called image_url)

    return flask.render_template("display.html", prompt=prompt, image_url=image_url)

# Initialize the web server app when the code locally (Cloud Run handles it in that environment)
if __name__ == "__main__":
    app.run(debug=True, host="0.0.0.0", port=8080)

असल में, यह पूरा ऐप्लिकेशन है. display_image में तीन टिप्पणियां हैं, जिन्हें Python कोड के साथ पूरा करना होगा. इसके बाद, ऐप्लिकेशन तैयार हो जाएगा.

आइए, उन खाली जगहों को भरना शुरू करते हैं. Flask की मदद से, प्रॉम्प्ट को आसानी से वापस पाया जा सकता है. टिप्पणी के बाद एक लाइन जोड़ें, जैसा कि यहां दिखाया गया है:

# Code to get the prompt (called prompt) from the submitted form
prompt = flask.request.form["prompt"]

अगर आपको अभी ऐप्लिकेशन की जांच करनी है, तो display_image में return स्टेटमेंट से पहले एक लाइन जोड़ें. इससे, image_url (इमेज पर ले जाने वाला मान्य यूआरएल) को वैल्यू दी जा सकती है.

उदाहरण के लिए: image_url="<your url here>"

python main.py कमांड का इस्तेमाल करके, Cloud Shell से प्रोग्राम को स्थानीय तौर पर चलाया जा सकता है. साथ ही, स्क्रीन पर सबसे ऊपर दाईं ओर मौजूद पोर्ट 8080 पर झलक देखी जा सकती है.

a80b4abd28cb7eed.png

फ़िलहाल, आपको हमेशा उस यूआरएल में इमेज दिखेगी जिसे आपने दिया है. अब आगे बढ़ते हैं और देखते हैं कि ऐप्लिकेशन से वह वैल्यू कैसे पाई जाती है. image_url को स्टैटिक वैल्यू देने वाली लाइन को ज़रूर हटाएं.

6. इमेज बनाना

Google Cloud में, Vertex AI पर जनरेटिव एआई के लिए Python API है. इसका इस्तेमाल करने के लिए, हमें अपने प्रोग्राम में सबसे ऊपर मौजूद अन्य इंपोर्ट के साथ, इसे इंपोर्ट करने वाली लाइन जोड़नी होगी:

from vertexai.vision_models import ImageGenerationModel

और requirements.txt फ़ाइल में vertexai शामिल करें.

ImageGenerationModel के दस्तावेज़ में, इसका इस्तेमाल करने का तरीका बताया गया है. हम एक मॉडल बनाएंगे और फिर किसी प्रॉम्प्ट के आधार पर उससे इमेज जनरेट करेंगे. दूसरे चरण के लिए main.py में कोड जोड़ें, इमेज बनाएं, और उसे response में सेव करें:

# Code to generate the image
model = ImageGenerationModel.from_pretrained("imagegeneration@006")
response = model.generate_images(prompt=prompt)[0]

generate_images को भेजे गए पैरामीटर के आधार पर, एक बार में चार इमेज बनाई जा सकती हैं. इसलिए, लौटाई गई वैल्यू GeneratedImage की सूची होगी. भले ही, इस मामले में सिर्फ़ एक इमेज लौटाई गई हो.

अब हमें इमेज को WWW पेज पर दिखाना है. GeneratedImage में इमेज को show करने का एक तरीका है, लेकिन यह सिर्फ़ नोटबुक वाले एनवायरमेंट में काम करता है. हालांकि, इमेज को सेव करने का एक तरीका है. टेंप्लेट रेंडर करते समय, हम इमेज को सेव कर देंगे और सेव की गई इमेज का यूआरएल भेज देंगे.

यह थोड़ा मुश्किल है और इसे करने के कई तरीके हैं. आइए, सिलसिलेवार तरीके से आसान तरीकों के बारे में जानें. (अगर आपको देखकर सीखने में ज़्यादा आसानी होती है, तो नीचे दिए गए चरणों की इमेज देखें.)

सबसे पहले, हमें इमेज सेव करनी होगी. लेकिन इसका नाम क्या होगा? स्टैटिक नाम का इस्तेमाल करने से समस्याएं आ सकती हैं, क्योंकि एक ही समय में कई लोग इस प्रोग्राम का इस्तेमाल कर सकते हैं. हम हर उपयोगकर्ता के लिए, यूयूआईडी जैसी किसी चीज़ की मदद से अलग-अलग इमेज के नाम बना सकते हैं. हालांकि, Python की tempfile लाइब्रेरी का इस्तेमाल करना आसान है. इससे, यूनीक नाम वाली एक अस्थायी फ़ाइल बन जाएगी. नीचे दिया गया कोड, एक टेम्पफ़ाइल बनाएगा, उसका नाम लेगा, और इमेज जनरेट करने के चरण का जवाब टेम्पफ़ाइल में लिखेगा. हम इसे अभी अपने कोड में नहीं डालेंगे, क्योंकि हमें पहले एक यूआरएल चाहिए.

with tempfile.NamedTemporaryFile("wb") as f:
    filename = f.name
    response.save(filename, include_generation_parameters=False)
    # process the saved file here, before it goes away

सेव की गई फ़ाइल को प्रोसेस करने के कई तरीके हैं. हालांकि, डेटा यूआरएल का इस्तेमाल करना सबसे आसान और सुरक्षित तरीका है.

डेटा यूआरएल की मदद से, यूआरएल में असल डेटा भेजा जा सकता है, न कि सिर्फ़ उसका पाथ. डेटा यूआरएल का सिंटैक्स यह है:

data:[image/png][;base64],<data>

इमेज का Base64 कोड पाने के लिए, हमें tempfile से सेव की गई फ़ाइल को खोलना होगा और उसे वैरिएबल में पढ़ना होगा. हां, यह एक बड़ी स्ट्रिंग होगी, लेकिन आधुनिक ब्राउज़र और सर्वर के साथ काम करेगी. इसके बाद, हम base64 लाइब्रेरी का इस्तेमाल करके, उस डेटा को एक स्ट्रिंग में बदल देंगे, ताकि उसे डेटा यूआरएल में भेजा जा सके.

तीसरा चरण (यूआरएल बनाना) पूरा करने के लिए, हमारा फ़ाइनल कोड यह होगा:

# Code to create a URL for the image (called image_url)
with tempfile.NamedTemporaryFile("wb") as f:
    filename = f.name
    response.save(filename, include_generation_parameters=False)
    # process the saved file here, before it goes away
    with open(filename, "rb") as image_file:
        binary_image = image_file.read()
        base64_image = base64.b64encode(binary_image).decode("utf-8")
        image_url = f"data:image/png;base64,{base64_image}"

इन सभी चरणों को नीचे दी गई इमेज में देखा जा सकता है:

268876579dc02376.png

आपको अपने प्रोग्राम की शुरुआत में, tempfile और base64 इंपोर्ट करने होंगे.

import tempfile
import base64

Cloud Shell से अपना प्रोग्राम चलाने की कोशिश करें. इसके लिए, पक्का करें कि आप main.py वाले फ़ोल्डर में हों और यह कमांड चलाएं:

python main.py

इसके बाद, स्क्रीन पर सबसे ऊपर दाईं ओर मौजूद, पोर्ट 8080 पर झलक देखें का इस्तेमाल करके, इसकी झलक देखी जा सकती है.

a80b4abd28cb7eed.png

7. एक सामान्य गड़बड़ी

कभी-कभी, आपको प्रोग्राम को चलाते समय (टेस्टिंग के दौरान या उसे डिप्लॉय करने के बाद), ऐसा मैसेज मिल सकता है:

2366c3bba6273517.png

ऐसा होने की सबसे ज़्यादा संभावना, Google के एआई की मदद से, ज़िम्मेदारी के साथ डेटा इस्तेमाल करने के तरीकों का उल्लंघन करने वाले प्रॉम्प्ट की वजह से होती है . "बिल्लियां रंग-बिरंगी गेंदों से खेल रही हैं" जैसे आसान प्रॉम्प्ट से भी यह समस्या हो सकती है. (हालांकि, आपको "बिल्ली के बच्चों को रंग-बिरंगे खिलौनों से खेलते हुए" दिखाने वाली इमेज मिल सकती हैं.)

इस गड़बड़ी को ठीक करने के लिए, हम कोड जोड़ेंगे, ताकि इमेज जनरेट करने की कोशिश करते समय, उस अपवाद को पकड़ा जा सके. अगर कोई गड़बड़ी है, तो हम home.html टेंप्लेट को फिर से रेंडर करेंगे. साथ ही, एक मैसेज भी दिखाएंगे.

सबसे पहले, home.html टेंप्लेट में पहले फ़ॉर्म के बाद एक डिव जोड़ें. यह डिव, गड़बड़ी होने पर दिखेगा:

<!DOCTYPE html>
<html>
   <head>
       <title>Let's draw a picture</title>
   </head>
   <body>
       <h1>Let's draw a picture</h1>
       <form  action="/" method="post" >
           <input type="text" id="prompt" name="prompt">
           <input type="submit" value="Send">
       </form>
       {% if mistake %}
       <div id="warning">
       The prompt contains sensitive words that violate
       <a href=\"https://ai.google/responsibility/responsible-ai-practices\">
           Google's Responsible AI practices</a>.
       Try rephrasing the prompt."</div>

       {% endif %}

   </body>
</html>

इसके बाद, display_image में generate_images कोड को कॉल करते समय, किसी संभावित अपवाद को पकड़ने के लिए main.py में कोड जोड़ें. अगर कोई अपवाद है, तो कोड home.html टेंप्लेट को मैसेज के साथ रेंडर करेगा.

# Code to generate the image
   model = ImageGenerationModel.from_pretrained("imagegeneration@006")
   try:
       response = model.generate_images(prompt=prompt)[0]   
   except:
       #  This is probably due to a questionable prompt
       return flask.render_template("home.html", warning=True)

ज़िम्मेदार एआई की यह सुविधा, Imagen की एकमात्र सुविधा नहीं है. ऐसी कई सुविधाएं हैं जो लोगों और बच्चों की निजता को सुरक्षित रखती हैं. साथ ही, इमेज पर सामान्य फ़िल्टर भी लगाती हैं. इनके बारे में ज़्यादा जानने के लिए यहां जाएं.

8. ऐप्लिकेशन को वेब पर डिप्लॉय करना

Cloud Shell में imageapp फ़ोल्डर से कमांड का इस्तेमाल करके, ऐप्लिकेशन को वेब पर डिप्लॉय किया जा सकता है. कमांड में अपने असली प्रोजेक्ट आईडी का इस्तेमाल करना न भूलें.

gcloud run deploy imageapp \
  --source . \
  --region us-central1 \
  --allow-unauthenticated \
  --project your-project-id

आपको इस तरह का जवाब दिखेगा, जिसमें बताया जाएगा कि आपका आवेदन कहां मिलेगा:

Service [imageapp] revision [imageapp-00001-t48] has been deployed and is serving 100 percent of traffic.
Service URL: https://imageapp-708208532564.us-central1.run.app```

9. क्लीनअप करना

Cloud Run का इस्तेमाल न होने पर, आपसे कोई शुल्क नहीं लिया जाता. हालांकि, Artifact Registry में कंटेनर इमेज को सेव करने के लिए, आपसे शुल्क लिया जा सकता है. शुल्क से बचने के लिए, अपनी रिपॉज़िटरी या Cloud प्रोजेक्ट को मिटाया जा सकता है. Cloud प्रोजेक्ट मिटाने पर, उस प्रोजेक्ट में इस्तेमाल किए गए सभी संसाधनों के लिए बिलिंग बंद हो जाती है.

कंटेनर इमेज का रिपॉज़िटरी मिटाने के लिए:

gcloud artifacts repositories delete cloud-run-source-deploy \
  --location $REGION

अपनी Cloud Run सेवा मिटाने के लिए:

gcloud run services delete imageapp \
  --platform managed \
  --region $REGION

अपना Google Cloud प्रोजेक्ट मिटाने के लिए:

  1. अपना मौजूदा प्रोजेक्ट आईडी पाएं:
PROJECT_ID=$(gcloud config get-value core/project)
  1. पक्का करें कि यह वही प्रोजेक्ट है जिसे आपको मिटाना है:
echo $PROJECT_ID
  1. प्रोजेक्ट मिटाएं:
gcloud projects delete $PROJECT_ID

10. बधाई हो

बधाई हो, आपने एक वेब ऐप्लिकेशन बना लिया है. यह ऐप्लिकेशन, Imagen से जनरेट की गई इमेज दिखाएगा. अपने ऐप्लिकेशन में इसका इस्तेमाल कैसे किया जा सकता है?

आगे क्या करना है?

इन कोडलैब को देखें...

इसके बारे में और पढ़ें