T
traeai
登录
返回首页
AWS Machine Learning Blog

使用 Amazon SageMaker AI 和 FHE 实现端到端加密的机器学习推理

8.5Score
使用 Amazon SageMaker AI 和 FHE 实现端到端加密的机器学习推理

TL;DR · AI 摘要

AWS 使用 Amazon SageMaker AI 和全同态加密(FHE)实现端到端加密的机器学习推理,确保数据在云中处理时始终加密。

核心要点

  • AWS 使用 concrete-ml 实现 FHE 推理,支持多种模型并兼容 scikit-learn API。
  • 通过 SageMaker AI 部署模型,可在云中进行加密推理,保护数据隐私。
  • 该方法适用于医疗、能源和电信等行业,满足隐私法规要求。

结构提纲

按章节快速跳转。

  1. 介绍机器学习推理中数据隐私的重要性及 FHE 的作用。

  2. 列举医疗、能源和电信等行业中 FHE 的实际应用价值。

  3. 说明如何使用 concrete-mlSageMaker AI 中实现 FHE 推理。

  4. 介绍训练模型、部署模型、创建客户端和发送查询的完整流程。

  5. 强调 concrete-ml 的灵活性、兼容性及对多种模型的支持。

思维导图

用一张图看清主题之间的关系。

查看大纲文本(无障碍 / 无 JS 友好)
  • 端到端加密 ML 推理
    • FHE 技术
      • 数据加密处理
      • 隐私保护
    • AWS 解决方案
      • Amazon SageMaker AI
      • concrete-ml 库
    • 应用场景
      • 医疗行业
      • 能源行业
      • 电信行业

金句 / Highlights

值得收藏与分享的关键句。

#Amazon SageMaker#FHE#机器学习#数据隐私
打开原文

使用 Amazon SageMaker AI 和 FHE 实现端到端加密的 ML 推理 | 人工智能

使用 Amazon SageMaker AI 和 FHE 实现端到端加密的 ML 推理

机器学习(ML)推理通常需要处理敏感数据,例如医疗记录、专有商业信息或个人通信。如果可以在不暴露数据给云本身的情况下在云中运行 ML 推理,会怎样?更具体地说,如果可以确保数据在整个 ML 推理过程中始终保持加密状态,会怎样?本文将向您展示如何使用 Amazon SageMaker AI 和全同态加密(FHE)来执行 ML 推理。通过使用 FHE,我们提出了一种 ML 推理方法,该方法旨在保持查询、响应和中间值的加密状态,使其对观察者(包括 SageMaker AI 本身)不可读。

FHE 是一种加密形式,它允许在不解密的情况下对加密数据进行处理。在 ML 推理场景中,您可以使用它对加密查询应用模型,从而生成加密的预测结果。以下是一些这种能力可能带来价值的场景:

  • 医疗保健:一家健康保险公司希望为医生提供一个基于诊断数据预测医疗程序结果的 ML 模型。将模型发布到云中可以简化部署,但由于隐私法规,医生无法将患者医疗信息暴露给第三方。
  • 能源行业:一家石油和天然气公司使用 ML 来评估潜在钻探地点的卫星照片,并选择需要进一步专家评估的照片。他们希望将模型托管在云中以节省成本,但不能将政治敏感地点的照片暴露给第三方。
  • 电信行业:一家电信运营商希望处理客户电子邮件以检测垃圾邮件和网络钓鱼。他们需要基于云的 ML 来实现可扩展性,但数据保护法规要求客户信息在第三方处保持加密状态。

这篇博客之前在文章《使用 Amazon SageMaker 端点启用全同态加密,实现安全、实时推理》中讨论过 ML 推理中的 FHE,但本文更进一步。之前的那篇文章展示了如何通过手动构建一个使用低级库 SEAL 的线性回归算法,从头开始实现基于 FHE 的推理。而本文则展示了一种更灵活、更高层次的方法,该方法基于 concrete-ml,这是一个专门为基于 FHE 的推理构建的高级库。它开箱即用地支持几种常见的模型类型,并且甚至与广为人知的 ML 库 scikit-learn 兼容。

在本文中,您将学习如何:

  • 使用自定义容器在 SageMaker AI 中训练 concrete-ml 模型
  • 将该模型部署到 SageMaker AI 推理端点
  • 为 concrete-ml 推理创建自定义客户端
  • 使用该客户端向推理端点发送查询

完成之后,您将拥有一个系统,该系统使用 SageMaker AI 中的 concrete-ml,旨在执行端到端加密的 ML 推理。

解决方案概述

在 SageMaker AI 中使用 concrete-ml 的工作流程如下:

  • 模型所有者准备训练数据。当所有特征都归一化到相同范围(例如 [-1, 1])时,concrete-ml 表现良好。
  • 模型所有者使用这些数据训练其模型的一个 FHE 启用版本。该模型设计用于对加密数据执行计算,而不是明文数据。
  • 模型所有者在 SageMaker AI 中托管该模型。
  • 客户端使用模型支持的同态加密(FHE)方案对查询进行加密。
  • 客户端将加密后的查询发送到云中的 FHE 启用模型。
  • 模型在 FHE 计算过程中无需解密值,即可将加密的查询转换为加密的预测结果。
  • 模型将加密的响应返回给客户端,客户端对其进行解密以获取预测结果。

这与 Amazon Web Services (AWS) Nitro System 在 Amazon Elastic Compute Cloud (Amazon EC2) 中提供的保密计算环境不同,但可以互补。在 AWS Nitro Enclaves 中,查询在提供 CPU 和内存隔离的加固、隔离环境中以明文形式解密和处理。而在 FHE 中,查询在整个过程中始终保持加密状态;安全性依赖于数学原理,而不是硬件或软件。

先决条件

要实现此解决方案,您需要:

  • 本地开发环境,已安装 Python 3.12,能够使用 pip 安装软件包,并且本地已安装 Docker 或其他容器构建软件。此外,这些说明建议您在虚拟环境中工作,但这不是严格必需的。
  • AWS 账户,包含以下内容:用于存储训练和推理容器镜像的 Amazon Elastic Container Registry (Amazon ECR) 仓库,用于存储以下内容的 Amazon Simple Storage Service (Amazon S3) 位置:模型、训练代码(如果您希望将其存储在与模型不同的存储桶中)、密钥和密文。

我们建议您遵循 Amazon S3 的安全最佳实践。

  • AWS Identity and Access Management (IAM) 中的角色,用于以下内容:模型创建者、推理端点创建者、推理端点本身、客户端。

在示例代码的仓库中,可以找到这些角色的 IAM 策略,以及用于 MNIST 手写数字数据集的示例。

在开始之前,请注意,截至撰写本文时,concrete-ml 可以从 Zama 获取,用于原型设计或非商业用途,无需付费许可证。但是,如果您打算用于商业用途,可能需要商业许可证。

训练

构建和部署训练容器

要构建训练容器:

  • 假设模型训练者角色。
  • 本地创建一个 Dockerfile.training 文件。
  • 将以下内容添加到 Dockerfile.training 中:
code
FROM python:3.12
RUN apt-get update && apt-get upgrade -y && apt-get clean
RUN apt-get -y install --no-install-recommends cmake
RUN pip install sagemaker_training==5.1.1 concrete-ml==1.9.0 concrete-python==2.10.0 torch==2.3.1

确保版本号在整个系统中匹配。concrete-ml 库要求 Python、concrete-ml 包和 concrete-python 包在整个系统中版本一致。

  • 构建容器镜像:docker build -f ./Dockerfile.training
  • 将镜像推送到 Amazon ECR:运行认证命令以使用 Docker 登录到您的 Amazon ECR 注册表:aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <account-id>.dkr.ecr.<region>.amazonaws.com 标记镜像:docker tag <image-id> <account-id>.dkr.ecr.<region>.amazonaws.com/<repo-name>:latest 推送标记的镜像:docker push <account-id>.dkr.ecr.<region>.amazonaws.com/<repo-name>:latest

