ایمن سازی مدل های ML و مالکیت معنوی با استفاده از فضای محرمانه

۱. مرور کلی

فضای محرمانه (Confidential Space) محیطی امن برای همکاری بین چندین طرف ارائه می‌دهد. این آزمایشگاه کد نشان می‌دهد که چگونه می‌توان از فضای محرمانه برای محافظت از مالکیت معنوی حساس، مانند مدل‌های یادگیری ماشین، استفاده کرد.

در این آزمایشگاه کد، شما از فضای محرمانه (Confidential Space) استفاده خواهید کرد تا یک شرکت بتواند مدل یادگیری ماشین اختصاصی خود را به طور ایمن با شرکت دیگری که مایل به استفاده از این مدل است، به اشتراک بگذارد. به طور خاص، شرکت Primus یک مدل یادگیری ماشین دارد که فقط برای حجم کاری که در فضای محرمانه اجرا می‌شود، منتشر می‌شود و Primus را قادر می‌سازد تا کنترل کامل بر مالکیت معنوی خود را حفظ کند. شرکت Secundus اپراتور حجم کاری خواهد بود و حجم کاری یادگیری ماشین را در یک فضای محرمانه اجرا خواهد کرد. Secundus این مدل را بارگذاری کرده و با استفاده از داده‌های نمونه متعلق به Secundus، استنتاجی را اجرا خواهد کرد.

در اینجا Primus نویسنده‌ی بار کاری است که کد بار کاری را می‌نویسد و همکاری است که می‌خواهد از مالکیت معنوی آن در برابر اپراتور بار کاری غیرقابل اعتماد، Secundus، محافظت کند. Secundus اپراتور بار کاریِ بار کاریِ یادگیری ماشین است.

5a86c47d935da998.jpeg

آنچه یاد خواهید گرفت

  • چگونه محیطی را پیکربندی کنیم که در آن یک طرف بتواند مدل یادگیری ماشین اختصاصی خود را با طرف دیگر به اشتراک بگذارد، بدون اینکه کنترل مالکیت معنوی آن را از دست بدهد؟

آنچه نیاز دارید

نقش‌های دخیل در راه‌اندازی فضای محرمانه

در این آزمایشگاه کد، شرکت پریموس مالک منابع و نویسنده‌ی بار کاری خواهد بود که مسئولیت موارد زیر را بر عهده خواهد داشت:

  1. راه‌اندازی منابع ابری مورد نیاز با یک مدل یادگیری ماشین
  2. نوشتن کد حجم کار
  3. انتشار تصویر حجم کار
  4. پیکربندی سیاست Workload Identity Pool برای محافظت از مدل ML در برابر یک اپراتور غیرقابل اعتماد

شرکت Secundus مجری و مسئول موارد زیر خواهد بود:

  1. تنظیم منابع ابری مورد نیاز برای ذخیره تصاویر نمونه مورد استفاده بر اساس حجم کار و نتایج
  2. اجرای بار کاری یادگیری ماشین در فضای محرمانه با استفاده از مدل ارائه شده توسط Primus

نحوه کار فضای محرمانه

وقتی بار کاری را در فضای محرمانه اجرا می‌کنید، فرآیند زیر با استفاده از منابع پیکربندی شده انجام می‌شود:

  1. این بار کاری، یک توکن دسترسی عمومی گوگل برای $PRIMUS_SERVICEACCOUNT از Workload Identity Pool درخواست می‌کند. این توکن، یک توکن سرویس Attestation Verifier به همراه Claimهای مربوط به بار کاری و محیط ارائه می‌دهد.
  2. اگر ادعاهای اندازه‌گیری بار کاری در توکن سرویس Attestation Verifier با شرط ویژگی در WIP مطابقت داشته باشد، توکن دسترسی را برای $PRIMUS_SERVICEACCOUNT.
  3. این بار کاری از توکن دسترسی حساب سرویس مرتبط با $PRIMUS_SERVICEACCOUNT برای دسترسی به مدل یادگیری ماشینی ذخیره شده در سطل $PRIMUS_INPUT_STORAGE_BUCKET استفاده می‌کند.
  4. این بار کاری عملیاتی را روی داده‌های متعلق به Secundus انجام می‌دهد و آن بار کاری توسط Secundus در پروژه‌اش اداره و اجرا می‌شود.
  5. این بار کاری از حساب سرویس $WORKLOAD_SERVICEACCOUNT برای نوشتن نتایج آن عملیات در سطل $SECUNDUS_RESULT_STORAGE_BUCKET استفاده می‌کند.

