Jak uruchomić Transformers.js na procesorach graficznych Cloud Run

1. Wprowadzenie

Omówienie

Cloud Run niedawno dodał obsługę karty graficznej. Jest ona dostępna w ramach publicznej wersji przedpremierowej na liście oczekujących. Jeśli chcesz wypróbować tę funkcję, wypełnij ten formularz, aby dołączyć do listy oczekujących. Cloud Run to platforma kontenerowa w Google Cloud, która ułatwia uruchamianie kodu w kontenerze bez konieczności zarządzania klastrem.

Obecnie udostępniamy GPU Nvidia L4 z 24 GB vRAM. W każdej instancji Cloud Run jest jeden GPU, a autoskalowanie Cloud Run nadal obowiązuje. Obejmuje to skalowanie do 5 instancji (przy dostępnym zwiększeniu limitu) oraz skalowanie do zera, gdy nie ma żądań.

Transformers.js ma być funkcjonalnie odpowiednikiem biblioteki Pythona transformers firmy Hugging Face, co oznacza, że możesz uruchamiać te same wstępnie przetrenowane modele za pomocą bardzo podobnego interfejsu API. Więcej informacji znajdziesz na stronie Transformers.js.

W tym laboratorium programistycznym utworzysz aplikację i wdrożysz ją w Cloud Run. Aplikacja będzie korzystać z Transformers.js i procesorów graficznych.

Czego się nauczysz

  • Jak uruchomić aplikację przy użyciu Transformers.js w Cloud Run za pomocą GPU

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

Zanim zaczniesz korzystać z tego ćwiczenia z programowania, musisz włączyć kilka interfejsów API. Ten warsztat wymaga korzystania z tych interfejsów API. Aby włączyć te interfejsy API, uruchom to polecenie:

gcloud services enable run.googleapis.com \
    storage.googleapis.com \
    cloudbuild.googleapis.com \

Następnie możesz ustawić zmienne środowiskowe, których będziesz używać w tym ćwiczeniu.

PROJECT_ID=<YOUR_PROJECT_ID>

AR_REPO_NAME=repo
REGION=us-central1

3. Tworzenie aplikacji Transformers.js

Najpierw utwórz katalog dla kodu źródłowego i przejdź do niego.

mkdir transformers-js-codelab && cd $_

Utwórz plik package.json.

{
    "name": "huggingface",
    "version": "1.0.0",
    "main": "index.js",
    "type": "module",
    "scripts": {
      "test": "echo \"Error: no test specified\" && exit 1"
    },
    "keywords": [],
    "author": "",
    "license": "ISC",
    "description": "",
    "dependencies": {
      "@huggingface/transformers": "^3.0.0-alpha.8",
      "@xenova/transformers": "^2.17.2",
      "express": "^4.17.1"
    }
  }

Utwórz plik o nazwie index.js.

import { pipeline } from "@xenova/transformers";

import express from 'express';

// make sure the text-generation pipeline is created first
// before anyone can access the routes
const generator = await pipeline('text-generation', 'Xenova/llama2.c-stories15M', {
    device: 'cuda',
    dtype: 'fp32',
});

// now create the app and routes
const app = express();

app.get('/', async (req, res) => {
  const text = 'A long time ago in a galaxy far far away,';
  const output = await generator(text, { max_new_tokens: 50 });
  res.send(output);
});

const port = parseInt(process.env.PORT) || 8080;
app.listen(port, () => {
  console.log(`transformers-js app: listening on port ${port}`);
});

Utwórz Dockerfile. Plik dockerfile zainstaluje dodatkowe sterowniki NVIDIA wymagane dla pliku Transformers.js

FROM node:20
WORKDIR /usr/src/app

RUN apt-get update && \
 apt-get install software-properties-common -y && \
 wget https://developer.download.nvidia.com/compute/cuda/repos/debian12/x86_64/cuda-keyring_1.1-1_all.deb && \
 dpkg -i cuda-keyring_1.1-1_all.deb && \
 add-apt-repository contrib && \
 apt-get update && \
 apt-get -y install cuda-toolkit-12-6 && \
 apt-get -y install cudnn-cuda-12

EXPOSE 8080
COPY package.json .

RUN npm install

COPY index.js .
ENTRYPOINT ["node", "index.js"]

4. Kompilowanie i wdrażanie usługi Cloud Run

Utwórz repozytorium w Artifact Registry.

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

przesłać kod do Cloud Build.

IMAGE=us-central1-docker.pkg.dev/$PROJECT_ID/$AR_REPO_NAME/gpu-transformers-js
gcloud builds submit --tag $IMAGE

Wdrażanie w Cloud Run

gcloud beta run deploy transformers-js-codelab \
 --image=$IMAGE \
 --cpu 8 --memory 32Gi \
 --gpu=1 --no-cpu-throttling --gpu-type nvidia-l4 \
 --allow-unauthenticated \
 --region us-central1 \
 --project=$PROJECT_ID \
 --max-instances 1

5. Testowanie usługi

Aby przetestować usługę, uruchom to polecenie:

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

curl $SERVICE_URL

zobaczysz komunikat podobny do tego:

[{"generated_text":"A long time ago in a galaxy far far away, there was a beautiful garden. Every day, the little girl would go to the garden and look at the flowers. She loved the garden so much that she would come back every day to visit it.\nOne day, the little girl was walking through"}]

6. Gratulacje!

Gratulujemy ukończenia ćwiczenia.

Zalecamy zapoznanie się z dokumentacją GPU Cloud Run.

Omówione zagadnienia

  • Jak uruchomić aplikację korzystającą z Transformers.js w Cloud Run przy użyciu procesorów graficznych

7. Czyszczenie danych

Aby uniknąć przypadkowych opłat (np. jeśli usługi Cloud Run są przypadkowo wywoływane częściej niż w ramach miesięcznego limitu wywołań Cloud Run w wersji bezpłatnej), możesz usunąć Cloud Run lub 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ę transformers-js-codelab.

Jeśli chcesz usunąć cały projekt, otwórz stronę https://console.cloud.google.com/cloud-resource-manager, wybierz projekt utworzony w kroku 2 i kliknij Usuń. Jeśli usuniesz projekt, musisz zmienić projekty w Cloud SDK. Aby wyświetlić listę wszystkich dostępnych projektów, uruchom gcloud projects list.