Cloud Run GPU で Transformers.js を実行する方法

1. はじめに

概要

Cloud Run には最近、GPU のサポートが追加されました。順番待ちのパブリック プレビューとしてご利用いただけます。この機能をお試しになりたい場合は、こちらのフォームにご記入のうえ、順番待ちリストにご登録ください。Cloud Run は Google Cloud 上のコンテナ プラットフォームで、クラスタを管理することなく、コンテナ内でコードを簡単に実行できます。

現在、提供されている GPU は、24 GB の vRAM を備えた Nvidia L4 GPU です。Cloud Run インスタンスごとに 1 つの GPU があり、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 アプリを作成する

まず、ソースコードのディレクトリを作成し、そのディレクトリに移動します。

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 サービスが無料 tier の月次 Cloud Run 呼び出し割り当てを超えて誤って呼び出された場合など)、Cloud Run を削除するか、手順 2 で作成したプロジェクトを削除します。

Cloud Run サービスを削除するには、Cloud Run Cloud コンソール(https://console.cloud.google.com/run)に移動し、transformers-js-codelab サービスを削除します。

プロジェクト全体を削除する場合は、https://console.cloud.google.com/cloud-resource-manager に移動し、ステップ 2 で作成したプロジェクトを選択して、[削除] を選択します。プロジェクトを削除する場合は、Cloud SDK でプロジェクトを変更する必要があります。gcloud projects list を実行すると、使用可能なすべてのプロジェクトのリストが表示されます。