बिना सर्वर वाला एआई: Cloud Run के साथ EmbeddingGemma का इस्तेमाल करना

1. परिचय

इस कोडलैब में, आपको EmbeddingGemma को डिप्लॉय करने का तरीका बताया जाएगा. यह कई भाषाओं में टेक्स्ट एम्बेड करने वाला एक बेहतरीन मॉडल है. इसे Cloud Run पर, जीपीयू का इस्तेमाल करके डिप्लॉय किया जा सकता है. इसके बाद, इस डिप्लॉय की गई सेवा का इस्तेमाल, सिमैंटिक सर्च ऐप्लिकेशन के लिए एम्बेडिंग जनरेट करने के लिए किया जाएगा.

टेक्स्ट जनरेट करने वाले पारंपरिक लार्ज लैंग्वेज मॉडल (एलएलएम) के उलट, एम्बेडिंग मॉडल टेक्स्ट को संख्यात्मक वेक्टर में बदलते हैं. ये वेक्टर, रीट्रिवल-ऑगमेंटेड जनरेशन (आरएजी) सिस्टम बनाने के लिए ज़रूरी हैं. इनकी मदद से, किसी उपयोगकर्ता की क्वेरी के लिए सबसे काम के दस्तावेज़ ढूंढे जा सकते हैं.

आपको क्या करना होगा

  • Ollama का इस्तेमाल करके, EmbeddingGemma मॉडल को कंटेनर में रखें.
  • कंटेनर को जीपीयू ऐक्सेलरेटर के साथ Cloud Run पर डिप्लॉय करें.
  • सैंपल टेक्स्ट के लिए एम्बेडिंग जनरेट करके, डिप्लॉय किए गए मॉडल की जांच करें.
  • तैनात की गई सेवा का इस्तेमाल करके, सेमैंटिक सर्च का हल्का सिस्टम बनाएं.

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

  • बिलिंग की सुविधा वाला Google Cloud प्रोजेक्ट.
  • आपको Docker और कमांड लाइन के बारे में बुनियादी जानकारी होनी चाहिए.

2. शुरू करने से पहले

प्रोजेक्ट सेटअप करना

  1. अगर आपके पास पहले से कोई Google खाता नहीं है, तो आपको Google खाता बनाना होगा.
    • ऑफ़िस या स्कूल वाले खाते के बजाय, निजी खाते का इस्तेमाल करें. ऑफ़िस और स्कूल वाले खातों पर कुछ पाबंदियां हो सकती हैं. इनकी वजह से, इस लैब के लिए ज़रूरी एपीआई चालू नहीं किए जा सकते.
  2. Google Cloud Console में साइन इन करें.
  3. Cloud Console में बिलिंग चालू करें.
    • इस लैब को पूरा करने में, Cloud संसाधनों पर 1 डॉलर से कम का खर्च आना चाहिए.
    • ज़्यादा शुल्क से बचने के लिए, इस लैब के आखिर में दिए गए निर्देशों का पालन करके संसाधनों को मिटाया जा सकता है.
    • नए उपयोगकर्ता, 300 डॉलर के मुफ़्त में आज़माने की सुविधा का फ़ायदा पा सकते हैं.
  4. नया प्रोजेक्ट बनाएं या किसी मौजूदा प्रोजेक्ट का फिर से इस्तेमाल करें.
    • अगर आपको प्रोजेक्ट के कोटे से जुड़ी कोई गड़बड़ी दिखती है, तो किसी मौजूदा प्रोजेक्ट का फिर से इस्तेमाल करें या नया प्रोजेक्ट बनाने के लिए किसी मौजूदा प्रोजेक्ट को मिटाएं.

Cloud Shell शुरू करना

Cloud Shell, Google Cloud में चलने वाला एक कमांड-लाइन एनवायरमेंट है. इसमें ज़रूरी टूल पहले से लोड होते हैं.

  1. Google Cloud कंसोल में सबसे ऊपर मौजूद, Cloud Shell चालू करें पर क्लिक करें.
  2. Cloud Shell से कनेक्ट होने के बाद, अपने क्रेडेंशियल की पुष्टि करें:
    gcloud auth list
    
  3. पुष्टि करें कि आपका प्रोजेक्ट चुना गया है:
    gcloud config get project
    
  4. अगर ज़रूरी हो, तो इसे सेट करें:
    gcloud config set project <YOUR_PROJECT_ID>
    

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

