ভার্টেক্স পাইপলাইনে কাস্টম মডেল প্রশিক্ষণ চলছে

1. ওভারভিউ

এই ল্যাবে, আপনি শিখবেন কিভাবে Vertex Pipelines- এ Kubeflow Pipelines SDK ব্যবহার করে একটি কাস্টম মডেল প্রশিক্ষণের কাজ চালাতে হয়।

আপনি কি শিখুন

আপনি কিভাবে শিখবেন:

  • স্কেলযোগ্য ML পাইপলাইন তৈরি করতে Kubeflow Pipelines SDK ব্যবহার করুন
  • একটি কাস্টম স্কিট-লার্ন মডেল ট্রেনিং জব তৈরি করুন এবং কন্টেইনারাইজ করুন যা Vertex AI পরিচালিত ডেটাসেট ব্যবহার করে এবং একটি পাইপলাইনের মধ্যে Vertex AI প্রশিক্ষণে চলবে
  • ভার্টেক্স পাইপলাইনের মধ্যে একটি ব্যাচ পূর্বাভাস কাজ চালান
  • google_cloud_pipeline_components লাইব্রেরির মাধ্যমে সরবরাহ করা Vertex AI পরিষেবাগুলির সাথে ইন্টারঅ্যাক্ট করার জন্য পূর্ব-নির্মিত উপাদানগুলি ব্যবহার করুন

Google ক্লাউডে এই ল্যাবটি চালানোর জন্য মোট খরচ প্রায় $5

2. ভার্টেক্স এআই-এর ভূমিকা

এই ল্যাবটি Vertex AI ব্যবহার করে, Google ক্লাউডে আমাদের এন্ড-টু-এন্ড পরিচালিত ML প্ল্যাটফর্ম। Vertex AI Google ক্লাউড জুড়ে Google-এর ML অফারগুলিকে একটি নির্বিঘ্ন ডেভেলপমেন্ট অভিজ্ঞতায় সংহত করে৷ মডেল প্রশিক্ষণ এবং স্থাপনার পরিষেবা ছাড়াও, Vertex AI-তে MLOps-এর বিভিন্ন পণ্য রয়েছে, যার মধ্যে রয়েছে Vertex Pipelines (এই ল্যাবের ফোকাস), মডেল মনিটরিং, ফিচার স্টোর এবং আরও অনেক কিছু। আপনি নীচের চিত্রে সমস্ত Vertex AI পণ্য অফার দেখতে পারেন।

ভার্টেক্স পণ্য ওভারভিউ

আপনার কোন প্রতিক্রিয়া থাকলে, অনুগ্রহ করে সমর্থন পৃষ্ঠাটি দেখুন।

কেন ML পাইপলাইন দরকারী?

আমরা ডুব দেওয়ার আগে, আসুন প্রথমে বুঝতে পারি কেন আপনি একটি পাইপলাইন ব্যবহার করতে চান। কল্পনা করুন যে আপনি একটি এমএল ওয়ার্কফ্লো তৈরি করছেন যাতে ডেটা প্রক্রিয়াকরণ, একটি মডেল প্রশিক্ষণ, হাইপারপ্যারামিটার টিউনিং, মূল্যায়ন এবং মডেল স্থাপন অন্তর্ভুক্ত রয়েছে। এই ধাপগুলির প্রতিটিতে বিভিন্ন নির্ভরতা থাকতে পারে, যা অবাস্তব হয়ে উঠতে পারে যদি আপনি পুরো ওয়ার্কফ্লোকে একচেটিয়া হিসাবে বিবেচনা করেন। আপনি যখন আপনার ML প্রক্রিয়াটি স্কেল করতে শুরু করেন, আপনি আপনার ML কর্মপ্রবাহটি আপনার দলের অন্যদের সাথে ভাগ করতে চাইতে পারেন যাতে তারা এটি চালাতে পারে এবং কোডে অবদান রাখতে পারে। একটি নির্ভরযোগ্য, প্রজননযোগ্য প্রক্রিয়া ছাড়া, এটি কঠিন হয়ে উঠতে পারে। পাইপলাইনগুলির সাথে, আপনার ML প্রক্রিয়ার প্রতিটি ধাপ তার নিজস্ব ধারক। এটি আপনাকে স্বাধীনভাবে পদক্ষেপগুলি বিকাশ করতে এবং প্রতিটি ধাপ থেকে পুনরুত্পাদনযোগ্য উপায়ে ইনপুট এবং আউটপুট ট্র্যাক করতে দেয়। এছাড়াও আপনি আপনার ক্লাউড পরিবেশে অন্যান্য ইভেন্টের উপর ভিত্তি করে আপনার পাইপলাইনের রানের সময়সূচী বা ট্রিগার করতে পারেন, যেমন নতুন প্রশিক্ষণের ডেটা উপলব্ধ হলে পাইপলাইন চালানো বন্ধ করা।

tl;dr : পাইপলাইনগুলি আপনাকে আপনার এমএল ওয়ার্কফ্লোগুলিকে স্ট্রীমলাইন এবং পুনরুত্পাদন করতে সহায়তা করে।

3. মেঘ পরিবেশ সেটআপ

এই কোডল্যাব চালানোর জন্য আপনার একটি Google ক্লাউড প্ল্যাটফর্ম প্রকল্পের প্রয়োজন হবে যাতে বিলিং সক্ষম থাকে৷ একটি প্রকল্প তৈরি করতে, এখানে নির্দেশাবলী অনুসরণ করুন।

ধাপ 1: ক্লাউড শেল শুরু করুন

এই ল্যাবে আপনি একটি ক্লাউড শেল সেশনে কাজ করতে যাচ্ছেন, যা Google-এর ক্লাউডে চলমান একটি ভার্চুয়াল মেশিন দ্বারা হোস্ট করা একটি কমান্ড ইন্টারপ্রেটার। আপনি আপনার নিজের কম্পিউটারে স্থানীয়ভাবে এই বিভাগটি সহজেই চালাতে পারেন, কিন্তু ক্লাউড শেল ব্যবহার করে প্রত্যেককে একটি সামঞ্জস্যপূর্ণ পরিবেশে একটি পুনরুত্পাদনযোগ্য অভিজ্ঞতার অ্যাক্সেস দেয়। ল্যাবের পরে, আপনার নিজের কম্পিউটারে এই বিভাগটি পুনরায় চেষ্টা করার জন্য আপনাকে স্বাগত জানাই৷

ক্লাউড শেল অনুমোদন করুন

ক্লাউড শেল সক্রিয় করুন

ক্লাউড কনসোলের উপরের ডানদিকে, ক্লাউড শেল সক্রিয় করতে নীচের বোতামে ক্লিক করুন:

ক্লাউড শেল সক্রিয় করুন

আপনি যদি আগে কখনও ক্লাউড শেল চালু না করে থাকেন, তাহলে আপনাকে একটি মধ্যবর্তী স্ক্রীন (ভাঁজের নীচে) উপস্থাপন করা হবে যা বর্ণনা করে। যদি এটি হয়, তবে চালিয়ে যান ক্লিক করুন (এবং আপনি এটি আর কখনও দেখতে পাবেন না)। এককালীন স্ক্রীনটি দেখতে কেমন তা এখানে রয়েছে:

ক্লাউড শেল সেটআপ

ক্লাউড শেলের সাথে সংযোগ করতে এবং সংযোগ করতে এটির মাত্র কয়েক মুহূর্ত লাগবে৷

ক্লাউড শেল শুরু

এই ভার্চুয়াল মেশিনটি আপনার প্রয়োজনীয় সমস্ত ডেভেলপমেন্ট টুল দিয়ে লোড করা হয়েছে। এটি একটি ক্রমাগত 5GB হোম ডিরেক্টরি অফার করে এবং Google ক্লাউডে চলে, যা নেটওয়ার্ক কর্মক্ষমতা এবং প্রমাণীকরণকে ব্যাপকভাবে উন্নত করে। এই কোডল্যাবে আপনার অনেক কাজ, যদি সব না হয়, শুধুমাত্র একটি ব্রাউজার বা আপনার Chromebook দিয়ে করা যেতে পারে।

একবার ক্লাউড শেলের সাথে সংযুক্ত হয়ে গেলে, আপনি দেখতে পাবেন যে আপনি ইতিমধ্যেই প্রমাণীকরণ করেছেন এবং প্রকল্পটি ইতিমধ্যে আপনার প্রকল্প আইডিতে সেট করা আছে।

আপনি প্রমাণীকৃত কিনা তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান:

gcloud auth list

কমান্ড আউটপুটে আপনার এরকম কিছু দেখতে হবে:

ক্লাউড শেল আউটপুট

gcloud কমান্ড আপনার প্রকল্প সম্পর্কে জানে তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান:

gcloud config list project

কমান্ড আউটপুট

[core]
project = <PROJECT_ID>

যদি এটি না হয়, আপনি এই কমান্ড দিয়ে এটি সেট করতে পারেন:

gcloud config set project <PROJECT_ID>

কমান্ড আউটপুট

Updated property [core/project].

ক্লাউড শেলের কিছু এনভায়রনমেন্ট ভেরিয়েবল রয়েছে, যার মধ্যে রয়েছে GOOGLE_CLOUD_PROJECT যা আমাদের বর্তমান ক্লাউড প্রকল্পের নাম রয়েছে। আমরা এই ল্যাব জুড়ে বিভিন্ন জায়গায় এটি ব্যবহার করব। আপনি এটি চালানোর মাধ্যমে দেখতে পারেন:

echo $GOOGLE_CLOUD_PROJECT

ধাপ 2: APIs সক্ষম করুন

পরবর্তী ধাপে, আপনি দেখতে পাবেন যে এই পরিষেবাগুলি কোথায় প্রয়োজন (এবং কেন), তবে আপাতত, আপনার প্রকল্পটিকে কম্পিউট ইঞ্জিন, কন্টেইনার রেজিস্ট্রি এবং ভার্টেক্স এআই পরিষেবাগুলিতে অ্যাক্সেস দেওয়ার জন্য এই কমান্ডটি চালান:

gcloud services enable compute.googleapis.com         \
                       containerregistry.googleapis.com  \
                       aiplatform.googleapis.com

এটির অনুরূপ একটি সফল বার্তা তৈরি করা উচিত:

Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.

ধাপ 3: একটি ক্লাউড স্টোরেজ বালতি তৈরি করুন

Vertex AI-তে একটি প্রশিক্ষণের কাজ চালানোর জন্য, আমাদের সংরক্ষিত মডেল সম্পদগুলি সংরক্ষণ করার জন্য আমাদের একটি স্টোরেজ বাকেটের প্রয়োজন হবে৷ বালতি আঞ্চলিক হতে হবে। আমরা এখানে us-central ব্যবহার করছি, কিন্তু অন্য অঞ্চল ব্যবহার করতে আপনাকে স্বাগতম (শুধু এই ল্যাব জুড়ে এটি প্রতিস্থাপন করুন)। আপনার যদি ইতিমধ্যে একটি বালতি থাকে তবে আপনি এই পদক্ষেপটি এড়িয়ে যেতে পারেন।

একটি বালতি তৈরি করতে আপনার ক্লাউড শেল টার্মিনালে নিম্নলিখিত কমান্ডগুলি চালান:

BUCKET_NAME=gs://$GOOGLE_CLOUD_PROJECT-bucket
gsutil mb -l us-central1 $BUCKET_NAME

পরবর্তীতে আমরা এই বালতিতে আমাদের কম্পিউট পরিষেবা অ্যাকাউন্ট অ্যাক্সেস দেব। এটি নিশ্চিত করবে যে ভার্টেক্স পাইপলাইনগুলির কাছে এই বালতিতে ফাইলগুলি লেখার প্রয়োজনীয় অনুমতি রয়েছে৷ এই অনুমতি যোগ করতে নিম্নলিখিত কমান্ড চালান:

gcloud projects describe $GOOGLE_CLOUD_PROJECT > project-info.txt
PROJECT_NUM=$(cat project-info.txt | sed -nre 's:.*projectNumber\: (.*):\1:p')
SVC_ACCOUNT="${PROJECT_NUM//\'/}-compute@developer.gserviceaccount.com"
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT --member serviceAccount:$SVC_ACCOUNT --role roles/storage.objectAdmin

ধাপ 4: একটি ভার্টেক্স এআই ওয়ার্কবেঞ্চ উদাহরণ তৈরি করুন

আপনার ক্লাউড কনসোলের ভার্টেক্স এআই বিভাগ থেকে, ওয়ার্কবেঞ্চে ক্লিক করুন:

ভার্টেক্স এআই মেনু

সেখান থেকে, ব্যবহারকারী-পরিচালিত নোটবুকের মধ্যে, নতুন নোটবুকে ক্লিক করুন:

নতুন নোটবুক তৈরি করুন

তারপর GPU ছাড়া টেনসরফ্লো এন্টারপ্রাইজ 2.3 (এলটিএস সহ) ইনস্ট্যান্স টাইপ নির্বাচন করুন:

TFE উদাহরণ

ডিফল্ট বিকল্পগুলি ব্যবহার করুন এবং তারপরে তৈরি করুন ক্লিক করুন।

ধাপ 5: আপনার নোটবুক খুলুন

একবার উদাহরণ তৈরি হয়ে গেলে, JupyterLab খুলুন নির্বাচন করুন:

নোটবুক খুলুন

4. ভার্টেক্স পাইপলাইন সেটআপ

ভার্টেক্স পাইপলাইনগুলি ব্যবহার করার জন্য আমাদের কিছু অতিরিক্ত লাইব্রেরি ইনস্টল করতে হবে:

  • কুবেফ্লো পাইপলাইনস : এটি সেই SDK যা আমরা আমাদের পাইপলাইন তৈরি করতে ব্যবহার করব। ভার্টেক্স পাইপলাইন কুবেফ্লো পাইপলাইন বা টিএফএক্স উভয়ের সাথে নির্মিত চলমান পাইপলাইনগুলিকে সমর্থন করে।
  • Google ক্লাউড পাইপলাইন উপাদান : এই লাইব্রেরিটি পূর্ব-নির্মিত উপাদানগুলি সরবরাহ করে যা আপনার পাইপলাইনের পদক্ষেপগুলি থেকে Vertex AI পরিষেবাগুলির সাথে যোগাযোগ করা সহজ করে তোলে৷

ধাপ 1: পাইথন নোটবুক তৈরি করুন এবং লাইব্রেরি ইনস্টল করুন

প্রথমে, আপনার নোটবুক ইন্সট্যান্সের লঞ্চার মেনু থেকে (যেটি আপনি আপনার নোটবুকের উপরের বাম দিকে + আইকনে ক্লিক করে অ্যাক্সেস করতে পারেন), পাইথন 3 নির্বাচন করে একটি নোটবুক তৈরি করুন:

Python3 নোটবুক তৈরি করুন

আপনি আপনার নোটবুক ইনস্ট্যান্সের উপরের বাম দিকে + সাইন-এ ক্লিক করে লঞ্চার মেনু অ্যাক্সেস করতে পারেন।

আমরা এই ল্যাবে ব্যবহার করব এমন উভয় পরিষেবা ইনস্টল করতে, প্রথমে একটি নোটবুক কক্ষে ব্যবহারকারীর পতাকা সেট করুন:

USER_FLAG = "--user"

তারপর আপনার নোটবুক থেকে নিম্নলিখিত চালান:

!pip3 install {USER_FLAG} google-cloud-aiplatform==1.7.0 --upgrade
!pip3 install {USER_FLAG} kfp==1.8.9 google-cloud-pipeline-components==0.2.0

এই প্যাকেজগুলি ইনস্টল করার পরে আপনাকে কার্নেলটি পুনরায় চালু করতে হবে:

import os

if not os.getenv("IS_TESTING"):
    # Automatically restart kernel after installs
    import IPython

    app = IPython.Application.instance()
    app.kernel.do_shutdown(True)

অবশেষে, আপনি সঠিকভাবে প্যাকেজ ইনস্টল করেছেন কিনা তা পরীক্ষা করুন। KFP SDK সংস্করণটি হতে হবে >=1.8:

!python3 -c "import kfp; print('KFP SDK version: {}'.format(kfp.__version__))"
!python3 -c "import google_cloud_pipeline_components; print('google_cloud_pipeline_components version: {}'.format(google_cloud_pipeline_components.__version__))"

ধাপ 2: আপনার প্রকল্প আইডি এবং বালতি সেট করুন

এই ল্যাব জুড়ে আপনি আপনার ক্লাউড প্রজেক্ট আইডি এবং আপনার আগে তৈরি করা বালতি উল্লেখ করবেন। পরবর্তী আমরা তাদের প্রত্যেকের জন্য ভেরিয়েবল তৈরি করব।

আপনি যদি আপনার প্রকল্প আইডি না জানেন তবে আপনি নিম্নলিখিতগুলি চালিয়ে এটি পেতে সক্ষম হতে পারেন:

import os
PROJECT_ID = ""

# Get your Google Cloud project ID from gcloud
if not os.getenv("IS_TESTING"):
    shell_output=!gcloud config list --format 'value(core.project)' 2>/dev/null
    PROJECT_ID = shell_output[0]
    print("Project ID: ", PROJECT_ID)

অন্যথায়, এটি এখানে সেট করুন:

if PROJECT_ID == "" or PROJECT_ID is None:
    PROJECT_ID = "your-project-id"  # @param {type:"string"}

তারপর আপনার বালতির নাম সংরক্ষণ করার জন্য একটি ভেরিয়েবল তৈরি করুন। আপনি যদি এই ল্যাবে এটি তৈরি করেন তবে নিম্নলিখিতগুলি কাজ করবে। অন্যথায়, আপনাকে এটি ম্যানুয়ালি সেট করতে হবে:

BUCKET_NAME="gs://" + PROJECT_ID + "-bucket"

ধাপ 3: লাইব্রেরি আমদানি করুন

এই কোডল্যাব জুড়ে আমরা যে লাইব্রেরিগুলি ব্যবহার করব তা আমদানি করতে নিম্নলিখিত যোগ করুন:

from kfp.v2 import compiler, dsl
from kfp.v2.dsl import pipeline

from google.cloud import aiplatform
from google_cloud_pipeline_components import aiplatform as gcc_aip

ধাপ 4: ধ্রুবক সংজ্ঞায়িত করুন

আমাদের পাইপলাইন তৈরি করার আগে আমাদের যা করতে হবে তা হল কিছু ধ্রুবক ভেরিয়েবল সংজ্ঞায়িত করা। PIPELINE_ROOT হল ক্লাউড স্টোরেজ পাথ যেখানে আমাদের পাইপলাইন দ্বারা তৈরি আর্টিফ্যাক্টগুলি লেখা হবে৷ আমরা এখানে অঞ্চল হিসাবে us-central1 ব্যবহার করছি, কিন্তু আপনি যদি আপনার বালতি তৈরি করার সময় একটি ভিন্ন অঞ্চল ব্যবহার করেন তবে নীচের কোডে REGION ভেরিয়েবল আপডেট করুন:

PATH=%env PATH
%env PATH={PATH}:/home/jupyter/.local/bin
REGION="us-central1"

PIPELINE_ROOT = f"{BUCKET_NAME}/pipeline_root/"
PIPELINE_ROOT

উপরের কোডটি চালানোর পরে, আপনার মুদ্রিত পাইপলাইনের রুট ডিরেক্টরি দেখতে হবে। এটি হল ক্লাউড স্টোরেজের অবস্থান যেখানে আপনার পাইপলাইনের আর্টিফ্যাক্টগুলি লেখা হবে৷ এটি gs://YOUR-BUCKET-NAME/pipeline_root/ ফর্ম্যাটে হবে

5. একটি কাস্টম মডেল প্রশিক্ষণ কাজ কনফিগার করা

আমরা আমাদের পাইপলাইন সেট আপ করার আগে, আমাদের কাস্টম মডেল প্রশিক্ষণ কাজের জন্য কোড লিখতে হবে। মডেলটি প্রশিক্ষণের জন্য, আমরা UCI মেশিন লার্নিং ড্রাই বিন্স ডেটাসেট ব্যবহার করব, থেকে: KOKLU, M. এবং OZKAN, IA, (2020), "কম্পিউটার ভিশন এবং মেশিন লার্নিং টেকনিক ব্যবহার করে শুকনো মটরশুটির মাল্টিক্লাস ক্লাসিফিকেশন।" কৃষিতে কম্পিউটার এবং ইলেকট্রনিক্সে, 174, 105507. DOI

আমাদের প্রথম পাইপলাইন ধাপটি একটি BigQuery টেবিল ব্যবহার করে Vertex AI-তে একটি পরিচালিত ডেটাসেট তৈরি করবে যাতে এই বিন ডেটার একটি সংস্করণ রয়েছে। ডেটাসেটটি আমাদের প্রশিক্ষণের কাজে ইনপুট হিসাবে পাস করা হবে। আমাদের প্রশিক্ষণ কোডে, এই পরিচালিত ডেটাসেট অ্যাক্সেস করার জন্য আমাদের পরিবেশ পরিবর্তনশীল অ্যাক্সেস থাকবে।

আমরা কীভাবে আমাদের কাস্টম প্রশিক্ষণের কাজ সেট আপ করব তা এখানে:

  • আমাদের ডেটাতে শিমের প্রকারগুলিকে শ্রেণীবদ্ধ করতে একটি Scikit-learn DecisionTreeClassifier মডেল লিখুন
  • একটি ডকার কন্টেইনারে ট্রেনিং কোড প্যাকেজ করুন এবং কনটেইনার রেজিস্ট্রিতে ঠেলে দিন

সেখান থেকে, আমরা সরাসরি আমাদের পাইপলাইন থেকে একটি Vertex AI প্রশিক্ষণের কাজ শুরু করতে পারব। চলুন শুরু করা যাক!

ধাপ 1: একটি ডকার পাত্রে আমাদের প্রশিক্ষণ কোড সংজ্ঞায়িত করুন

আপনার নোটবুক উদাহরণ থেকে, লঞ্চার খুলুন এবং টার্মিনাল নির্বাচন করুন:

টার্মিনাল খুলুন

তারপরে একটি ডিরেক্টরি সেট আপ করতে নিম্নলিখিতটি চালান যেখানে আপনি আপনার কন্টেইনারাইজড কোড যোগ করবেন:

mkdir traincontainer
cd traincontainer
touch Dockerfile

mkdir trainer
touch trainer/train.py

এই কমান্ডগুলি চালানোর পরে, আপনি বাম দিকে তৈরি traincontainer/ নামে একটি ডিরেক্টরি দেখতে পাবেন (এটি দেখতে আপনাকে রিফ্রেশ আইকনে ক্লিক করতে হতে পারে)। আপনি আপনার traincontainer/ ডিরেক্টরিতে নিম্নলিখিতগুলি দেখতে পাবেন:

+ Dockerfile
+ trainer/
    + train.py

আমাদের কোড কন্টেইনারাইজ করার প্রথম ধাপ হল একটি ডকারফাইল তৈরি করা। আমাদের ডকারফাইলে আমরা আমাদের ছবি চালানোর জন্য প্রয়োজনীয় সমস্ত কমান্ড অন্তর্ভুক্ত করব। এটি আমাদের ব্যবহার করা সমস্ত লাইব্রেরি ইনস্টল করবে এবং আমাদের প্রশিক্ষণ কোডের জন্য এন্ট্রি পয়েন্ট সেট আপ করবে। আপনার তৈরি করা ডকারফাইলটি খুলুন এবং নিম্নলিখিতগুলি যুক্ত করুন:

FROM gcr.io/deeplearning-platform-release/sklearn-cpu.0-23
WORKDIR /

# Copies the trainer code to the docker image.
COPY trainer /trainer

RUN pip install sklearn google-cloud-bigquery joblib pandas google-cloud-storage

# Sets up the entry point to invoke the trainer.
ENTRYPOINT ["python", "-m", "trainer.train"]

আপনি আপনার নোটবুক ইনস্ট্যান্সে ফাইলগুলি সম্পাদনা করার সময় সংরক্ষণ করতে, আপনি ctrl+s ব্যবহার করতে পারেন।

এরপর, train.py ফাইলটি খুলুন। এখানে আমরা আমাদের প্রশিক্ষণ কোড যোগ করব। train.py এ নিম্নলিখিতটি অনুলিপি করুন। এটি আমাদের পরিচালিত ডেটাসেট থেকে ডেটা পুনরুদ্ধার করে, এটি একটি পান্ডাস ডেটাফ্রেমে রাখে, একটি স্কিট-লার্ন মডেলকে প্রশিক্ষণ দেয় এবং প্রশিক্ষিত মডেলটিকে ক্লাউড স্টোরেজে আপলোড করে:

from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import roc_curve
from sklearn.model_selection import train_test_split
from google.cloud import bigquery
from google.cloud import storage
from joblib import dump

import os
import pandas as pd

bqclient = bigquery.Client()
storage_client = storage.Client()

def download_table(bq_table_uri: str):
    prefix = "bq://"
    if bq_table_uri.startswith(prefix):
        bq_table_uri = bq_table_uri[len(prefix):]

    table = bigquery.TableReference.from_string(bq_table_uri)
    rows = bqclient.list_rows(
        table,
    )
    return rows.to_dataframe(create_bqstorage_client=False)

# These environment variables are from Vertex AI managed datasets
training_data_uri = os.environ["AIP_TRAINING_DATA_URI"]
test_data_uri = os.environ["AIP_TEST_DATA_URI"]

# Download data into Pandas DataFrames, split into train / test
df = download_table(training_data_uri)
test_df = download_table(test_data_uri)
labels = df.pop("Class").tolist()
data = df.values.tolist()
test_labels = test_df.pop("Class").tolist()
test_data = test_df.values.tolist()

# Define and train the Scikit model
skmodel = DecisionTreeClassifier()
skmodel.fit(data, labels)
score = skmodel.score(test_data, test_labels)
print('accuracy is:',score)

# Save the model to a local file
dump(skmodel, "model.joblib")

# Upload the saved model file to GCS
bucket = storage_client.get_bucket("YOUR_GCS_BUCKET")
model_directory = os.environ["AIP_MODEL_DIR"]
storage_path = os.path.join(model_directory, "model.joblib")
blob = storage.blob.Blob.from_string(storage_path, client=storage_client)
blob.upload_from_filename("model.joblib")

তারপরে, আপনার নোটবুকে ফিরে যান এবং উপরের স্ক্রিপ্ট থেকে আপনার ক্লাউড স্টোরেজ বাকেটের নামের সাথে YOUR_GCS_BUCKET প্রতিস্থাপন করতে নিম্নলিখিতটি চালান:

BUCKET = BUCKET_NAME[5:] # Trim the 'gs://' before adding to train script
!sed -i -r 's@YOUR_GCS_BUCKET@'"$BUCKET"'@' traincontainer/trainer/train.py

আপনি চাইলে ম্যানুয়ালিও করতে পারেন। আপনি যদি তা করেন, আপনি স্ক্রিপ্ট আপডেট করার সময় আপনার বালতির নামে gs:// অন্তর্ভুক্ত করবেন না তা নিশ্চিত করুন।

এখন আমাদের প্রশিক্ষণ কোড একটি ডকার কন্টেইনারে রয়েছে এবং আমরা ক্লাউডে প্রশিক্ষণ চালানোর জন্য প্রস্তুত।

ধাপ 2: কন্টেইনার রেজিস্ট্রিতে কন্টেইনার পুশ করুন

আমাদের প্রশিক্ষণ কোড সম্পূর্ণ হলে, আমরা এটিকে Google কন্টেইনার রেজিস্ট্রিতে পুশ করতে প্রস্তুত। পরে যখন আমরা আমাদের পাইপলাইনের ট্রেনিং কম্পোনেন্ট কনফিগার করি, তখন আমরা এই কন্টেইনারে Vertex Pipelines নির্দেশ করব।

আপনার টার্মিনালে ফিরে যান, এবং আপনার traincontainer/ ডিরেক্টরির মূল থেকে, কনটেইনার রেজিস্ট্রিতে আপনার কন্টেইনার ইমেজের জন্য URI-এর সাথে একটি পরিবর্তনশীল সংজ্ঞায়িত করুন।

PROJECT_ID=$(gcloud config get-value project)
IMAGE_URI="gcr.io/$PROJECT_ID/scikit:v1"

তারপরে, নিম্নলিখিতগুলি চালিয়ে আপনার ধারক তৈরি করুন:

docker build ./ -t $IMAGE_URI

অবশেষে, কন্টেইনার রেজিস্ট্রিতে কন্টেইনারটি পুশ করুন:

docker push $IMAGE_URI

আপনার ধারকটি সেখানে আছে তা যাচাই করতে আপনার ক্লাউড কনসোলের কন্টেইনার রেজিস্ট্রি বিভাগে নেভিগেট করুন। এটি এই মত কিছু দেখাবে:

কন্টেইনার রেজিস্ট্রি

6. একটি ব্যাচ পূর্বাভাস কাজ কনফিগার করা

আমাদের পাইপলাইনের শেষ ধাপটি একটি ব্যাচের পূর্বাভাস কাজ চালাবে। এটি কাজ করার জন্য, আমাদের ক্লাউড স্টোরেজে একটি CSV ফাইল সরবরাহ করতে হবে যাতে আমরা ভবিষ্যদ্বাণী পেতে চাই এমন উদাহরণগুলি রয়েছে৷ আমরা আমাদের নোটবুকে এই CSV ফাইলটি তৈরি করব এবং gsutil কমান্ড লাইন টুল ব্যবহার করে ক্লাউড স্টোরেজে কপি করব।

ক্লাউড সঞ্চয়স্থানে ব্যাচের পূর্বাভাস উদাহরণ অনুলিপি করা হচ্ছে

নিম্নলিখিত ফাইলটিতে আমাদের বিনস ডেটাসেটের প্রতিটি ক্লাস থেকে 3টি উদাহরণ রয়েছে। নীচের উদাহরণটি Class কলাম অন্তর্ভুক্ত করে না কারণ এটিই আমাদের মডেল ভবিষ্যদ্বাণী করবে। আপনার নোটবুকে স্থানীয়ভাবে এই CSV ফাইলটি তৈরি করতে নিম্নলিখিতটি চালান:

%%writefile batch_examples.csv
Area,Perimeter,MajorAxisLength,MinorAxisLength,AspectRation,Eccentricity,ConvexArea,EquivDiameter,Extent,Solidity,roundness,Compactness,ShapeFactor1,ShapeFactor2,ShapeFactor3,ShapeFactor4
23288,558.113,207.567738,143.085693,1.450653336,0.7244336162,23545,172.1952453,0.8045881703,0.9890847314,0.9395021523,0.8295857874,0.008913077034,0.002604069884,0.6882125787,0.9983578734
23689,575.638,205.9678003,146.7475015,1.403552348,0.7016945718,24018,173.6714472,0.7652721693,0.9863019402,0.8983750474,0.8431970773,0.00869465998,0.002711119968,0.7109813112,0.9978994889
23727,559.503,189.7993849,159.3717704,1.190922235,0.5430731512,24021,173.8106863,0.8037601626,0.9877607094,0.952462433,0.9157600082,0.007999299741,0.003470231343,0.8386163926,0.9987269085
31158,641.105,212.0669751,187.1929601,1.132879009,0.4699241567,31474,199.1773023,0.7813134733,0.989959967,0.9526231013,0.9392188582,0.0068061806,0.003267009878,0.8821320637,0.9993488983
32514,649.012,221.4454899,187.1344232,1.183349841,0.5346736437,32843,203.4652564,0.7849831,0.9899826447,0.9700068737,0.9188051492,0.00681077351,0.002994124691,0.8442029022,0.9989873701
33078,659.456,235.5600775,178.9312328,1.316483846,0.6503915309,33333,205.2223615,0.7877214708,0.9923499235,0.9558229607,0.8712102818,0.007121351881,0.002530662194,0.7590073551,0.9992209221
33680,683.09,256.203255,167.9334938,1.525623324,0.7552213942,34019,207.081404,0.80680321,0.9900349805,0.9070392732,0.8082699962,0.007606985006,0.002002710402,0.6533003868,0.9966903078
33954,716.75,277.3684803,156.3563259,1.773951126,0.825970469,34420,207.9220419,0.7994819873,0.9864613597,0.8305492781,0.7496238998,0.008168948587,0.001591181142,0.5619359911,0.996846984
36322,719.437,272.0582306,170.8914975,1.591993952,0.7780978465,36717,215.0502424,0.7718560075,0.9892420405,0.8818487005,0.7904566678,0.007490177594,0.001803782407,0.6248217437,0.9947124371
36675,742.917,285.8908964,166.8819538,1.713132487,0.8119506999,37613,216.0927123,0.7788277766,0.9750618137,0.8350248381,0.7558572692,0.0077952528,0.001569528272,0.5713202115,0.9787472145
37454,772.679,297.6274753,162.1493177,1.835514817,0.8385619338,38113,218.3756257,0.8016695205,0.9827093118,0.7883332637,0.7337213257,0.007946480356,0.001420623993,0.5383469838,0.9881438654
37789,766.378,313.5680678,154.3409867,2.031657789,0.8704771226,38251,219.3500608,0.7805870567,0.9879218844,0.8085170916,0.6995293312,0.008297866252,0.001225659709,0.4893412853,0.9941740339
47883,873.536,327.9986493,186.5201272,1.758516115,0.822571799,48753,246.9140116,0.7584464543,0.9821549443,0.7885506623,0.7527897207,0.006850002074,0.00135695419,0.5666923636,0.9965376533
49777,861.277,300.7570338,211.6168613,1.42123379,0.7105823885,50590,251.7499649,0.8019106536,0.9839296304,0.843243269,0.8370542883,0.00604208839,0.001829706116,0.7006598815,0.9958014989
49882,891.505,357.1890036,179.8346914,1.986207449,0.8640114945,51042,252.0153467,0.7260210171,0.9772736178,0.7886896753,0.7055518063,0.007160679276,0.001094585314,0.4978033513,0.9887407248
53249,919.923,325.3866286,208.9174205,1.557489212,0.7666552108,54195,260.3818974,0.6966846347,0.9825445152,0.7907120655,0.8002231025,0.00611066177,0.001545654241,0.6403570138,0.9973491406
61129,964.969,369.3481688,210.9473449,1.750902193,0.8208567513,61796,278.9836198,0.7501135067,0.9892064211,0.8249553283,0.7553404711,0.006042110436,0.001213219664,0.5705392272,0.9989583843
61918,960.372,353.1381442,224.0962377,1.575832543,0.7728529173,62627,280.7782864,0.7539207091,0.9886790043,0.8436218213,0.7950947556,0.005703319619,0.00140599258,0.6321756704,0.9962029945
141953,1402.05,524.2311633,346.3974998,1.513380332,0.7505863011,143704,425.1354762,0.7147107987,0.9878152313,0.9074598849,0.8109694843,0.003692991084,0.0009853172185,0.6576715044,0.9953071199
145285,1440.991,524.9567463,353.0769977,1.486805285,0.7400216694,146709,430.0960442,0.7860466375,0.9902937107,0.8792413513,0.8192980608,0.003613289371,0.001004269363,0.6712493125,0.9980170255
146153,1476.383,526.1933264,356.528288,1.475881001,0.7354662103,149267,431.3789276,0.7319360978,0.9791380546,0.8425962592,0.8198107159,0.003600290972,0.001003163512,0.6720896099,0.991924286

তারপরে, আপনার ক্লাউড স্টোরেজ বালতিতে ফাইলটি অনুলিপি করুন:

!gsutil cp batch_examples.csv $BUCKET_NAME

যখন আমরা আমাদের পাইপলাইন সংজ্ঞায়িত করব তখন আমরা পরবর্তী ধাপে এই ফাইলটি উল্লেখ করব।

7. পূর্ব-নির্মিত উপাদান সহ একটি পাইপলাইন নির্মাণ

এখন যেহেতু আমাদের প্রশিক্ষণ কোড ক্লাউডে আছে, আমরা আমাদের পাইপলাইন থেকে এটি কল করতে প্রস্তুত। আমরা যে পাইপলাইনটি সংজ্ঞায়িত করব তা আমরা আগে ইনস্টল করা google_cloud_pipeline_components লাইব্রেরি থেকে তিনটি পূর্ব-নির্মিত উপাদান ব্যবহার করবে। এই পূর্ব-নির্ধারিত উপাদানগুলি আমাদের পাইপলাইন সেট আপ করার জন্য আমাদের যে কোডটি লিখতে হবে তা সহজ করে এবং মডেল প্রশিক্ষণ এবং ব্যাচ পূর্বাভাসের মতো Vertex AI পরিষেবাগুলি ব্যবহার করার অনুমতি দেবে৷

আমাদের তিন-পদক্ষেপ পাইপলাইন যা করবে তা এখানে:

  • Vertex AI-তে একটি পরিচালিত ডেটাসেট তৈরি করুন
  • আমরা সেট আপ করা কাস্টম কন্টেইনার ব্যবহার করে Vertx AI-তে একটি প্রশিক্ষণের কাজ চালান
  • আমাদের প্রশিক্ষিত স্কিট-লার্ন ক্লাসিফিকেশন মডেলে একটি ব্যাচের পূর্বাভাসের কাজ চালান

ধাপ 1: আমাদের পাইপলাইন সংজ্ঞায়িত করুন

যেহেতু আমরা পূর্ব-নির্মিত উপাদান ব্যবহার করছি, আমরা পাইপলাইনের সংজ্ঞায় আমাদের সম্পূর্ণ পাইপলাইন সেট আপ করতে পারি। একটি নোটবুক কক্ষে নিম্নলিখিত যোগ করুন:

@pipeline(name="automl-beans-custom",
                  pipeline_root=PIPELINE_ROOT)
def pipeline(
    bq_source: str = "bq://sara-vertex-demos.beans_demo.large_dataset",
    bucket: str = BUCKET_NAME,
    project: str = PROJECT_ID,
    gcp_region: str = REGION,
    bq_dest: str = "",
    container_uri: str = "",
    batch_destination: str = ""
):
    dataset_create_op = gcc_aip.TabularDatasetCreateOp(
        display_name="tabular-beans-dataset",
        bq_source=bq_source,
        project=project,
        location=gcp_region
    )

    training_op = gcc_aip.CustomContainerTrainingJobRunOp(
        display_name="pipeline-beans-custom-train",
        container_uri=container_uri,
        project=project,
        location=gcp_region,
        dataset=dataset_create_op.outputs["dataset"],
        staging_bucket=bucket,
        training_fraction_split=0.8,
        validation_fraction_split=0.1,
        test_fraction_split=0.1,
        bigquery_destination=bq_dest,
        model_serving_container_image_uri="us-docker.pkg.dev/vertex-ai/prediction/sklearn-cpu.0-24:latest",
        model_display_name="scikit-beans-model-pipeline",
        machine_type="n1-standard-4",
    )
    batch_predict_op = gcc_aip.ModelBatchPredictOp(
        project=project,
        location=gcp_region,
        job_display_name="beans-batch-predict",
        model=training_op.outputs["model"],
        gcs_source_uris=["{0}/batch_examples.csv".format(BUCKET_NAME)],
        instances_format="csv",
        gcs_destination_output_uri_prefix=batch_destination,
        machine_type="n1-standard-4"
    )

ধাপ 2: কম্পাইল করুন এবং পাইপলাইন চালান

আপনার পাইপলাইন সংজ্ঞায়িত করে, আপনি এটি কম্পাইল করতে প্রস্তুত। নিম্নলিখিতগুলি একটি JSON ফাইল তৈরি করবে যা আপনি পাইপলাইন চালানোর জন্য ব্যবহার করবেন:

compiler.Compiler().compile(
    pipeline_func=pipeline, package_path="custom_train_pipeline.json"
)

পরবর্তী, একটি TIMESTAMP ভেরিয়েবল তৈরি করুন৷ আমরা আমাদের কাজের আইডিতে এটি ব্যবহার করব:

from datetime import datetime

TIMESTAMP = datetime.now().strftime("%Y%m%d%H%M%S")

তারপরে কয়েকটি প্রকল্প-নির্দিষ্ট পরামিতি পাস করে আপনার পাইপলাইনের কাজটি সংজ্ঞায়িত করুন:

pipeline_job = aiplatform.PipelineJob(
    display_name="custom-train-pipeline",
    template_path="custom_train_pipeline.json",
    job_id="custom-train-pipeline-{0}".format(TIMESTAMP),
    parameter_values={
        "project": PROJECT_ID,
        "bucket": BUCKET_NAME,
        "bq_dest": "bq://{0}".format(PROJECT_ID),
        "container_uri": "gcr.io/{0}/scikit:v1".format(PROJECT_ID),
        "batch_destination": "{0}/batchpredresults".format(BUCKET_NAME)
    },
    enable_caching=True,
)

অবশেষে, একটি নতুন পাইপলাইন এক্সিকিউশন তৈরি করতে কাজ চালান:

pipeline_job.submit()

এই সেলটি চালানোর পরে, আপনার কনসোলে চালানো পাইপলাইন দেখার জন্য একটি লিঙ্ক সহ লগগুলি দেখতে হবে:

পাইপলাইন কাজের লগ

সেই লিঙ্কে নেভিগেট করুন। আপনি আপনার পাইপলাইন ড্যাশবোর্ড খুলে এটি অ্যাক্সেস করতে পারেন। সম্পূর্ণ হলে আপনার পাইপলাইন এইরকম হওয়া উচিত:

ইন্ট্রো পাইপলাইন সম্পন্ন হয়েছে

এই পাইপলাইনটি চালানোর জন্য 5-10 মিনিট সময় লাগবে, কিন্তু এটি সম্পূর্ণ হওয়ার আগে আপনি পরবর্তী ধাপে যেতে পারেন। পরবর্তীতে আপনি এই পাইপলাইনের প্রতিটি ধাপে কী ঘটছে সে সম্পর্কে আরও শিখবেন।

8. আপনার পাইপলাইন এক্সিকিউশন বোঝা

আসুন আমাদের তিনটি পাইপলাইন ধাপের প্রতিটিতে গভীরভাবে ডুব দেওয়া যাক।

পাইপলাইন ধাপ 1: একটি পরিচালিত ডেটাসেট তৈরি করা

আমাদের পাইপলাইনের প্রথম ধাপটি Vertex AI-তে একটি পরিচালিত ডেটাসেট তৈরি করে। আপনি যদি আপনার কনসোলের পাইপলাইন বিভাগে নিম্নলিখিত ডেটাসেট লিঙ্কটিতে ক্লিক করেন:

পাইপলাইন থেকে ডেটাসেটের লিঙ্ক

আপনি Vertex AI-তে আপনার ডেটাসেট দেখতে পাবেন, যেটিতে আপনার ডেটাসেটের বিভিন্ন কলামের তথ্য সহ BigQuery-এর ডেটা উৎসের একটি লিঙ্ক রয়েছে। একবার আপনি Vertex AI-তে একটি পরিচালিত ডেটাসেট আপলোড করলে, এটি একটি AutoML বা কাস্টম মডেলকে প্রশিক্ষণ দিতে ব্যবহার করা যেতে পারে।

ম্যানেজ করা ডেটাসেট ব্যবহার করে এমন কাস্টম মডেল কাজের জন্য, Vertex AI আপনার প্রশিক্ষণের কাজগুলিতে বিশেষ পরিবেশের ভেরিয়েবল পাস করে এবং আপনার ডেটাকে ট্রেন এবং টেস্ট সেটে বিভক্ত করার কাজ পরিচালনা করে। আমরা আমাদের পরবর্তী পাইপলাইন ধাপে এটি ব্যবহার করব।

পাইপলাইন ধাপ 2: ভার্টেক্স এআই প্রশিক্ষণে একটি মডেল প্রশিক্ষণ

আপনার কাস্টম প্রশিক্ষণের কাজ চলাকালীন, আপনি সরাসরি Vertex Pipelines কনসোলে লগ দেখতে ক্লিক করতে পারেন:

কাস্টম প্রশিক্ষণ লগ

এছাড়াও আপনি আপনার Vertex AI ট্রেনিং ড্যাশবোর্ডে কাস্টম প্রশিক্ষণ কাজের বিশদ বিবরণ দেখতে পারেন। প্রশিক্ষণের কাজ শেষ হলে, Vertex AI-তে একটি মডেল রিসোর্স তৈরি করা হবে। তারপরে আমরা এই মডেলটিকে অনলাইন ভবিষ্যদ্বাণীর জন্য একটি শেষ পয়েন্টে স্থাপন করতে পারি বা একটি ব্যাচ পূর্বাভাস কাজ তৈরি করতে পারি, যা আমরা আমাদের পরবর্তী পাইপলাইন ধাপে করব৷

পাইপলাইন ধাপ 3: আমাদের মডেলে একটি ব্যাচ ভবিষ্যদ্বাণী কাজ চালানো

অবশেষে, আমাদের পাইপলাইন একটি CSV ফাইলের মাধ্যমে আমরা পাস করা উদাহরণগুলির পূর্বাভাস পাবে। ব্যাচের পূর্বাভাসের কাজটি সম্পূর্ণ হলে, Vertex AI ক্লাউড স্টোরেজে আমাদের নির্দিষ্ট করা অবস্থানে একটি CSV ফাইল লিখবে। যখন এই পাইপলাইন ধাপটি চলতে শুরু করে, আপনি আপনার Vertex AI কনসোলের ব্যাচ ভবিষ্যদ্বাণী বিভাগে নেভিগেট করে কাজটি তৈরি দেখতে পারেন।

আপনার ব্যাচের ভবিষ্যদ্বাণীগুলির ক্লাউড স্টোরেজ URL দেখতে কাজটি সম্পূর্ণ হলে সেটিতে ক্লিক করুন:

ব্যাচ ভবিষ্যদ্বাণী কাজ

ক্লাউড স্টোরেজ ডিরেক্টরিতে যেতে সেই লিঙ্কটিতে ক্লিক করুন যেখানে আপনি ভবিষ্যদ্বাণী ফলাফলগুলি খুঁজে পেতে পারেন এবং তারপরে prediction.results ফাইলগুলির একটি ডাউনলোড করতে ক্লিক করুন৷ ফাইলটিতে, আপনাকে নিম্নলিখিত সারিগুলি দেখতে হবে:

{"instance": [33954.0, 716.75, 277.3684803, 156.3563259, 1.773951126, 0.825970469, 34420.0, 207.9220419, 0.7994819873, 0.9864613597, 0.8305492781, 0.7496238998, 0.008168948587, 0.001591181142, 0.5619359911, 0.996846984], "prediction": "HOROZ"}

এতে আমাদের মডেলের ভবিষ্যদ্বাণী করা ক্লাস সহ একটি নির্দিষ্ট উদাহরণের বৈশিষ্ট্যের মানগুলি অন্তর্ভুক্ত রয়েছে। এই উদাহরণের জন্য, আমাদের মডেল মনে করে এটি একটি "HOROZ" মটরশুটি ছিল।

যে দিয়ে, আপনি ল্যাব শেষ করেছেন!

🎉 অভিনন্দন! 🎉

আপনি শিখেছেন কিভাবে Vertex AI ব্যবহার করতে হয়:

  • কাস্টম উপাদান সহ এন্ড-টু-এন্ড পাইপলাইন তৈরি করতে Kubeflow Pipelines SDK ব্যবহার করুন
  • ভার্টেক্স পাইপলাইনগুলিতে আপনার পাইপলাইনগুলি চালান এবং SDK দিয়ে পাইপলাইন চালানো শুরু করুন৷
  • কনসোলে আপনার ভার্টেক্স পাইপলাইন গ্রাফ দেখুন এবং বিশ্লেষণ করুন
  • আপনার পাইপলাইনে Vertex AI পরিষেবা যোগ করতে পূর্ব-নির্মিত পাইপলাইন উপাদান ব্যবহার করুন
  • পুনরাবৃত্ত পাইপলাইন কাজের সময়সূচী

ভার্টেক্সের বিভিন্ন অংশ সম্পর্কে আরও জানতে, ডকুমেন্টেশন দেখুন।

9. পরিচ্ছন্নতা

যাতে আপনাকে চার্জ না করা হয়, এটি সুপারিশ করা হয় যে আপনি এই ল্যাব জুড়ে তৈরি সংস্থানগুলি মুছে ফেলুন৷

ধাপ 1: আপনার নোটবুকের উদাহরণ বন্ধ করুন বা মুছুন

আপনি যদি এই ল্যাবে তৈরি করা নোটবুকটি ব্যবহার চালিয়ে যেতে চান, তাহলে এটি ব্যবহার না করার সময় এটি বন্ধ করার পরামর্শ দেওয়া হয়। আপনার ক্লাউড কনসোলের নোটবুক UI থেকে, নোটবুকটি নির্বাচন করুন এবং তারপরে থামুন নির্বাচন করুন। আপনি যদি দৃষ্টান্তটি সম্পূর্ণরূপে মুছে ফেলতে চান তবে মুছুন নির্বাচন করুন:

উদাহরণ বন্ধ করুন

ধাপ 2: আপনার ক্লাউড স্টোরেজ বালতি মুছুন

আপনার ক্লাউড কনসোলে নেভিগেশন মেনু ব্যবহার করে স্টোরেজ বাকেট মুছে ফেলতে, স্টোরেজ ব্রাউজ করুন, আপনার বালতি নির্বাচন করুন এবং মুছুন ক্লিক করুন:

স্টোরেজ মুছুন