การรักษาความปลอดภัยของโมเดล ML และทรัพย์สินทางปัญญาโดยใช้ Confidential Space

1. ภาพรวม

พื้นที่ทำงานที่ปลอดภัยเป็นสภาพแวดล้อมที่ปลอดภัยสำหรับการทํางานร่วมกันระหว่างหลายฝ่าย โค้ดแล็บนี้แสดงวิธีใช้พื้นที่ทำงานที่ปลอดภัยเพื่อปกป้องทรัพย์สินทางปัญญาที่ละเอียดอ่อน เช่น โมเดลแมชชีนเลิร์นนิง

ในโค้ดแล็บนี้ คุณจะใช้พื้นที่ส่วนบุคคลเพื่อให้บริษัทหนึ่งแชร์โมเดลแมชชีนเลิร์นนิงที่เป็นกรรมสิทธิ์กับบริษัทอื่นที่ต้องการใช้โมเดลได้อย่างปลอดภัย กล่าวโดยละเอียดคือ บริษัท Primus มีโมเดลแมชชีนเลิร์นนิงที่จะเผยแพร่ให้กับเวิร์กโหลดที่ทำงานในพื้นที่ส่วนบุคคลเท่านั้น ซึ่งช่วยให้ Primus ควบคุมทรัพย์สินทางปัญญาของตนได้อย่างสมบูรณ์ บริษัท Secundus จะเป็นผู้ให้บริการจัดการเวิร์กโหลดและจะเรียกใช้เวิร์กโหลดแมชชีนเลิร์นนิงในพื้นที่ทำงานที่มีการรักษาความปลอดภัย Secundus จะโหลดโมเดลนี้และทำการอนุมานโดยใช้ข้อมูลตัวอย่างที่เป็นของ Secundus

ในที่นี้ Primus เป็นผู้เขียนเวิร์กโหลดที่เขียนโค้ดเวิร์กโหลด และผู้ทำงานร่วมกันที่ต้องการปกป้องทรัพย์สินทางปัญญาจาก Secundus ซึ่งเป็นผู้ดำเนินการเวิร์กโหลดที่ไม่น่าเชื่อถือ Secundus เป็นโอเปอเรเตอร์ของปริมาณงานแมชชีนเลิร์นนิง

5a86c47d935da998.jpeg

สิ่งที่คุณจะได้เรียนรู้

  • วิธีกำหนดค่าสภาพแวดล้อมที่ฝ่ายหนึ่งสามารถแชร์โมเดล ML ที่เป็นกรรมสิทธิ์ของตนกับอีกฝ่ายหนึ่งได้โดยไม่สูญเสียการควบคุมทรัพย์สินทางปัญญา

สิ่งที่ต้องมี

บทบาทที่เกี่ยวข้องกับการตั้งค่าพื้นที่ทำงานที่ปลอดภัย

ในโค้ดแล็บนี้ บริษัท Primus จะเป็นเจ้าของทรัพยากรและผู้เขียนเวิร์กโหลด ซึ่งจะมีหน้าที่รับผิดชอบดังต่อไปนี้

  1. การตั้งค่าทรัพยากรระบบคลาวด์ที่จําเป็นด้วยโมเดลแมชชีนเลิร์นนิง
  2. การเขียนโค้ดภาระงาน
  3. การเผยแพร่รูปภาพภาระงาน
  4. การกำหนดค่านโยบาย Workload Identity Pool เพื่อปกป้องโมเดล ML จากผู้ให้บริการที่ไม่น่าเชื่อถือ

บริษัท Secundus จะเป็นผู้ดำเนินการและรับผิดชอบในเรื่องต่อไปนี้

  1. การตั้งค่าทรัพยากรระบบคลาวด์ที่จําเป็นเพื่อจัดเก็บรูปภาพตัวอย่างที่ภาระงานใช้และผลลัพธ์
  2. เรียกใช้เวิร์กโหลด ML ในพื้นที่ทำงานที่มีข้อมูลลับโดยใช้โมเดลที่ Primus ให้มา

วิธีการทำงานของพื้นที่ทำงานส่วนตัว

