0
0
Lập trình
TT

AI Serverless: Triển Khai EmbeddingGemma Trên Cloud Run

Đăng vào 4 ngày trước

• 8 phút đọc

AI Serverless: Triển Khai EmbeddingGemma Trên Cloud Run

Giới thiệu

Bài viết này sẽ dựa trên bài viết trước về việc chạy mô hình nhúng Qwen3 trên Cloud Run, và tập trung vào mô hình EmbeddingGemma vừa được phát hành từ gia đình Gemma. Hãy cùng khám phá cách tận dụng các kỹ thuật serverless mạnh mẽ để triển khai mô hình này trên nền tảng không máy chủ của Google Cloud.

Bạn sẽ học cách:

  • Đóng gói mô hình nhúng bằng Docker và Ollama
  • Triển khai mô hình nhúng lên Cloud Run với GPU
  • Kiểm tra mô hình đã triển khai từ máy cục bộ

Trước khi đi vào mã nguồn, hãy cùng thảo luận về các thành phần cốt lõi hỗ trợ giải pháp AI không máy chủ này.

Mô hình EmbeddingGemma

Theo thẻ mô hình EmbeddingGemma:

“EmbeddingGemma là một mô hình nhúng văn bản đa ngôn ngữ với 308 triệu tham số, dựa trên Gemma 3. Nó được tối ưu hóa cho việc sử dụng trên các thiết bị hàng ngày như điện thoại, máy tính xách tay và máy tính bảng. Mô hình này tạo ra các đại diện số cho văn bản để được sử dụng cho các tác vụ hạ nguồn như truy xuất thông tin, tìm kiếm tương đồng ngữ nghĩa, phân loại và phân cụm.”

Việc tối ưu hóa cho hiệu suất làm cho EmbeddingGemma trở thành ứng cử viên lý tưởng cho việc triển khai không máy chủ trên Cloud Run, đảm bảo hiệu suất cao và tiết kiệm chi phí cho các ứng dụng AI của bạn.

Cloud Run

Cloud Run là một nền tảng tính toán quản lý trên Google Cloud cho phép bạn chạy các ứng dụng được đóng gói trong môi trường không máy chủ. Hãy nghĩ về nó như một điểm giữa giữa một dịch vụ hàm đơn giản (như Cloud Run Functions) và một cụm GKE có thể tùy chỉnh hơn. Bạn chỉ cần cung cấp một hình ảnh container, và nó sẽ xử lý tất cả cơ sở hạ tầng phía dưới, từ việc cấp phát và mở rộng đến quản lý thời gian chạy.

Điều tuyệt vời của Cloud Run là nó có thể tự động mở rộng xuống mức 0, có nghĩa là khi không có yêu cầu, bạn sẽ không phải trả bất kỳ chi phí nào cho tài nguyên. Khi lưu lượng tăng lên, nó nhanh chóng mở rộng để xử lý tải. Điều này làm cho nó trở nên hoàn hảo cho các mô hình không trạng thái cần có sẵn cao và tiết kiệm chi phí.

Triển khai

Hãy cùng đi qua quy trình triển khai từng bước.

Chuẩn bị môi trường

Đầu tiên, hãy cấu hình môi trường gcloud CLI.

Lưu ý: nếu bạn chưa cài đặt gcloud CLI, vui lòng làm theo hướng dẫn có sẵn tại đây.

Bước 1 - Thiết lập dự án mặc định:

Copy
gcloud config set project PROJECT_ID

Bước 2 - Cấu hình Google Cloud CLI sử dụng khu vực europe-west1 cho các lệnh Cloud Run:

Copy
gcloud config set run/region europe-west1

Quan trọng: tại thời điểm viết bài, GPU trên Cloud Run có sẵn ở một số khu vực. Để kiểm tra khu vực hỗ trợ gần nhất, vui lòng tham khảo trang này.

Đóng gói

Bây giờ chúng ta sẽ sử dụng Docker và Ollama để chạy mô hình EmbeddingGemma. Tạo một tệp có tên Dockerfile với nội dung sau:

Copy
FROM ollama/ollama:latest

# Lắng nghe trên tất cả các giao diện, cổng 8080
ENV OLLAMA_HOST=0.0.0.0:8080

# Lưu trữ tệp trọng số mô hình trong /models
ENV OLLAMA_MODELS=/models

# Giảm độ chi tiết ghi lại
ENV OLLAMA_DEBUG=false

# Không bao giờ giải phóng trọng số mô hình khỏi GPU
ENV OLLAMA_KEEP_ALIVE=-1