۲. منابع ابری را تنظیم کنید

قبل از اینکه شروع کنی

  • برای دریافت اسکریپت‌های مورد نیاز که به عنوان بخشی از این آزمایشگاه کد استفاده می‌شوند ، این مخزن را با استفاده از دستور زیر کلون کنید.
git clone https://github.com/GoogleCloudPlatform/confidential-space.git
  • دایرکتوری مربوط به این codelab را تغییر دهید.
cd confidential-space/codelabs/ml_model_protection/scripts
  • مطمئن شوید که متغیرهای محیطی مورد نیاز پروژه را مطابق شکل زیر تنظیم کرده‌اید. برای اطلاعات بیشتر در مورد راه‌اندازی یک پروژه GCP، لطفاً به این codelab مراجعه کنید. می‌توانید برای کسب اطلاعات بیشتر در مورد نحوه بازیابی شناسه پروژه و تفاوت آن با نام پروژه و شماره پروژه، به این مراجعه کنید.
export PRIMUS_PROJECT_ID=<GCP project id of Primus>
export SECUNDUS_PROJECT_ID=<GCP project id of Secundus>
  • فعال کردن صورتحساب برای پروژه‌هایتان
  • API محاسبات محرمانه و API های زیر را برای هر دو پروژه فعال کنید.
gcloud services enable \
    cloudapis.googleapis.com \
    cloudresourcemanager.googleapis.com \
    cloudshell.googleapis.com \
    container.googleapis.com \
    containerregistry.googleapis.com \
    iam.googleapis.com \
    confidentialcomputing.googleapis.com
  • با استفاده از دستور زیر، به متغیرهای نام منابع مشخص شده در بالا، مقادیری اختصاص دهید. این متغیرها به شما امکان می‌دهند نام منابع را در صورت نیاز سفارشی کنید و همچنین در صورت ایجاد منابع موجود، از آنها استفاده کنید. (مثال: export PRIMUS_INPUT_STORAGE_BUCKET='my-input-bucket' )
  1. شما می‌توانید متغیرهای زیر را با نام‌های منابع ابری موجود در پروژه Primus تنظیم کنید. اگر متغیر تنظیم شود، از منبع ابری موجود مربوطه از پروژه Primus استفاده می‌شود. اگر متغیر تنظیم نشود، نام منبع ابری از project-name تولید می‌شود و منبع ابری جدید با آن نام ایجاد می‌شود. متغیرهای پشتیبانی شده برای نام‌های منابع در زیر آمده است:

$PRIMUS_INPUT_STORAGE_BUCKET

باکتی که مدل یادگیری ماشینی Primus را ذخیره می‌کند.

$PRIMUS_WORKLOAD_IDENTITY_POOL

مجموعه هویت بار کاری (WIP) پریموس که ادعاها را تأیید می‌کند.

$PRIMUS_WIP_PROVIDER

ارائه دهنده‌ی مخزن هویت بار کاری Primus که شامل شرط مجوز برای استفاده از توکن‌های امضا شده توسط سرویس Attestation Verifier می‌شود.

$PRIMUS_SERVICE_ACCOUNT

حساب سرویس Primus که $PRIMUS_WORKLOAD_IDENTITY_POOL برای دسترسی به منابع محافظت‌شده (مدل ML در این آزمایشگاه کد) از آن استفاده می‌کند. در این مرحله، این حساب مجوز خواندن مدل یادگیری ماشین ذخیره‌شده در سطل $PRIMUS_INPUT_STORAGE_BUCKET را دارد.

$PRIMUS_ARTIFACT_REPOSITORY

