۱. مرور کلی
آمادهاید تا امنیت و حریم خصوصی بارهای کاری شتابیافته با GPU خود را ارتقا دهید؟ این آزمایشگاه کد شما را در مورد قابلیتهای Trusted Space راهنمایی میکند، پیشنهادی برای ارائه ایزولهسازی قوی اپراتور و پشتیبانی شتابدهنده برای بارهای کاری حساس هوش مصنوعی/یادگیری ماشین شما.
محافظت از دادهها، مدلها و کلیدهای ارزشمند بیش از هر زمان دیگری حیاتی است. Trusted Space با اطمینان از اینکه بارهای کاری شما در یک محیط امن و قابل اعتماد اجرا میشوند، جایی که حتی اپراتور بار کاری نیز به آن دسترسی ندارد، راهکاری ارائه میدهد.
آنچه Trusted Space ارائه میدهد به شرح زیر است:
- حریم خصوصی و امنیت پیشرفته: فضای قابل اعتماد، یک محیط اجرایی قابل اعتماد فراهم میکند که در آن داراییهای حساس شما (مانند مدلها، دادههای ارزشمند و کلیدها) با پشتیبانی رمزنگاری، محافظت میشوند.
- جداسازی اپراتور: نگرانیها در مورد دخالت اپراتور را از بین ببرید. با فضای قابل اعتماد، حتی اپراتورهای بار کاری شما نیز هیچ دسترسی ندارند و این امر مانع از SSH کردن، دسترسی به دادهها، نصب نرمافزار یا دستکاری کد شما توسط آنها میشود.
- پشتیبانی از شتابدهنده: Trusted Space به گونهای طراحی شده است که به طور یکپارچه با طیف گستردهای از شتابدهندههای سختافزاری، از جمله پردازندههای گرافیکی مانند H100، A100، T4 و L4 کار کند. این امر تضمین میکند که برنامههای هوش مصنوعی/یادگیری ماشین شما که از نظر عملکرد بسیار مهم هستند، به راحتی اجرا شوند.
آنچه یاد خواهید گرفت
- با پیشنهادات کلیدی Trusted Space آشنا شوید.
- بیاموزید که چگونه یک محیط فضای قابل اعتماد را برای ایمنسازی داراییهای ارزشمند حجم کاری هوش مصنوعی/ماشینکاری خود مستقر و پیکربندی کنید.
آنچه نیاز دارید
- یک پروژه پلتفرم ابری گوگل
- آشنایی اولیه با موتور محاسباتی گوگل و شتابدهندههای آن .
- دانش پایه در مورد حسابهای سرویس ، مدیریت کلید ، فدراسیون هویت بار کاری و شرایط ویژگیها .
- دانش پایه در مورد کانتینرها و رجیستری مصنوعات
محافظت از اعلانهای حساس تولید کد با شرکت Primus
در این آزمایشگاه کد، ما خود را جای Primus خواهیم گذاشت، شرکتی که به حریم خصوصی و امنیت دادههای کارمندان خود اولویت میدهد. Primus میخواهد یک مدل تولید کد را برای کمک به توسعهدهندگان خود در انجام وظایف کدنویسیشان مستقر کند. با این حال، آنها نگران حفاظت از محرمانگی درخواستهای ارسالی توسط کارمندان خود هستند، زیرا این درخواستها اغلب حاوی قطعه کدهای حساس، جزئیات پروژه داخلی یا الگوریتمهای اختصاصی هستند.
چرا شرکت پریموس به اپراتور اعتماد ندارد؟
شرکت پریموس در بازاری بسیار رقابتی فعالیت میکند. کدبیس آنها حاوی داراییهای معنوی ارزشمندی از جمله الگوریتمهای اختصاصی و قطعه کدهای حساس است که مزیت رقابتی ایجاد میکنند. آنها نگران احتمال جاسوسی سازمانی توسط اپراتورهای حجم کار هستند. علاوه بر این، درخواستهای کارمندان ممکن است شامل بخشهای محرمانه «نیاز به دانستن» کد باشد که شرکت پریموس میخواهد از آنها محافظت کند.
برای رفع این نگرانی، شرکت Primus از Trusted Space برای ایزوله کردن سرور استنتاجی که مدل را برای تولید کد اجرا میکند، استفاده خواهد کرد. نحوه کار به این صورت است:
- رمزگذاری اعلان: قبل از ارسال اعلان به سرور استنتاج، هر کارمند آن را با استفاده از یک کلید KMS که توسط Primus Corp در Google Cloud مدیریت میشود، رمزگذاری میکند. این تضمین میکند که فقط محیط فضای قابل اعتماد، که کلید رمزگشایی مربوطه در آن موجود است، میتواند آن را رمزگشایی کرده و به اعلان متن ساده دسترسی پیدا کند. در یک سناریوی دنیای واقعی، رمزگذاری سمت کلاینت میتواند توسط کتابخانههای موجود (مثلاً tink ) انجام شود. به عنوان بخشی از این آزمایشگاه کد، ما از این برنامه کلاینت نمونه با رمزگذاری پاکت استفاده خواهیم کرد.
- جداسازی اپراتور: فقط سرور استنتاج، که در یک محیط فضای قابل اعتماد اجرا میشود، به کلید مورد استفاده برای رمزگذاری دسترسی خواهد داشت و قادر به رمزگشایی اعلان در یک محیط قابل اعتماد خواهد بود. دسترسی به کلید رمزگذاری توسط Workload Identity Pool محافظت میشود. به دلیل تضمینهای جداسازی فضای قابل اعتماد، حتی اپراتور بار کاری نیز نمیتواند به کلید مورد استفاده برای رمزگذاری و محتوای رمزگشایی شده دسترسی پیدا کند.
- استنتاج امن با استفاده از شتابدهنده(ها): سرور استنتاج بر روی یک ماشین مجازی محافظتشده (به عنوان بخشی از راهاندازی فضای امن) راهاندازی میشود که تضمین میکند نمونه بار کاری توسط بدافزار یا روتکیتهای سطح بوت یا هسته به خطر نیفتاده است. این سرور اعلان را در محیط فضای امن رمزگشایی میکند، استنتاج را با استفاده از مدل تولید کد انجام میدهد و کد تولید شده را به کارمند بازمیگرداند.
۲. منابع ابری را تنظیم کنید
قبل از اینکه شروع کنی
- برای دریافت اسکریپتهای مورد نیاز که به عنوان بخشی از این آزمایشگاه کد استفاده میشوند، این مخزن را با استفاده از دستور زیر کلون کنید.
git clone https://github.com/GoogleCloudPlatform/confidential-space.git
- دایرکتوری مربوط به این codelab را تغییر دهید.
cd confidential-space/codelabs/trusted_space_codelab/scripts
- مطمئن شوید که متغیرهای محیطی مورد نیاز پروژه را مطابق شکل زیر تنظیم کردهاید. برای اطلاعات بیشتر در مورد راهاندازی یک پروژه GCP، لطفاً به این codelab مراجعه کنید. میتوانید برای کسب اطلاعات بیشتر در مورد نحوه بازیابی شناسه پروژه و تفاوت آن با نام پروژه و شماره پروژه، به این مراجعه کنید.
export PRIMUS_PROJECT_ID=<GCP project id of Primus>
- فعال کردن صورتحساب برای پروژههایتان
- API محاسبات محرمانه و API های زیر را برای هر دو پروژه فعال کنید.
gcloud services enable \
cloudapis.googleapis.com \
cloudresourcemanager.googleapis.com \
cloudkms.googleapis.com \
cloudshell.googleapis.com \
container.googleapis.com \
containerregistry.googleapis.com \
iam.googleapis.com \
confidentialcomputing.googleapis.com
- با استفاده از دستور زیر، به متغیرهای نام منابع مشخص شده در بالا، مقادیری اختصاص دهید. این متغیرها به شما امکان میدهند نام منابع را در صورت نیاز سفارشی کنید و همچنین در صورت ایجاد منابع موجود، از آنها استفاده کنید. (مثلاً
export PRIMUS_SERVICE_ACCOUNT='my-service-account')
- شما میتوانید متغیرهای زیر را با نامهای منابع ابری موجود در پروژه Primus تنظیم کنید. اگر متغیر تنظیم شود، از منبع ابری موجود مربوطه از پروژه Primus استفاده میشود. اگر متغیر تنظیم نشود، نام منبع ابری از نام پروژه تولید میشود و یک منبع ابری جدید با آن نام ایجاد میشود. در زیر متغیرهای پشتیبانی شده برای نامهای منابع آمده است:
| منطقهای که تحت آن منابع منطقهای برای شرکت پریموس ایجاد میشود. |
| مکانی که در آن منابع برای شرکت پریموس ایجاد میشود. |
| منطقهای که در آن منابع منطقهای برای شرکت پریموس ایجاد میشود. |
| Workload Identity Pool شرکت Primus برای محافظت از منابع ابری. |
| ارائه دهنده Workload Identity Pool شرکت Primus که شامل شرایط مجوز برای استفاده از توکنهای امضا شده توسط سرویس تأیید گواهی است. |
| حساب کاربری سرویس شرکت Primus که |
| کلید KMS برای رمزگذاری پیامهای ارائه شده توسط کارمندان شرکت Primus استفاده میشود. |
| حلقه کلید KMS که برای ایجاد کلید رمزگذاری |
| نسخه کلید KMS از کلید رمزگذاری |
| مخزن مصنوعات که تصویر داکر بار کاری در آن قرار خواهد گرفت. |
| ناحیهای برای مخزن مصنوعات که ایمیج داکر مربوط به حجم کار منتشر شده را در خود جای میدهد. |
| نام حجم کار ماشین مجازی. |
| نام ایمیج داکر مربوط به حجم کار. |
| برچسب تصویر کانتینر حجم کار. |
| حساب کاربری سرویس که مجوز دسترسی به ماشین مجازی محرمانهای که بار کاری را اجرا میکند، دارد. |
| نام ماشین مجازی کلاینت که برنامه کلاینت سرور استنتاج را اجرا میکند. |
| حساب سرویس مورد استفاده توسط |
- برای پروژه
$PRIMUS_PROJECT_IDبه نقشهای Storage Admin، Artifact Registry Administrator، Cloud KMS Admin، Service Account Admin، IAM Workload Identity Pool Admin نیاز خواهید داشت. میتوانید برای نحوه اعطای نقشهای IAM با استفاده از کنسول GCP به این راهنما مراجعه کنید. - برای
$PRIMUS_PROJECT_ID، اسکریپت زیر را اجرا کنید تا نام متغیرهای باقیمانده بر اساس شناسه پروژه شما برای نام منابع، به مقادیری تنظیم شوند.
source config_env.sh
منابع شرکت پریموس را تنظیم کنید
به عنوان بخشی از این مرحله، منابع ابری مورد نیاز برای Primus را تنظیم خواهید کرد. اسکریپت زیر را برای تنظیم منابع برای Primus اجرا کنید. منابع زیر به عنوان بخشی از اجرای اسکریپت ایجاد میشوند:
- کلید رمزگذاری (
$PRIMUS_ENC_KEY) و حلقه کلید ($PRIMUS_ENC_KEYRING) در KMS برای رمزگذاری فایل دادههای مشتری شرکت Primus. - Workload Identity Pool (
$PRIMUS_WORKLOAD_IDENTITY_POOL) برای اعتبارسنجی ادعاها بر اساس شرایط ویژگیهای پیکربندیشده تحت ارائهدهنده آن. - حساب کاربری سرویس (
$PRIMUS_SERVICE_ACCOUNT) که به مجموعه هویت بار کاری فوقالذکر ($PRIMUS_WORKLOAD_IDENTITY_POOL) متصل است، به رمزگشایی دادهها با استفاده از کلید KMS (با استفاده از نقشroles/cloudkms.cryptoKeyDecrypter)، رمزگذاری دادهها با استفاده از کلید KMS (با استفاده از نقشroles/cloudkms.cryptoKeyEncrypter)، خواندن دادهها از مخزن ذخیرهسازی ابری (با استفاده از نقشobjectViewer) و اتصال حساب کاربری سرویس به مجموعه هویت بار کاری (با استفاده ازroles/iam.workloadIdentityUser) دسترسی دارد.
./setup_primus_resources.sh
۳. ایجاد حجم کار
ایجاد حساب کاربری سرویس حجم کار
اکنون، یک حساب کاربری سرویس برای بار کاری با نقشها و مجوزهای مورد نیاز ایجاد خواهید کرد. اسکریپت زیر را برای ایجاد یک حساب کاربری سرویس بار کاری در پروژه Primus اجرا کنید. این حساب کاربری سرویس توسط ماشین مجازی که سرور استنتاج را اجرا میکند، استفاده خواهد شد.
این حساب سرویس حجم کار ( $WORKLOAD_SERVICEACCOUNT ) نقشهای زیر را خواهد داشت:
- برای دریافت توکن تایید،
confidentialcomputing.workloadUser -
logging.logWriterبرای نوشتن گزارشها در Cloud Logging.
./create_workload_service_account.sh
ایجاد حجم کار
به عنوان بخشی از این مرحله، شما یک تصویر داکر از بار کاری ایجاد خواهید کرد. بار کاری توسط شرکت Primus نوشته خواهد شد. بار کاری مورد استفاده در این آزمایشگاه کد، کد پایتون است که از مدل codegemma از سطل GCS (از vertex model garden) که در دسترس عموم است ، استفاده میکند. بار کاری، مدل codegemma را بارگذاری کرده و سرور استنتاج را راهاندازی میکند که به درخواستهای تولید کد از توسعهدهندگان Primus پاسخ میدهد.
در درخواست تولید کد، Workload، DEK رمزگذاری شده را به همراه یک اعلان رمزگذاری شده دریافت میکند. سپس Workload فراخوانی KMS API را برای رمزگشایی DEK انجام میدهد و سپس اعلان را با استفاده از این DEK رمزگشایی میکند. کلیدهای رمزگذاری (برای DEK) از طریق مخزن هویت بار کاری محافظت میشوند و دسترسی به بارهای کاری که شرایط ویژگی را برآورده میکنند، اعطا میشود. این شرایط ویژگی با جزئیات بیشتر در بخش بعدی در مورد مجوز بار کاری توضیح داده شده است. هنگامی که سرور استنتاج اعلان رمزگشایی شده را دریافت کرد، کد را با استفاده از یک مدل بارگذاری شده تولید میکند و پاسخ را برمیگرداند.
اسکریپت زیر را اجرا کنید تا یک بار کاری ایجاد شود که در آن مراحل زیر انجام شود:
- یک رجیستری از اشیاء باستانی (
$PRIMUS_ARTIFACT_REGISTRY) متعلق به Primus ایجاد کنید. - کد بار کاری را با نام منابع مورد نیاز بهروزرسانی کنید.
- بار کاری سرور استنتاج را بسازید و برای ساخت یک تصویر داکر از کد بار کاری، فایل داکر (Dockerfile) ایجاد کنید. در اینجا فایل داکر مورد استفاده برای این آزمایشگاه کد آمده است.
- ایمیج داکر را ساخته و در رجیستری مصنوعات (
$PRIMUS_ARTIFACT_REGISTRY) متعلق به پریموس منتشر کنید. - به
$WORKLOAD_SERVICEACCOUNTمجوز خواندن برای$PRIMUS_ARTIFACT_REGISTRYاعطا کنید. این مجوز برای کانتینر بار کاری لازم است تا بتواند تصویر داکر بار کاری را از رجیستری Artifact دریافت کند.
./create_workload.sh
برای مرجع شما، در اینجا متد generate() مربوط به بار کاری که در این آزمایشگاه کد ایجاد و استفاده میشود، آمده است (میتوانید کل کد بار کاری را اینجا پیدا کنید).
def generate():
try:
data = request.get_json()
ciphertext = base64.b64decode(data["ciphertext"])
wrapped_dek = base64.b64decode(data["wrapped_dek"])
unwrapped_dek_response = kms_client.decrypt(
request={"name": key_name, "ciphertext": wrapped_dek}
)
unwrapped_dek = unwrapped_dek_response.plaintext
f = Fernet(unwrapped_dek)
plaintext = f.decrypt(ciphertext)
prompt = plaintext.decode("utf-8")
tokens = tokenizer(prompt, return_tensors="pt")
outputs = model.generate(**tokens, max_new_tokens=128)
generated_code = tokenizer.decode(outputs[0])
generated_code_bytes = generated_code.encode("utf-8")
response = f.encrypt(generated_code_bytes)
ciphertext_base64 = base64.b64encode(response).decode("utf-8")
response = {"generated_code_ciphertext": ciphertext_base64}
return jsonify(response)
except (ValueError, TypeError, KeyError) as e:
return jsonify({"error": str(e)}), 500
۴. مجوزدهی و اجرای حجم کار
حجم کار را مجاز کنید
شرکت Primus میخواهد بر اساس ویژگیهای منابع زیر، به بارهای کاری اجازه دسترسی به کلید KMS مورد استفاده برای رمزگذاری سریع را بدهد:
- چه چیزی : کدی که تأیید شده است
- کجا : محیطی امن
- چه کسی : اپراتوری که مورد اعتماد است
Primus از Workload identity Federation برای اجرای یک سیاست دسترسی بر اساس این الزامات استفاده میکند. Workload identity Federation به شما امکان میدهد شرایط ویژگی را مشخص کنید. این شرایط، هویتهایی را که میتوانند با Workload identity pool (WIP) احراز هویت شوند، محدود میکند. میتوانید سرویس Attestation Verifier Service را به عنوان ارائهدهنده Workload identity pool به WIP اضافه کنید تا اندازهگیریها را ارائه داده و سیاست را اجرا کند.
مخزن هویت بار کاری قبلاً به عنوان بخشی از مرحله تنظیم منابع ابری ایجاد شده بود. اکنون Primus یک ارائه دهنده مخزن هویت بار کاری OIDC جدید ایجاد خواهد کرد. شرط --attribute-condition مشخص شده، دسترسی به مخزن بار کاری را مجاز میکند. این امر مستلزم موارد زیر است:
- چه چیزی : آخرین
$WORKLOAD_IMAGE_NAMEآپلود شده در مخزن$PRIMUS_ARTIFACT_REPOSITORY. - که در آن : محیط اجرای قابل اعتماد Confidential Space بر روی تصویر ماشین مجازی Confidential Space که کاملاً پشتیبانی میشود، اجرا میشود.
- چه کسی : حساب سرویس Primus
$WORKLOAD_SERVICE_ACCOUNT.
export WORKLOAD_IMAGE_DIGEST=$(gcloud artifacts docker images describe ${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG --format="value(image_summary.digest)" --project ${PRIMUS_PROJECT_ID})
gcloud iam workload-identity-pools providers create-oidc $PRIMUS_WIP_PROVIDER \
--location="global" \
--project="$PRIMUS_PROJECT_ID" \
--workload-identity-pool="$PRIMUS_WORKLOAD_IDENTITY_POOL" \
--issuer-uri="https://confidentialcomputing.googleapis.com/" \
--allowed-audiences="https://sts.googleapis.com" \
--attribute-mapping="google.subject='assertion.sub'" \
--attribute-condition="assertion.swname == 'HARDENED_SHIELDED' && assertion.hwmodel == 'GCP_SHIELDED_VM' &&
assertion.submods.container.image_digest == '${WORKLOAD_IMAGE_DIGEST}' &&
assertion.submods.container.image_reference == '${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG' &&
'$WORKLOAD_SERVICEACCOUNT@$PRIMUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts"
دستور فوق با بررسی تنظیم hwmodel روی "GCP_SHIELDED_VM" و swname روی "HARDENED_SHIELDED" تأیید میکند که بار کاری در یک محیط فضای قابل اعتماد اجرا میشود. علاوه بر این، شامل assertionهای مخصوص بار کاری، مانند image_digest و image_reference ، برای افزایش امنیت و تضمین یکپارچگی بار کاری در حال اجرا است.
حجم کار را اجرا کنید
به عنوان بخشی از این مرحله، ما بار کاری را در ماشین مجازی Trusted Space اجرا خواهیم کرد که یک شتابدهنده به آن متصل خواهد بود. آرگومانهای مورد نیاز TEE با استفاده از پرچم فراداده (metadata flag ) ارسال میشوند. آرگومانهای مربوط به کانتینر بار کاری با استفاده از بخش " tee-cmd " پرچم ارسال میشوند. برای تجهیز ماشین مجازی بار کاری به یک پردازنده گرافیکی Nvidia Tesla T4، از پرچم --accelerator=type=nvidia-tesla-t4,count=1 استفاده خواهیم کرد. این کار یک پردازنده گرافیکی (GPU) را به ماشین مجازی متصل میکند. همچنین باید tee-install-gpu-driver=true در پرچمهای فراداده وارد کنیم تا نصب درایور پردازنده گرافیکی مناسب آغاز شود.
gcloud compute instances create ${WORKLOAD_VM} \
--accelerator=type=nvidia-tesla-t4,count=1 \
--machine-type=n1-standard-16 \
--shielded-secure-boot \
--image-project=conf-space-images-preview \
--image=confidential-space-0-gpupreview-796705b \
--zone=${PRIMUS_PROJECT_ZONE} \
--maintenance-policy=TERMINATE \
--boot-disk-size=40 \
--scopes=cloud-platform \
--service-account=${WORKLOAD_SERVICEACCOUNT}@${PRIMUS_PROJECT_ID}.iam.gserviceaccount.com \
--metadata="^~^tee-image-reference=${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_ARTIFACT_REPOSITORY}/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}~tee-install-gpu-driver=true~tee-restart-policy=Never"
اجرای پرسوجوی استنتاجی
پس از راهاندازی موفقیتآمیز سرور استنتاج بار کاری، اکنون کارمندان شرکت Primus میتوانند درخواستهای تولید کد را به سرور استنتاج ارسال کنند.
به عنوان بخشی از این آزمایشگاه کد، ما از اسکریپت زیر برای راهاندازی برنامه کلاینت که با سرور استنتاج تعامل خواهد داشت، استفاده خواهیم کرد. این اسکریپت را برای راهاندازی ماشین مجازی کلاینت اجرا کنید.
./setup_client.sh
مراحل زیر نحوه SSH به ماشین مجازی کلاینت و اجرای یک برنامه کلاینت نمونه را در یک محیط مجازی پایتون نشان میدهد. این برنامه نمونه از رمزگذاری پوششی با کتابخانه Fernet استفاده میکند، اما به خاطر داشته باشید که کتابخانههای رمزگذاری خاص را میتوان برای موارد استفاده مختلف تطبیق داد.
gcloud compute ssh ${CLIENT_VM} --zone=${PRIMUS_PROJECT_ZONE}
دستورات زیر را برای فعال کردن محیط مجازی پایتون در ماشین مجازی کلاینت و اجرای برنامه کلاینت اجرا کنید.
source venv/bin/activate
python3 inference_client.py
خروجی این برنامهی کلاینت نمونه، درخواستهای رمزگذاری و متن ساده و پاسخهای رمزگذاری شده و رمزگشایی شدهی مربوط به آنها را نشان میدهد.
۵. تمیز کردن
این اسکریپتی است که میتواند برای پاکسازی منابعی که به عنوان بخشی از این آزمایشگاه کد ایجاد کردهایم، استفاده شود. به عنوان بخشی از این پاکسازی، منابع زیر حذف خواهند شد:
- حساب کاربری سرویس Primus (
$PRIMUS_SERVICEACCOUNT). - کلید رمزگذاری پریموس (
$PRIMUS_ENC_KEY). - مخزن مصنوعات Primus (
$PRIMUS_ARTIFACT_REPOSITORY). - مخزن هویت بار کاری Primus (
$PRIMUS_WORKLOAD_IDENTITY_POOL) به همراه ارائهدهنده آن. - حساب سرویس حجم کار Primus (
$WORKLOAD_SERVICEACCOUNT). - ماشین مجازیِ در حال کار (
$WORKLOAD_VM) و ماشین مجازیِ در حال کار ($CLIENT_VM).
./cleanup.sh
اگر کاوش شما تمام شد، لطفاً حذف پروژه خود را در نظر بگیرید.
- به کنسول پلتفرم ابری بروید
- پروژهای را که میخواهید خاموش کنید انتخاب کنید، سپس روی «حذف» در بالا کلیک کنید: این کار پروژه را برای حذف زمانبندی میکند.