# Lưu trữ trọng số mô hình trong hình ảnh container
ENV MODEL=embeddinggemma:latest
RUN ollama serve & sleep 5 && ollama pull $MODEL

# Bắt đầu Ollama
ENTRYPOINT ["ollama", "serve"]

Xây dựng và Triển khai

Chúng ta sẽ sử dụng triển khai nguồn của Cloud Run. Điều này cho phép bạn đạt được các mục tiêu sau trong một lệnh duy nhất:

  • Đầu tiên, biên dịch hình ảnh container từ mã nguồn đã cung cấp.
  • Tiếp theo, tải hình ảnh container kết quả lên một Artifact Registry.
  • Sau đó, triển khai container lên Cloud Run, đảm bảo rằng hỗ trợ GPU được kích hoạt bằng cách sử dụng các tham số --gpu--gpu-type.
  • Cuối cùng, chuyển hướng tất cả lưu lượng truy cập đến phiên bản mới được triển khai này.

Bạn chỉ cần chạy:

Copy
gcloud run deploy embedding-gemma \
  --source . \
  --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=blog-embedding-gemma

Lưu ý các cờ quan trọng sau trong lệnh này:

  • --concurrency 4 được đặt để khớp với giá trị của biến môi trường OLLAMA_NUM_PARALLEL.
  • --gpu 1 với --gpu-type nvidia-l4 gán 1 GPU NVIDIA L4 cho mỗi instance Cloud Run trong dịch vụ.
  • --max-instances 1 chỉ định số lượng tối đa các instance có thể mở rộng. Nó phải bằng hoặc thấp hơn hạn mức GPU NVIDIA L4 của dự án của bạn.
  • --no-allow-unauthenticated hạn chế quyền truy cập không xác thực đến dịch vụ. Bằng cách giữ dịch vụ ở chế độ riêng tư, bạn có thể tin tưởng vào 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 cho giao tiếp giữa các dịch vụ.
  • --no-cpu-throttling là cần thiết để kích hoạt GPU.
  • --no-gpu-zonal-redundancy thiết lập các tùy chọn dự phòng theo khu vực tùy thuộc vào yêu cầu failover theo khu vực và hạn mức có sẵn.

Kiểm tra triển khai

Sau khi triển khai dịch vụ thành công, bạn có thể khởi tạo các yêu cầu. Tuy nhiên, các cuộc gọi api trực tiếp sẽ dẫn đến phản hồi HTTP 401 Unauthorized từ Cloud Run.

Hành vi này tuân theo cách tiếp cận “an toàn theo mặc định” của Google. Mô hình này được thiết kế để gọi từ các dịch vụ khác, chẳng hạn như một ứng dụng RAG, và do đó không mở cho truy cập công khai.

Để hỗ trợ kiểm tra cục bộ triển khai của bạn, cách đơn giản nhất là khởi động proxy phát triển của Cloud Run bằng lệnh sau:

Copy
gcloud run services proxy embedding-gemma --port=9090

Sau đó, trong một cửa sổ terminal thứ hai, chạy:

Copy
curl http://localhost:9090/api/embed -d '{
  "model": "embeddinggemma",
  "input": "Sample text"
}'

Phản hồi sẽ trông giống như sau:

Bạn cũng có thể sử dụng Python để gọi endpoint. Ví dụ:

Copy
from ollama import Client

client = Client(host="http://localhost:9090")

response = client.embed(model="embeddinggemma", input="Sample text")
print(response)

Chúc mừng 🎉 Triển khai Cloud Run của bạn đã hoạt động thành công!

Ví dụ RAG

Bạn có thể sử dụng mô hình mới được triển khai để xây dựng ứng dụng RAG đầu tiên của mình. Đây là cách thực hiện:

Bước 1 - Tạo các nhúng

Bắt đầu với các phụ thuộc cần thiết:

Copy
pip install ollama chromadb

Tạo một tệp example.py chứa:

Copy
import ollama
import chromadb

documents = [
    "Poland là một quốc gia nằm ở Trung Âu.",
    "Thủ đô và thành phố lớn nhất của Ba Lan là Warsaw.",
    "Ngôn ngữ chính thức của Ba Lan là tiếng Ba Lan, một ngôn ngữ Tây Slavic.",
    "Marie Curie, nhà khoa học tiên phong đã thực hiện nghiên cứu đột phá về phóng xạ, được sinh ra ở Warsaw, Ba Lan.",
    "Ba Lan nổi tiếng với món ăn truyền thống gọi là pierogi, là những chiếc bánh bao nhồi nhân.",
    "Rừng Białowieża ở Ba Lan là một trong những phần lớn nhất còn lại của rừng nguyên sinh rộng lớn từng kéo dài trên Bình nguyên châu Âu.",
]

client = chromadb.Client()
collection = client.create_collection(name="docs")

ollama_client = ollama.Client(host="http://localhost:9090")

# Lưu trữ từng tài liệu trong cơ sở dữ liệu nhúng vector trong bộ nhớ
for i, d in enumerate(documents):
    response = ollama_client.embed(model="embeddinggemma", input=d)
    embeddings = response["embeddings"]
    collection.add(ids=[str(i)], embeddings=embeddings, documents=[d])

Bước 2 - Truy xuất

Tiếp theo, với đoạn mã sau bạn có thể tìm kiếm cơ sở dữ liệu vector để lấy tài liệu phù hợp nhất (thêm nó vào example.py):

Copy
# Một câu hỏi ví dụ
question = "Ngôn ngữ chính thức của Ba Lan là gì?"

# Tạo một nhúng cho đầu vào và truy xuất tài liệu phù hợp nhất
response = ollama_client.embed(model="embeddinggemma", input=question)
results = collection.query(query_embeddings=[response["embeddings"][0]], n_results=1)
data = results["documents"][0][0]

Bước 3 - Tạo câu trả lời cuối

Trong bước cuối này, chúng ta sẽ sử dụng mô hình Gemma3 đã cài đặt cục bộ.

Lưu ý: Chúng ta sử dụng Gemma3 trong bước tạo câu trả lời, nhưng bất kỳ mô hình nào khác cũng có thể hoạt động ở đây (ví dụ: Gemini, Qwen3, Llama, v.v.). Tuy nhiên, điều quan trọng là phải sử dụng cùng một mô hình nhúng trong Bước 1 (Tạo nhúng) và Bước 2 (Truy xuất).

Để cài đặt mô hình Gemma3:latest, hãy chạy:

Copy
ollama pull gemma3

Bây giờ có thể kết hợp lời nhắc của người dùng với các kết quả tìm kiếm và tạo ra câu trả lời cuối (thêm mã này vào example.py):

Copy
# Bước cuối - tạo phản hồi kết hợp lời nhắc và dữ liệu chúng ta đã truy xuất ở bước 2
prompt = f"Sử dụng dữ liệu này: {data}. Trả lời cho lời nhắc này: {question}"

output = ollama.generate(
    model="gemma3",
    prompt=prompt,
)

print(f"Lời nhắc: {prompt}")
print(output["response"])

Chạy mã:

Copy
python example.py

Câu trả lời sẽ trông giống như dưới đây:

Copy
Lời nhắc: Sử dụng dữ liệu này: Ngôn ngữ chính thức của Ba Lan là tiếng Ba Lan, một ngôn ngữ Tây Slavic.. Trả lời cho lời nhắc này: Ngôn ngữ chính thức của Ba Lan là gì?
Ngôn ngữ chính thức của Ba Lan là tiếng Ba Lan. Đó là một ngôn ngữ Tây Slavic.

Bạn đã thành công trong việc tạo và chạy ứng dụng RAG đầu tiên của mình bằng mô hình EmbeddingGemma.

Tóm tắt

Tại thời điểm này, bạn đã thiết lập thành công một dịch vụ Cloud Run chạy mô hình EmbeddingGemma, sẵn sàng để tạo nhúng cho tìm kiếm ngữ nghĩa hoặc ứng dụng RAG.

Phương pháp này cũng cho phép bạn triển khai và so sánh nhiều mô hình nhúng khác nhau trên Cloud Run (ví dụ: Qwen3 Embedding hoặc các mô hình hỗ trợ Ollama khác), giúp bạn tìm ra mô hình phù hợp nhất cho trường hợp sử dụng cụ thể của mình mà không cần thay đổi mã lớn.

Sẵn sàng xây dựng các ứng dụng AI không máy chủ của riêng bạn?

  • Bắt đầu xây dựng trên Cloud Run ngay hôm nay và khám phá toàn bộ tiềm năng của nó!
  • Nếu bạn quan tâm đến việc tìm hiểu thêm về đánh giá RAG, bài viết này là một điểm khởi đầu tốt.

Cảm ơn bạn đã đọc

Nếu bạn thấy bài viết này hữu ích, hãy xem xét việc theo dõi tôi ở đây và cho nó một cái vỗ tay 👏 để giúp người khác khám phá nó.

Tôi luôn háo hức để trò chuyện với các nhà phát triển và những người đam mê AI, vì vậy hãy cảm thấy tự do kết nối với tôi trên LinkedIn hoặc Bluesky.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào