Как выполнить вывод LLM на графических процессорах Cloud Run с помощью vLLM и OpenAI Python SDK

1. Введение

Обзор

Cloud Run — это контейнерная платформа на Google Cloud, которая упрощает запуск кода в контейнере, не требуя управления кластером. Недавно в Cloud Run была добавлена ​​поддержка графических процессоров (GPU).

Сегодня мы предоставляем только графические процессоры Nvidia L4 с 24 ГБ видеопамяти. На каждый экземпляр Cloud Run приходится один графический процессор, и автоматическое масштабирование Cloud Run по-прежнему применяется. Это включает масштабирование до 5 экземпляров (с возможностью увеличения квоты), а также масштабирование до нуля экземпляров при отсутствии запросов.

Один из вариантов использования графических процессоров — запуск собственных открытых больших языковых моделей (LLM). В этом руководстве показано, как развернуть сервис, который запускает LLM.

Данный сервис представляет собой бэкэнд-сервис, на котором работает vLLM — механизм логического вывода для производственных систем. В этом практическом занятии используется модель Gemma 2 от Google с 2 миллиардами параметров, оптимизированная для выполнения инструкций.

Что вы узнаете

  • Как использовать графические процессоры в Cloud Run.
  • Как использовать Hugging Face для получения модели.
  • Как развернуть оптимизированную для инструкций модель Google Gemma 2 2b на Cloud Run, используя vLLM в качестве механизма вывода.
  • Как вызвать серверную службу для автодополнения предложений.

2. Настройка и требования

Предварительные требования

  • Вы вошли в облачную консоль.
  • Вы ранее развернули службу Cloud Run. Например, для начала вы можете воспользоваться руководством по быстрому развертыванию веб-службы из исходного кода .
  • У вас есть учетная запись Hugging Face, и вы подтвердили согласие с лицензией Gemma 2 2b, размещенной по адресу https://huggingface.co/google/gemma-2-2b-it; в противном случае вы не сможете загрузить модель.
  • Вы создали токен доступа, предоставляющий доступ к модели google/gemma-2-2b-it.

Активировать Cloud Shell

  1. В консоли Cloud нажмите «Активировать Cloud Shell» . d1264ca30785e435.png .

cb81e7c8e34bc8d.png

Если вы запускаете Cloud Shell впервые, вам будет показан промежуточный экран с описанием его возможностей. Если вам был показан промежуточный экран, нажмите «Продолжить» .

d95252b003979716.png

Подготовка и подключение к Cloud Shell займут всего несколько минут.

7833d5e1c5d18f54.png

Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Она предоставляет постоянный домашний каталог объемом 5 ГБ и работает в облаке Google, что значительно повышает производительность сети и аутентификацию. Большая часть, если не вся, ваша работа в этом практическом задании может быть выполнена с помощью браузера.

После подключения к Cloud Shell вы увидите, что прошли аутентификацию и что проект настроен на ваш идентификатор проекта.

  1. Выполните следующую команду в Cloud Shell, чтобы подтвердить свою аутентификацию:
gcloud auth list

вывод команды

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Выполните следующую команду в Cloud Shell, чтобы убедиться, что команда gcloud знает о вашем проекте:
gcloud config list project

вывод команды

[core]
project = <PROJECT_ID>

Если это не так, вы можете установить это с помощью следующей команды:

gcloud config set project <PROJECT_ID>

вывод команды

Updated property [core/project].

3. Включите API и установите переменные среды.

Включить API

Прежде чем начать использовать этот практический пример, вам потребуется включить несколько API. Для работы с этим практическим примером необходимы следующие API. Вы можете включить эти API, выполнив следующую команду:

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

Настройка переменных среды

Вы можете установить переменные окружения, которые будут использоваться на протяжении всего этого практического занятия.

HF_TOKEN=<YOUR_HUGGING_FACE_TOKEN>
PROJECT_ID=<YOUR_PROJECT_ID>

REGION=europe-west1
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. Создайте учетную запись службы.

Эта учетная запись службы используется для создания службы Cloud Run и доступа к секрету из Secret Manager.

