Cách chạy dự đoán LLM trên GPU Cloud Run bằng vLLM và SDK OpenAI Python

1. Giới thiệu

Tổng quan

Cloud Run mới bổ sung tính năng hỗ trợ GPU. Tính năng này hiện đang ở giai đoạn dùng thử công khai (có trong danh sách chờ). Nếu bạn muốn dùng thử tính năng này, hãy điền vào biểu mẫu này để có tên trong danh sách chờ. Cloud Run là một nền tảng vùng chứa trên Google Cloud, giúp bạn dễ dàng chạy mã trong vùng chứa mà không cần quản lý một cụm.

Hiện tại, GPU mà chúng tôi cung cấp là GPU Nvidia L4 với 24 GB vRAM. Mỗi phiên bản Cloud Run có một GPU và tính năng tự động mở rộng quy mô của Cloud Run vẫn được áp dụng. Điều này bao gồm việc mở rộng quy mô lên đến 5 phiên bản (có thể tăng hạn mức), cũng như giảm quy mô xuống 0 phiên bản khi không có yêu cầu.

Một trường hợp sử dụng GPU là chạy các mô hình ngôn ngữ lớn (LLM) mở của riêng bạn. Hướng dẫn này sẽ hướng dẫn bạn triển khai một dịch vụ chạy LLM.

Dịch vụ này là một dịch vụ phụ trợ chạy vLLM, một công cụ suy luận cho các hệ thống sản xuất. Lớp học lập trình này sử dụng Gemma 2 của Google với mô hình được điều chỉnh theo hướng dẫn có 2 tỷ tham số.

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

  • Cách sử dụng GPU trên Cloud Run.
  • Cách sử dụng Hugging Face để truy xuất một mô hình.
  • Cách triển khai mô hình được tinh chỉnh theo hướng dẫn Gemma 2 2b của Google trên Cloud Run bằng vLLM làm công cụ suy luận.
  • Cách gọi dịch vụ phụ trợ để hoàn thành câu.

2. Thiết lập và yêu cầu

Điều kiện tiên quyết

  • Bạn đã đăng nhập vào Cloud Console.
  • Trước đây, bạn đã triển khai một dịch vụ Cloud Run. Ví dụ: bạn có thể làm theo hướng dẫn nhanh về cách triển khai dịch vụ web từ mã nguồn để bắt đầu.
  • Bạn có tài khoản Hugging Face và đã xác nhận giấy phép Gemma 2 2b tại https://huggingface.co/google/gemma-2-2b-it; nếu không, bạn sẽ không thể tải mô hình xuống.
  • Bạn đã tạo một mã truy cập có quyền truy cập vào mô hình google/gemma-2-2b-it.

Kích hoạt Cloud Shell

  1. Trong Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell d1264ca30785e435.png.

cb81e7c8e34bc8d.png

Nếu đây là lần đầu tiên bạn khởi động Cloud Shell, bạn sẽ thấy một màn hình trung gian mô tả về Cloud Shell. Nếu bạn thấy màn hình trung gian, hãy nhấp vào Tiếp tục.

d95252b003979716.png

Quá trình cung cấp và kết nối với Cloud Shell chỉ mất vài giây.

7833d5e1c5d18f54.png

Máy ảo này được trang bị tất cả các công cụ phát triển cần thiết. Nền tảng này cung cấp một thư mục chính có dung lượng 5 GB và chạy trong Google Cloud, giúp tăng cường đáng kể hiệu suất mạng và hoạt động xác thực. Bạn có thể thực hiện hầu hết, nếu không muốn nói là tất cả, công việc của mình trong lớp học lập trình này bằng trình duyệt.

Sau khi kết nối với Cloud Shell, bạn sẽ thấy rằng mình đã được xác thực và dự án được đặt thành mã dự án của bạn.

  1. Chạy lệnh sau trong Cloud Shell để xác nhận rằng bạn đã được xác thực:
gcloud auth list

Đầu ra của lệnh

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Chạy lệnh sau trong Cloud Shell để xác nhận rằng lệnh gcloud biết về dự án của bạn:
gcloud config list project

Đầu ra của lệnh

[core]
project = <PROJECT_ID>

Nếu không, bạn có thể đặt nó bằng lệnh sau:

gcloud config set project <PROJECT_ID>

Đầu ra của lệnh

Updated property [core/project].

3. Bật API và đặt các biến môi trường

Bật API

Để có thể bắt đầu sử dụng lớp học lập trình này, bạn cần bật một số API. Lớp học lập trình này yêu cầu bạn sử dụng các API sau. Bạn có thể bật các API đó bằng cách chạy lệnh sau:

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

Thiết lập các biến môi trường

Bạn có thể thiết lập các biến môi trường sẽ được dùng trong suốt lớp học lập trình này.

HF_TOKEN=<YOUR_HUGGING_FACE_TOKEN>
PROJECT_ID=<YOUR_PROJECT_ID>

REGION=us-central1
SERVICE_NAME=vllm-gemma-2-2b-it
AR_REPO_NAME=vllm-gemma-2-2b-it-repo
SERVICE_ACCOUNT=vllm-gemma-2-2b-it
SERVICE_ACCOUNT_ADDRESS=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

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

Tài khoản dịch vụ này được dùng để tạo dịch vụ Cloud Run và truy cập vào một khoá bí mật từ Secret Manager.

Trước tiên, hãy tạo tài khoản dịch vụ bằng cách chạy lệnh sau:

gcloud iam service-accounts create $SERVICE_ACCOUNT \
  --display-name="Cloud Run vllm SA to access secret manager"

Thứ hai, cấp vai trò Người dùng Vertex AI cho tài khoản dịch vụ.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role=roles/secretmanager.secretAccessor

Bây giờ, hãy tạo một khoá bí mật trong Secret Manager có tên là HF_TOKEN cho Mã truy cập Hugging Face. Cloud Build sử dụng tài khoản dịch vụ để truy cập vào khoá bí mật này tại thời gian xây dựng nhằm kéo mô hình Gemma 2 (2B) xuống từ Hugging Face. Bạn có thể tìm hiểu thêm về các bí mật và Cloud Build tại đây.

printf $HF_TOKEN | gcloud secrets create HF_TOKEN --data-file=-

Và cấp cho tài khoản dịch vụ điện toán mặc định quyền truy cập vào bí mật HF_TOKEN trong Secret Manager khi tạo hình ảnh.

PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
  --role="roles/secretmanager.secretAccessor"

5. Tạo hình ảnh trong Artifact Registry

Trước tiên, hãy tạo một kho lưu trữ trong Artifact Registry.

gcloud artifacts repositories create $AR_REPO_NAME \
  --repository-format docker \
  --location us-central1

Tiếp theo, hãy tạo một Dockerfile sẽ kết hợp mã bí mật từ Secret Manager. Bạn có thể tìm hiểu thêm về cờ Docker buildx –secrets tại đây.

FROM vllm/vllm-openai:latest

ENV HF_HOME=/model-cache
RUN --mount=type=secret,id=HF_TOKEN HF_TOKEN=$(cat /run/secrets/HF_TOKEN) \
    huggingface-cli download google/gemma-2-2b-it

ENV HF_HUB_OFFLINE=1

ENTRYPOINT python3 -m vllm.entrypoints.openai.api_server \
    --port ${PORT:-8000} \
    --model ${MODEL_NAME:-google/gemma-2-2b-it} \
    ${MAX_MODEL_LEN:+--max-model-len "$MAX_MODEL_LEN"}

Bây giờ, hãy tạo một tệp cloudbuild.yaml

steps:
- name: 'gcr.io/cloud-builders/docker'
  id: build
  entrypoint: 'bash'
  secretEnv: ['HF_TOKEN']
  args: 
    - -c
    - |
        SECRET_TOKEN="$$HF_TOKEN" docker buildx build --tag=${_IMAGE} --secret id=HF_TOKEN .

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

images: ["${_IMAGE}"]

substitutions:  
  _IMAGE: 'us-central1-docker.pkg.dev/${PROJECT_ID}/vllm-gemma-2-2b-it-repo/vllm-gemma-2-2b-it'

options:
  dynamicSubstitutions: true
  machineType: "E2_HIGHCPU_32"

Cuối cùng, hãy gửi một bản dựng.

gcloud builds submit --config=cloudbuild.yaml

Quá trình tạo có thể mất khoảng 8 phút.

6. Triển khai dịch vụ

Giờ đây, bạn đã sẵn sàng triển khai hình ảnh lên Cloud Run. Quá trình triển khai sẽ mất khoảng 5 phút. Bạn cần tăng độ trễ ban đầu cho quy trình kiểm tra tình trạng hoạt động thêm vài phút để hình ảnh có thêm thời gian tải. Nếu không, bạn sẽ gặp lỗi Deadline Exceeded (Đã quá thời hạn) trong quy trình kiểm tra tình trạng.

