【隐私计算】tf-encrypted隐私计算框架/库基础

tf-encrypted介绍

在这里插入图片描述

TF Encrypted是TensorFlow中一个用于加密机器学习的框架,它看起来和感觉上都很像TensorFlow,利用了Keras API 的易用性,同时通过安全多方计算和同态加密实现了对加密数据的训练和预测。TF Encrypted的目标是使保护隐私的机器学习变得可用,而不需要密码学、分布式系统或高性能计算方面的专业知识。
同时,现在TF Encrypted已经完全支持tensorflow2,使代码更加清晰明了。

tf-encrypted隐私计算库的安装

tf-encrypted最直接的安装方式:

pip install tf-encrypted

但是这个方式已经不能用了,会出现报错,比如:

'NoneType' object has no attribute 'secure_seed'

取而代之的方式是直接git clone这个仓库,流程如下:

安装python版本为3.8的conda环境

conda create -n tfe python=3.8

激活环境

conda activate tfe

下载tf-encrypted仓库

git clone https://github.com/tf-encrypted/tf-encrypted.git

进入tf-encrypted仓库

cd tf-encrypted

安装所需依赖包

pip install -e .

需要注意:tensorflow版本必须>=2.9.1,否则可能出现如下报错:

ImportError: cannot import name 'glob_stateful_parallelism' from 'tensorflow.python.ops.while_v2'

编译tf-encrypted仓库

make build

执行后会先下载一个压缩包,如果执行太慢,可以尝试手动执行下载:

curl -ol https://github.com/jedisct1/libsodium/archive/1.0.17.tar.gz

编译到最后可能出现如下问题:
在这里插入图片描述
原因就是系统中g++的版本过低,需要升级,以至少支持g++14版本。

tf-encrypted使用示例

加载tf-encrypted库
由于此时我们没有在Python环境中安装tf-encrypted,因此需要手动载入这个库:

sys.path.append('/home/zwx/tf-encrypted')
import tf_encrypted as tfe

官网提供的矩阵乘法示例

import tensorflow as tf
import sys
sys.path.append('/home/zwx/tf-encrypted')
import tf_encrypted as tfe@tfe.local_computation('input-provider')
def provide_input():# normal TensorFlow operations can be run locally# as part of defining a private input, in this# case on the machine of the input providerreturn tf.ones(shape=(2, 5))# provide inputs
w = tfe.define_private_variable(tf.ones(shape=(5, 3)))
print('w:', w)
print('w_plaintext:', w.reveal(), '\n', w.reveal().to_native())
x = provide_input()
print('x:', x)
print('x_plaintext:', x.reveal(), '\n', x.reveal().to_native())# eager execution
y = tfe.matmul(x, w)
res = y.reveal().to_native()# build graph and run graph
@tfe.function
def matmul_func(x, w):y = tfe.matmul(x, w)print('y_ciphertext:', y)return y.reveal().to_native()res = matmul_func(x, w)
print('res:\n', res)

在这里插入图片描述

代码重点:

  • 使用修饰器@tfe.local_computation(‘input-provider’)将输入封装成private类型
  • 使用tfe.define_private_variable()定义private类型的变量
  • 对于private类型的x,使用x.reveal()将其解密得到public类型数据,使用x.reveal().to_native()可以提取具体的明文值
  • 当直接打印private类型的数据时,share_type中显示了秘密分享的类型,比如上图中的arithmetic,即算术秘密分享
  • 现在tf-encrypted均基于tensorflow2,无需考虑和tensorflow1不兼容的问题

官网提供的简单神经网络示例

import tensorflow as tf
import sys
sys.path.append('/home/zwx/tf-encrypted')
import tf_encrypted as tfe@tfe.local_computation('prediction-client')
def provide_input():# normal TensorFlow operations can be run locally# as part of defining a private input, in this# case on the machine of the input providerreturn tf.ones(shape=(5, 10))x = provide_input()model = tfe.keras.Sequential([tfe.keras.layers.Dense(512, batch_input_shape=x.shape),tfe.keras.layers.Activation('relu'),tfe.keras.layers.Dense(10),
])# get prediction input from client
logits = model(x)result = logits.reveal()
print('result:', result, '\n', result.to_native())

在这里插入图片描述

神经网络推理

在/examples/benchmark/inference文件中给出了隐私推理的示例。
首先进入tf-encrypted的根目录下(因为跑推理的脚本里需要tf_encrypted.player):

cd /tf-encrypted

然后执行命令跑基于协议的模型推理:

./examples/benchmark/inference/run-remote.sh resnet50  --protocol ABY3 --config ./examples/benchmark/inference/config.json

注意路径要正确,不然是跑不通的!
参数选择:

model_name: resnet50, densenet121, vgg19
protocol: ABY3, Pond, SecureNN
precision: 64-bit by default (可以改成high使用128-bit)
config: IP的配置(感觉暂时不用管)

执行命令,可以得到这6个文件:

在这里插入图片描述

不过,可能会遇到如下的报错:

attr {key: "explicit_paddings"value {list {}}
}
raise ValueError(
ValueError: Could not infer attribute explicit_paddings type from empty iterator

不用着急,这个问题是框架在转tf模型时出现的onnx库错误,通过查阅tensorflow-onnx官方文档,知道了这个问题的原因是onnx版本过高的问题。

在这里插入图片描述

解决方案:将onnx版本降级到1.14.1即可:pip install onnx==1.14.1

再次执行推理命令,可以在log_master.txt中看到如下的输出日志信息:

在这里插入图片描述

从这个日志文件中能得到什么信息?

  • Plain model predcited和predicted中各个类别的概率分布是接近的
  • 应该能分别看出构建graph和推理的时间(暂时还不太清楚怎么看)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/277656.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL DQL

目录 一、DQL概述 二、基础查询 三、条件查询 四、聚合查询 五、分组查询 六、排序查询 七、分页查询 八、其它测试 九、执行顺序 一、DQL概述 DQL英文全称是Data Query Language(数据查询语言),数据查询语言,用来查询数据库中表的记录。查询关…

10. 从零用Rust编写正反向代理, HTTP内网穿透支持修改头信息

wmproxy wmproxy是由Rust编写,已实现http/https代理,socks5代理, 反向代理,静态文件服务器,内网穿透,配置热更新等, 后续将实现websocket代理等,同时会将实现过程分享出来&#xff…

Linux 常用命令----mktemp 命令

文章目录 基本用法实例演示高级用法注意事项 mktemp 命令用于创建一个临时文件或目录,这在需要处理临时数据或进行安全性测试时非常有用。使用 mktemp 可以保证文件名的唯一性,避免因文件名冲突而导致的问题。 基本用法 创建临时文件: 命令 mktemp 默认…

微软microsoft推出了最新的小型但强大的开源语言AI模型Phi-2

微软推出了最新的小型开源语言模型 Phi-2。该模型只有 27 亿个参数,却能超过比它大 25 倍的模型的性能。Phi-2 是微软 Phi 项目的一部分,旨在制作小而强大的语言模型。该项目包括 13 亿参数的 Phi-1,据称在 Python 编码方面实现了最先进的性能…

Linux(22):X Window 设定介绍

X Window System X Window System 是个非常大的架构,他还用到网络功能。也就是说,其实 X 窗口系统是能够跨网络与跨操作系统平台的。 X Window系统最早是由 MIT (Massachusetts Institute of Technology,麻省理工学院) 在1984年发展出来的&…

Tomcat的结构分析和请求处理原理解析

目录 Tomcat服务器?Tomcat结构处理请求流程Tomcat作用其他的web服务器 Tomcat服务器? 我们经常开口闭口“服务器”、“服务器”的,其实“服务器”是个很容易引发歧义的概念 其实,Tomcat服务器 Web服务器 Servlet/JSP容器&#…

安路IP核应用举例(OSC、UART)

1.OSC(内部振荡器) 按照Project->New Project顺序新建工程后,后按照Tools->IP Generator顺序,创建IP核,如下图: 安路FPGA的内置OSC振荡模块频率可选30MHz、60MHz。 可选Verilog或VHDL语言。 如图,生成的.v文件只…

怎么把文件转成附件放在公众号里?这篇教程给你详细说清楚

文件转附件,其实就是把文件上传到某个网站,获得文件的下载链接,从而放到文章或者其他地方供读者下载使用。因为公众号并不支持直接在文章里面添加下载链接(至少订阅号不行),所以把文件转成下载链接的方式并…

HPM6750系列--总章

本栏目介绍先楫半导体出品的HPM6750芯片(基于HPM6750evkmini开发板) ​​​​​​​ 内容概述 HPM6750系列--第一篇 初识HPM6750 介绍HPM6750芯片信息,包括主频、内存、外设配置,并列举了各种开发工具和开发资源。 HPM6750系列--…

异地现场工控设备,如何实现远程配置、调试?

南京某企业专注于工业物联领域,在相关项目中往往会在各个点位部署基于Linux系统的中控主机,实现各类物联设备信息的采集、汇总。但是,由于各点位分散多地,且数量达到了上百个,虽然中控主机具备4G物联网接入能力&#x…

Qt容器QMdiArea 小部件提供一个显示 MDI 窗口的区域

## QMdiArea ## 控件简介 QMdiArea 继承 QAbstractScrollArea。QMdiArea 小部件提供一个显示 MDI 窗口的区域。QMdiArea的功能本质上类似于MDI窗口的窗口管理器。大多数复杂的程序,都使用MDI框架,在 Qt designer 中可以直接将控件 MDI Area 拖入使用。 ## 用法示例 例 qm…

利用有限制通配符来提升API的灵活性

在Java中,有限制通配符(bounded wildcard)允许你在泛型中指定一个范围,从而提升API的灵活性。通配符使得你能够编写更通用、适用于多种类型的代码。以下是一个利用有限制通配符提升API灵活性的例子: 假设有一个简单的…