Cloud Run GPU에서 Transformers.js를 실행하는 방법

1. 소개

개요

Cloud Run에 최근 GPU 지원이 추가되었습니다. 대기자 명단 공개 미리보기로 사용할 수 있습니다. 이 기능을 사용해 보고 싶다면 이 양식을 작성하여 대기자 명단에 등록하세요. Cloud Run은 클러스터를 관리할 필요 없이 컨테이너에서 코드를 간편하게 실행할 수 있는 Google Cloud의 컨테이너 플랫폼입니다.

현재 제공되는 GPU는 24GB의 vRAM이 있는 Nvidia L4 GPU입니다. Cloud Run 인스턴스당 GPU는 1개이며 Cloud Run 자동 확장은 계속 적용됩니다. 여기에는 최대 5개 인스턴스까지 수평 확장 (할당량 상향 조정 가능)과 요청이 없을 때 인스턴스를 0개로 축소하는 것이 포함됩니다.

Transformers.js는 Hugging Face의 Transformer Python 라이브러리와 기능적으로 동일하도록 설계되었으므로 매우 유사한 API를 사용하여 동일한 선행 학습된 모델을 실행할 수 있습니다. Transformers.js 웹사이트에서 자세히 알아보세요.

이 Codelab에서는 Transformers.js 및 GPU를 사용하는 앱을 만들어 Cloud Run에 배포합니다.

학습할 내용

  • GPU를 사용하여 Cloud Run에서 Transformers.js를 사용하여 앱을 실행하는 방법

2. API 사용 설정 및 환경 변수 설정

이 Codelab을 사용하기 전에 몇 가지 API를 사용 설정해야 합니다. 이 Codelab에서는 다음 API를 사용해야 합니다. 다음 명령어를 실행하여 이러한 API를 사용 설정할 수 있습니다.

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

그런 다음 이 Codelab 전체에서 사용할 환경 변수를 설정할 수 있습니다.

PROJECT_ID=<YOUR_PROJECT_ID>

AR_REPO_NAME=repo
REGION=us-central1

3. Transformers.js 앱 만들기

먼저 소스 코드용 디렉터리를 만들고 해당 디렉터리로 cd하세요.

mkdir transformers-js-codelab && cd $_

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

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}`);
});

Dockerfile를 만듭니다. dockerfile은 Transformers.js에 필요한 NVIDIA 드라이버를 추가로 설치합니다.

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. Cloud Run 서비스 빌드 및 배포

Artifact Registry에서 저장소를 만듭니다.

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

Cloud Build에 코드를 제출합니다.

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

다음으로 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. 서비스 테스트

다음을 실행하여 서비스를 테스트할 수 있습니다.

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

curl $SERVICE_URL

다음과 비슷한 내용이 표시됩니다.

[{"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. 축하합니다.

축하합니다. Codelab을 완료했습니다.

Cloud Run GPU에 관한 문서를 검토하는 것이 좋습니다.

학습한 내용

  • GPU를 사용하여 Cloud Run에서 Transformers.js를 사용하여 앱을 실행하는 방법

7. 삭제

실수로 인한 요금 청구를 피하려면(예: Cloud Run 서비스가 무료 등급의 월별 Cloud Run 호출 할당보다 실수로 더 많이 호출되는 경우) Cloud Run을 삭제하거나 2단계에서 만든 프로젝트를 삭제하면 됩니다.

Cloud Run 서비스를 삭제하려면 https://console.cloud.google.com/run의 Cloud Run Cloud 콘솔로 이동하여 transformers-js-codelab 서비스를 삭제합니다.

전체 프로젝트를 삭제하려면 https://console.cloud.google.com/cloud-resource-manager로 이동하여 2단계에서 만든 프로젝트를 선택한 후 삭제를 선택하면 됩니다. 프로젝트를 삭제하면 Cloud SDK에서 프로젝트를 변경해야 합니다. gcloud projects list를 실행하면 사용 가능한 모든 프로젝트의 목록을 볼 수 있습니다.