วิธีเรียกใช้ Transformers.js บน GPU ของ Cloud Run

1. บทนำ

ภาพรวม

การรองรับ GPU ที่เพิ่งเพิ่ม Cloud Run โดยพร้อมให้ใช้งานเป็นเวอร์ชันตัวอย่างแบบสาธารณะที่ลงชื่อรอ หากสนใจทดลองใช้ฟีเจอร์นี้ โปรดกรอกแบบฟอร์มนี้เพื่อเข้าร่วมคิวรอ Cloud Run เป็นแพลตฟอร์มคอนเทนเนอร์บน Google Cloud ที่ทำให้การเรียกใช้โค้ดในคอนเทนเนอร์เป็นเรื่องง่าย โดยที่คุณไม่ต้องจัดการคลัสเตอร์

ปัจจุบัน GPU ที่เราเปิดให้ใช้งานคือ GPU ของ Nvidia L4 ที่มี vRAM ขนาด 24 GB มี GPU 1 รายการต่ออินสแตนซ์ Cloud Run และยังคงใช้การปรับขนาดอัตโนมัติของ Cloud Run อยู่ ซึ่งรวมถึงการปรับขนาดขึ้นสูงสุด 5 อินสแตนซ์ (พร้อมให้เพิ่มโควต้า) รวมถึงการปรับขนาดลงเป็น 0 อินสแตนซ์เมื่อไม่มีคำขอ

Transformers.js ออกแบบมาเพื่อให้มีฟังก์ชันการทำงานเทียบเท่ากับไลบรารี Python ของ Transformers ของ Hugging Face ซึ่งหมายความว่าคุณสามารถเรียกใช้โมเดลที่ฝึกล่วงหน้าแบบเดียวกันโดยใช้ API ที่คล้ายกันมากได้ ดูข้อมูลเพิ่มเติมได้ที่เว็บไซต์ Transformers.js

ใน Codelab นี้ คุณจะสร้างและทำให้แอปใช้งานได้บน Cloud Run ซึ่งใช้ Transformers.js และ GPU

สิ่งที่คุณจะได้เรียนรู้

  • วิธีเรียกใช้แอปโดยใช้ Transformers.js ใน Cloud Run โดยใช้ GPU

2. เปิดใช้ API และตั้งค่าตัวแปรสภาพแวดล้อม

ก่อนที่คุณจะเริ่มใช้ Codelab นี้ได้ คุณจะต้องเปิดใช้ API หลายรายการ โค้ดแล็บนี้ต้องใช้ 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 จะติดตั้งไดรเวอร์ NVIDIA เพิ่มเติมที่จำเป็นสำหรับ 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. บิลด์และทำให้บริการ 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 จนเสร็จสมบูรณ์

เราขอแนะนําให้อ่านเอกสารประกอบเกี่ยวกับ GPU ของ Cloud Run

สรุปประเด็นที่ได้พูดถึง

  • วิธีเรียกใช้แอปโดยใช้ Transformers.js บน Cloud Run โดยใช้ GPU

7. ล้างข้อมูล

หากต้องการหลีกเลี่ยงการเรียกเก็บเงินโดยไม่ตั้งใจ (เช่น หากมีการเรียกใช้บริการ Cloud Run โดยไม่ตั้งใจมากกว่าการจัดสรรการเรียกใช้ Cloud Run รายเดือนในรุ่นฟรี) คุณสามารถลบ Cloud Run หรือลบโปรเจ็กต์ที่สร้างไว้ในขั้นตอนที่ 2

หากต้องการลบบริการ Cloud Run ให้ไปที่คอนโซล Cloud ของ Cloud Run ที่ https://console.cloud.google.com/run แล้วลบบริการ transformers-js-codelab

หากเลือกลบทั้งโปรเจ็กต์ ให้ไปที่ https://console.cloud.google.com/cloud-resource-manager เลือกโปรเจ็กต์ที่สร้างในขั้นตอนที่ 2 แล้วเลือก "ลบ" หากลบโปรเจ็กต์ คุณจะต้องเปลี่ยนโปรเจ็กต์ใน Cloud SDK คุณสามารถดูรายการโปรเจ็กต์ที่ใช้ได้ทั้งหมดโดยเรียกใช้ gcloud projects list