مخزن مصنوعات که ایمیج داکرِ حجم کار در آن قرار می‌گیرد.

  1. شما می‌توانید متغیرهای زیر را با نام‌های منابع ابری موجود در پروژه Secundus تنظیم کنید. اگر متغیر تنظیم شود، از منبع ابری موجود مربوطه از پروژه Secundus استفاده می‌شود. اگر متغیر تنظیم نشود، نام منبع ابری از نام پروژه تولید می‌شود و یک منبع ابری جدید با آن نام ایجاد می‌شود. در زیر متغیرهای پشتیبانی شده برای نام‌های منابع آمده است:

$SECUNDUS_INPUT_STORAGE_BUCKET

سطلی که تصاویر نمونه‌ای را که Secundus می‌خواهد با استفاده از مدل ارائه شده توسط Primus طبقه‌بندی کند، ذخیره می‌کند.

$SECUNDUS_RESULT_STORAGE_BUCKET

سطلی که نتایج حجم کار را ذخیره می‌کند.

$WORKLOAD_IMAGE_NAME

نام تصویر کانتینر بار کاری.

$WORKLOAD_IMAGE_TAG

برچسب تصویر کانتینر حجم کار.

$WORKLOAD_SERVICE_ACCOUNT

حساب کاربری سرویس که مجوز دسترسی به ماشین مجازی محرمانه‌ای که بار کاری را اجرا می‌کند، دارد.

  • برای این دو پروژه به مجوزهای خاصی نیاز دارید و می‌توانید برای نحوه اعطای نقش‌های IAM با استفاده از کنسول GCP به این راهنما مراجعه کنید:
  • برای $PRIMUS_PROJECT_ID ، به مدیر ذخیره‌سازی (Storage Admin)، مدیر رجیستری مصنوعات (Artifact Registry Administrator)، مدیر حساب کاربری سرویس (Service Account Admin) و مدیر استخر شناسایی بار کاری IAM (IAM Workload Identity Pool Admin) نیاز خواهید داشت.
  • برای $SECUNDUS_PROJECT_ID ، به مدیر محاسبات، مدیر ذخیره‌سازی، مدیر حساب سرویس، مدیر استخر شناسایی بار کاری IAM و مدیر امنیت (اختیاری) نیاز خواهید داشت.
  • اسکریپت زیر را اجرا کنید تا نام متغیرهای باقی‌مانده بر اساس شناسه پروژه شما برای نام منابع، به مقادیری تنظیم شوند.
source config_env.sh

منابع شرکت پریموس را تنظیم کنید

به عنوان بخشی از این مرحله، منابع ابری مورد نیاز برای Primus را تنظیم خواهید کرد. اسکریپت زیر را برای تنظیم منابع برای Primus اجرا کنید. منابع زیر به عنوان بخشی از اجرای اسکریپت ایجاد می‌شوند:

  • مخزن ذخیره‌سازی ابری ( $PRIMUS_INPUT_STORAGE_BUCKET ) برای ذخیره مدل یادگیری ماشینی Primus.
  • مخزن هویت بار کاری ( $PRIMUS_WORKLOAD_IDENTITY_POOL ) برای اعتبارسنجی ادعاها بر اساس شرایط ویژگی‌های پیکربندی‌شده تحت ارائه‌دهنده آن.
  • حساب کاربری سرویس ( $PRIMUS_SERVICEACCOUNT ) به مخزن هویت بار کاری فوق‌الذکر ( $PRIMUS_WORKLOAD_IDENTITY_POOL ) با دسترسی IAM برای خواندن داده‌ها از مخزن ذخیره‌سازی ابری (با استفاده از نقش objectViewer ) و برای اتصال این حساب کاربری سرویس به مخزن هویت بار کاری (با استفاده از نقش roles/iam.workloadIdentityUser ) متصل شده است.

به عنوان بخشی از این تنظیمات منابع ابری، ما از یک مدل TensorFlow استفاده خواهیم کرد. می‌توانیم کل مدل را که شامل معماری مدل، وزن‌ها و پیکربندی آموزش است، در یک بایگانی ZIP ذخیره کنیم. برای اهداف این آزمایشگاه کد، ما از مدل MobileNet V1 که روی مجموعه داده ImageNet موجود در اینجا آموزش داده شده است، استفاده خواهیم کرد.

