隐语Secretflow—源码编译安装体验

隐语Secretflow—源码编译安装体验
XR隐语Secretflow—源码编译安装体验
官方提供四种方式安装SecretFlow。我使用的设备是:Mac M4|macOS Sequoia15.6.1,已安装anaconda。
我最早是希望尝试使用源码方式安装的,然后出现了些问题,虽然解决了但是需要安装一些其他软件工具,所以还是比较麻烦的。
我也试了 pypi 方式,这种方式最简单。如果不改源码的情况,用这种方式完全可以。下面我两种方式都写了。
1.从pypi安装
这块直接参照官方的安装说明即可,非常简单。
请注意python版本需要是3.10,你可以用conda构建一个虚拟环境。
1
2 >conda create -n sf python=3.10
>conda activate sf之后,请使用pip安装SecretFlow。
- 完全版本
1 >pip install -U secretflow
- Lite版本
1 >pip install -U secretflow-lite
安装过程中,我没有遇到任何问题。然后我也使用官方提供的测试案例,引入使用了secretflow包。
你的第一个SecretFlow程序。
导入secretflow包。
1 >>> import secretflow as sf创建一个包含Alice、Bob和Carol的本地集群。
1 >>> sf.init(parties=['alice', 'bob', 'carol'], address='local')创建Alice的PYU设备,可以处理她的数据。
1 >>> alice_device = sf.PYU('alice')让Alice说“Hello World”。
1 >>> message_from_alice = alice_device(lambda x:x)("Hello World!")打印消息。
1
2 >>> message_from_alice
<secretflow.device.device.pyu.PYUObject object at 0x7fdec24a15b0>我们看到Alice设备上的消息是一个PYU对象,在控制程序中。
通过揭示消息,在控制程序中打印文本。
1
2 >>> print(sf.reveal(message_from_alice))
Hello World!
在我们创建的sf环境中,使用 jupyter 然后输入案例代码,发现几个关键输出都是符合官方文档的。不过多了两个报错:
缺少
ipywidgets包导致进度条(tqdm)和 Notebook 交互功能受限;os.fork()与 JAX 多线程存在兼容性警告(暂不影响核心功能)
os.fork()(创建子进程的系统调用)与 JAX 的多线程机制可能冲突,理论上可能导致死锁,但在大多数 SecretFlow 的常规使用场景中(如本地模拟、简单分布式任务),这个警告不会影响实际功能,暂时可以忽略。如果后续出现死锁问题,再针对性调整 JAX 的线程配置(如 JAX_THREADS=1 限制单线程)。
第一个问题很好解决,安装 ipywidgets下就可以。第二个暂时忽略,不影响目前使用。
1 | # 安装 ipywidgets(同时更新依赖) |
2.从源码安装
这块先列一下官方的安装说明
1.下载源码并建立Python虚拟环境
1
2
3
4
5 git clone https://github.com/secretflow/secretflow.git
cd secretflow
conda create -n secretflow python=3.10
conda activate secretflow2.安装SecretFlow
- 完全版本
1
2
3 python setup.py bdist_wheel
pip install dist/*.whl
- 精简版本
1
2
3 python setup.py bdist_wheel --lite
pip install dist/*.whl
2.1 构建安装扩展知识了解
扩展说一下secretflow构建的一些知识,可以帮助不了解python构建的同学了解下。
构建过程:
- Python 包的构建是通过 setup.py 文件配置的,这个文件使用 setuptools 库来定义包的元数据和构建规则
- 当执行 python setup.py bdist_wheel 时,setuptools 会根据 setup.py 中的配置创建一个 wheel 格式的分发包
SecretFlow 项目的构建特点 :
- 从 setup.py 可以看出,SecretFlow 有两种构建模式:完整版和精简版(lite)
- 构建时会动态更新版本信息,包括日期、构建时间和 Git 提交 ID
- 项目使用 Bazel 来构建 C/C++ 扩展(ext_modules)
- 根据不同平台(macOS、Linux)会生成不同的 wheel 包
构建步骤 :
- 解析命令行参数(如 –lite 选项)
- 读取并过滤依赖项(requirements.txt)
- 更新版本信息文件
- 编译 C/C++ 扩展(如果有)
- 收集 Python 模块和包
- 生成 wheel 文件到 dist 目录
安装过程 :
- 当执行 pip install dist/*.whl 时,pip 会安装 dist 目录下的 wheel 包
- 安装过程不需要再次编译,直接复制文件到 Python 环境中
- 安装后,可以直接导入和使用这个包
2.2 实操
命令如下:
1 | git clone https://github.com/secretflow/secretflow.git |
上面这些都正常操作,没有问题。然后记得选择 远程仓库release下的1.13.x分支或者1.14.x(我本次使用的是main分支,它是1.14.x版本的)。不同版本可能对python版本要求不一样,所以这块注意下。
然后执行:
1 | python setup.py bdist_wheel |
我这里报错了:
1 | running build_ext |
因为项目使用Bazel来构建的C/C++ 扩展,而我并没有安装过Bazel。
2.3 安装Bazel
Bazel官方文档:https://bazel.build/install/os-x?hl=zh-cn#install-on-mac-os-x-homebrew
Bazel官方是建议使用 bazelisk 来安装使用bazel的,这个确实是比较方便的。我有试过其他两种方式的:
- 使用二进制安装程序进行安装,对比确实要麻烦一些,然后还需要下载Xcode
- 使用Homebrew 安装 Bazel 软件包。看着简单,但是 brew 里的版本都是比较新的,secretflow 1.14.x 需要使用的是bazel 6.5.0没找到。然后太高版本的bazel,我构建的时候报错。
安装bazelisk:
1 | brew install bazelisk |
1 | (secretflow) kxr@Mac secretflow % brew install bazelisk |
安装好之后,在Secretflow项目文件夹内其实有一个.bazelversion文件,bazelisk会自己识别这个文件,然后选择使用哪个版本的Bazel。
1 | (secretflow) kxr@Mac secretflow % bazel --version |
bazel安装好之后,重新进行构建:
1 | python setup.py bdist_wheel |
看到输出有如下内容,就没有问题啦:
1 | Installing collected packages: secretflow |
然后就可以正常在jupyter中使用的了。













