مستقر کردن مدل هوشواره‌ای در GKE با NVIDIA NIM

۱. مقدمه

این Codelab عملی شما را در استقرار و مدیریت مدل هوش مصنوعی کانتینری‌سازی‌شده در Google Kubernetes Engine (GKE) بااستفاده از قدرت ریزخدمات NVIDIA NIM™ راهنمایی می‌کند.

این آموزش برای توسعه‌دهندگان و دانشمندان داده‌ای طراحی شده است که به‌دنبال موارد زیر هستند:

  • ساده‌سازی استقرار استنباط هوش مصنوعی: بیاموزید چگونه از NIM پیش‌ساخته برای استقرار سریع‌تر و آسان‌تر مدل‌های هوش مصنوعی در تولید در GKE استفاده کنید.
  • بهینه‌سازی عملکرد در واحدهای پردازش گرافیکی NVIDIA: با استقرار NIM که از NVIDIA TensorRT برای استنباط بهینه در واحدهای پردازش گرافیکی در خوشه GKE شما استفاده می‌کند، تجربه عملی کسب کنید.
  • توسعه دادن حجم کار استنباط هوش مصنوعی: بااستفاده از Kubernetes برای مقیاس‌بندی خودکار و مدیریت منابع محاسباتی، نحوه توسعه دادن استقرار NIM خود را براساس تقاضا کاوش کنید.

۲. آنچه خواهید آموخت

در پایان این آموزش، با این موارد تجربه کسب خواهید کرد:

  1. مستقر کردن NIM در GKE: یک NVIDIA NIM ازپیش ساخته‌شده را برای وظایف مختلف استنباط در خوشه GKE خود مستقر کنید.
  2. مدیریت استقرار NIM: از فرمان‌های kubectl برای مدیریت، نظارت، و مقیاس‌بندی NIM مستقرشده استفاده کنید.
  3. مقیاس‌بندی حجم‌های کاری استنباط: از ویژگی‌های Kubernetes برای مقیاس‌بندی خودکار استقرار NIM براساس تقاضای ترافیک استفاده کنید.

۳. آشنایی با اجزا

واحدهای پردازش گرافیکی در Google Kubernetes Engine (GKE)

واحدهای پردازش گرافیکی (GPU) به شما امکان می‌دهند تا بارهای کاری خاصی را که روی گره‌هایتان اجرا می‌شوند، مانند یادگیری ماشین و پردازش داده، تسریع کنید. ‫GKE گزینه‌های متنوعی از نوع ماشین برای پیکربندی گره ارائه می‌دهد، ازجمله انواع ماشین با واحدهای پردازش گرافیکی NVIDIA H100،‏ L4، و A100.

NVIDIA NIM

NVIDIA NIM مجموعه‌ای از ریزسرویس‌های استنباطی با کاربری آسان برای تسریع استقرار مدل‌های پایه در هر فضای ابری یا مرکز داده و کمک به حفظ امنیت داده‌های شما است.

NVIDIA AI Enterprise

NVIDIA AI Enterprise یک پلاتفرم نرم‌افزاری بومی ابری سرتاسری است که خطوط لوله علم داده را تسریع می‌کند و توسعه و استقرار کمک‌خلبان‌های سطح تولید و دیگر برنامه‌های هوش مصنوعی زایا را ساده می‌کند. ازطریق GCP Marketplace دردسترس است.

۴. پیش‌نیازها

  • پروژه: پروژه Google Cloud با صورت‌حساب فعال.
  • اجازه‌ها: اجازه‌های کافی برای ایجاد خوشه‌های GKE و دیگر منابع مرتبط.
  • Helm: Helm مدیر بسته Kubernetes است.
  • گرداننده GPU‏ NVIDIA: افزونه‌ای برای kubernetes که مدیریت همه عناصر نرم‌افزاری NVIDIA موردنیاز برای آماده‌سازی GPU را خودکارسازی می‌کند.
  • کلید API NVIDIA: روی این پیوند کلیک کنید و دستورالعمل‌های مربوط به نحوه ایجاد حساب کاربری و تولید کلید API را دنبال کنید. برای بارگیری کردن محتوی NIM، به کلید میانای برنامه‌سازی کاربردی نیاز است.
  • واحدهای پردازش گرافیکی NVIDIA: یکی از واحدهای پردازش گرافیکی زیر باید کار کند (لطفاً توجه داشته باشید، اگر واحدهای پردازش گرافیکی کافی ندارید، می‌توانید این مراحل را برای درخواست افزایش سهمیه دنبال کنید)
  • اختیاری - GCloud SDK:** درصورتی‌که از Cloud Shell در «درگاه GCP» استفاده نمی‌کنید، لطفاً مطمئن شوید که Google Cloud SDK را نصب و پیکربندی کرده‌اید.
  • اختیاری - kubectl:** درصورتی‌که از Cloud Shell در «درگاه GCP» استفاده نمی‌کنید، لطفاً مطمئن شوید ابزار خط فرمان kubectl را نصب و پیکربندی کرده‌اید.