验证容器是否可用

code
aws ecr describe-images --repository-name <repo-name>

你应该看到包含图像的 JSON 输出,其中 imageDigest 字段非空,并且带有最新的标签。

训练模型

要训练模型,请完成以下步骤。

注意:在这些步骤中,concrete-ml 与其他任何机器学习框架没有区别,训练容器也与其他任何自定义训练容器没有区别。请注意,训练是在明文数据上进行的。也就是说,除了归一化之外,concrete-ml 不需要对这些数据进行额外的预处理。但如果常规训练需要额外的预处理,这里仍然需要进行(并且必须在训练任务之前或作为训练任务的一部分进行)。

#### 创建训练脚本

  • 创建一个名为 training_script.py 的文件。
  • 将以下模板代码添加到 training_script.py 中:
python
import argparse
import os
import numpy
from concrete.ml.sklearn import <Model class to train>
from concrete.ml.deployment import FHEModelDev

def do_training(model_dir, train):
    # 从 train 目录加载你的数据
    # 训练你的模型实例,然后使用以下代码保存它。
    FHEModelDev(model_dir, model).save()

def model_fn(model_dir):
    # SageMaker AI 需要这个函数存在,但不会使用它
    raise NotImplementedError

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--model-dir', type=str, default=os.environ['SM_MODEL_DIR'])
    parser.add_argument('--train', type=str, default=os.environ['SM_CHANNEL_TRAINING'])
    args = parser.parse_args()
    do_training(args.model_dir, args.train)
  • 在 do_training 函数中实现数据加载逻辑。
  • 在 do_training 函数中实现模型训练逻辑。

#### 创建自定义框架

为了方便,我们建议你创建一个自定义框架,以将训练容器集成到 SageMaker AI 中。为此:

  • 创建一个名为 framework.py 的文件。
  • 将以下内容添加到 framework.py 中:
python
from sagemaker.estimator import Framework

class Concrete(Framework):
    def __init__(
        self,
        entry_point,
        source_dir=None,
        hyperparameters=None,
        py_version="py312",
        framework_version="1.9.0",
        distributions=None,
        **kwargs,
    ):
        self.image_uri = <Training container location>
        super(Concrete, self).__init__(
            entry_point,
            source_dir,
            hyperparameters,
            image_uri=self.image_uri,
            **kwargs
        )
        self.framework_version = framework_version
        self.py_version = py_version

    def training_image_uri(self, region=None):
        return self.image_uri

    def create_model(
        self,
        model_server_workers=None,
        role=None,
        vpc_config_override=None,
        entry_point=None,
        source_dir=None,
        dependencies=None,
        image_name=None,
        **kwargs,
    ):
        return None
  • 使用你的 Amazon ECR 训练容器位置更新 image_uri 的值。

#### 启动训练任务

本节将展示如何使用 Python 脚本启动训练任务,但也可以通过控制台或 AWS 命令行界面(AWS CLI)完成该操作。(注意:训练任务会根据实例类型和持续时间产生费用。)

  • 为 Python 3.12 创建一个虚拟环境。
  • 激活虚拟环境。
  • 使用 pip 安装以下包:
bash
boto3==1.37.38
sagemaker==2.243.2
  • 创建一个名为 start_training.py 的文件。
  • 将以下内容添加到 start_training.py 中:from sagemaker import session from framework import Concrete sagemaker_session = session.Session() concrete = Concrete( entry_point="training_script.py", instance_count=1, instance_type="ml.m5.xlarge", # 对于小型模型使用 ml.m5.xlarge,对于大型模型使用 ml.m5.4xlarge role="arn:aws:iam::123456789012:role/SageMakerModelTrainerRole", # 使用 Prerequisites 中的 model-trainer 角色 ARN sagemaker_session=sagemaker_session, hyperparameters={}, output_path="s3://my-model-bucket/concrete-ml/models/", # 使用 Prerequisites 中的模型存储桶 code_location="s3://my-model-bucket/concrete-ml/scripts/", # 用于训练脚本存储的 S3 路径 ) concrete.fit(inputs=<Amazon S3 数据位置>)
  • 用您特定的配置更新 instance_type、role、output_path、code_location 和 inputs 的值。
  • 执行此文件:python start_training.py
  • 通过检查训练作业状态来验证训练是否成功完成:aws sagemaker describe-training-job --training-job-name <job-name> 查找 TrainingJobStatus: Completed。然后验证输出文件是否存在:aws s3 ls s3://my-model-bucket/concrete-ml/models/ 确认 server.zip 和 client.zip 是否存在。

训练完成后,训练容器会将两个文件保存到模型存储桶中:server.zip(用于推理端点)和 client.zip(用于客户端加密查询)。

推理

构建并部署推理容器

基于 FHE 的 ML 推理将比标准 ML 推理更复杂,因为有一些新的技术限制:

  • 客户端需要从 client.zip 获取模型特定信息以生成加密密钥。
  • FHE 密文可能超过 SageMaker AI 查询大小限制,因此客户端和服务端需要在 SageMaker AI API 调用之外进行通信。
  • FHE 评估可能比 SageMaker AI 超时时间更长,因此推理将使用 SageMaker AI 的异步推理机制。
  • 端点需要从客户端获取评估密钥(一种公钥)以执行 FHE 评估。

为了满足这些新要求并简化用户的体验,我们将向您展示如何构建一个系统,其中:

  • 自定义客户端加密查询并将其附加评估密钥
  • 自定义训练端点在需要时检索 client.zip,并使用它来评估 FHE 模型
  • 同样的自定义客户端从训练端点解密预测结果
  • 客户端和端点使用 Amazon S3 相互通信密文和密钥

要部署并使用此系统,请完成以下部分。

#### 编写你的预测器

创建一个名为 predictor.py 的文件,内容如下。

code
from flask import Flask
import flask
import logging
import json
from concrete.ml.deployment import FHEModelServer
from sagemaker.s3 import S3Uploader, S3Downloader

# 加载模型
try:
    model = FHEModelServer("/opt/ml/model/")
except Exception:
    logging.exception("初始化 FHEModelServer 失败")
    raise

app = Flask(__name__)

@app.route('/ping', methods=['GET'])
def ping():
    return flask.Response(response='\n', status=200, mimetype='application/json')
python
@app.route('/invocations', methods=['POST'])
def transformation():
    try:
        input_json = flask.request.get_json()
        if not input_json or not isinstance(input_json, dict):
            return flask.Response(
                response=json.dumps({"error": "Invalid JSON"}),
                status=400,
                mimetype="application/json",
            )
        required_keys = [
            "evaluation_keys_uri",
            "encrypted_query_uri",
        ]
        for key in required_keys:
            if key not in input_json:
                return flask.Response(response=f'Missing required field: {key}',
                                      status=400)
            if (not isinstance(input_json[key], str)
                    or not input_json[key].startswith('s3://')):
                return flask.Response(response=f'Invalid Amazon S3 URI for {key}', status=400)
        evaluation_keys_uri = input_json["evaluation_keys_uri"]
        encrypted_query_uri = input_json["encrypted_query_uri"]
        downloader = S3Downloader()
        try:
            evaluation_keys = downloader.read_bytes(evaluation_keys_uri)
            encrypted_query = downloader.read_bytes(encrypted_query_uri)
        except Exception as e:
            logging.error(f"Failed to download from S3: {e}")
            return flask.Response(response='Failed to retrieve data from Amazon S3',
                                  status=500)
        prediction = model.run(encrypted_query, evaluation_keys)
        return flask.Response(
            response=prediction, status=200, mimetype="application/octet-stream"
        )
    except KeyError as e:
        return flask.Response(
            response=json.dumps({"error": f"Missing key: {str(e)}"}),
            status=400,
            mimetype="application/json",
        )
    except Exception as e:
        return flask.Response(
            response=json.dumps({"error": "Internal server error"}),
            status=500,
            mimetype="application/json",
        )

该预测器期望“query”包含三个 Amazon S3 位置:两个用于查找加密查询及其关联的评估密钥,还有一个用于写入预测结果。它会下载查询和密钥,在它们上执行 FHE 模型的评估,并将预测结果写回 Amazon S3。

#### 将预测器打包成容器

要将此预测器打包成容器:

  • 假扮成 endpoint-creator 角色。
  • 为容器文件创建一个新目录。
  • 将 predictor.py 复制到新目录中。
  • 通过从示例仓库下载或从 SageMaker AI 自定义推理容器文档中复制,获取所需的样板文件(nginx.conf、serve 和 wsgi.py)。(注意:后者需要在 nginx.conf 中增加超时值,以允许 FHE 评估完成。)
  • 在该目录中创建 Dockerfile.inference。
  • 将以下内容添加到 Dockerfile.inference 文件中:
Dockerfile
  FROM python:3.12
  RUN apt-get -y update && apt-get install -y --no-install-recommends \
      nginx \
      ca-certificates \
      cmake \
      && rm -rf /var/lib/apt/lists/*
  RUN pip install flask gevent gunicorn sagemaker sagemaker_training==5.1.1 concrete-ml==1.9.0 concrete-python==2.10.0
  RUN rm -rf /root/.cache
  # 设置环境变量
  ENV PYTHONUNBUFFERED=TRUE
  ENV PYTHONDONTWRITEBYTECODE=TRUE
  ENV PATH="/opt/program:${PATH}"
  COPY <包含容器文件的目录>/ /opt/program
  RUN chmod +x /opt/program/serve
  WORKDIR /opt/program
  • 构建容器镜像:
bash
  docker build -f ./Dockerfile.inference
  • 将镜像推送到 Amazon ECR。运行认证命令以登录到 Amazon ECR 注册表:
bash
  aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <account-id>.dkr.ecr.<region>.amazonaws.com

使用仓库名称标记镜像:

bash
  docker tag <image-id> <account-id>.dkr.ecr.<region>.amazonaws.com/<repo-name>:latest

推送标记的镜像:

bash
  docker push <account-id>.dkr.ecr.<region>.amazonaws.com/<repo-name>:latest

验证容器是否可用:

bash
  aws ecr describe-images --repository-name <repo-name>

你应该看到包含你的镜像的 JSON 输出,其中 imageDigest 字段非空,并带有 latest 标签。

#### 部署推理端点

(重要:端点在删除之前会产生持续费用,费用会根据实例类型、训练时长和端点运行时间而变化。有关详细定价信息,请参阅 Amazon SageMaker AI 定价。使用完毕后请记得删除端点以避免不必要的费用。)继续使用端点创建者角色:

  • 创建一个虚拟环境。
  • 激活这个虚拟环境。
  • 使用 pip 安装以下包:
bash
  pip install boto3==1.37.38 sagemaker==2.243.2
  • 创建一个名为 start_inference_endpoint.py 的文件,内容如下:
python
  from sagemaker.session import Session
  from sagemaker.model import Model
  from sagemaker.predictor import Predictor
  from sagemaker.async_inference.async_inference_config import AsyncInferenceConfig

  sagemaker_session = Session()
  model = Model(
      image_uri="123456789012.dkr.ecr.us-east-1.amazonaws.com/concrete-inference:latest",  # 使用前面构建步骤中的 ECR URI
      model_data="s3://my-model-bucket/concrete-ml/models/model.tar.gz",  # 训练作业保存模型的路径
      role="arn:aws:iam::123456789012:role/SageMakerEndpointRole",  # 使用 Prerequisites 中的端点角色 ARN
      sagemaker_session=sagemaker_session,
      predictor_cls=Predictor,
  )
  async_config = AsyncInferenceConfig(
      max_concurrent_invocations_per_instance=1,
      output_path=<Amazon S3 存放结果密文的位置>,
      failure_path=<Amazon S3 存放推理失败的位置>,
  )
  endpoint = model.deploy(
      initial_instance_count=1,  # 测试时从 1 个实例开始
      instance_type="ml.m5.xlarge",  # FHE 的最低推荐;使用 ml.m5.24xlarge 以获得更好的性能
      wait=True,
      endpoint_logging=True,
      async_inference_config=async_config,
  )
  print(f"Endpoint name: {endpoint.endpoint_name}")
  • 执行脚本:
bash
  python start_inference_endpoint.py
  • 验证端点是否已上线:
bash
  aws sagemaker describe-endpoint --endpoint-name <endpoint-name>

等待直到 EndpointStatus 显示 InService 后再继续。这可能需要几分钟时间。

脚本将打印出端点的名称。请将此名称记录下来供客户端使用。

创建客户端

用户在使用您的系统时,不需要了解任何关于同态加密(FHE)的知识。因此,客户端将隐藏所有与 FHE 相关的细节。具体来说,客户端将执行以下操作:

  • 从 Amazon S3 下载 client.zip 文件。
  • 使用 client.zip 生成密钥。
  • 使用这些密钥对查询进行加密。
  • 将加密后的查询和相关的评估密钥写入 Amazon S3。
  • 将这些位置发送到推理端点,并接收加密预测的 Amazon S3 位置。
  • 下载加密的预测结果并进行解密。

要创建这个客户端:

  • 创建一个名为 client.py 的文件。
  • 将以下模板代码添加到 client.py 中:
python
import tempfile
import tarfile
import os
import json
import sagemaker
from sagemaker.s3 import S3Uploader, S3Downloader
from sagemaker.base_deserializers import BytesDeserializer
from sagemaker.base_serializers import JSONSerializer
from sagemaker.predictor import Predictor
from sagemaker.predictor_async import AsyncPredictor
from sagemaker.async_inference.waiter_config import WaiterConfig
from concrete.ml.deployment import FHEModelClient

sagemaker_session = sagemaker.Session()

predictor = AsyncPredictor(
    Predictor(
        <name of the endpoint created above>,
        serializer=JSONSerializer(),
        deserializer=BytesDeserializer(),
        sagemaker_session=sagemaker_session,
    )
)

model_location = <model Amazon S3 location>

def get_query():
    # 返回需要加密的查询的代码
    ...

# 下载并提取客户端配置
with tempfile.TemporaryDirectory() as config_dir_name:
    try:
        S3Downloader().download(
            model_location,
            local_path=config_dir_name,
            sagemaker_session=sagemaker_session,
        )
        tf = tarfile.open(os.path.join(config_dir_name, "model.tar.gz"), mode="r:gz")
        tf.extract("client.zip", config_dir_name)
    except FileNotFoundError as e:
        <handle exception>
    except tarfile.TarError as e:
        <handle exception>
    except Exception as e:
        <handle exception>

with tempfile.TemporaryDirectory() as key_dir_name:
    concrete_client = FHEModelClient(config_dir_name, key_dir=key_dir_name)

    # 生成并上传评估密钥
    eval_keys_location = <eval keys Amazon S3 location>
    concrete_client.generate_private_and_evaluation_keys()
    eval_keys = concrete_client.get_serialized_evaluation_keys()
    uploader = S3Uploader()
    uploader.upload_bytes(
        eval_keys,
        eval_keys_location,
        sagemaker_session=sagemaker_session
    )

    # 加密并上传查询
    encrypted_query_location = <Amazon S3 location for encrypted query>
    plaintext_query = get_query()
    encrypted_query = concrete_client.quantize_encrypt_serialize(plaintext_query)
    uploader.upload_bytes(
        encrypted_query,
        encrypted_query_location,
        sagemaker_session=sagemaker_session
    )

    # 向端点发送请求
    query = {
        'evaluation_keys_uri': eval_keys_location,
        'encrypted_query_uri': encrypted_query_location,
    }
    query_json = json.dumps(query)
    try:
        async_response = predictor.predict_async(
            data=query_json,
            input_path="<Amazon S3 location for the async query>",
            initial_args={"ContentType": "application/json"},
        )
        # 等待端点返回结果
        encrypted_result = async_response.get_result(
            waiter_config=WaiterConfig("<configuration values of your choice>")
        )
        prediction = concrete_client.deserialize_decrypt(encrypted_result)
    except TimeoutError as e:
        <handle exception>
    except Exception as e:
        <handle exception>
  • 实现 get_query() 函数以获取您的明文查询。
  • 更新 Amazon S3 路径、端点名称和模型位置的占位符值。
  • 为占位符 <handle exception> 块添加异常处理代码,根据应用程序需求处理 TimeoutError、FileNotFoundError 和 TarError。

(你可能已经注意到客户端和端点对加密查询和响应的处理方式不同。客户端通过手动将加密查询写入 Amazon S3 并提交 Amazon S3 的位置作为实际查询,向端点发送加密查询。端点则直接提交加密结果,允许 SageMaker AI 处理写入和从 Amazon S3 读取的操作。为什么会有这种差异?加密的响应是一个单一的字节字符串,SageMaker AI 可以自然处理。然而,客户端的查询是一个 JSON 结构,必须包含评估密钥的位置。加密的查询需要进行编码(例如使用 Base64)才能嵌入到同一个 JSON 中,这会增加不必要的处理和网络时间。因此,示例代码通过自行处理加密查询,跳过了这个编码步骤。)

然后:

  • 安装所需的包:boto3==1.37.38 sagemaker==2.243.2 concrete-ml==1.9.0 concrete-python==2.10.0

最后:

  • 假设客户端角色。
  • 执行此脚本:python client.py
  • 通过将预测输出与预期结果进行比较,验证 FHE 加密是否正常工作。

清理资源

为了避免产生未来的费用,请删除你创建的资源:

  • 通过 SageMaker AI 控制台或 SDK 删除推理端点。
  • 验证端点是否已删除:aws sagemaker describe-endpoint --endpoint-name <endpoint_name> 这应该返回一个错误,表明端点不存在。
  • 通过 SageMaker AI 控制台或 SDK 删除端点配置。
  • 验证端点配置是否已删除:aws sagemaker list-endpoint-configs 这应该显示没有匹配的端点配置。
  • 通过 SageMaker AI 控制台或 SDK 删除 SageMaker AI 模型。
  • 验证模型是否已删除:aws sagemaker list-models 这应该显示没有匹配的模型。
  • 通过 Amazon S3 控制台或 AWS CLI 从 Amazon S3 删除模型工件、加密查询、加密响应和评估密钥。
  • 验证 Amazon S3 对象是否已删除:aws s3 ls s3://<bucket-name>/ 这应该显示为空或没有匹配的对象。
  • 通过 Amazon ECR 控制台或 AWS CLI 从 Amazon ECR 删除容器镜像。
  • 验证容器镜像是否已删除:aws ecr describe-images --repository-name <repo-name> 这应该显示没有匹配的镜像。

常见问题

  • 推理过程中出现 TimeoutError:增加 WaiterConfig 的 max_attempts 或使用更大的实例类型。
  • 出现 AccessDenied 错误:验证 IAM 角色是否具有正确的 S3 和 SageMaker AI 权限。
  • 容器构建失败:验证 Docker 是否具有足够的内存(超过 8 GB)。
  • 推理过程中出现服务器错误:验证 concrete-ml 包之间的版本一致性。

FHE 提供了加密保护,但也会带来性能上的权衡。开销取决于模型,但通常可以预期与明文推理相比,推理速度会减慢多达 100,000 倍。你可以通过几种方式减少这种减慢。第一种是增加实例中的 vCPU 数量。另一种是使用一种标准的机器学习技术,称为“量化”,它减少了模型推理中使用的数值精度。由于 concrete-ml 的运行时间随着数值精度的增加而增加,因此量化在此处对性能的提升可能比在常规机器学习推理中更大。量化可能会降低模型的准确性,而这种准确性不会受到转换为 FHE 的影响。然而,在模型代码中使用量化可以将开销降低到 2800 倍(在 ml.m5.xlarge 实例上,从 67 毫秒到 187 秒),且没有可观察到的准确性损失。通过增加 vCPU 的数量,可以进一步将开销降低到 500 倍(在 ml.m5.24xlarge 实例上,耗时 46 秒)。

对于某些应用来说,这仍然是一个显著的延迟。由于这种开销,FHE 目前还不适合用于交互式或对延迟敏感的应用。然而,它对于异步或批量处理的工作负载可能是实用的,其中隐私需求超过了延迟问题。例如,考虑本文开头提到的使用案例:

  • 为医生提供一个基于诊断数据预测医疗程序结果的机器学习模型。
  • 评估潜在的石油/天然气钻探地点的卫星照片,以选择需要进一步专家评估的照片。
  • 检测电子邮件中的垃圾邮件和网络钓鱼。

这些使用案例都可以容忍几秒钟额外的延迟。

客户需要确保解密的查询和预测保持机密,因为 concrete-ml 的加密和其明文解密(当结合使用时)可能会泄露有关密钥的信息。此外,需要注意的是,该系统不会保护模型的机密性。查询和响应将被加密,并对 SageMaker AI 不可见,但 concrete-ml 本身不会对模型进行加密。模型可能仍然对 SageMaker AI 可见。它也可能受到那些能够看到明文查询和响应的人的“模型窃取”攻击。最后,concrete-ml 不提供电路隐私:通过密文可能泄露有关模型的信息。然而,客户仍然可以使用 AWS 为 Amazon S3 和 SageMaker AI 提供的标准安全机制来保护模型和密文。请记住:安全责任是 AWS 和每个客户共同承担的。遵循最佳实践,客户应:

  • 在创建 IAM 角色时遵循最小权限原则。为每个角色仅授予其执行其功能所需的最低权限。查看仓库中的示例 IAM 策略,并根据您的具体使用案例调整资源 ARN 和操作。
  • 对非 FHE 密文的值启用 Amazon S3 存储桶加密。这包括启用所有存储模型、数据和评估密钥的 Amazon S3 存储桶的默认加密,以保护静态数据。
  • 将 Amazon S3 存储桶权限减少到系统所需的最低权限。

您可以在 SageMaker AI 中使用基于 FHE 的工具,对设计为在整个过程中保持不可读的加密数据执行推理。这种方法可以为您提供 SageMaker AI 的优势——灵活性、可扩展性和托管基础设施,同时帮助您从查询到响应的整个过程中保持加密保护。

若想了解更多关于 AWS 安全性和加密的信息,请参考以下资源:

  • AWS 为客户提供哪些加密服务?
  • AWS 加密工具文档
  • AWS 上的加密计算
  • 全同态加密概述
  • 使用 Amazon SageMaker 端点启用全同态加密,实现安全的实时推理
  • Amazon S3 中的安全性
  • Amazon Elastic Container Service 中的安全性
  • 配置 Amazon SageMaker AI 中的安全性
  • IAM 中的安全最佳实践

如有问题或意见,请通过 aws-crypto-compute@amazon.com 与我们联系。

作者简介

'\"

AI 可能会生成不准确的信息,请核实重要内容