./setup_primus_company_resources.sh

اسکریپت فوق منبع ابری را تنظیم می‌کند، اکنون مدل را در مخزن ذخیره‌سازی ابری ایجاد شده توسط اسکریپت دانلود و منتشر می‌کنیم.

  1. مدل از پیش آموزش دیده را از اینجا دانلود کنید.
  2. پس از دانلود، فایل tar دانلود شده را به model.tar.gz تغییر نام دهید.
  3. فایل model.tar.gz را با استفاده از دستور زیر از دایرکتوری حاوی فایل model.tar.gz در فضای ذخیره‌سازی ابری منتشر کنید.
gsutil cp model.tar.gz gs://${PRIMUS_INPUT_STORAGE_BUCKET}/

منابع شرکت سکوندوس را تنظیم کنید

به عنوان بخشی از این مرحله، منابع ابری مورد نیاز برای Secundus را تنظیم خواهید کرد. اسکریپت زیر را برای تنظیم منابع برای Secundus اجرا کنید. به عنوان بخشی از این مراحل، منابع زیر ایجاد خواهند شد:

  • مخزن ذخیره‌سازی ابری ( $SECUNDUS_INPUT_STORAGE_BUCKET ) برای ذخیره تصاویر نمونه جهت اجرای استنتاج‌ها توسط Secundus.
  • مخزن ذخیره‌سازی ابری ( $SECUNDUS_RESULT_STORAGE_BUCKET ) برای ذخیره نتیجه اجرای بار کاری یادگیری ماشین توسط Secundus.

برخی از تصاویر نمونه برای این آزمایشگاه کد در اینجا در دسترس هستند.

./setup_secundus_company_resources.sh

۳. ایجاد حجم کار

ایجاد حساب کاربری سرویس حجم کار

اکنون، یک حساب کاربری سرویس برای بار کاری با نقش‌ها و مجوزهای مورد نیاز ایجاد خواهید کرد. اسکریپت زیر را برای ایجاد یک حساب کاربری سرویس بار کاری در پروژه Secundus اجرا کنید. این حساب کاربری سرویس توسط ماشین مجازی که بار کاری ML را اجرا می‌کند، استفاده خواهد شد.

این حساب سرویس حجم کار ( $WORKLOAD_SERVICEACCOUNT ) نقش‌های زیر را خواهد داشت:

  • برای دریافت توکن تایید، confidentialcomputing.workloadUser استفاده کنید.
  • logging.logWriter برای نوشتن گزارش‌ها در Cloud Logging.
  • objectViewer برای خواندن داده‌ها از مخزن ذخیره‌سازی ابری $SECUNDUS_INPUT_STORAGE_BUCKET .
  • objectUser برای نوشتن نتیجه بار کاری در مخزن ذخیره‌سازی ابری $SECUNDUS_RESULT_STORAGE_BUCKET .
./create_workload_service_account.sh

ایجاد حجم کار

به عنوان بخشی از این مرحله، شما یک ایمیج داکر برای حجم کار ایجاد خواهید کرد. این ایمیج توسط پریموس نوشته خواهد شد. حجم کار مورد استفاده در این آزمایشگاه کد، کد پایتون یادگیری ماشین است که به مدل یادگیری ماشین ذخیره شده در مخزن ذخیره‌سازی پریموس دسترسی پیدا می‌کند و با تصاویر نمونه‌ای که در یک مخزن ذخیره‌سازی ذخیره شده‌اند، استنتاج‌هایی را اجرا می‌کند.

مدل یادگیری ماشینی ذخیره شده در مخزن ذخیره‌سازی Primus فقط توسط بارهای کاری که شرایط ویژگی مورد نیاز را برآورده می‌کنند، قابل دسترسی خواهد بود. این شرایط ویژگی با جزئیات بیشتر در بخش بعدی در مورد مجوزدهی به بار کاری توضیح داده شده است.

در اینجا متد run_inference() مربوط به بار کاری که در این آزمایشگاه کد ایجاد و استفاده خواهد شد، آمده است. می‌توانید کل کد بار کاری را اینجا پیدا کنید.

def run_inference(image_path, model):
  try:
    # Read and preprocess the image
    image = tf.image.decode_image(tf.io.read_file(image_path), channels=3)
    image = tf.image.resize(image, (128, 128))
    image = tf.image.convert_image_dtype(image, tf.float32)
    image = tf.expand_dims(image, axis=0)

    # Get predictions from the model
    predictions = model(image)
    predicted_class = np.argmax(predictions)

    top_k = 5
    top_indices = np.argsort(predictions[0])[-top_k:][::-1]

    # Convert top_indices to a TensorFlow tensor
    top_indices_tensor = tf.convert_to_tensor(top_indices, dtype=tf.int32)

    # Use TensorFlow tensor for indexing
    top_scores = tf.gather(predictions[0], top_indices_tensor)

    return {
        "predicted_class": int(predicted_class),
        "top_k_predictions": [
            {"class_index": int(idx), "score": float(score)}
            for idx, score in zip(top_indices, top_scores)
        ],
    }
  except Exception as e:
    return {"error": str(e)}

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

  • یک رجیستری از اشیاء باستانی ( $PRIMUS_ARTIFACT_REGISTRY ) متعلق به Primus ایجاد کنید.
  • کد بار کاری را با نام منابع مورد نیاز به‌روزرسانی کنید.
  • بار کاری ML را بسازید و برای ساخت یک تصویر Docker از کد بار کاری، Dockerfile ایجاد کنید. در اینجا Dockerfile مورد استفاده برای این آزمایشگاه کد آمده است.
  • ایمیج داکر را ساخته و در رجیستری مصنوعات ( $PRIMUS_ARTIFACT_REGISTRY ‎) متعلق به پریموس منتشر کنید.
  • به $WORKLOAD_SERVICEACCOUNT مجوز خواندن برای $PRIMUS_ARTIFACT_REGISTRY اعطا کنید. این مجوز برای کانتینر بار کاری لازم است تا بتواند تصویر داکر بار کاری را از رجیستری Artifact دریافت کند.
./create_workload.sh

علاوه بر این، می‌توان بارهای کاری را کدگذاری کرد تا با بررسی هش یا امضای مدل قبل از استفاده، از بارگذاری نسخه مورد انتظار مدل یادگیری ماشین اطمینان حاصل شود. مزیت چنین بررسی‌های اضافی این است که یکپارچگی مدل یادگیری ماشین را تضمین می‌کند. با این کار، اپراتور بار کاری همچنین باید تصویر بار کاری یا پارامترهای آن را به‌روزرسانی کند، زمانی که انتظار می‌رود بار کاری از نسخه‌های مختلف مدل ML استفاده کند.

۴. مجوزدهی و اجرای حجم کار

حجم کار را مجاز کنید

پریموس می‌خواهد بر اساس ویژگی‌های منابع زیر، به بارهای کاری اجازه دسترسی به مدل یادگیری ماشینی خود را بدهد:

  • چه چیزی : کدی که تأیید شده است
  • کجا : محیطی امن
  • چه کسی : اپراتوری که مورد اعتماد است

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 که کاملاً پشتیبانی می‌شود، اجرا می‌شود.
  • چه کسی : دومین حساب سرویس $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 config set project $PRIMUS_PROJECT_ID
gcloud iam workload-identity-pools providers create-oidc $PRIMUS_WIP_PROVIDER \
  --location="global" \
  --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 == 'CONFIDENTIAL_SPACE' && 
'STABLE' in assertion.submods.confidential_space.support_attributes && 
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@$SECUNDUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts"

حجم کار را اجرا کنید

به عنوان بخشی از این مرحله، ما بار کاری را در ماشین مجازی Confidential Space اجرا خواهیم کرد. آرگومان‌های مورد نیاز TEE با استفاده از پرچم metadata ارسال می‌شوند. آرگومان‌های مربوط به کانتینر بار کاری با استفاده از بخش " tee-cmd " پرچم ارسال می‌شوند. نتیجه اجرای بار کاری در $SECUNDUS_RESULT_STORAGE_BUCKET منتشر خواهد شد.