เมื่อคุณเรียกใช้เวิร์กโหลดใน Confidential Space ระบบจะดำเนินการตามขั้นตอนต่อไปนี้โดยใช้ทรัพยากรที่กําหนดค่าไว้

  1. ภาระงานขอโทเค็นการเข้าถึงทั่วไปของ Google สําหรับ $PRIMUS_SERVICEACCOUNT จาก Workload Identity Pool โดยจะมีโทเค็นบริการโปรแกรมตรวจสอบการรับรองที่มีการอ้างสิทธิ์เกี่ยวกับเวิร์กโหลดและสภาพแวดล้อม
  2. หากการอ้างสิทธิ์การวัดภาระงานในโทเค็นบริการโปรแกรมตรวจสอบการรับรองตรงกับเงื่อนไขแอตทริบิวต์ใน WIP ระบบจะแสดงผลโทเค็นการเข้าถึงสำหรับ $PRIMUS_SERVICEACCOUNT.
  3. เวิร์กโหลดใช้โทเค็นการเข้าถึงบัญชีบริการที่เชื่อมโยงกับ $PRIMUS_SERVICEACCOUNT เพื่อเข้าถึงโมเดลแมชชีนเลิร์นนิงที่จัดเก็บไว้ในที่เก็บข้อมูล $PRIMUS_INPUT_STORAGE_BUCKET
  4. ภาระงานจะดําเนินการกับข้อมูลที่ Secundus เป็นเจ้าของ และ Secundus จะเป็นผู้ดําเนินการและเรียกใช้ภาระงานนั้นในโปรเจ็กต์ของตน
  5. เวิร์กโหลดใช้บัญชีบริการ $WORKLOAD_SERVICEACCOUNT เพื่อเขียนผลลัพธ์ของการดำเนินการนั้นลงในที่เก็บข้อมูล $SECUNDUS_RESULT_STORAGE_BUCKET

2. ตั้งค่าทรัพยากรระบบคลาวด์

ก่อนเริ่มต้น

  • โคลน ที่เก็บนี้โดยใช้คําสั่งด้านล่างเพื่อรับสคริปต์ที่จําเป็นซึ่งใช้ในโค้ดแล็บนี้
git clone https://github.com/GoogleCloudPlatform/confidential-space.git
  • เปลี่ยนไดเรกทอรีของ Codelab นี้
cd confidential-space/codelabs/ml_model_protection/scripts
  • ตรวจสอบว่าคุณได้ตั้งค่าตัวแปรสภาพแวดล้อมของโปรเจ็กต์ที่จําเป็นดังที่แสดงด้านล่าง ดูข้อมูลเพิ่มเติมเกี่ยวกับการตั้งค่าโปรเจ็กต์ GCP ได้ที่ โค้ดแล็บนี้ โปรดดูรายละเอียดเกี่ยวกับวิธีเรียกข้อมูลรหัสโปรเจ็กต์และความแตกต่างระหว่างรหัสโปรเจ็กต์กับชื่อโปรเจ็กต์และหมายเลขโปรเจ็กต์ได้ที่นี่
export PRIMUS_PROJECT_ID=<GCP project id of Primus>
export SECUNDUS_PROJECT_ID=<GCP project id of Secundus>
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

พูล Workload Identity (WIP) ของ Primus ที่ตรวจสอบการอ้างสิทธิ์

$PRIMUS_WIP_PROVIDER

ผู้ให้บริการ Workload Identity Pool ของ Primus ซึ่งมีเงื่อนไขการให้สิทธิ์เพื่อใช้กับโทเค็นที่บริการโปรแกรมตรวจสอบการรับรองลงนาม

$PRIMUS_SERVICE_ACCOUNT

บัญชีบริการ Primus ที่ $PRIMUS_WORKLOAD_IDENTITY_POOL ใช้เข้าถึงทรัพยากรที่ได้รับการปกป้อง (โมเดล ML ในโค้ดแล็บนี้) ในขั้นตอนนี้ ผู้ใช้จะมีสิทธิ์อ่านโมเดลแมชชีนเลิร์นนิงที่จัดเก็บไว้ในที่เก็บข้อมูล $PRIMUS_INPUT_STORAGE_BUCKET

