Phân phát Gemma 3 bằng vLLM trên Cloud Run

1. Giới thiệu

Các mô hình ngôn ngữ lớn (LLM) đang thay đổi cách chúng ta xây dựng các ứng dụng thông minh. Nhưng việc chuẩn bị những mô hình mạnh mẽ này để sử dụng trong thực tế có thể gặp nhiều khó khăn. Chúng cần nhiều sức mạnh tính toán, đặc biệt là card đồ hoạ (GPU) và những cách thông minh để xử lý nhiều yêu cầu cùng một lúc. Ngoài ra, bạn muốn giảm chi phí và đảm bảo ứng dụng chạy mượt mà mà không bị chậm trễ.

Lớp học lập trình này sẽ hướng dẫn bạn cách giải quyết những thách thức này! Chúng ta sẽ sử dụng 2 công cụ chính:

  1. vLLM: Hãy coi đây là một công cụ siêu nhanh dành cho LLM. Việc này giúp các mô hình của bạn chạy hiệu quả hơn nhiều, xử lý nhiều yêu cầu cùng lúc và giảm mức sử dụng bộ nhớ.
  2. Google Cloud Run: Đây là nền tảng không máy chủ của Google. Đây là một lựa chọn tuyệt vời để triển khai các ứng dụng vì nó xử lý tất cả các hoạt động mở rộng quy mô cho bạn – từ không có người dùng đến hàng nghìn người dùng, rồi giảm xuống trở lại. Quan trọng nhất là Cloud Run hiện hỗ trợ GPU, đây là yếu tố cần thiết để lưu trữ các LLM!

Khi kết hợp với nhau, vLLM và Cloud Run mang đến một cách thức mạnh mẽ, linh hoạt và tiết kiệm chi phí để phân phát các LLM của bạn. Trong hướng dẫn này, bạn sẽ triển khai một mô hình mở, cung cấp mô hình đó dưới dạng một API web tiêu chuẩn.

Kiến thức bạn sẽ học được**:**

  • Cách chọn kích thước và biến thể mô hình phù hợp để phân phát.
  • Cách thiết lập vLLM để phân phát các điểm cuối API tương thích với OpenAI.
  • Cách tạo vùng chứa cho máy chủ vLLM bằng Docker.
  • Cách chuyển hình ảnh vùng chứa của bạn đến Google Artifact Registry.
  • Cách triển khai vùng chứa lên Cloud Run bằng tính năng tăng tốc GPU.
  • Cách kiểm thử mô hình đã triển khai.

Điều kiện sử dụng**:**

  • Một trình duyệt, chẳng hạn như Chrome, để truy cập vào Google Cloud Console
  • Kết nối Internet ổn định
  • Một Dự án trên Google Cloud đã bật tính năng thanh toán
  • Mã truy cập Hugging Face (tạo một mã tại đây nếu bạn chưa có)
  • Hiểu biết cơ bản về Python, Docker và giao diện dòng lệnh
  • Có trí tò mò và ham học hỏi

2. Trước khi bắt đầu

Thiết lập dự án trên Google Cloud

Codelab này yêu cầu bạn phải có một Dự án trên Google Cloud có tài khoản thanh toán đang hoạt động.

  • Đối với các phiên có người hướng dẫn: Nếu bạn đang ở trong lớp học, người hướng dẫn sẽ cung cấp cho bạn thông tin cần thiết về dự án và việc thanh toán. Làm theo hướng dẫn của giảng viên để hoàn tất quá trình thiết lập.
  • Đối với người học độc lập: Nếu tự mình thực hiện việc này, bạn cần thiết lập một dự án mới và kích hoạt tài khoản thanh toán dùng thử. Vui lòng làm theo các bước dưới đây để bắt đầu.
  • Mở một cửa sổ ẩn danh bằng cách nhấn tổ hợp phím (Ctrl + Shift + N hoặc Cmd + Shift + N)
  • Truy cập vào cổng đổi quà này bằng cửa sổ ẩn danh
  • Đăng nhập và nhận tài khoản thanh toán dùng thử bằng Tài khoản Gmail cá nhân
  • Làm theo hướng dẫn trong bộ tài liệu này để hoàn tất quá trình thiết lập

Định cấu hình Cloud Shell

