1. Giới thiệu
Trong lớp học lập trình này, bạn sẽ tìm hiểu cách triển khai EmbeddingGemma (một mô hình nhúng văn bản đa ngôn ngữ mạnh mẽ) trên Cloud Run bằng GPU. Sau đó, bạn sẽ sử dụng dịch vụ đã triển khai này để tạo các mục nhúng cho một ứng dụng tìm kiếm ngữ nghĩa.
Không giống như các Mô hình ngôn ngữ lớn (LLM) truyền thống tạo văn bản, các mô hình nhúng sẽ chuyển đổi văn bản thành vectơ số. Các vectơ này đóng vai trò quan trọng trong việc xây dựng hệ thống Tạo tăng cường khả năng truy xuất (RAG), cho phép bạn tìm thấy những tài liệu phù hợp nhất cho cụm từ tìm kiếm của người dùng.
Bạn sẽ thực hiện
- Tạo vùng chứa cho mô hình EmbeddingGemma bằng Ollama.
- Triển khai vùng chứa lên Cloud Run có tính năng tăng tốc GPU.
- Kiểm thử mô hình đã triển khai bằng cách tạo các vectơ nhúng cho văn bản mẫu.
- Xây dựng một hệ thống tìm kiếm ngữ nghĩa đơn giản bằng dịch vụ đã triển khai của bạn.
Bạn cần có
- Một dự án trên Google Cloud đã bật tính năng thanh toán.
- Hiểu biết cơ bản về Docker và dòng lệnh.
2. Trước khi bắt đầu
Thiết lập dự án
- Nếu chưa có Tài khoản Google, bạn phải tạo một Tài khoản Google.
- Sử dụng tài khoản cá nhân thay vì tài khoản trường học hoặc tài khoản do nơi làm việc cấp. Tài khoản do nơi làm việc hoặc trường học cấp có thể có các hạn chế khiến bạn không bật được những API cần thiết cho lớp học này.
- Đăng nhập vào Google Cloud Console.
- Bật tính năng thanh toán trong Cloud Console.
- Việc hoàn thành bài tập thực hành này sẽ tốn ít hơn 1 USD cho các tài nguyên trên đám mây.
- Bạn có thể làm theo các bước ở cuối bài thực hành này để xoá tài nguyên nhằm tránh bị tính thêm phí.
- Người dùng mới đủ điều kiện dùng thử miễn phí trị giá 300 USD.
- Tạo một dự án mới hoặc chọn sử dụng lại một dự án hiện có.
- Nếu bạn thấy lỗi về hạn mức dự án, hãy sử dụng lại một dự án hiện có hoặc xoá một dự án hiện có để tạo dự án mới.
Khởi động Cloud Shell
Cloud Shell là một môi trường dòng lệnh chạy trong Google Cloud và được tải sẵn các công cụ cần thiết.
- Nhấp vào Kích hoạt Cloud Shell ở đầu bảng điều khiển Cloud của Google.
- Sau khi kết nối với Cloud Shell, hãy xác minh thông tin xác thực của bạn:
gcloud auth list - Xác nhận rằng bạn đã chọn dự án của mình:
gcloud config get project - Đặt nếu cần:
gcloud config set project <YOUR_PROJECT_ID>
Bật API
Chạy lệnh này để bật tất cả các API bắt buộc:
gcloud services enable \
run.googleapis.com \
artifactregistry.googleapis.com \
cloudbuild.googleapis.com
3. Đóng gói mô hình vào vùng chứa
Để chạy EmbeddingGemma mà không cần máy chủ, chúng ta cần đóng gói nó vào một vùng chứa. Chúng ta sẽ sử dụng Ollama, một khung đơn giản để chạy LLM và Docker.
Tạo tệp Docker
Trong Cloud Shell, hãy tạo một thư mục mới cho dự án của bạn rồi chuyển đến thư mục đó:
mkdir embedding-gemma-codelab
cd embedding-gemma-codelab
Tạo một tệp có tên là Dockerfile với nội dung sau:
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 này thực hiện những việc sau:
- Bắt đầu từ hình ảnh cơ sở chính thức của Ollama.
- Định cấu hình Ollama để theo dõi trên cổng 8080 (mặc định của Cloud Run).
- Lệnh
RUNsẽ khởi động máy chủollamavà tải mô hìnhembeddinggemmaxuống trong quy trình xây dựng để mô hình này được tích hợp vào hình ảnh. - Đặt
OLLAMA_KEEP_ALIVE=-1để đảm bảo mô hình luôn được tải vào bộ nhớ GPU cho các yêu cầu tiếp theo nhanh hơn.
4. Xây dựng và triển khai
Chúng ta sẽ sử dụng Cloud Run source deployment (Triển khai nguồn Cloud Run) để tạo và triển khai vùng chứa chỉ trong một bước. Lệnh này tạo hình ảnh bằng Cloud Build, lưu trữ hình ảnh đó trong Artifact Registry và triển khai hình ảnh đó vào Cloud Run.
Chạy lệnh sau để triển khai:
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
Tìm hiểu về cấu hình
--source .chỉ định thư mục hiện tại làm nguồn cho bản dựng.--region europe-west1chúng tôi sử dụng một khu vực hỗ trợ GPU trên Cloud Run.--concurrency 4được đặt để khớp với giá trị của biến môi trường OLLAMA_NUM_PARALLEL.--gpu 1với--gpu-type nvidia-l4sẽ chỉ định 1 GPU NVIDIA L4 cho mọi phiên bản Cloud Run trong dịch vụ.--max-instances 1chỉ định số lượng phiên bản tối đa để mở rộng quy mô. Giá trị này phải bằng hoặc thấp hơn hạn mức GPU NVIDIA L4 của dự án.--no-allow-unauthenticatedhạn chế quyền truy cập chưa được xác thực vào dịch vụ. Bằng cách giữ cho dịch vụ ở chế độ riêng tư, bạn có thể dựa vào tính năng xác thực Quản lý danh tính và quyền truy cập (IAM) tích hợp của Cloud Run để giao tiếp giữa các dịch vụ.- Bạn cần có
--no-cpu-throttlingđể bật GPU. --no-gpu-zonal-redundancythiết lập các lựa chọn dự phòng theo vùng tuỳ thuộc vào yêu cầu về việc chuyển đổi dự phòng theo vùng và hạn mức hiện có.
Những điểm cần lưu ý về khu vực
GPU trên Cloud Run chỉ có ở một số khu vực. Bạn có thể xem các khu vực được hỗ trợ trong tài liệu.
Kết quả triển khai
Sau vài phút, quá trình triển khai sẽ hoàn tất và bạn sẽ thấy một thông báo như sau:
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. Kiểm thử quá trình triển khai
Vì đã triển khai dịch vụ bằng --no-allow-unauthenticated, nên chúng ta không thể chỉ cần curl URL công khai. Trước tiên, chúng ta cần cấp cho chính mình quyền truy cập vào dịch vụ và sử dụng mã thông báo xác thực trong yêu cầu.
- Cấp cho tài khoản người dùng của bạn quyền gọi dịch vụ:
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \ --member=user:$(gcloud config get-value account) \ --role='roles/run.invoker' - Lưu thông tin xác thực và số dự án Google Cloud vào các biến môi trường để sử dụng trong yêu cầu:
export PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format="value(projectNumber)") export ID_TOKEN=$(gcloud auth print-identity-token) - Chạy lệnh sau để tạo một mục nhúng cho "Văn bản mẫu":
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" }'
Bạn sẽ thấy một phản hồi JSON chứa một vectơ (một danh sách dài các số) trong trường embedding. Điều này xác nhận rằng mô hình nhúng dựa trên GPU không máy chủ của bạn đang hoạt động!
Phản hồi sẽ có dạng như sau: 
Ứng dụng Python
Bạn cũng có thể dùng Python để tương tác với dịch vụ này. Tạo một tệp có tên 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)
Kích hoạt:
python test_client.py
6. Xây dựng ứng dụng tìm kiếm ngữ nghĩa
Giờ đây, chúng ta đã có một dịch vụ nhúng đang hoạt động, hãy tạo một ứng dụng Tìm kiếm ngữ nghĩa đơn giản. Chúng tôi sẽ sử dụng các vectơ nhúng được tạo để tìm tài liệu phù hợp nhất cho một cụm từ tìm kiếm nhất định.
Phần phụ thuộc
Chúng ta sẽ sử dụng chromadb làm cơ sở dữ liệu vectơ và thư viện ứng dụng ollama.
uv init semantic-search --description "Semantic Search Application"
cd semantic-search
uv add chromadb ollama
Tạo ứng dụng tìm kiếm
Tạo một tệp có tên là semantic_search.py bằng đoạn mã sau:
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}")
Chạy ứng dụng
Thực thi tập lệnh:
uv run semantic_search.py
Bạn sẽ thấy kết quả xuất ra có dạng như sau:
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.
Tập lệnh này minh hoạ cốt lõi của hệ thống RAG: sử dụng dịch vụ EmbeddingGemma không cần máy chủ để chuyển đổi cả tài liệu và cụm từ tìm kiếm thành vectơ, cho phép bạn tìm thấy thông tin chính xác cần thiết để trả lời câu hỏi của người dùng.
7. Dọn dẹp
Để tránh các khoản phí phát sinh cho tài khoản Google Cloud của bạn, hãy xoá các tài nguyên đã tạo trong lớp học lập trình này.
Xoá dịch vụ Cloud Run
gcloud run services delete embedding-gemma --region europe-west1 --quiet
Xoá hình ảnh vùng chứa
gcloud artifacts docker images delete \
europe-west1-docker.pkg.dev/${GOOGLE_CLOUD_PROJECT}/cloud-run-source-deploy/embedding-gemma \
--quiet
8. Xin chúc mừng
Xin chúc mừng! Bạn đã triển khai thành công EmbeddingGemma trên Cloud Run bằng GPU và dùng mô hình này để hỗ trợ một ứng dụng tìm kiếm ngữ nghĩa.
Giờ đây, bạn đã có một nền tảng có khả năng mở rộng và không cần máy chủ để xây dựng các ứng dụng AI cần hiểu ý nghĩa của văn bản.
Kiến thức bạn học được
- Cách tạo vùng chứa cho một mô hình Ollama bằng Docker.
- Cách triển khai một dịch vụ có hỗ trợ GPU lên Cloud Run.
- Cách sử dụng mô hình đã triển khai cho tìm kiếm ngữ nghĩa (RAG).
Các bước tiếp theo
- Khám phá các mô hình khác trong họ Gemma.
- Tìm hiểu thêm về GPU Cloud Run.
- Khám phá các Lớp học lập trình khác về Cloud Run.
- Xây dựng một quy trình RAG hoàn chỉnh bằng cách kết nối bước truy xuất này với một mô hình tạo sinh.