Сначала создайте учетную запись службы, выполнив следующую команду:

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

Во-вторых, предоставьте учетной записи службы роль пользователя Vertex AI.

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

Теперь создайте в Secret Manager секрет с именем HF_TOKEN для вашего токена доступа Hugging Face. Cloud Build использует учетную запись службы для доступа к этому секрету во время сборки, чтобы загрузить модель Gemma 2 (2B) из Hugging Face. Подробнее о секретах и ​​Cloud Build можно узнать здесь .

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

А также предоставьте учетной записи службы вычислений по умолчанию доступ к секрету HF_TOKEN в Secret Manager при сборке образа.

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. Создайте образ в реестре артефактов.

Сначала создайте репозиторий в реестре артефактов.

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

Далее создайте Dockerfile , который будет использовать секрет из Secret Manager. Подробнее о флаге Docker buildx –secrets можно узнать здесь .

FROM vllm/vllm-openai:v0.11.0

ENV HF_HOME=/model-cache
RUN --mount=type=secret,id=HF_TOKEN HF_TOKEN=$(cat /run/secrets/HF_TOKEN) \
    hf 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} \
    --gpu-memory-utilization 0.85 \
    --max-num-seqs 256 \
    --max-model-len 4096

Теперь создайте файл 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: '${_LOCATION}-docker.pkg.dev/${PROJECT_ID}/vllm-gemma-2-2b-it-repo/vllm-gemma-2-2b-it'

options:
  dynamicSubstitutions: true
  machineType: "E2_HIGHCPU_32"

Наконец, отправьте сборку.

gcloud builds submit --config=cloudbuild.yaml --substitutions=_LOCATION=$REGION

Сборка занимает приблизительно 8 минут.

6. Разверните сервис

Теперь вы готовы развернуть образ в Cloud Run. Развертывание займет около 5 минут. Вам потребуется увеличить начальную задержку проверки работоспособности на несколько минут, чтобы дать образу больше времени на загрузку. В противном случае вы получите ошибку «Превышен срок выполнения» от проверки работоспособности.

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. Проверьте работу сервиса.

После развертывания вы можете либо использовать службу прокси для разработчиков Cloud Run , которая автоматически добавляет токен идентификации, либо напрямую отправить запрос к URL-адресу службы с помощью команды curl.

Использование прокси-сервиса для разработчиков Cloud Run

Для использования службы прокси для разработчиков Cloud Run выполните следующие действия:

Сначала выполните следующую команду.

gcloud run services proxy $SERVICE_NAME --region $REGION

Далее, заверните услугу.

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

Используя URL-адрес сервиса напрямую

Сначала получите URL-адрес развернутой службы.

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

Заверните услугу

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

Результаты

Вы должны увидеть результаты, аналогичные следующим:

{"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. Поздравляем!

Поздравляем с завершением практического занятия!

Мы рекомендуем ознакомиться с документацией Cloud Run.

Что мы рассмотрели

  • Как использовать графические процессоры в Cloud Run.
  • Как использовать Hugging Face для получения модели.
  • Как развернуть модель Google Gemma 2 (2B) на Cloud Run, используя vLLM в качестве механизма вывода.
  • Как вызвать серверную службу для автодополнения предложений.

9. Уборка

Чтобы избежать непреднамеренных списаний средств (например, если сервисы Cloud Run будут случайно запущены больше раз, чем предусмотрено вашим ежемесячным лимитом на запуск Cloud Run в бесплатном тарифе ), вы можете либо удалить Cloud Run, либо удалить проект, созданный на шаге 2.

Чтобы удалить службу Cloud Run, перейдите в консоль Cloud Run по адресу https://console.cloud.google.com/run и удалите службу vllm-gemma-2-2b . Возможно, вам также потребуется удалить учетную запись службы vllm-gemma-2-2b .

Если вы решите удалить весь проект, перейдите по ссылке https://console.cloud.google.com/cloud-resource-manager , выберите проект, созданный на шаге 2, и нажмите «Удалить». После удаления проекта вам потребуется изменить проекты в вашем Cloud SDK. Список всех доступных проектов можно просмотреть, выполнив gcloud projects list .