सभी ज़रूरी एपीआई चालू करने के लिए, यह निर्देश चलाएं:

gcloud services enable \
  run.googleapis.com \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com

3. मॉडल को कंटेनर में बदलना

EmbeddingGemma को सर्वरलेस तरीके से चलाने के लिए, हमें इसे कंटेनर में पैकेज करना होगा. हम एलएलएम को चलाने के लिए, हल्के-फुल्के फ़्रेमवर्क Ollama और Docker का इस्तेमाल करेंगे.

Dockerfile बनाना

Cloud Shell में, अपने प्रोजेक्ट के लिए एक नई डायरेक्ट्री बनाएं और उसमें जाएं:

mkdir embedding-gemma-codelab
cd embedding-gemma-codelab

यहां दिए गए कॉन्टेंट के साथ Dockerfile नाम की फ़ाइल बनाएं:

FROM ollama/ollama:latest

# Listen on all interfaces, port 8080
ENV OLLAMA_HOST=0.0.0.0:8080

# Store model weight files in /models
ENV OLLAMA_MODELS=/models

# Reduce logging verbosity
ENV OLLAMA_DEBUG=false

# Never unload model weights from the GPU
ENV OLLAMA_KEEP_ALIVE=-1

# Store the model weights in the container image
ENV MODEL=embeddinggemma:latest
RUN ollama serve & sleep 5 && ollama pull $MODEL

# Start Ollama
ENTRYPOINT ["ollama", "serve"]

यह Dockerfile, ये काम करता है:

  1. यह Ollama की आधिकारिक बेस इमेज से शुरू होती है.
  2. Ollama को पोर्ट 8080 (Cloud Run का डिफ़ॉल्ट) पर सिग्नल पाने के लिए कॉन्फ़िगर करता है.
  3. RUN कमांड, ollama सर्वर शुरू करती है. साथ ही, बिल्ड प्रोसेस के दौरान embeddinggemma मॉडल डाउनलोड करती है, ताकि इसे इमेज में शामिल किया जा सके.
  4. यह कुकी, OLLAMA_KEEP_ALIVE=-1 को सेट करती है. इससे यह पक्का किया जाता है कि मॉडल, जीपीयू मेमोरी में लोड रहे, ताकि बाद के अनुरोधों को तेज़ी से प्रोसेस किया जा सके.

4. बनाना और डिप्लॉय करना

हम एक ही चरण में अपने कंटेनर को बनाने और डिप्लॉय करने के लिए, Cloud Run सोर्स डिप्लॉयमेंट का इस्तेमाल करेंगे. यह कमांड, Cloud Build का इस्तेमाल करके इमेज बनाती है. साथ ही, इसे Artifact Registry में सेव करती है और Cloud Run पर डिप्लॉय करती है.

डप्लॉय करने के लिए, यह कमांड चलाएं:

gcloud run deploy embedding-gemma \
  --source . \
  --region europe-west1 \
  --concurrency 4 \
  --cpu 8 \
  --set-env-vars OLLAMA_NUM_PARALLEL=4 \
  --gpu 1 \
  --gpu-type nvidia-l4 \
  --max-instances 1 \
  --memory 32Gi \
  --no-allow-unauthenticated \
  --no-cpu-throttling \
  --no-gpu-zonal-redundancy \
  --timeout=600 \
  --labels dev-tutorial=codelab-embedding-gemma

कॉन्फ़िगरेशन के बारे में जानकारी

  • --source . से, मौजूदा डायरेक्ट्री को बिल्ड के सोर्स के तौर पर तय किया जाता है.
  • --region europe-west1 हम Cloud Run पर जीपीयू की सुविधा देने वाले क्षेत्र का इस्तेमाल करते हैं.
  • --concurrency 4 को OLLAMA_NUM_PARALLEL एनवायरमेंट वैरिएबल की वैल्यू से मैच करने के लिए सेट किया जाता है.
  • --gpu 1 के साथ --gpu-type nvidia-l4 का इस्तेमाल करने पर, सेवा में मौजूद हर Cloud Run इंस्टेंस को 1 NVIDIA L4 GPU असाइन किया जाता है.
  • --max-instances 1 से, स्केल किए जाने वाले इंस्टेंस की ज़्यादा से ज़्यादा संख्या तय की जाती है. यह आपके प्रोजेक्ट के NVIDIA L4 GPU के कोटे के बराबर या उससे कम होना चाहिए.
  • --no-allow-unauthenticated, सेवा को बिना पुष्टि किए ऐक्सेस करने पर पाबंदी लगाता है. सेवा को निजी रखने पर, सेवा से सेवा के बीच कम्यूनिकेशन के लिए, Cloud Run में पहले से मौजूद Identity and Access Management (IAM) ऑथेंटिकेशन पर भरोसा किया जा सकता है.
  • जीपीयू को चालू करने के लिए, --no-cpu-throttling ज़रूरी है.
  • --no-gpu-zonal-redundancy ज़ोनल रिडंडेंसी के विकल्प सेट करें. ये विकल्प, ज़ोनल फ़ेलओवर से जुड़ी आपकी ज़रूरतों और उपलब्ध कोटे पर निर्भर करते हैं.