$PRIMUS_ARTIFACT_REPOSITORY

ที่เก็บอาร์ติแฟกต์ที่จะพุชอิมเมจ Docker ของเวิร์กโหลด

  1. คุณสามารถตั้งค่าตัวแปรต่อไปนี้ด้วยชื่อทรัพยากรระบบคลาวด์ที่มีอยู่เดิมในโปรเจ็กต์ Secundus หากตั้งค่าตัวแปร ระบบจะใช้ทรัพยากรระบบคลาวด์ที่มีอยู่ที่เกี่ยวข้องจากโปรเจ็กต์ Secundus หากไม่ได้ตั้งค่าตัวแปร ระบบจะสร้างชื่อทรัพยากรระบบคลาวด์จาก project-name และสร้างทรัพยากรระบบคลาวด์ใหม่โดยใช้ชื่อนั้น ตัวแปรที่รองรับสำหรับชื่อทรัพยากรมีดังนี้

$SECUNDUS_INPUT_STORAGE_BUCKET

ที่เก็บข้อมูลซึ่งจัดเก็บรูปภาพตัวอย่างที่ Secundus ต้องการจัดประเภทโดยใช้โมเดลที่ Primus ระบุ

$SECUNDUS_RESULT_STORAGE_BUCKET

ที่เก็บข้อมูลที่จัดเก็บผลลัพธ์ของภาระงาน

$WORKLOAD_IMAGE_NAME

ชื่อของรูปภาพคอนเทนเนอร์ภาระงาน

$WORKLOAD_IMAGE_TAG

แท็กของอิมเมจคอนเทนเนอร์ของภาระงาน

$WORKLOAD_SERVICE_ACCOUNT

บัญชีบริการที่มีสิทธิ์เข้าถึง VM ข้อมูลที่เป็นความลับซึ่งเรียกใช้ภาระงาน

  • คุณจะต้องมีสิทธิ์บางอย่างสำหรับโปรเจ็กต์ 2 รายการนี้ และดูคู่มือนี้เกี่ยวกับวิธีมอบบทบาท IAM โดยใช้คอนโซล GCP
  • สำหรับ $PRIMUS_PROJECT_ID คุณจะต้องมีผู้ดูแลระบบพื้นที่เก็บข้อมูล ผู้ดูแลระบบรีจิสทรีอาร์ติแฟกต์ ผู้ดูแลระบบบัญชีบริการ และผู้ดูแลระบบพูล Workload Identity ของ IAM
  • สำหรับ $SECUNDUS_PROJECT_ID คุณจะต้องมีผู้ดูแลระบบ Compute, ผู้ดูแลระบบพื้นที่เก็บข้อมูล, ผู้ดูแลระบบบัญชีบริการ, ผู้ดูแลระบบพูล Workload Identity ของ IAM, ผู้ดูแลระบบความปลอดภัย (ไม่บังคับ)
  • เรียกใช้สคริปต์ต่อไปนี้เพื่อตั้งค่าชื่อตัวแปรที่เหลือเป็นค่าตามรหัสโปรเจ็กต์สำหรับชื่อทรัพยากร
source config_env.sh

ตั้งค่าทรัพยากรของ Primus Company

ในขั้นตอนนี้ คุณจะต้องตั้งค่าทรัพยากรระบบคลาวด์ที่จำเป็นสำหรับ Primus เรียกใช้สคริปต์ต่อไปนี้เพื่อตั้งค่าทรัพยากรสําหรับ Primus ระบบจะสร้างทรัพยากรต่อไปนี้เป็นส่วนหนึ่งของการเรียกใช้สคริปต์

  • ที่เก็บข้อมูล Cloud Storage ($PRIMUS_INPUT_STORAGE_BUCKET) เพื่อจัดเก็บโมเดลแมชชีนเลิร์นนิงของ Primus
  • Workload Identity Pool ($PRIMUS_WORKLOAD_IDENTITY_POOL) เพื่อตรวจสอบการอ้างสิทธิ์ตามเงื่อนไขแอตทริบิวต์ที่กำหนดค่าไว้ภายใต้ผู้ให้บริการ
  • บัญชีบริการ ($PRIMUS_SERVICEACCOUNT) ที่แนบอยู่กับพูล Workload Identity ที่กล่าวถึงข้างต้น ($PRIMUS_WORKLOAD_IDENTITY_POOL) ที่มีสิทธิ์เข้าถึง IAM เพื่ออ่านข้อมูลจากที่เก็บข้อมูลระบบคลาวด์ (โดยใช้บทบาท objectViewer) และเพื่อเชื่อมต่อบัญชีบริการนี้กับพูล Workload Identity (โดยใช้บทบาท roles/iam.workloadIdentityUser)

เราจะใช้โมเดล TensorFlow ในการตั้งค่าทรัพยากรระบบคลาวด์นี้ เราบันทึกโมเดลทั้งหมดซึ่งประกอบด้วยสถาปัตยกรรม น้ำหนัก และการกำหนดค่าการฝึกของโมเดลไว้ในไฟล์ ZIP ได้ วัตถุประสงค์ของโค้ดแล็บนี้คือ เราจะใช้โมเดล MobileNet V1 ที่ฝึกในชุดข้อมูล ImageNet ซึ่งมีอยู่ที่นี่

./setup_primus_company_resources.sh

สคริปต์ที่กล่าวถึงข้างต้นจะตั้งค่าทรัพยากรระบบคลาวด์ ตอนนี้เราจะดาวน์โหลดและเผยแพร่โมเดลไปยังที่เก็บข้อมูล Cloud Storage ที่สร้างโดยสคริปต์

  1. ดาวน์โหลดโมเดลที่ฝึกไว้ล่วงหน้าได้ที่นี่
  2. เมื่อดาวน์โหลดแล้ว ให้เปลี่ยนชื่อไฟล์ tar ที่ดาวน์โหลดเป็น model.tar.gz
  3. เผยแพร่ไฟล์ model.tar.gz ไปยังที่เก็บข้อมูล Cloud Storage โดยใช้คําสั่งต่อไปนี้จากไดเรกทอรีที่มีไฟล์ model.tar.gz
gsutil cp model.tar.gz gs://${PRIMUS_INPUT_STORAGE_BUCKET}/

ตั้งค่าทรัพยากรของบริษัท Secundus

ในขั้นตอนนี้ คุณจะต้องตั้งค่าทรัพยากรระบบคลาวด์ที่จําเป็นสําหรับ Secundus เรียกใช้สคริปต์ต่อไปนี้เพื่อตั้งค่าทรัพยากรสําหรับ Secundus ขั้นตอนเหล่านี้จะสร้างทรัพยากรต่อไปนี้

  • ที่เก็บข้อมูล Cloud Storage ($SECUNDUS_INPUT_STORAGE_BUCKET) เพื่อจัดเก็บรูปภาพตัวอย่างสําหรับการเรียกใช้การอนุมานโดย Secundus
  • ที่เก็บข้อมูล Cloud Storage ($SECUNDUS_RESULT_STORAGE_BUCKET) เพื่อจัดเก็บผลลัพธ์ของการดำเนินการเวิร์กโหลด ML โดย Secundus

ตัวอย่างรูปภาพบางส่วนมีให้ที่นี่สําหรับโค้ดแล็บนี้

./setup_secundus_company_resources.sh

3. สร้างภาระงาน

สร้างบัญชีบริการของ Workload

ตอนนี้คุณจะต้องสร้างบัญชีบริการสำหรับเวิร์กโหลดที่มีบทบาทและสิทธิ์ที่จำเป็น เรียกใช้สคริปต์ต่อไปนี้เพื่อสร้างบัญชีบริการเวิร์กโหลดในโปรเจ็กต์ Secundus VM ที่เรียกใช้เวิร์กโหลด ML จะใช้บัญชีบริการนี้

