Jak uruchomić Transformers.js na kartach graficznych Cloud Run

1. Wprowadzenie

Przegląd

Usługa Cloud Run niedawno zyskała obsługę procesorów graficznych. Jest ona dostępna w ramach publicznej wersji przedpremierowej, do której można dołączyć po zapisaniu się na listę 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 procesory graficzne Nvidia L4 z 24 GB pamięci vRAM. Na każdą instancję Cloud Run przypada 1 procesor graficzny, a autoskalowanie Cloud Run nadal obowiązuje. Obejmuje to skalowanie w górę do 5 instancji (z możliwością zwiększenia limitu) oraz skalowanie w dół do 0 instancji, gdy nie ma żadnych żądań.

Biblioteka Transformers.js jest funkcjonalnie odpowiednikiem biblioteki transformers w Pythonie od Hugging Face, co oznacza, że możesz uruchamiać te same wstępnie wytrenowane modele przy użyciu bardzo podobnego interfejsu API. Więcej informacji znajdziesz na stronie Transformers.js.

W tym ćwiczeniu utworzysz i wdrożysz w Cloud Run aplikację, która korzysta z Transformers.js i GPU.

Czego się nauczysz

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

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

Zanim zaczniesz korzystać z tego samouczka, musisz włączyć kilka interfejsów API. Ten przewodnik wymaga użycia tych interfejsów API: Możesz włączyć te interfejsy API, uruchamiając 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ć podczas naszych ćwiczeń z programowania.

PROJECT_ID=<YOUR_PROJECT_ID>

AR_REPO_NAME=repo
REGION=us-central1

3. Tworzenie aplikacji Transformers.js

Najpierw utwórz katalog 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 potrzebne do działania 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

Prześlij kod do Cloud Build.

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

Następnie wdróż 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 coś podobnego 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ą dotyczącą procesorów graficznych Cloud Run.

Omówione zagadnienia

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

7. Czyszczenie danych

Aby uniknąć przypadkowych opłat (np. jeśli usługi Cloud Run zostaną przypadkowo wywołane więcej razy niż miesięczny limit wywołań Cloud Run w warstwie bezpłatnej), możesz usunąć Cloud Run lub projekt utworzony w kroku 2.

Aby usunąć usługę Cloud Run, otwórz konsolę Cloud Run w Cloud Console pod adresem https://console.cloud.google.com/run i usuń usługę transformers-js-codelab.

Jeśli zdecydujesz się 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. Listę wszystkich dostępnych projektów możesz wyświetlić, uruchamiając polecenie gcloud projects list.