Jak wnioskować na podstawie modeli LLM na GPU w Cloud Run przy użyciu vLLM i pakietu OpenAI Python SDK

1. Wprowadzenie

Omówienie

W Cloud Run dodano ostatnio obsługę GPU. Jest dostępna publicznie w wersji przedpremierowej na liście oczekujących. Jeśli chcesz wypróbować tę funkcję, wypełnij ten formularz, aby wpisać się na listę oczekujących. Cloud Run to platforma kontenerów w Google Cloud, która ułatwia uruchamianie kodu w kontenerze bez konieczności zarządzania klastrem.

Obecnie dostępne są procesory graficzne Nvidia L4 z 24 GB pamięci RAM. W każdej instancji Cloud Run jest jeden GPU, a autoskalowanie Cloud Run nadal obowiązuje. Obejmuje to skalowanie do 5 instancji (z możliwością zwiększenia limitu) oraz skalowanie w dół do zera, gdy nie ma żądań.

Jednym z przypadków użycia GPU jest uruchamianie własnych otwartych dużych modeli językowych (LLM). Ten samouczek przedstawia proces wdrażania usługi obsługującej LLM.

Jest to usługa backendu, która uruchamia vLLM – mechanizm wnioskowania dla systemów produkcyjnych. W ramach tego ćwiczenia w Codelabs korzystamy z opracowanej przez Google aplikacji Gemma 2 z 2 miliardami parametrów dostrojonym modelem dostrojonym w postaci instrukcji.

Czego się nauczysz

  • Jak używać GPU w Cloud Run.
  • Jak użyć Hugging Face, aby pobrać model.
  • Wdrażanie w Cloud Run modelu Google Gemma 2 2b dostrojonego zgodnie z instrukcjami przy użyciu LLM jako silnika wnioskowania.
  • Jak wywołać usługę backendu, aby dokończyć zdanie.

2. Konfiguracja i wymagania

Wymagania wstępne

  • Jesteś zalogowany w konsoli Google Cloud.
  • Masz już wdrożoną usługę Cloud Run. Możesz na przykład zapoznać się z krótkim wprowadzeniem do wdrażania usługi sieciowej z kodu źródłowego.
  • masz konto Hugging Face i akceptujesz licencję Gemma 2 2b na stronie https://huggingface.co/google/gemma-2-2b-it; w przeciwnym razie nie będzie można pobrać modelu.
  • Udało Ci się utworzyć token dostępu z dostępem do modelu google/gemma-2-2b-it.

Aktywowanie Cloud Shell

  1. W konsoli Cloud kliknij Aktywuj Cloud Shell d1264ca30785e435.png.

cb81e7c8e34bc8d.png

Jeśli uruchamiasz Cloud Shell po raz pierwszy, zobaczysz ekran pośredni z opisem tej usługi. Jeśli wyświetlił się ekran pośredni, kliknij Dalej.

d95252b003979716.png

Uzyskanie dostępu do Cloud Shell i połączenie się z nim powinno zająć tylko kilka chwil.

7833d5e1c5d18f54.png

Ta maszyna wirtualna ma wszystkie potrzebne narzędzia dla programistów. Zawiera stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie zwiększa wydajność sieci i uwierzytelnianie. Większość zadań w ramach tego ćwiczenia z programowania można wykonać w przeglądarce.

Po nawiązaniu połączenia z Cloud Shell powinno pojawić się potwierdzenie, że użytkownik jest uwierzytelniony, a projekt jest ustawiony na identyfikator Twojego projektu.

  1. Uruchom to polecenie w Cloud Shell, aby potwierdzić, że jesteś uwierzytelniony:
gcloud auth list

Dane wyjściowe polecenia

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Uruchom to polecenie w Cloud Shell, aby sprawdzić, czy polecenie gcloud zna Twój projekt:
gcloud config list project

Dane wyjściowe polecenia

[core]
project = <PROJECT_ID>

Jeśli tak nie jest, możesz go ustawić za pomocą tego polecenia:

gcloud config set project <PROJECT_ID>

Dane wyjściowe polecenia

Updated property [core/project].

3. Włączanie interfejsów API i ustawianie zmiennych środowiskowych

Włącz interfejsy API

Zanim zaczniesz korzystać z tego ćwiczenia z programowania, musisz włączyć kilka interfejsów API. To ćwiczenie w Codelabs wymaga używania poniższych interfejsów API. Możesz włączyć te interfejsy API, uruchamiając to polecenie:

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