इलाके के हिसाब से ध्यान रखने वाली बातें

Cloud Run पर GPU, कुछ ही इलाकों में उपलब्ध हैं. दस्तावेज़ में जाकर, उन देशों/इलाकों के बारे में जानें जहां यह सुविधा उपलब्ध है.

डिप्लॉयमेंट का आउटपुट

कुछ मिनटों के बाद, डिप्लॉयमेंट पूरा हो जाएगा और आपको इस तरह का मैसेज दिखेगा:

Service [embedding-gemma] revision [embedding-gemma-12345-abc] has been deployed and is serving 100 percent of traffic.
Service URL: https://embedding-gemma-123456789012.europe-west1.run.app

5. डिप्लॉयमेंट की जांच करना

हमने इस सेवा को --no-allow-unauthenticated के साथ डिप्लॉय किया है. इसलिए, हम सार्वजनिक यूआरएल को सीधे तौर पर curl नहीं कर सकते. हमें सबसे पहले, सेवा को ऐक्सेस करने की अनुमति देनी होगी. साथ ही, अनुरोध में पुष्टि करने वाले टोकन का इस्तेमाल करना होगा.

  1. अपने उपयोगकर्ता खाते को सेवा को कॉल करने की अनुमति दें:
    gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
        --member=user:$(gcloud config get-value account) \
        --role='roles/run.invoker'
    
  2. अनुरोध में इस्तेमाल करने के लिए, Google Cloud क्रेडेंशियल और प्रोजेक्ट नंबर को एनवायरमेंट वैरिएबल में सेव करें:
    export PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format="value(projectNumber)")
    export ID_TOKEN=$(gcloud auth print-identity-token)
    
  3. "Sample text" के लिए एम्बेडिंग जनरेट करने के लिए, यह कमांड चलाएं:
    curl -X POST "https://embedding-gemma-$PROJECT_NUMBER.europe-west1.run.app/api/embed" \
        -H "Authorization: Bearer $ID_TOKEN" \
        -H "Content-Type: application/json" \
        -d '{
            "model": "embeddinggemma",
            "input": "Sample text"
        }'
    

आपको embedding फ़ील्ड में, वेक्टर (संख्याओं की लंबी सूची) वाला JSON रिस्पॉन्स दिखेगा. इससे पुष्टि होती है कि सर्वरलेस GPU की मदद से काम करने वाला आपका एम्बेडिंग मॉडल काम कर रहा है!

जवाब कुछ ऐसा दिखेगा: EmbeddingGemma कर्ल आउटपुट

Python क्लाइंट

इस सेवा के साथ इंटरैक्ट करने के लिए, Python का भी इस्तेमाल किया जा सकता है. test_client.py नाम की फ़ाइल बनाएं:

import urllib.request
import urllib.parse
import json
import os

# 1. Setup the URL and Payload
url = f"https://embedding-gemma-{os.environ['PROJECT_NUMBER']}.europe-west1.run.app/api/embed"
payload = {
    "model": "embeddinggemma",
    "input": "Sample text"
}

# 2. Create the Request object
# Note: Providing 'data' automatically makes this a POST request
req = urllib.request.Request(
    url,
    data=json.dumps(payload).encode("utf-8"),
    headers={
        "Authorization": f"Bearer {os.environ['ID_TOKEN']}",
        "Content-Type": "application/json"
    }
)

# 3. Execute and print the response
response = urllib.request.urlopen(req)
result = json.loads(response.read().decode("utf-8"))
print(result)

इसे चलाएं:

python test_client.py