Bây giờ, hãy thiết lập Cloud Shell, một giao diện dòng lệnh tiện dụng ngay trong Google Cloud Console.

Khởi chạy Cloud Shell

Ở góc trên bên phải của Google Cloud Console, bạn sẽ thấy một biểu tượng trông giống như một thiết bị đầu cuối (>_). Nhấp vào biểu tượng đó để kích hoạt Cloud Shell.

8e234ad9973e49d4.png

Uỷ quyền truy cập

Nếu được nhắc, hãy nhấp vào Uỷ quyền để cấp cho Cloud Shell các quyền cần thiết để tương tác với dự án của bạn trên Google Cloud.

d5e271ec814f5769.png

Xác minh mã dự án

Xem Project ID trong thiết bị đầu cuối. Nội dung này sẽ được viết bằng màu vàng như trong hình bên dưới. Đảm bảo đó là mã nhận dạng mà bạn đã ghi lại khi tạo dự án.

b0cc3fe9f0868217.png

Nếu Project ID được phản ánh chính xác trong thiết bị đầu cuối, hãy chuyển sang bước Bật các API cần thiết.

Chỉnh sửa mã dự án (nếu cần)

Nếu Project ID không chính xác hoặc hoàn toàn không xuất hiện, hãy dùng lệnh này để khắc phục. Hãy nhớ thay thế văn bản your-project-id bằng Project ID chính xác của bạn trước khi thực thi lệnh.

gcloud config set project your-project-id

Bật các API cần thiết

Để sử dụng các dịch vụ của Google Cloud như Cloud Run, trước tiên, bạn phải kích hoạt các API tương ứng cho dự án của mình. Chạy các lệnh sau trong Cloud Shell để bật các dịch vụ cần thiết cho Lớp học lập trình này:

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

3. Chọn mô hình phù hợp

Bạn có thể tìm thấy nhiều mô hình mở trên các trang web như Hugging Face HubKaggle. Khi muốn sử dụng một trong những mô hình này trên một dịch vụ như Google Cloud Run, bạn cần chọn một mô hình phù hợp với tài nguyên bạn có (tức là GPU NVIDIA L4).

Ngoài kích thước, hãy nhớ cân nhắc những gì mô hình thực sự có thể làm. Các mô hình không giống nhau; mỗi mô hình đều có ưu điểm và nhược điểm riêng. Ví dụ: một số mô hình có thể xử lý nhiều loại dữ liệu đầu vào (chẳng hạn như hình ảnh và văn bản – còn gọi là khả năng đa phương thức), trong khi những mô hình khác có thể ghi nhớ và xử lý nhiều thông tin hơn cùng một lúc (tức là chúng có cửa sổ ngữ cảnh lớn hơn). Thông thường, các mô hình lớn hơn sẽ có nhiều chức năng nâng cao hơn như gọi hàmsuy nghĩ.

Bạn cũng cần kiểm tra xem công cụ phân phát (trong trường hợp này là vLLM) có hỗ trợ mô hình mà bạn muốn hay không. Bạn có thể xem tất cả các mô hình được vLLM hỗ trợ tại đây.

Giờ đây, chúng ta hãy khám phá Gemma 3, bộ mô hình ngôn ngữ lớn (LLM) mới nhất của Google được cung cấp công khai. Gemma 3 có 4 quy mô dựa trên độ phức tạp, được đo bằng tham số: 1 tỷ, 4 tỷ, 12 tỷ và 27 tỷ.

Đối với mỗi kích thước này, bạn sẽ thấy 2 loại chính:

  • Phiên bản cơ sở (được huấn luyện trước): Đây là mô hình nền tảng đã học được từ một lượng lớn dữ liệu.
  • Phiên bản được tinh chỉnh theo hướng dẫn: Phiên bản này đã được tinh chỉnh thêm để hiểu rõ hơn và làm theo các hướng dẫn hoặc lệnh cụ thể.

Các mô hình lớn hơn (4 tỷ, 12 tỷ và 27 tỷ tham số) là đa phương thức, tức là có thể hiểu và xử lý cả hình ảnh và văn bản. Tuy nhiên, biến thể nhỏ nhất có 1 tỷ tham số chỉ tập trung vào văn bản.

Trong Lớp học lập trình này, chúng ta sẽ sử dụng 1 tỷ biến thể của Gemma 3: gemma-3-1b-it. Việc sử dụng một mô hình nhỏ hơn cũng giúp bạn tìm hiểu cách làm việc với tài nguyên hạn chế. Đây là điều quan trọng để giảm chi phí và đảm bảo ứng dụng của bạn chạy trơn tru trên đám mây.

4. Biến môi trường và thông tin bí mật

Tạo tệp môi trường

Trước khi tiếp tục, bạn nên đặt tất cả cấu hình mà bạn sẽ sử dụng trong suốt Lớp học lập trình này ở một nơi. Để bắt đầu, hãy mở thiết bị đầu cuối và làm theo các bước sau:

  1. Tạo một thư mục mới cho dự án này.
  2. Chuyển đến thư mục vừa tạo.
  3. Tạo một tệp .env trống trong thư mục này (tệp này sẽ chứa các biến môi trường của bạn sau này)

Sau đây là lệnh để thực hiện các bước đó:

mkdir vllm-gemma3
cd vllm-gemma3
touch .env

Tiếp theo, hãy sao chép các biến được liệt kê bên dưới rồi dán vào tệp.env mà bạn vừa tạo. Hãy nhớ thay thế các giá trị giữ chỗ (your_project_idyour_region) bằng thông tin cụ thể về dự án của bạn. Ví dụ: (PROJECT_ID=unique-ai-projectREGION=us-central1)

PROJECT_ID=your_project_id
REGION=your_region

MODEL_PROVIDER=google
MODEL_VARIANT=gemma-3-1b-it
MODEL_NAME=${MODEL_PROVIDER}/${MODEL_VARIANT}

AR_REPO_NAME=vllm-gemma3-repo
SERVICE_NAME=${MODEL_VARIANT}-service
IMAGE_NAME=${REGION}-docker.pkg.dev/${PROJECT_ID}/${AR_REPO_NAME}/${SERVICE_NAME}

SERVICE_ACC_NAME=${SERVICE_NAME}-sa
SERVICE_ACC_EMAIL=${SERVICE_ACC_NAME}@${PROJECT_ID}.iam.gserviceaccount.com

Sau khi bạn chỉnh sửa và lưu tệp.env, hãy nhập lệnh sau để tải các biến môi trường đó vào phiên thiết bị đầu cuối:

source .env

Bạn có thể kiểm thử xem các biến có được tải thành công hay không bằng cách lặp lại một trong các biến. Ví dụ:

echo $SERVICE_NAME

Nếu bạn nhận được cùng một giá trị như đã chỉ định trong tệp.env, thì các biến đã được tải thành công.

Lưu trữ một bí mật trên Secret Manager

Đối với mọi dữ liệu nhạy cảm, bao gồm cả mã truy cập, thông tin xác thực và mật khẩu, bạn nên sử dụng trình quản lý bí mật.

Trước khi sử dụng các mô hình Gemma 3, trước tiên, bạn phải xác nhận các điều khoản và điều kiện vì chúng được kiểm soát. Truy cập vào Thẻ mô hình Gamma3 trên Hugging Face Hub và xác nhận các điều khoản và điều kiện.

Sau khi bạn có Hugging Face Access Token, hãy chuyển đến trang Secret Manager và tạo một bí mật bằng cách làm theo các hướng dẫn sau

  • Chuyển đến Google Cloud Console
  • Chọn dự án trong thanh trình đơn thả xuống ở trên cùng bên trái
  • Tìm kiếm Secret Manager trong thanh tìm kiếm rồi nhấp vào lựa chọn đó khi thấy

Khi bạn ở trang Secret Manager:

  • Nhấp vào nút +Tạo khoá bí mật,
  • Điền những thông tin sau:
  • Tên: HF_TOKEN
  • Giá trị khoá bí mật: <your_hf_access_token>
  • Nhấp vào nút Tạo khoá bí mật khi bạn hoàn tất.

Giờ đây, bạn sẽ có Hugging Face Access Token dưới dạng một khoá bí mật trên Google Cloud Secret Manager.

Bạn có thể kiểm thử quyền truy cập vào khoá bí mật bằng cách thực thi lệnh bên dưới trong thiết bị đầu cuối. Lệnh đó sẽ truy xuất khoá bí mật từ Secret Manager:

