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

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

官方快速开始文档:https://www.secretflow.org.cn/zh-CN/docs/secretflow/v1.12.0b0/getting_started/installation#option-3-from-source

官方提供四种方式安装SecretFlow。我使用的设备是:Mac M4|macOS Sequoia15.6.1,已安装anaconda。

我最早是希望尝试使用源码方式安装的,然后出现了些问题,虽然解决了但是需要安装一些其他软件工具,所以还是比较麻烦的。

我也试了 pypi 方式,这种方式最简单。如果不改源码的情况,用这种方式完全可以。下面我两种方式都写了。

1.从pypi安装

这块直接参照官方的安装说明即可,非常简单。

https://www.secretflow.org.cn/zh-CN/docs/secretflow/v1.12.0b0/getting_started/installation#option-3-from-source

请注意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!

image-20250924140004853

在我们创建的sf环境中,使用 jupyter 然后输入案例代码,发现几个关键输出都是符合官方文档的。不过多了两个报错:

  • 缺少 ipywidgets 包导致进度条(tqdm)和 Notebook 交互功能受限;

  • os.fork() 与 JAX 多线程存在兼容性警告(暂不影响核心功能)

os.fork()(创建子进程的系统调用)与 JAX 的多线程机制可能冲突,理论上可能导致死锁,但在大多数 SecretFlow 的常规使用场景中(如本地模拟、简单分布式任务),这个警告不会影响实际功能,暂时可以忽略。如果后续出现死锁问题,再针对性调整 JAX 的线程配置(如 JAX_THREADS=1 限制单线程)。

第一个问题很好解决,安装 ipywidgets下就可以。第二个暂时忽略,不影响目前使用。

1
2
# 安装 ipywidgets(同时更新依赖)
pip install -U 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 secretflow

2.安装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
2
3
4
5
git clone https://github.com/secretflow/secretflow.git
cd secretflow

conda create -n secretflow python=3.10
conda activate secretflow

上面这些都正常操作,没有问题。然后记得选择 远程仓库release下的1.13.x分支或者1.14.x(我本次使用的是main分支,它是1.14.x版本的)。不同版本可能对python版本要求不一样,所以这块注意下。

然后执行:

1
python setup.py bdist_wheel

我这里报错了:

1
2
3
running build_ext
bazel build //secretflow_lib/binding:_lib.so --symlink_prefix=build/temp.macosx-11.1-arm64-cpython-310/bazel- --compilation_mode=opt
error: command 'bazel' failed: No such file or directory

因为项目使用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
2
3
4
5
6
7
8
9
10
11
12
13
14
(secretflow) kxr@Mac secretflow % brew install bazelisk
==> Fetching downloads for: bazelisk
==> Fetching bazelisk
==> Downloading https://mirrors.aliyun.com/homebrew/homebrew-bottles/bazelisk-
Already downloaded: /Users/kxr/Library/Caches/Homebrew/downloads/74dd8be5821f56d64883464d891016635439cc387c71e3164e242feee80e5d23--bazelisk-1.26.0.arm64_sequoia.bottle.tar.gz
==> Pouring bazelisk-1.26.0.arm64_sequoia.bottle.tar.gz
🍺 /opt/homebrew/Cellar/bazelisk/1.26.0: 8 files, 5.9MB
==> Running `brew cleanup bazelisk`...
Disable this behaviour by setting `HOMEBREW_NO_INSTALL_CLEANUP=1`.
Hide these hints with `HOMEBREW_NO_ENV_HINTS=1` (see `man brew`).
==> No outdated dependents to upgrade!
==> Caveats
zsh completions have been installed to:
/opt/homebrew/share/zsh/site-functions

安装好之后,在Secretflow项目文件夹内其实有一个.bazelversion文件,bazelisk会自己识别这个文件,然后选择使用哪个版本的Bazel。

1
2
(secretflow) kxr@Mac secretflow % bazel --version      
bazel 6.5.0

bazel安装好之后,重新进行构建:

1
python setup.py bdist_wheel

看到输出有如下内容,就没有问题啦:

1
2
Installing collected packages: secretflow
Successfully installed secretflow-1.14.0.dev20250924

然后就可以正常在jupyter中使用的了。