كيفية تشغيل Transformers.js على وحدات معالجة الرسومات في Cloud Run

1. مقدمة

نظرة عامة

أضافت خدمة Cloud Run مؤخرًا إمكانية استخدام وحدات معالجة الرسومات. وهي متاحة كمعاينة عامة ضمن قائمة الانتظار. إذا كنت مهتمًا بتجربة الميزة، يُرجى ملء هذا النموذج للانضمام إلى قائمة الانتظار. ‫Cloud Run هي منصة حاويات على Google Cloud تسهّل تشغيل الرموز البرمجية في حاوية، بدون الحاجة إلى إدارة مجموعة.

في الوقت الحالي، وحدات معالجة الرسومات التي نوفّرها هي وحدات معالجة الرسومات Nvidia L4 التي تتضمّن ذاكرة وصول عشوائي للفيديو (vRAM) بسعة 24 غيغابايت. تتوفّر وحدة معالجة رسومات واحدة لكل مثيل من Cloud Run، ويظلّ التوسيع التلقائي لنطاق Cloud Run ساريًا. ويشمل ذلك توسيع النطاق إلى ما يصل إلى 5 مثيلات (مع إمكانية زيادة الحصة)، بالإضافة إلى تقليل النطاق إلى صفر مثيل عندما لا تكون هناك أي طلبات.

تم تصميم Transformers.js لتكون مكافئة وظيفيًا لمكتبة transformers python من Hugging Face، ما يعني أنّه يمكنك تشغيل النماذج نفسها المُدرَّبة مسبقًا باستخدام واجهة برمجة تطبيقات مشابهة جدًا. يمكنك الاطّلاع على مزيد من المعلومات على موقع Transformers.js الإلكتروني.

في هذا الدرس التطبيقي حول الترميز، ستنشئ تطبيقًا وتنشره على Cloud Run باستخدام Transformers.js ووحدات معالجة الرسومات.

ما ستتعلمه

  • كيفية تشغيل تطبيق باستخدام Transformers.js على Cloud Run باستخدام وحدات معالجة الرسومات

2. تفعيل واجهات برمجة التطبيقات وضبط متغيرات البيئة

قبل البدء في استخدام هذا الدرس العملي، عليك تفعيل العديد من واجهات برمجة التطبيقات. يتطلّب هذا الدرس التطبيقي استخدام واجهات برمجة التطبيقات التالية. يمكنك تفعيل واجهات برمجة التطبيقات هذه من خلال تنفيذ الأمر التالي:

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

بعد ذلك، يمكنك ضبط متغيرات البيئة التي سيتم استخدامها في جميع أنحاء هذا الدرس التطبيقي حول الترميز.

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 برامج تشغيل 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. تهانينا!

تهانينا على إكمال هذا الدرس العملي.

ننصحك بمراجعة المستندات حول وحدات معالجة الرسومات في Cloud Run.

المواضيع التي تناولناها

  • كيفية تشغيل تطبيق باستخدام Transformers.js على Cloud Run باستخدام وحدات معالجة الرسومات

7. تَنظيم

لتجنُّب الرسوم غير المقصودة (على سبيل المثال، إذا تم استدعاء خدمات Cloud Run مرات أكثر من عدد مرات الاستدعاء المخصّصة لك شهريًا في الطبقة المجانية)، يمكنك إما حذف Cloud Run أو حذف المشروع الذي أنشأته في الخطوة 2.

لحذف خدمة Cloud Run، انتقِل إلى Cloud Run Cloud Console على https://console.cloud.google.com/run واحذف الخدمة transformers-js-codelab.

إذا اخترت حذف المشروع بأكمله، يمكنك الانتقال إلى https://console.cloud.google.com/cloud-resource-manager، واختيار المشروع الذي أنشأته في الخطوة 2، ثم النقر على "حذف". إذا حذفت المشروع، عليك تغيير المشاريع في Cloud SDK. يمكنك الاطّلاع على قائمة بجميع المشاريع المتاحة من خلال تنفيذ gcloud projects list.