《隐语入门基础教程》-学习笔记2

线树图集 2025-05-26 11:44:07

一、SecretFlow 简介与运行要求

(一)简介

SecretFlow 是一款隐私保护计算框架,用于实现数据的密态计算和共享,广泛应用于金融、医疗等领域,确保数据在流通和计算过程中的隐私安全。

(二)运行要求

  • Python 版本 :≥3.8。
  • 操作系统 :支持 CentOS 7、Anolis8、Ubuntu 18.04/20.04、macOS 11.1 +、WSL2。
  • 资源要求 :≥8 核 16GB。

二、安装包及安装方式

(一)安装包

  • secretflow :包含 SecretFlow 所有的 requirements,体积较大。
  • secretflow-lite :仅包含基础功能,不包含深度学习等依赖库,体积较小。

(二)安装方式

  • 方式一:docker 镜像
    • 可通过 Docker Hub 或阿里云获取镜像。例如,在 Docker Hub 上获取的命令为:
      docker run -it secretflow/secretflow-anolis8:latest
      ,阿里云上获取的命令为:
      docker run -it secretflow-registry.cnhangzhou.cr.aliyuncs.com/secretflow-anolis8:latest
    • 安装完成后,可通过以下 Python 代码验证安装是否成功:
import secretflow as sf
print(sf.__version__)
  • 方式二:pypi

    • 需要 pip ≥19.3,建议使用 conda 管理 Python 环境。安装命令为:
      pip installU – secretflow

      pip install –U secretflow-lite
    • 安装完成后,同样可通过上述 Python 代码验证版本。
  • 方式三:源码

    • 需要 pip ≥19.3,建议使用 conda 管理 Python 环境。首先,下载源码并建立 Python 虚拟环境:

      git clone https://github.com/secretflow/secretflow.git
      cd secretflow
      conda create -n secretflow python==3.8
      conda activate secretflow
      
    • 然后安装 SecretFlow。涉及到 C++ 编译,建议使用镜像 secretflow/release-ci:latest

      python setup.py bdist_wheel
      pip install dist/*.whl
      

三、部署模式

(一)仿真模式

  • 特点 :适合仿真实验,验证代码效果,既支持单机仿真,也支持多机仿真,只需要执行一次代码,安全增强。

  • 单机仿真示例

    • 导入 SecretFlow 并初始化,指定参与方和地址为本地:

      import secretflow as sf
      sf.init(parties=['alice', 'bob'], address='local')
      
    • 创建参与方对象,执行函数:

      alice = sf.PYU('alice')
      bob = sf.PYU('bob')
      result_alice = alice(lambda x : x + 1)(2)
      result_bob = bob(lambda x : x - 1)(2)
      print(result_alice.reveal())  # 输出:3
      print(result_bob.reveal())  # 输出:1
      
  • 集群仿真示例

    • 在第一台机器上部署 Ray 主节点,模拟参与方 alice:
      ```bash
      ray start --head \

--node-ip-address="192.168.1.101" --port="6379"
--resources='{"alice": 16} '
--include-dashboard=False
--disable-usage-stats

    * 在第二台机器上部署 Ray 从节点,模拟参与方 bob:```bash
ray start \
--address="192.168.1.101:6379" \
--resources=' {"bob": 16} ' \
--include-dashboard=False \
--disable-usage-stats
* 执行 Python 代码初始化 SecretFlow,指定参与方和 Ray 主节点地址:
import secretflow as sf
sf.init(parties=['alice', 'bob'], address='192.168.1.101:6379')
alice = sf.PYU('alice')
bob = sf.PYU('bob')
result_alice = alice(lambda x : x)(2)
result_bob = bob(lambda x : x)(2)
print(result_alice.reveal())  # 输出:2
print(result_bob.reveal())  # 输出:2
* 可选创建密态设备 SPU,用于多方安全计算:
import spu
cluster_def = {
'nodes': [{
'party': 'alice', 'address': '192.168.1.101:6380',
}, {
'party': 'bob', 'address': '192.168.1.102:6380',
},
], 'runtime_config': {
'protocol': spu.spu_pb2.SEMI2K, 'field': spu.spu_pb2.FM128, 'sigmoid_mode': spu.spu_pb2.RuntimeConfig.SIGMOID_REAL,
}
}
spu = sf.SPU(cluster_def=cluster_def)

(二)生产模式

  • 特点 :相比仿真模式,每个参与方都是独立的 Ray 集群,所有参与方都需要执行代码,安全增强。

  • 部署步骤

    • 在每个参与方的机器上部署 Ray 主节点,指定节点的 IP 和端口,以及资源。例如,在 alice 的机器上:
      ```bash
      ray start --head \

--node-ip-address="192.168.1.101" --port="6379"
--resources='{"alice": 16} '
--include-dashboard=False
--disable-usage-stats


在 bob 的机器上:
```bash
ray start --head \
--node-ip-address="192.168.1.102" --port="6379" \
--resources='{"bob": 16} ' \
--include-dashboard=False \
--disable-usage-stats
* 在每台机器上分别执行 Python 代码,初始化 SecretFlow,指定自己的参与方信息和其他参与方的地址。在 alice 的机器上:
import secretflow as sf
cluster_config ={
'parties': {
'alice’: {'address': '192.168.1.101:6379'}, 'bob': {'address': '192.168.1.102:6379'},
}, 'self_party': 'alice',
}
sf.init(address='192.168.1.101:6379', cluster_config=cluster_config)

在 bob 的机器上:

import secretflow as sf
cluster_config ={
'parties': {
'alice’: {'address': '192.168.1.101:6379'}, 'bob': {'address': '192.168.1.102:6379'},
}, 'self_party': 'bob',
}
sf.init(address='192.168.1.102:6379', cluster_config=cluster_config)
* 可选创建 SPU,用于多方安全计算:
import spu
cluster_def = {
'nodes': [{
'party': 'alice', 'address': '192.168.1.101:6380',
}, {
'party': 'bob', 'address': '192.168.1.102:6380',
},
], 'runtime_config': {
'protocol': spu.spu_pb2.SEMI2K, 'field': spu.spu_pb2.FM128, 'sigmoid_mode': spu.spu_pb2.RuntimeConfig.SIGMOID_REAL,
}
}
spu = sf.SPU(cluster_def=cluster_def)
  • 通信网络 :涉及 Ray 主节点、SPU、Proxy 等组件之间的通信,需注意端口冲突问题。

(三)使用 KUSCIA 解决多端口问题

  • KUSCIA 定位 :屏蔽不同机构间基础设施差异,为跨机构协作提供资源管理和任务调度能力。
  • 作用 :统一网络基础设施,解决 SPU、Ray 通信多端口问题。

(四)使用 SecretNote 提升体验

  • 特点 :与 Notebook 一致的使用体验,所有参与方代码在一个页面上执行,单操作界面,多节点代码自动执行,方便跟踪运行状态。
  • 示例 :使用 SecretNote 运行一个简单的多方计算任务:
    ```python

    在 SecretNote 中编写如下代码

    import secretflow as sf

初始化 SecretFlow

sf.init(parties=['alice', 'bob'], address='local')

创建参与方对象

alice = sf.PYU('alice')
bob = sf.PYU('bob')

定义计算函数

def compute_sum(x, y):
return x + y

执行计算

result = alice(compute_sum)(2, bob(lambda: 3)())
print(result.reveal()) # 输出:5


建议使用 docker 方式运行 SecretNote:
```bash
docker run -p 8888:8888 secretflow/secretnote

四、常见问题解答(FAQ)

(一)镜像下载慢或失败

  • 解决方法 :建议使用国内的 pypi 源。可以配置 pip 使用国内镜像,如阿里云镜像:
    pip config set global.index-url https://mirrors.aliyun.com/pypi/simple
    

(二)网络报错(服务启动失败等)

  • 可能原因 :端口被占用或端口存在冲突。
  • 解决方法 :检查端口占用情况,使用 netstat -an | grep <端口> 命令查看端口是否被占用,如被占用则更换端口。

(三)发送失败或连接失败(生产模式更常见)

  • 可能原因 :服务没启动、多方服务启动不同步。
  • 解决方法 :调整连接参数,如超时、重试次数等。例如,在初始化 SecretFlow 时增加超时时间:
    sf.init(address='{Ray head node address}', cluster_config=cluster_config, timeout=30)
    

(四)使用 docker 模式运行 SecretFlow 集群注意事项

  • 建议 :使用 host 网络模式,若不能使用则在同一台机器上运行多个 docker 容器时,使用同一个 docker network 连接。创建 docker network 的命令为:
    docker network create secretflow-network
    

然后在运行容器时指定该网络:

docker run --network=secretflow-network ...

(五)选择 Ray 及是否可用其他框架替代

  • Ray 的优势 :提供全局视角编程范式、灵活计算模型、透明分布式等优势。
  • 替代方案 :理论上只要框架支持 SecretFlow 的分布式调度原语(remote、get)即可替代。例如,可以尝试使用其他分布式计算框架,如 Dask,但可能需要进行适配和修改。

五、课程总结

SecretFlow 的安装方式多样,包括 docker 镜像、pypi 和源码安装,可根据实际需求选择。部署模式分为仿真模式和生产模式,仿真模式适合实验验证,生产模式适用于实际生产环境,需注意端口冲突和安全增强。同时,借助 KUSCIA 和 SecretNote 可进一步优化部署和使用体验,提高工作效率。在实际应用中,可参考以下示例代码进行操作:

  • 安装验证

    import secretflow as sf
    print(sf.__version__)
    
  • 单机仿真

    import secretflow as sf
    sf.init(parties=['alice', 'bob'], address='local')
    alice = sf.PYU('alice')
    bob = sf.PYU('bob')
    result_alice = alice(lambda x : x + 1)(2)
    result_bob = bob(lambda x : x - 1)(2)
    print(result_alice.reveal())
    print(result_bob.reveal())
    
  • 集群仿真

    import secretflow as sf
    sf.init(parties=['alice', 'bob'], address='192.168.1.101:6379')
    alice = sf.PYU('alice')
    bob = sf.PYU('bob')
    result_alice = alice(lambda x : x)(2)
    result_bob = bob(lambda x : x)(2)
    print(result_alice.reveal())
    print(result_bob.reveal())
    
  • 生产模式部署

    import secretflow as sf
    cluster_config ={
    'parties': {
    'alice’: {'address': '192.168.1.101:6379'}, 'bob': {'address': '192.168.1.102:6379'},
    }, 'self_party': 'alice',
    }
    sf.init(address='192.168.1.101:6379', cluster_config=cluster_config)
    
...全文
22 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

562

社区成员

发帖
与我相关
我的任务
社区描述
隐语开源社区,隐私计算开发者交流和讨论的平台。
密码学可信计算技术安全 企业社区
社区管理员
  • 隐语SecretFlow
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

【最新活动】

3月18日:隐私计算实训营第一期

试试用AI创作助手写篇文章吧