经常使用Concrete ML确保模型训练和推理的端到端隐衷
经常使用Concrete ML确保模型训练和推理的端到端隐衷
译文 精选 作者: 布加迪 本文引见了经常使用齐全同态加密(FHE)为scikit-learn联结训练模型和加密推理确保端到端隐衷。在云计算和基于机器学习的服务万无一失的时代,隐衷是一大应战。将端到端隐衷参与到单干式机器学习用例听起来像是一项艰难的义务。幸亏,诸如齐全同态加密(FHE)之类的明码学打破提供了处置方案。Zama的新演示展现了如何应用开源机器学习工具经常使用联结学习和FHE来参与端到端隐衷。这篇博文解释了这番演示的底层上班机理,结合了scikit-learn、联结学习和FHE。
FHE这种技术使运行程序提供方能够构建基于云的运行程序以包全用户隐衷,而Concrete ML这种机器学习工具包可以让模型改而经常使用FHE。Concrete ML应用了scikit-learn中弱小持重的模型训练算法来训练与FHE兼容的模型,无需任何明码学常识。
Concrete ML经常使用scikit-learn作为构建与FHE兼容的模型的基础,这是由于scikit-learn领有杰出的易用性、可裁减性、强健性以及用于构建、验证和调整数据管道的泛滥工具。只管深度学习在非结构化数据上体现良好,但它通常须要超参数调优才干到达高精度。在许多用例中,特意是针对结构化数据,scikit-learn仰仗其训练算法的持重性体现杰出。
本地训练模型,并安保地部署
当数据迷信家领有一切训练数据时,训练很安保,由于没有数据分开机器,并且在部署模型时只要要确保推理安保。但是,用FHE包全的推理的训练模型对模型训练实施了必定的限度。只管过去经常使用FHE须要明码学专业常识,但像Concrete ML这样的工具将明码学这局部屏蔽起来,使数据迷信家可以享受FHE。此外,FHE参与了计算开支,这象征着机器学习模型或许须要针对准确性和运转时提前启动调整。Concrete ML经常使用scikit-learn适用程序类(比如GridSearchCV)充沛应用参数搜查,从而使这种调整变得很容易。
若经常使用Concrete ML本地训练模型,语法对scikit-learn来说一样,可以在 视频 教程中找到解释。假设是MNIST上的逻辑回归模型,只要运转以下代码片段:
from sklearn.datasets import fetch_openmlfrom sklearn.model_selection import train_test_splitmnist_dataset = fetch_openml("mnist_784")x_train, x_test, y_train, y_test = train_test_split(mnist_dataset.data,mnist_dataset.target.astype("int"),test_size=10000,)
接上去,拟合Concrete ML逻辑回归模型,该模型是scikit-learn等效模型的暂时代替品。只要要一个额外的步骤:编译,就可以生成对加密数据口头推理的FHE计算电路。编译由Concrete实现,它是将程序变成FHE等效程序的环节,间接处置加密后的数据。
from concrete.ml.sklearn.linear_model import LogisticRegressionmodel = LogisticRegression(penalty="l2")model.fit(X=x_train, y=y_train)model.compile(x_train)
如今测试模型针对加密数据口头时的准确性。该模型的准确率约为92%。与scikit-learn一样,Concrete ML支持其余许多线性模型,比如SVM、Lasso和ElasticNet,你经过方便地更改模型类就可以经常使用它们。此外,还支持等效scikit-learn模型的一切超参数(如上方代码片段中的penalty)。
from sklearn.metrics import accuracy_scorey_preds_clear = model.predict(x_test, fhe="execute")print(f"The test accuracy of the model on encrypted>
用于训练数据隐衷的联结学习
通常,在有许多用户的消费系统中,机器学习模型须要针对一切用户数据的汇合启动训练,同时保管每个用户的隐衷。这种场景下的经常出现用例包含数字肥壮、渣滓邮件检测、在线广告,甚至更方便的用例,比如下一个单词预测辅佐。
Concrete ML可以导入由等工具经常使用联结学习(FL)训练的模型。要经常使用FL训练与上述相反的模型,必定定义一个客户端运行程序和主机运行程序。首先,客户端由partition_id标识,partition_id是一个介于0和客户端数量之间的数字。要宰割MNIST数据集并取得客户端的切片,应经常使用Flower federated_utils软件包。
(X_train, y_train) = federated_utils.partition(X_train, y_train, 10)[partition_id]
如今定义训练客户端逻辑:
import flwr as flfrom sklearn.linear_model import LogisticRegression# Create LogisticRegression Modelmodel = LogisticRegression(penalty="l2",warm_start=True,# prevent refreshing weights when fitting)federated_utils.set_initial_params(model)class MnistClient(fl.client.NumPyClient):def get_parameters(self, config):# type: ignorereturn federated_utils.get_model_parameters(model)def fit(self, parameters, config):# type: ignorefederated_utils.set_model_params(model, parameters)model.fit(X_train, y_train)print(f"Training finished for round {config['server_round']}")return federated_utils.get_model_parameters(model), len(X_train), {}def evaluate(self, parameters, config):# type: ignorefederated_utils.set_model_params(model, parameters)loss = log_loss(y_test, model.predict_proba(X_test))accuracy = model.score(X_test, y_test)return loss, len(X_test), {"accuracy": accuracy}# Start Flower clientfl.client.start_numpy_client(server_address="0.0.0.0:8080",client=MnistClient())
最后,必定创立一个典型的Flower主机实例:
model = LogisticRegression()federated_utils.set_initial_params(model)strategy = fl.server.strategy.FedAvg()fl.server.start_server(server_address="0.0.0.0:8080",strategy=strategy,config=fl.server.ServerConfig(num_rounds=5),)
训练中止后,客户端或主机可以将模型存储到文件中:
with open("model.pkl", "wb") as file:pickle.dump(model, file)
一旦模型获取训练,就可以从pickle文件中加载它,并将其转换成Concrete ML模型,以启用包全隐衷的推理。实践上,Concrete ML既可以训练新模型(如上文所示),也可以转换现有模型(比如FL创立的模型)。经常使用from_sklearn_model函数的这个转换步骤在上方用于经常使用联结学习训练的模型上。该 视频 进一步解释了如何经常使用该函数。
with path_to_model.open("rb") as file:sklearn_model = pickle.load(file)compile_set = numpy.random.randint(0, 255, (100, 784)).astype(float)sklearn_model.classes_ = sklearn_model.classes_.astype(int)from concrete.ml.sklearn.linear_model import LogisticRegressionmodel = LogisticRegression.from_sklearn_model(sklearn_model, compile_set)model.compile(compile_set)
至于本地训练,经常使用一些测试数据评价该模型:
from sklearn.metrics import accuracy_scorey_preds_enc = model.predict(x_test, fhe="execute")print(f"The test accuracy of the model on encrypted>
总之,经常使用scikit-learn、Flower和Concrete ML,只要要几行代码,就可以以齐全包全隐衷的形式训练模型并预测新数据:数据集片段是隐秘的,预测针对加密数据口头。这里训练的模型针对加密数据口头时到达了92%的准确率。
论断
上方讨论了基于Flower和Concrete ML的完整端到端专有训练演示的最关键步骤。你可以在咱们的开源代码存储库中找到 一切源代码 。与scikit-learn兼容使Concrete ML的用户能够经常使用相熟的编程形式,并便于与scikit-learn兼容的工具包(比如Flower)兼容。本文中的示例仅对原始scikit-learn管道启动了一些更改,标明了如何经常使用联结学习和FHE为经常使用MNIST训练分类器削减端到端隐衷。
原文题目:End-to-end privacy for model training and inference with Concrete ML。