gcloud compute instances create ${WORKLOAD_VM} \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --project=${SECUNDUS_PROJECT_ID} \
 --maintenance-policy=MIGRATE \
 --scopes=cloud-platform --zone=${SECUNDUS_PROJECT_ZONE} \
 --image-project=confidential-space-images \
 --image-family=confidential-space \
 --service-account=${WORKLOAD_SERVICEACCOUNT}@${SECUNDUS_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}

مشاهده نتایج

پس از اتمام موفقیت‌آمیز بار کاری، نتیجه‌ی بار کاری یادگیری ماشینی در $SECUNDUS_RESULT_STORAGE_BUCKET منتشر خواهد شد.

gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/result

در اینجا چند نمونه از نتایج استنتاج روی تصاویر نمونه آورده شده است:

Image: sample_image_1.jpeg, Response: {'predicted_class': 531, 'top_k_predictions': [{'class_index': 531, 'score': 12.08437442779541}, {'class_index': 812, 'score': 10.269512176513672}, {'class_index': 557, 'score': 9.202644348144531}, {'class_index': 782, 'score': 9.08737564086914}, {'class_index': 828, 'score': 8.912498474121094}]}

Image: sample_image_2.jpeg, Response: {'predicted_class': 905, 'top_k_predictions': [{'class_index': 905, 'score': 9.53619384765625}, {'class_index': 557, 'score': 7.928380966186523}, {'class_index': 783, 'score': 7.70129919052124}, {'class_index': 531, 'score': 7.611623287200928}, {'class_index': 906, 'score': 7.021416187286377}]}

Image: sample_image_3.jpeg, Response: {'predicted_class': 905, 'top_k_predictions': [{'class_index': 905, 'score': 6.09878396987915}, {'class_index': 447, 'score': 5.992854118347168}, {'class_index': 444, 'score': 5.9582319259643555}, {'class_index': 816, 'score': 5.502010345458984}, {'class_index': 796, 'score': 5.450454235076904}]}

برای هر تصویر نمونه در مخزن ذخیره‌سازی Secundus، یک ورودی در نتایج مشاهده خواهید کرد. این ورودی شامل دو بخش کلیدی از اطلاعات خواهد بود:

  • شاخص کلاس پیش‌بینی‌شده: این یک شاخص عددی است که نشان‌دهنده کلاسی است که مدل پیش‌بینی می‌کند تصویر به آن تعلق دارد.
  • پیش‌بینی‌های برتر (Top_k_predictions): این گزینه تا k پیش‌بینی برای تصویر ارائه می‌دهد که از بیشترین تا کمترین احتمال رتبه‌بندی شده‌اند. مقدار k در این آزمایشگاه کد روی ۵ تنظیم شده است، اما می‌توانید آن را در کد بار کاری تنظیم کنید تا پیش‌بینی‌های بیشتر یا کمتری دریافت کنید.

برای ترجمه اندیس کلاس به یک نام کلاس قابل خواندن توسط انسان، به لیست برچسب‌ها موجود در اینجا مراجعه کنید. برای مثال، اگر اندیس کلاس ۲ را مشاهده می‌کنید، این عدد با برچسب کلاس "tench" در لیست برچسب‌ها مطابقت دارد.

در این آزمایشگاه کد، ما نشان داده‌ایم که یک مدل متعلق به Primus که فقط به بار کاری که در یک TEE اجرا می‌شود، منتشر می‌شود. Secundus بار کاری ML را در یک TEE اجرا می‌کند و این بار کاری قادر است مدل متعلق به Primus را مصرف کند، در حالی که Primus کنترل کامل بر مدل را حفظ می‌کند.

اجرای حجم کار غیرمجاز