บัญชีบริการของเวิร์กโหลดนี้ ($WORKLOAD_SERVICEACCOUNT) จะมีบทบาทต่อไปนี้

  • confidentialcomputing.workloadUser เพื่อรับโทเค็นการรับรอง
  • logging.logWriter เพื่อเขียนบันทึกไปยัง Cloud Logging
  • objectViewer เพื่ออ่านข้อมูลจากที่เก็บข้อมูลระบบคลาวด์ $SECUNDUS_INPUT_STORAGE_BUCKET
  • objectUser เพื่อเขียนผลลัพธ์ของเวิร์กโหลดไปยังที่เก็บข้อมูลระบบคลาวด์ $SECUNDUS_RESULT_STORAGE_BUCKET
./create_workload_service_account.sh

สร้างภาระงาน

ในขั้นตอนนี้ คุณจะต้องสร้างอิมเมจ Docker ของภาระงาน Primus จะเป็นผู้เขียนภาระงาน เวิร์กโหลดที่ใช้ในโค้ดแล็บนี้คือโค้ด Python สำหรับแมชชีนเลิร์นนิงซึ่งเข้าถึงโมเดล ML ที่เก็บไว้ในที่เก็บข้อมูลของ Primus และทำการอนุมานด้วยรูปภาพตัวอย่างที่เก็บไว้ในที่เก็บข้อมูล

โมเดลแมชชีนเลิร์นนิงที่เก็บไว้ในที่เก็บข้อมูลของ Primus จะเข้าถึงได้เฉพาะโดยเวิร์กโหลดที่ตรงกับเงื่อนไขแอตทริบิวต์ที่กำหนดเท่านั้น เงื่อนไขแอตทริบิวต์เหล่านี้จะอธิบายไว้อย่างละเอียดในส่วนถัดไปเกี่ยวกับการให้สิทธิ์เวิร์กโหลด

นี่คือเมธอด run_inference() ของเวิร์กโหลดที่จะสร้างและใช้ใน Codelab นี้ ดูรหัสเวิร์กโหลดทั้งหมดได้ที่นี่

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)}

เรียกใช้สคริปต์ต่อไปนี้เพื่อสร้างภาระงานที่จะทำตามขั้นตอนต่อไปนี้

  • สร้าง Artifact Registry($PRIMUS_ARTIFACT_REGISTRY) ของ Primus
  • อัปเดตโค้ดภาระงานด้วยชื่อทรัพยากรที่จำเป็น
  • สร้างภาระงาน ML และสร้าง Dockerfile สำหรับสร้างอิมเมจ Docker ของโค้ดภาระงาน ที่นี่คือ Dockerfile ที่ใช้สำหรับ Codelab นี้
  • สร้างและเผยแพร่อิมเมจ Docker ไปยัง Artifact Registry ($PRIMUS_ARTIFACT_REGISTRY) ของ Primus
  • ให้สิทธิ์อ่าน $PRIMUS_ARTIFACT_REGISTRY แก่ $WORKLOAD_SERVICEACCOUNT ซึ่งจำเป็นสำหรับคอนเทนเนอร์ภาระงานในการดึงอิมเมจ Docker ของภาระงานจาก Artifact Registry
./create_workload.sh

นอกจากนี้ คุณยังเขียนโค้ดให้เวิร์กโหลดเพื่อให้แน่ใจว่ากำลังโหลดโมเดลแมชชีนเลิร์นนิงเวอร์ชันที่คาดไว้ด้วยการตรวจสอบแฮชหรือลายเซ็นของโมเดลก่อนใช้งาน ข้อดีของการตรวจสอบเพิ่มเติมดังกล่าวคือช่วยให้มั่นใจได้ว่าโมเดลแมชชีนเลิร์นนิงมีความสมบูรณ์ ในกรณีนี้ ผู้ดำเนินการเวิร์กโหลดจะต้องอัปเดตรูปภาพเวิร์กโหลดหรือพารามิเตอร์ของเวิร์กโหลดด้วยเมื่อคาดว่าเวิร์กโหลดจะใช้โมเดล ML เวอร์ชันอื่น

4. ให้สิทธิ์และเรียกใช้ภาระงาน

ให้สิทธิ์ภาระงาน

Primus ต้องการให้สิทธิ์เวิร์กโหลดเข้าถึงโมเดลแมชชีนเลิร์นนิงตามแอตทริบิวต์ของทรัพยากรต่อไปนี้

  • สิ่งที่เป็น: รหัสที่ได้รับการยืนยัน
  • สถานที่: สภาพแวดล้อมที่ปลอดภัย
  • Who: ผู้ให้บริการที่เชื่อถือได้

Primus ใช้การรวมข้อมูลระบุตัวตนของเวิร์กโหลดเพื่อบังคับใช้นโยบายการเข้าถึงตามข้อกำหนดเหล่านี้ การรวมศูนย์ข้อมูลระบบ Workload Identity ช่วยให้คุณระบุเงื่อนไขแอตทริบิวต์ได้ เงื่อนไขเหล่านี้จะจำกัดข้อมูลประจำตัวที่ตรวจสอบสิทธิ์กับ Workload Identity Pool (WIP) ได้ คุณสามารถเพิ่มบริการเครื่องตรวจสอบการรับรองลงใน WIP เป็นผู้ให้บริการ Workload Identity Pool เพื่อแสดงการวัดผลและบังคับใช้นโยบาย

มีการสร้าง Workload Identity Pool ไว้แล้วก่อนหน้านี้ในขั้นตอนการตั้งค่าทรัพยากรระบบคลาวด์ ตอนนี้ Primus จะสร้างผู้ให้บริการ Workload Identity Pool ของ OIDC ใหม่ --attribute-condition ที่ระบุจะให้สิทธิ์เข้าถึงคอนเทนเนอร์ภาระงาน โดยต้องมีสิ่งต่อไปนี้

  • สิ่งที่ทำ: $WORKLOAD_IMAGE_NAME ล่าสุดที่อัปโหลดไปยังที่เก็บ $PRIMUS_ARTIFACT_REPOSITORY
  • ตำแหน่ง: สภาพแวดล้อมการดำเนินการที่เชื่อถือได้ของพื้นที่ทำงานที่เป็นความลับกำลังทำงานบนอิมเมจ VM ของพื้นที่ทำงานที่เป็นความลับที่รองรับอย่างเต็มรูปแบบ
  • ใคร: บัญชีบริการ Secundus $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"

เรียกใช้ภาระงาน

ในขั้นตอนนี้ เราจะเรียกใช้เวิร์กโหลดใน VM ของพื้นที่ทำงานที่มีข้อมูลลับ ระบบจะส่งอาร์กิวเมนต์ TEE ที่จำเป็นโดยใช้แฟล็กข้อมูลเมตา ระบบจะส่งอาร์กิวเมนต์สำหรับคอนเทนเนอร์เวิร์กโหลดโดยใช้ส่วน "tee-cmd" ของ Flag ระบบจะเผยแพร่ผลลัพธ์ของการดำเนินการเวิร์กโหลดไปยัง $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}

ดูผลลัพธ์

หลังจากเวิร์กโหลดเสร็จสมบูรณ์แล้ว ระบบจะเผยแพร่ผลลัพธ์ของเวิร์กโหลด ML ไปยัง $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 รายการนี้จะมีข้อมูลสำคัญ 2 รายการ ได้แก่

  • ดัชนีของ predicted_class: ดัชนีตัวเลขที่แสดงถึงคลาสที่โมเดลคาดการณ์ว่ารูปภาพนั้นจัดอยู่ในคลาสใด
  • Top_k_predictions: แสดงการคาดการณ์สูงสุด k รายการสําหรับรูปภาพ โดยจัดลําดับจากที่มีแนวโน้มมากที่สุดไปจนถึงมีแนวโน้มน้อยที่สุด ค่าของ k ได้รับการตั้งค่าเป็น 5 ในโค้ดแล็บนี้ แต่คุณสามารถปรับค่าในโค้ดเวิร์กโหลดเพื่อให้ได้การคาดการณ์มากขึ้นหรือน้อยลง

หากต้องการแปลดัชนีชั้นเรียนเป็นชื่อชั้นเรียนที่มนุษย์อ่านได้ โปรดดูรายการป้ายกำกับที่มีที่นี่ เช่น หากเห็นดัชนีชั้นเรียนเป็น 2 แสดงว่าสอดคล้องกับป้ายกำกับชั้นเรียน "ปลาบู่ทอง" ในรายการป้ายกำกับ

ในโค้ดแล็บนี้ เราได้สาธิตโมเดลที่เป็นของ Primus ซึ่งเผยแพร่ให้กับเวิร์กโหลดที่ทำงานใน TEE เท่านั้น Secundus จะเรียกใช้เวิร์กโหลด ML ใน TEE และเวิร์กโหลดนี้สามารถใช้โมเดลที่ Primus เป็นเจ้าของได้ ขณะที่ Primus ยังคงควบคุมโมเดลได้อย่างเต็มที่

เรียกใช้ภาระงานที่ไม่ได้รับอนุญาต

Secundus เปลี่ยนรูปภาพภาระงานโดยการดึงรูปภาพภาระงานอื่นจากที่เก็บอาร์ติแฟกต์ของตนเองซึ่ง Primus ไม่ได้ให้สิทธิ์ พูล Workload Identity ของ Primus ได้ให้สิทธิ์เฉพาะ${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAGรูปภาพภาระงานเท่านั้น

เรียกใช้ภาระงานอีกครั้ง

เมื่อ Secundus พยายามเรียกใช้เวิร์กโหลดเดิมด้วยภาพเวิร์กโหลดใหม่นี้ ก็จะดำเนินการไม่สำเร็จ หากต้องการดูข้อผิดพลาด ให้ลบไฟล์ผลลัพธ์ต้นฉบับและอินสแตนซ์ VM แล้วลองเรียกใช้เวิร์กโหลดอีกครั้ง

โปรดตรวจสอบว่ามีการสร้างและเผยแพร่อิมเมจ Docker ใหม่ภายใต้ Artifact Registry ของ Secundus (เป็น us-docker.pkg.dev/${SECUNDUS_PROJECT_ID}/custom-image/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}) และบัญชีบริการของ Workload ($WORKLOAD_SERVICEACCOUNT) ได้ให้สิทธิ์ผู้อ่าน Artifact Registry อ่านอิมเมจ Workload ใหม่นี้ การดำเนินการนี้ช่วยให้มั่นใจว่าเวิร์กโหลดจะไม่ออกก่อนที่นโยบาย WIP ของ Primus จะปฏิเสธโทเค็นที่เวิร์กโหลดนำเสนอ

ลบไฟล์ผลลัพธ์และอินสแตนซ์ VM ที่มีอยู่

  1. ตั้งค่าโปรเจ็กต์เป็นโปรเจ็กต์ $SECUNDUS_PROJECT_ID
gcloud config set project $SECUNDUS_PROJECT_ID
  1. ลบไฟล์ผลลัพธ์
gsutil rm gs://$SECUNDUS_RESULT_STORAGE_BUCKET/result
  1. ลบอินสแตนซ์ 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

5. ล้าง

ที่นี่เป็นสคริปต์ที่ใช้ล้างทรัพยากรที่เราสร้างขึ้นเป็นส่วนหนึ่งของ Codelab นี้ ในการล้างข้อมูลนี้ ระบบจะลบทรัพยากรต่อไปนี้

  • ป้อนที่เก็บข้อมูลของ Primus ($PRIMUS_INPUT_STORAGE_BUCKET)
  • บัญชีบริการ Primus ($PRIMUS_SERVICEACCOUNT)
  • ที่เก็บอาร์ติแฟกต์ของ Primus ($PRIMUS_ARTIFACT_REPOSITORY)
  • พูล Workload Identity ของ Primus ($PRIMUS_WORKLOAD_IDENTITY_POOL)
  • บัญชีบริการเวิร์กโหลดของ Secundus ($WORKLOAD_SERVICEACCOUNT)
  • ป้อนที่เก็บข้อมูลของ Secundus ($SECUNDUS_INPUT_STORAGE_BUCKET)
  • อินสแตนซ์ Compute สำหรับภาระงาน
  • ที่เก็บข้อมูลผลลัพธ์ของ Secundus ($SECUNDUS_RESULT_STORAGE_BUCKET)
$ ./cleanup.sh

หากสำรวจเสร็จแล้ว โปรดพิจารณาลบโปรเจ็กต์

ขั้นตอนถัดไป

ลองดู Codelab ที่คล้ายกันเหล่านี้...