Skonfiguruj zmienne środowiskowe

Możesz ustawić zmienne środowiskowe, które będą używane podczas tego ćwiczenia z programowania.

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. Tworzenie konta usługi

To konto usługi służy do tworzenia usługi Cloud Run i uzyskiwania dostępu do obiektu tajnego z usługi Secret Manager.

Najpierw utwórz konto usługi, uruchamiając to polecenie:

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

Następnie przypisz do konta usługi rolę użytkownika Vertex AI.

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

Teraz utwórz obiekt tajny w usłudze Secret Manager o nazwie HF_TOKEN dla swojego tokena dostępu Hugging Face. Cloud Build wykorzystuje konto usługi do uzyskiwania dostępu do tego obiektu tajnego w czasie kompilacji i pobiera model Gemma 2 (2B) z Hugging Face. Więcej informacji o obiektach tajnych i Cloud Build znajdziesz tutaj.

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

I przyznaj kontu usługi dostęp do obiektu tajnego HF_TOKEN w usłudze Secret Manager.

gcloud secrets add-iam-policy-binding HF_TOKEN \
    --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
    --role='roles/secretmanager.secretAccessor'

5. Tworzenie obrazu w Artifact Registry

Najpierw utwórz repozytorium w Artifact Registry.

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

Następnie utwórz obiekt Dockerfile, który będzie zawierał obiekt tajny z usługi Secret Manager. Więcej informacji o flagi Dockera Buildx – obiektów tajnych znajdziesz tutaj.

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"}

Teraz utwórz plik 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"

Na koniec prześlij kompilację.

gcloud builds submit --config=cloudbuild.yaml

Kompilacja może potrwać ok. 8 minut.

6. Wdrażanie usługi

Teraz możesz wdrożyć obraz w Cloud Run.

gcloud beta run deploy $SERVICE_NAME \
--image=us-central1-docker.pkg.dev/$PROJECT_ID/$AR_REPO_NAME/$SERVICE_NAME \
--service-account $SERVICE_ACCOUNT_ADDRESS \
--cpu=8 \
--memory=32Gi \
--gpu=1 --gpu-type=nvidia-l4 \
--region us-central1 \
--no-allow-unauthenticated \
--max-instances 5 \
--no-cpu-throttling

Wdrożenie może potrwać do 5 minut.

7. Testowanie usługi

Po wdrożeniu możesz skorzystać z usługi deweloperskiej serwera proxy Cloud Run, która automatycznie doda token identyfikatora za Ciebie, lub bezpośrednio skręcić adres URL usługi.

Korzystanie z usługi proxy programisty w Cloud Run

Aby skorzystać z usługi serwera proxy dla programistów w Cloud Run, możesz wykonać te czynności:

Najpierw uruchom następujące polecenie

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

Następnie zwiń usługę

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
}'

Bezpośrednie używanie adresu URL usługi

Najpierw pobierz adres URL wdrożonej usługi.

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

Zwiń usługę

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
}'

Wyniki

Wyniki powinny wyglądać podobnie do tych:

{"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. Gratulacje!

Gratulujemy ukończenia ćwiczeń z programowania.

Zalecamy zapoznanie się z dokumentacją Cloud Run.

Omówione zagadnienia

  • Jak używać GPU w Cloud Run.
  • Jak użyć Hugging Face, aby pobrać model.
  • Jak wdrożyć w Cloud Run model Google Gemma 2 (2B) z wykorzystaniem LLM jako silnika wnioskowania.
  • Jak wywołać usługę backendu, aby dokończyć zdanie.

9. Czyszczenie danych

Aby uniknąć niezamierzonych opłat (na przykład jeśli usługi Cloud Run były wywoływane więcej razy niż przez miesięczny przydział wywołań Cloud Run na poziomie bezpłatnym), możesz usunąć Cloud Run albo projekt utworzony w kroku 2.

Aby usunąć usługę Cloud Run, otwórz konsolę Cloud Run na stronie https://console.cloud.google.com/run i usuń usługę vllm-gemma-2-2b. Możesz też usunąć konto usługi vllm-gemma-2-2b.

Jeśli zdecydujesz się usunąć cały projekt, możesz otworzyć stronę https://console.cloud.google.com/cloud-resource-manager, wybrać projekt utworzony w kroku 2 i kliknąć Usuń. Jeśli usuniesz projekt, musisz zmienić projekty w pakiecie SDK Cloud. Aby wyświetlić listę wszystkich dostępnych projektów, uruchom polecenie gcloud projects list.