6. सिमैंटिक सर्च ऐप्लिकेशन बनाना

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

डिपेंडेंसी

हम chromadb को अपने वेक्टर डेटाबेस और ollama क्लाइंट लाइब्रेरी के तौर पर इस्तेमाल करेंगे.

uv init semantic-search --description "Semantic Search Application"
cd semantic-search
uv add chromadb ollama

सर्च ऐप्लिकेशन बनाना

नीचे दिए गए कोड का इस्तेमाल करके, semantic_search.py नाम की फ़ाइल बनाएं:

import ollama
import chromadb
import os

# 1. Define our knowledge base
documents = [
    "Poland is a country located in Central Europe.",
    "The capital and largest city of Poland is Warsaw.",
    "Poland's official language is Polish, which is a West Slavic language.",
    "Marie Curie, the pioneering scientist who conducted groundbreaking research on radioactivity, was born in Warsaw, Poland.",
    "Poland is famous for its traditional dish called pierogi, which are filled dumplings.",
    "The Białowieża Forest in Poland is one of the last and largest remaining parts of the immense primeval forest that once stretched across the European Plain.",
]

print("Initializing Vector Database...")
client = chromadb.Client()
collection = client.create_collection(name="docs")

# Configure the client to point to our Cloud Run proxy
ollama_client = ollama.Client(
    host=f"https://embedding-gemma-{os.environ['PROJECT_NUMBER']}.europe-west1.run.app",
    headers={'Authorization': 'Bearer ' + os.environ['ID_TOKEN']}
)

print("Generating embeddings and indexing documents...")
# 2. Store each document in the vector database
for i, d in enumerate(documents):
    # This calls our Cloud Run service to get the embedding
    response = ollama_client.embed(model="embeddinggemma", input=d)
    embeddings = response["embeddings"]
    collection.add(ids=[str(i)], embeddings=embeddings, documents=[d])

print("Indexing complete.\n")

# 3. Perform a Semantic Search
question = "What is Poland's official language?"
print(f"Query: {question}")

# Generate an embedding for the question
response = ollama_client.embed(model="embeddinggemma", input=question)

# Query the database for the most similar document
results = collection.query(
    query_embeddings=[response["embeddings"][0]],
    n_results=1
)

best_match = results["documents"][0][0]
print(f"Best Match Document: {best_match}")

ऐप्लिकेशन चलाना

स्क्रिप्ट को लागू करना:

uv run semantic_search.py

आपको इससे मिलता-जुलता आउटपुट दिखेगा:

Initializing Vector Database...
Generating embeddings and indexing documents...
Indexing complete.

Query: What is Poland's official language?
Best Match Document: Poland's official language is Polish, which is a West Slavic language.

इस स्क्रिप्ट में, RAG सिस्टम के मुख्य हिस्से को दिखाया गया है. इसमें, सर्वरलेस EmbeddingGemma सेवा का इस्तेमाल करके, दस्तावेज़ों और क्वेरी, दोनों को वेक्टर में बदला जाता है. इससे, किसी व्यक्ति के सवाल का जवाब देने के लिए ज़रूरी जानकारी को आसानी से ढूंढा जा सकता है.

7. व्यवस्थित करें

अपने Google Cloud खाते से लगातार शुल्क लिए जाने से बचने के लिए, इस कोडलैब के दौरान बनाई गई संसाधन मिटाएं.

Cloud Run सेवा मिटाना

gcloud run services delete embedding-gemma --region europe-west1 --quiet

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

gcloud artifacts docker images delete \
    europe-west1-docker.pkg.dev/${GOOGLE_CLOUD_PROJECT}/cloud-run-source-deploy/embedding-gemma \
    --quiet

8. बधाई हो

बधाई हो! आपने जीपीयू के साथ Cloud Run पर EmbeddingGemma को डिप्लॉय कर दिया है. साथ ही, इसका इस्तेमाल सिमैंटिक सर्च ऐप्लिकेशन को बेहतर बनाने के लिए किया है.

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

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

  • Docker की मदद से, Ollama मॉडल को कंटेनर में रखने का तरीका.
  • Cloud Run में, GPU की सुविधा वाली सेवा को डिप्लॉय करने का तरीका.
  • सिमैंटिक सर्च (आरएजी) के लिए, डिप्लॉय किए गए मॉडल का इस्तेमाल कैसे करें.

अगले चरण

रेफ़रंस दस्तावेज़