gcloud secrets versions access latest --secret=HF_TOKEN

Bạn sẽ thấy Mã truy cập được truy xuất và xuất hiện trong cửa sổ thiết bị đầu cuối.

5. Tạo một tài khoản dịch vụ

Để tăng cường bảo mật và quản lý quyền truy cập một cách hiệu quả trong môi trường sản xuất, các dịch vụ nên hoạt động trong các tài khoản dịch vụ chuyên dụng, chỉ có các quyền cần thiết cho các tác vụ cụ thể của chúng.

Chạy lệnh này để tạo tài khoản dịch vụ

gcloud iam service-accounts create $SERVICE_ACC_NAME --display-name='Cloud Run vLLM Model Serving SA'

Lệnh sau đây sẽ đính kèm quyền cần thiết

gcloud secrets add-iam-policy-binding HF_TOKEN \
  --member="serviceAccount:${SERVICE_ACC_EMAIL}" \
  --role="roles/secretmanager.secretAccessor"

6. Tạo một hình ảnh trên Artifact Registry

Bước này liên quan đến việc tạo một hình ảnh Docker bao gồm trọng số mô hình và vLLM được cài đặt sẵn.

1. Tạo kho lưu trữ Docker trên Artifact Registry

Hãy tạo một kho lưu trữ Docker trong Artifact Registry để đẩy các hình ảnh đã tạo. Chạy lệnh sau trong dòng lệnh:

gcloud artifacts repositories create ${AR_REPO_NAME} \
  --repository-format docker \
  --location ${REGION}

2. Lưu trữ mô hình

Dựa trên tài liệu về các phương pháp hay nhất cho GPU, bạn có thể lưu trữ các mô hình học máy bên trong hình ảnh vùng chứa hoặc tối ưu hoá việc tải các mô hình đó từ Cloud Storage. Tất nhiên, mỗi phương pháp đều có ưu và nhược điểm riêng. Bạn có thể đọc tài liệu để tìm hiểu thêm về các thành phần này. Để đơn giản, chúng ta sẽ chỉ lưu trữ mô hình trong hình ảnh vùng chứa.

3. Tạo tệp Docker

Tạo một tệp có tên là Dockerfile rồi sao chép nội dung bên dưới vào tệp đó:

FROM vllm/vllm-openai:v0.9.0

ARG MODEL_NAME
ARG HF_TOKEN

ENV HF_HOME=/model-cache
ENV MODEL_NAME=${MODEL_NAME}

# Use the HF_TOKEN argument to log in and download the model
RUN huggingface-cli login --token ${HF_TOKEN} && \
    huggingface-cli download ${MODEL_NAME}

ENV HF_HUB_OFFLINE=1

EXPOSE 8080

ENTRYPOINT python3 -m vllm.entrypoints.openai.api_server \
    --port ${PORT:-8080} \
    --model ${MODEL_NAME} \
    --gpu-memory-utilization 0.90 \
    ${MAX_MODEL_LEN:+--max-model-len "$MAX_MODEL_LEN"}

4. Tạo tệp cloudbuild.yaml

Tiếp theo, hãy tạo một tệp có tên là cloudbuild.yaml trong cùng thư mục. Tệp này xác định các bước mà Cloud Build sẽ thực hiện. Sao chép và dán nội dung sau vào cloudbuild.yaml:

steps:
- name: 'gcr.io/cloud-builders/docker'
  entrypoint: 'bash'
  args:
  - '-c'
  - |
    docker build \
      --build-arg MODEL_NAME=${_MODEL_NAME} \
      --build-arg HF_TOKEN=$$HF_TOKEN_SECRET \
      -t ${_IMAGE_NAME} .
  secretEnv: ['HF_TOKEN_SECRET']

images:
- '${_IMAGE_NAME}'

availableSecrets:
  secretManager:
  - versionName: projects/${PROJECT_ID}/secrets/HF_TOKEN/versions/latest
    env: 'HF_TOKEN_SECRET'

5. Gửi bản dựng đến Cloud Build

Sao chép và dán mã sau đây rồi chạy mã đó trong thiết bị đầu cuối:

