secretflow / secretflow

A unified framework for privacy-preserving data analysis and machine learning
https://www.secretflow.org.cn/docs/secretflow/en/
Apache License 2.0
2.36k stars 400 forks source link

多方机器学习中,spu中的fit是否可使用sklearn #92

Closed mingo0117 closed 2 years ago

mingo0117 commented 2 years ago

Issue Type

Others

Source

binary

Secretflow Version

latest

OS Platform and Distribution

ubuntu 18.04

Python version

3.8.13

Bazel version

No response

GCC/Compiler version

No response

What happend and What you expected to happen.

如题,想问下ml的前端是只能用纯jax写么?想直接调sklearn的svm,提示:
ray.exceptions.RaySystemError: System error: Failed to unpickle serialized exception
traceback: Traceback (most recent call last):
  File "/home/ops/anaconda3/envs/secretflow/lib/python3.8/site-packages/ray/exceptions.py", line 38, in from_ray_exception
    return pickle.loads(ray_exception.serialized_exception)
  File "/home/ops/anaconda3/envs/secretflow/lib/python3.8/site-packages/jax/_src/errors.py", line 321, in __init__
    "The numpy.ndarray conversion method __array__() was called on "
AttributeError: 'str' object has no attribute '_origin_msg'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/ops/anaconda3/envs/secretflow/lib/python3.8/site-packages/ray/serialization.py", line 398, in deserialize_objects
    obj = self._deserialize_object(data, metadata, object_ref)
  File "/home/ops/anaconda3/envs/secretflow/lib/python3.8/site-packages/ray/serialization.py", line 318, in _deserialize_object
    return RayError.from_bytes(obj)
  File "/home/ops/anaconda3/envs/secretflow/lib/python3.8/site-packages/ray/exceptions.py", line 32, in from_bytes
    return RayError.from_ray_exception(ray_exception)
  File "/home/ops/anaconda3/envs/secretflow/lib/python3.8/site-packages/ray/exceptions.py", line 41, in from_ray_exception
    raise RuntimeError(msg) from e
RuntimeError: Failed to unpickle serialized exception

Reproduction code to reproduce the issue.

def fit(*train):
            C = 0.8
            gamma = 20
            decision_function_shape = 'ovo'
            x, y = split_x_y(train)
            clf = svm.SVC(C=C, kernel='linear', gamma=gamma, decision_function_shape=decision_function_shape)
            clf.fit(x, y.ravel())
            return clf.coef_, clf.intercept_
icavan commented 2 years ago

hello @mingo0117 , 对于纯密态计算的方案,目前原生 AI 框架对接当前推荐的是 Jax,理论上所有可以翻译到 XLA IR 的框架都可以被 SPU 对接上,因此后续会包含 TF & Torch,可以看下 https://spu.readthedocs.io/en/beta/getting_started/introduction.html 。 走 XLA 的好处是未来 torch/jax/tf 自身的迭代和隐语的迭代是解耦的,可以用上最新版本的原生 AI 框架。

回到 SKLearn,SKLearn 本身并不能直接翻译到 XLA,所以暂时这么做是不可以的。 但是我们确实有计划提供类 SKLearn 的 API 风格的安全机器学习算法,这样可以减少用户的学习成本。

mingo0117 commented 2 years ago

好的。确实如您所说,jax有一定学习成本,起码对我还是比较新的一个框架,很多机器学习算法可能要用numpy的方式去写,再对着jax的api看怎么转... 有点头大

hello @mingo0117 , 对于纯密态计算的方案,目前原生 AI 框架对接当前推荐的是 Jax,理论上所有可以翻译到 XLA IR 的框架都可以被 SPU 对接上,因此后续会包含 TF & Torch,可以看下 https://spu.readthedocs.io/en/beta/getting_started/introduction.html 。 走 XLA 的好处是未来 torch/jax/tf 自身的迭代和隐语的迭代是解耦的,可以用上最新版本的原生 AI 框架。

回到 SKLearn,SKLearn 本身并不能直接翻译到 XLA,所以暂时这么做是不可以的。 但是我们确实有计划提供类 SKLearn 的 API 风格的安全机器学习算法,这样可以减少用户的学习成本。

icavan commented 2 years ago

好的。确实如您所说,jax有一定学习成本,起码对我还是比较新的一个框架,很多机器学习算法可能要用numpy的方式去写,再对着jax的api看怎么转... 有点头大

hello @mingo0117 , 对于纯密态计算的方案,目前原生 AI 框架对接当前推荐的是 Jax,理论上所有可以翻译到 XLA IR 的框架都可以被 SPU 对接上,因此后续会包含 TF & Torch,可以看下 https://spu.readthedocs.io/en/beta/getting_started/introduction.html 。 走 XLA 的好处是未来 torch/jax/tf 自身的迭代和隐语的迭代是解耦的,可以用上最新版本的原生 AI 框架。 回到 SKLearn,SKLearn 本身并不能直接翻译到 XLA,所以暂时这么做是不可以的。 但是我们确实有计划提供类 SKLearn 的 API 风格的安全机器学习算法,这样可以减少用户的学习成本。

是的,相对来说,一些常用的传统机器学习和特征工程(比如 LR / Pearson's R / XGB / WOE )隐语会迭代提供现成 API 让用户去直接使用。

SPU 这层是个中间层,目前除了要做密态NN或者想直接使用 SPU/HEU 等开发自己的密态应用,我们暂时不建议用户直接使用这一层。