gcloud beta run deploy $SERVICE_NAME \
--image=$REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO_NAME/$SERVICE_NAME \
--service-account $SERVICE_ACCOUNT_ADDRESS \
--cpu=8 \
--memory=32Gi \
--gpu=1 \
--port=8000 \
--gpu-type=nvidia-l4 \
--region $REGION \
--no-allow-unauthenticated \
--max-instances 3 \
--no-cpu-throttling \
--no-gpu-zonal-redundancy \
--startup-probe tcpSocket.port=8000,initialDelaySeconds=240,failureThreshold=1,timeoutSeconds=240,periodSeconds=240

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

Sau khi triển khai, bạn có thể sử dụng dịch vụ proxy phát triển Cloud Run (dịch vụ này sẽ tự động thêm mã nhận dạng cho bạn) hoặc trực tiếp sử dụng URL dịch vụ.

Sử dụng dịch vụ proxy dành cho nhà phát triển Cloud Run

Để sử dụng dịch vụ proxy dành cho nhà phát triển Cloud Run, bạn có thể làm theo các bước sau:

Trước tiên, hãy chạy lệnh sau

gcloud run services proxy $SERVICE_NAME --region us-central1

Tiếp theo, hãy curl dịch vụ

curl -X POST http://localhost:8080/v1/completions \
-H "Content-Type: application/json" \
-d '{
  "model": "google/gemma-2-2b-it",
  "prompt": "Cloud Run is a",
  "max_tokens": 128,
  "temperature": 0.90
}'

Sử dụng trực tiếp URL dịch vụ

Trước tiên, hãy truy xuất URL cho dịch vụ đã triển khai.

SERVICE_URL=$(gcloud run services describe $SERVICE_NAME --region $REGION --format 'value(status.url)')

Curl dịch vụ

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

Kết quả

Bạn sẽ thấy kết quả tương tự như sau:

{"id":"cmpl-e0e6924d4bfd4d918383c87cba5e25ac","object":"text_completion","created":1723853023,"model":"google/gemma-2-2b","choices":[{"index":0,"text":" serverless compute platform that lets you write your backend code in standard languages, such as Java, Go, PHP and Python.\n\nYou can deploy your function as a REST API that scales on demand and allows you to add additional security features such as HTTPS.\n\nTo write code for an Android app with Cloud Run, you need to use the GraalVM. This is because while Node.js is a more commonly known node-based platform, GraalVM is a virtual machine (VM) to run native code in the Cloud Run environment.\n\nNow you need graal.vm/java-11-jre.jar, the","logprobs":null,"finish_reason":"length","stop_reason":null}],"usage":{"prompt_tokens":5,"total_tokens":133,"completion_tokens":128}}

8. Xin chúc mừng!

Chúc mừng bạn đã hoàn thành lớp học lập trình này!

Bạn nên xem tài liệu Cloud Run

Nội dung đã đề cập

  • Cách sử dụng GPU trên Cloud Run.
  • Cách sử dụng Hugging Face để truy xuất một mô hình.
  • Cách triển khai mô hình Gemma 2 (2B) của Google trên Cloud Run bằng vLLM làm công cụ suy luận.
  • Cách gọi dịch vụ phụ trợ để hoàn thành câu.

9. Dọn dẹp

Để tránh bị tính phí ngoài ý muốn (ví dụ: nếu các dịch vụ Cloud Run được gọi nhiều lần hơn hạn mức gọi Cloud Run hằng tháng của bạn trong cấp miễn phí), bạn có thể xoá Cloud Run hoặc xoá dự án mà bạn đã tạo ở Bước 2.

Để xoá dịch vụ Cloud Run, hãy truy cập vào Cloud Console của Cloud Run tại https://console.cloud.google.com/run rồi xoá dịch vụ vllm-gemma-2-2b. Bạn cũng có thể muốn xoá tài khoản dịch vụ vllm-gemma-2-2b.

Nếu chọn xoá toàn bộ dự án, bạn có thể truy cập vào https://console.cloud.google.com/cloud-resource-manager, chọn dự án bạn đã tạo ở Bước 2 rồi chọn Xoá. Nếu xoá dự án, bạn sẽ cần thay đổi dự án trong Cloud SDK. Bạn có thể xem danh sách tất cả các dự án có sẵn bằng cách chạy gcloud projects list.