secretflow / spu

SPU (Secure Processing Unit) aims to be a provable, measurable secure computation device, which provides computation ability while keeping your private data protected.
https://www.secretflow.org.cn/docs/spu/en/
Apache License 2.0
235 stars 102 forks source link

unbalanced psi报错 #151

Closed LzyloveRila closed 1 year ago

LzyloveRila commented 1 year ago

spu版本: 0.3.2b12 运行脚本 example/python/psi/unbalanced_psi.py 环境:centOS7.9

目前出现2个问题

  1. broadcast_result 设置为True时,receiver_rank一方有正常的交集,另一方显示交集为0
  2. 某些情况下出现如下bug: image

看代码对应是这一段主动抛出的异常,请问是什么原因触发?

 while (in->GetLine(&line)) {
    if (idx < header_line_count) {
      out->Write(line);
      out->Write("\n");
    } else {
      if (indices_iter == indices.end()) {
        break;
      }
      if (*indices_iter == idx - header_line_count) {
        indices_iter++;
        out->Write(line);
        out->Write("\n");
        ++target_count;
      }
    }
    idx++;
  }

  SPU_ENFORCE(target_count == indices.size(),
              "logstic error, indices.size={}, target_count={}, please be "
              "sure the `indices` is sorted",
              indices.size(), target_count);
zhanglei486 commented 1 year ago
  1. example/python/psi/unbalanced_psi.py示例代码对ECDH_OPRF_UB_PSI_2PC_SHUFFLE_ONLINE和ECDH_OPRF_UB_PSI_2PC_ONLINE都进行了调用展示 ECDH_OPRF_UB_PSI_2PC_SHUFFLE_ONLINE 只是大数据方得到数据交接,broadcast设置无效 ECDH_OPRF_UB_PSI_2PC_ONLINE设置broadcast=True时,两方都可以得到交集结果。 可以检查一下具体设置的是哪个ONLINE协议。

  2. 第二个问题提到了某些情况下出现如下bug,可以把某些情况具体描述一下吗,列如两方数据量分别多少,脱敏的数据示例

    image

    求交输入的数据应该是去重后的数据。

LzyloveRila commented 1 year ago
  1. 使用的协议是 ECDH_OPRF_UB_PSI_2PC_ONLINE,broadcast=True时另一方得到的交集为0,输出文件内容为空
  2. 15w对10亿的md5值求交,输入数据仅一列。 拿测试数据尝试了有重复的数据,有时候会有这个报错,有时候没有,所以想知道抛出这段异常的代码是在判断什么,可以解释下吗?
zhanglei486 commented 1 year ago

psi要求输入数据是去重后的数据,有重复项会引起异常。 问题截图报异常是因为根据交集indices集合获取csv对应位置数据的结果,和indices集合数量不匹配

LzyloveRila commented 1 year ago

psi要求输入数据是去重后的数据,有重复项会引起异常。 问题截图报异常是因为根据交集indices集合获取csv对应位置数据的结果,和indices集合数量不匹配

去重后没有这个问题出现了,但UB ONLINE阶段bob(数据量大的一方)在一段时间后runtime error退出了,brpc get data 超时,没有等到alice broadcast result,brpc超时的时间我已经设置到long int的上限2147 s了。

请问这个怎么解决,没有keep alive机制吗? image

zhanglei486 commented 1 year ago

link_desc = { 'recv_timeout_ms': 3600000, }

spu = sf.SPU(cluster_def, link_desc) 设置link_desc recv_timeout_ms试一下

LzyloveRila commented 1 year ago

3600 1000 好像也不行,隐语最后调用到grpc库里这个wait_for函数,单位是us 3600 1000 * 1000 超过long 类型最大值,溢出了。。好像不生效,最大只能2147s 我以为会keep alive什么的

ONLINE阶段alice计算的时间比较久(10亿的时候),就timeout了。

image

image

zhanglei486 commented 1 year ago

发一下机器配置和数据量。 正常情形下,alice(小数据方)求交比较计算不会超过1小时,可以先把broadcast设为False,观察一下alice总体运行时间

LzyloveRila commented 1 year ago

8C32G, 数据量10亿,alice比较计算花了3300s,超过long int最大的2147s了。设置3600s还是会超时

lidh15 commented 1 year ago

这里 Alice 的耗时是否和网络状况有关? 可能在蚂蚁那边网络状况普遍比较良好即使是做十亿数据也不会超过一小时,但是普通老百姓的“正常情况”就是几十 KB/s?

zhanglei486 commented 1 year ago

"alice比较计算花了3300s",是纯本地计算,跟网络带宽没关系,建议提高CPU的核数,能降低alice的时间

zhanglei486 commented 1 year ago
image

根据前期测试的benchmark,8c16g,8269CY,2.5GHz online时间大概是17m,1000多秒

可以发一下CPU的具体配置 另外建议观察一下运行期间的CPU利用率,是否有其他程序占用CPU影响性能