gcloud builds submit . \
    --config=cloudbuild.yaml \
    --region=${REGION} \
    --substitutions=_MODEL_NAME=${MODEL_NAME},_IMAGE_NAME=${IMAGE_NAME}

Lệnh này tải mã của bạn lên (Dockerfilecloudbuild.yaml), truyền các biến shell của bạn dưới dạng các giá trị thay thế (_MODEL_NAME_IMAGE_NAME) rồi bắt đầu quá trình tạo.

Giờ đây, Cloud Build sẽ thực thi các bước được xác định trong cloudbuild.yaml. Bạn có thể theo dõi nhật ký trong thiết bị đầu cuối hoặc bằng cách nhấp vào đường liên kết đến thông tin chi tiết về bản dựng trong Cloud Console. Sau khi quá trình này hoàn tất, hình ảnh vùng chứa sẽ có trong kho lưu trữ Artifact Registry của bạn, sẵn sàng để triển khai.

7. Kiểm thử dịch vụ

Chạy lệnh sau trong dòng lệnh để tạo một proxy, nhờ đó bạn có thể truy cập vào dịch vụ khi dịch vụ đang chạy trong localhost:

gcloud run services proxy ${SERVICE_NAME} --region ${REGION}

Trong một cửa sổ dòng lệnh mới, hãy chạy lệnh curl này trong dòng lệnh để kiểm tra kết nối

curl -X POST http://localhost:8080/v1/completions \
-H "Authorization: Bearer $(gcloud auth print-identity-token)" \
-H "Content-Type: application/json" \
-d '{
  "model": "google/gemma-3-1b-it",
  "prompt": "Cloud Run is a ",
  "max_tokens": 128,
  "temperature": 0.90
}'

Nếu bạn thấy kết quả tương tự như bên dưới:

{"id":"cmpl-e96d05d2893d42939c1780d44233defa","object":"text_completion","created":1746870778,"model":"google/gemma-3-1b-it","choices":[{"index":0,"text":"100% managed Kubernetes service. It's a great option for many use cases.\n\nHere's a breakdown of key features and considerations:\n\n* **Managed Kubernetes:**  This means Google handles the underlying infrastructure, including scaling, patching, and maintenance.  You don't need to worry about managing Kubernetes clusters.\n* **Serverless:**  You only pay for the compute time your application actually uses.  No charges when your code isn't running.\n* **Scalability:**  Cloud Run automatically scales your application based on demand. You can easily scale up or down to handle fluctuating traffic.\n*","logprobs":null,"finish_reason":"length","stop_reason":null,"prompt_logprobs":null}],"usage":{"prompt_tokens":6,"total_tokens":134,"completion_tokens":128,"prompt_tokens_details":null}}

8. Kết luận

Xin chúc mừng! Bạn đã hoàn tất thành công Lớp học lập trình này. Bạn đã tìm hiểu cách:

  • Chọn kích thước mô hình phù hợp cho một mục tiêu triển khai.
  • Thiết lập vLLM để phân phát một API tương thích với OpenAI.
  • Tạo vùng chứa an toàn cho máy chủ vLLM và trọng số mô hình bằng Docker.
  • Đẩy một hình ảnh vùng chứa lên Google Artifact Registry.
  • Triển khai một dịch vụ được tăng tốc bằng GPU lên Cloud Run.
  • Kiểm thử một mô hình đã xác thực và triển khai.

Bạn có thể khám phá cách triển khai các mô hình thú vị khác như Llama, Mistral hoặc Qwen để tiếp tục hành trình học tập của mình!

9. Dọn dẹp

Để tránh bị tính phí trong tương lai, bạn cần xoá các tài nguyên mà mình đã tạo. Chạy các lệnh sau để dọn dẹp dự án của bạn.

1. Xoá dịch vụ Cloud Run:

gcloud run services delete ${SERVICE_NAME} --region=${REGION} --quiet

2. Xoá kho lưu trữ Artifact Registry:

gcloud artifacts repositories delete ${AR_REPO_NAME} --location=${REGION} --quiet

3. Xoá tài khoản dịch vụ:

gcloud iam service-accounts delete ${SERVICE_ACC_EMAIL} --quiet

4. Xoá khoá bí mật khỏi Secret Manager:

gcloud secrets delete HF_TOKEN --quiet