Secundus تصویر بار کاری را با دریافت یک تصویر بار کاری متفاوت از مخزن مصنوعات خود که توسط Primus مجاز نیست، تغییر می‌دهد. مخزن هویت بار کاری Primus فقط تصویر بار کاری ${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG را مجاز کرده است..

حجم کار را دوباره اجرا کنید

وقتی Secundus سعی می‌کند بار کاری اصلی را با این تصویر بار کاری جدید اجرا کند، با شکست مواجه می‌شود. برای مشاهده خطا، فایل نتایج اصلی و نمونه ماشین مجازی را حذف کنید و سپس دوباره سعی کنید بار کاری را اجرا کنید.

لطفاً مطمئن شوید که یک تصویر داکر جدید تحت رجیستری مصنوعات Secundus منتشر شده است (به عنوان us-docker.pkg.dev/${SECUNDUS_PROJECT_ID}/custom-image/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG} ) و serviceaccount بار کاری ( $WORKLOAD_SERVICEACCOUNT ) به خواننده رجیستری مصنوعات اجازه خواندن این تصویر بار کاری جدید را داده است. این کار برای اطمینان از این است که بار کاری قبل از اینکه سیاست WIP پریموس توکن ارائه شده توسط بار کاری را رد کند، خارج نشود.

فایل نتایج موجود و نمونه ماشین مجازی را حذف کنید

  1. پروژه را روی پروژه $SECUNDUS_PROJECT_ID تنظیم کنید.
gcloud config set project $SECUNDUS_PROJECT_ID
  1. فایل نتیجه را حذف کنید.
gsutil rm gs://$SECUNDUS_RESULT_STORAGE_BUCKET/result
  1. نمونه ماشین مجازی محرمانه (Confidential VM) را حذف کنید.
gcloud compute instances delete ${WORKLOAD_VM} --zone=${SECUNDUS_PROJECT_ZONE}

اجرای حجم کار غیرمجاز:

gcloud compute instances create ${WORKLOAD_VM} \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --maintenance-policy=MIGRATE \
 --scopes=cloud-platform --zone=${SECUNDUS_PROJECT_ZONE} \
 --image-project=confidential-space-images \
 --image-family=confidential-space \
 --service-account=${WORKLOAD_SERVICEACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com \
 --metadata  ^~^tee-image-reference=us-docker.pkg.dev/${SECUNDUS_PROJECT_ID}/custom-image/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}

مشاهده خطا

به جای نتایج حجم کار، خطایی با عنوان « The given credential is rejected by the attribute condition » مشاهده می‌کنید.

gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/result

۵. تمیز کردن

این اسکریپتی است که می‌تواند برای پاکسازی منابعی که به عنوان بخشی از این آزمایشگاه کد ایجاد کرده‌ایم، استفاده شود. به عنوان بخشی از این پاکسازی، منابع زیر حذف خواهند شد:

  • سطل ذخیره‌سازی ورودی Primus ( $PRIMUS_INPUT_STORAGE_BUCKET) .
  • حساب کاربری سرویس Primus ( $PRIMUS_SERVICEACCOUNT ).
  • مخزن مصنوعات Primus ( $PRIMUS_ARTIFACT_REPOSITORY ).
  • مخزن هویت بار کاری Primus ( $PRIMUS_WORKLOAD_IDENTITY_POOL ).
  • حساب سرویس حجم کار Secundus ( $WORKLOAD_SERVICEACCOUNT ).
  • سطل ذخیره سازی ورودی Secundus ( $SECUNDUS_INPUT_STORAGE_BUCKET) .
  • نمونه‌های محاسباتی حجم کار.
  • سطل ذخیره‌سازی نتایج Secundus ( $SECUNDUS_RESULT_STORAGE_BUCKET ).
$ ./cleanup.sh

اگر کاوش شما تمام شد، لطفاً حذف پروژه خود را در نظر بگیرید.

  • به کنسول پلتفرم ابری بروید
  • پروژه‌ای را که می‌خواهید خاموش کنید انتخاب کنید، سپس روی «حذف» در بالا کلیک کنید: این کار پروژه را برای حذف زمان‌بندی می‌کند.

بعدش چی؟

برخی از این آزمایشگاه‌های کد مشابه را بررسی کنید...