۵. ایجاد خوشه GKE با GPU

  1. Cloud Shell یا پایانه خود را باز کنید.
  2. پارامترهای زیر را مشخص کنید:
    export PROJECT_ID=<YOUR PROJECT ID>
    export REGION=<YOUR REGION>
    export ZONE=<YOUR ZONE>
    export CLUSTER_NAME=nim-demo
    export NODE_POOL_MACHINE_TYPE=g2-standard-16
    export CLUSTER_MACHINE_TYPE=e2-standard-4
    export GPU_TYPE=nvidia-l4
    export GPU_COUNT=1
    

لطفاً توجه داشته باشید که ممکن است لازم باشد مقادیر NODE_POOL_MACHINE_TYPE،‏ CLUSTER_MACHINE_TYPE، و GPU_TYPE را براساس نوع «نمونه محاسباتی» و واحدهای پردازش گرافیکی که استفاده می‌کنید تغییر دهید.

  1. ایجاد خوشه GKE:
    gcloud container clusters create ${CLUSTER_NAME} \
        --project=${PROJECT_ID} \
        --location=${ZONE} \
        --release-channel=rapid \
        --machine-type=${CLUSTER_MACHINE_TYPE} \
        --num-nodes=1
    
  2. ایجاد استخر گره GPU:
    gcloud container node-pools create gpupool \
        --accelerator type=${GPU_TYPE},count=${GPU_COUNT},gpu-driver-version=latest \
        --project=${PROJECT_ID} \
        --location=${ZONE} \
        --cluster=${CLUSTER_NAME} \
        --machine-type=${NODE_POOL_MACHINE_TYPE} \
        --num-nodes=1
    

‫۶. پیکربندی کلید میانای برنامه‌سازی کاربردی NVIDIA NGC

کلید NGC API به شما امکان می‌دهد تصاویر سفارشی را از NVIDIA NGC بکشید. برای مشخص کردن کلید:

export NGC_CLI_API_KEY="<YOUR NGC API KEY>"

این کلیدی است که به‌عنوان بخشی از «پیش‌نیازها» تولید شده است.

‫۷. استقرار و آزمایش NVIDIA NIM

  1. واکشی نمودار Helm مدل زبانی بزرگ NIM:
    helm fetch https://helm.ngc.nvidia.com/nim/charts/nim-llm-1.3.0.tgz --username='$oauthtoken' --password=$NGC_CLI_API_KEY
    
  2. ایجاد فضای نام NIM:
    kubectl create namespace nim
    
  3. پیکربندی اسرار:
    kubectl create secret docker-registry registry-secret --docker-server=nvcr.io --docker-username='$oauthtoken'     --docker-password=$NGC_CLI_API_KEY -n nim
    
    kubectl create secret generic ngc-api --from-literal=NGC_API_KEY=$NGC_CLI_API_KEY -n nim
    
  4. راه‌اندازی پیکربندی NIM:
    cat <<EOF > nim_custom_value.yaml
    image:
      repository: "nvcr.io/nim/meta/llama3-8b-instruct" # container location
      tag: 1.0.0 # NIM version you want to deploy
    model:
      ngcAPISecret: ngc-api  # name of a secret in the cluster that includes a key named NGC_CLI_API_KEY and is an NGC API key
    persistence:
      enabled: true
    imagePullSecrets:
      -   name: registry-secret # name of a secret used to pull nvcr.io images, see https://kubernetes.io/docs/tasks/    configure-pod-container/pull-image-private-registry/
    EOF
    
  5. درحال راه‌اندازی استقرار NIM:
    helm install my-nim nim-llm-1.1.2.tgz -f nim_custom_value.yaml --namespace nim
    
    تأیید کنید واحد NIM درحال اجرا است:
    kubectl get pods -n nim
    
  6. آزمایش استقرار NIM:
    پس‌از اینکه تأیید کردیم سرویس NIM ما با موفقیت مستقر شده است، می‌توانیم درخواست‌های استنباطی ارسال کنیم تا ببینیم چه نوع بازخوردی از سرویس NIM دریافت خواهیم کرد. برای انجام این کار، بازارسال درگاه را در سرویس فعال می‌کنیم تا بتوانیم از localhost خود در درگاه ۸۰۰۰ به NIM دسترسی داشته باشیم:
    kubectl port-forward service/my-nim-nim-llm 8000:8000 -n nim
    
    سپس می‌توانیم پایانه یا برگه دیگری را در پوسته ابری باز کنیم و درخواست زیر را امتحان کنیم:
    curl -X 'POST' \
      'http://localhost:8000/v1/chat/completions' \
      -H 'accept: application/json' \
      -H 'Content-Type: application/json' \
      -d '{
      "messages": [
        {
          "content": "You are a polite and respectful chatbot helping people plan a vacation.",
          "role": "system"
        },
        {
          "content": "What should I do for a 4 day vacation in Spain?",
          "role": "user"
        }
      ],
      "model": &quot;meta/llama3-8b-instruct",
      "max_tokens": 128,
      "top_p": 1,
      "n": 1,
      "stream": false,
      "stop": "\n",
      "frequency_penalty": 0.0
    }'
    
    اگر تکمیل گپی از سرویس NIM دریافت کردید، یعنی سرویس طبق انتظار کار می‌کند!

‫۸. پاک‌سازی

خوشه GKE را حذف کنید:

gcloud container clusters delete $CLUSTER_NAME --zone=$ZONE

‫۹. قدم بعدی چیست

برای اطلاعات بیشتر، مقاله‌های زیر را بررسی کنید: