博客 / 詳情

返回

如何運行一個互聯互通銀聯 BFIA 協議作業

打開鏈接即可點亮社區Star,照亮技術的前進之路。

Github 地址:https://github.com/secretflow/kuscia

Tips:由於內部 Kuscia P2P 協議升級,當前版本暫不支持銀聯 BFIA 協議,適配銀聯 BFIA 正在進行中。

若您使用第三方算法鏡像提交互聯互通作業,強烈建議您檢查鏡像安全性。

本教程以秘密分享-邏輯迴歸(SS-LR)算子為示例,介紹如何通過互聯互通銀聯 BFIA(Beijing FinTech Industry Alliance 北京金融科技產業聯盟)協議運行一個包含兩方任務的作業。

在本教程中,通過兩個 Kuscia Autonomy 節點來模擬不同框架底座的節點。在這兩個節點之間,通過互聯互通銀聯 BFIA 協議運行一個包含兩方任務的作業。

準備環境

準備運行銀聯 BFIA 協議的節點

部署運行銀聯 BFIA 協議的節點,請參考 快速入門點對點組網模式。

在執行啓動集羣命令時,需要新增一個命令行參數-p bfia,詳細命令如下:

# Start the cluster, which will launch two docker containers, representing the Autonomy nodes alice and bob.
./kuscia.sh p2p -P bfia -a none

準備工具腳本

docker cp ${USER}-kuscia-autonomy-alice:/home/kuscia/scripts/user/bfia/ .

準備秘密分享-邏輯迴歸(SS-LR)算子鏡像

  1. 準備 Alice 節點中算子鏡像

    ./bfia/prepare_ss_lr_image.sh -k ${USER}-kuscia-autonomy-alice
  2. 準備 Bob 節點中算子鏡像

    ./bfia/prepare_ss_lr_image.sh -k ${USER}-kuscia-autonomy-bob
  3. 工具幫助信息

    ./bfia/prepare_ss_lr_image.sh -h

部署 TTP Server 服務

因為秘密分享-邏輯迴歸(SS-LR)算子依賴一個可信第三方 TTP(Trusted Third Party)Server,所以本教程使用本地 Docker 容器的方式和運行銀聯 BFIA 協議的節點容器部署在同一套環境中,從而方便快速搭建運行互聯互通銀聯 BFIA 協議作業的體驗環境。

  1. 部署 TTP Server 服務

    ./bfia/deploy_ttp_server.sh
  2. 工具幫助信息

    ./bfia/deploy_ttp_server.sh -h

準備數據

您可以使用 Kuscia 中自帶的數據文件,或者使用您自己的數據文件。

在 Kuscia 中,節點數據文件的存放路徑為節點容器的 /home/kuscia/var/storage,您可以在容器中查看這個數據文件。

查看 Kuscia 示例數據

查看 Alice 節點示例數據

docker exec -it ${USER}-kuscia-autonomy-alice more /home/kuscia/var/storage/data/perfect_logit_a.csv

查看 Bob 節點示例數據

docker exec -it ${USER}-kuscia-autonomy-bob more /home/kuscia/var/storage/data/perfect_logit_b.csv

準備您自己的數據

您也可以使用您自己的數據文件,首先您要將數據文件複製到節點容器中,以 Alice 節點為例:

docker cp {your_alice_data} ${USER}-kuscia-autonomy-alice:/home/kuscia/var/storage/data/

接下來您可以像查看 Kuscia 示例數據 一樣查看您的數據文件,這裏不再贅述。

提交一個銀聯 BFIA 協議的作業

目前在 Kuscia 中有兩種方式提交銀聯 BFIA 協議的作業

  • 通過配置 KusciaJob 提交作業
  • 通過銀聯 BFIA 協議創建作業 API 接口提交作業

{#configure-bfia-kuscia-job}

通過配置 KusciaJob 提交作業

數據準備好之後,我們將 alice 作為任務發起方,進入 alice 節點容器中,然後配置和運行作業。

docker exec -it ${USER}-kuscia-autonomy-alice bash

使用 Kuscia 示例數據配置 KusciaJob

下面的示例展示了一個 KusciaJob, 該作業包含 1 個任務

  • 算子通過讀取 alice 和 bob 的數據文件,完成秘密分享邏輯迴歸任務。
  • KusciaJob 的名稱為 job-ss-lr,在一個 Kuscia 集羣中,這個名稱必須是唯一的,由 .metadata.name 指定。

在 Alice 容器中,創建文件 job-ss-lr.yaml,內容如下:

apiVersion: kuscia.secretflow/v1alpha1
kind: KusciaJob
metadata:
  name: job-ss-lr
  namespace: cross-domain
spec:
  initiator: alice
  tasks:
  - alias: ss_lr_1
    appImage: ss-lr
    parties:
    - domainID: alice
      role: host
    - domainID: bob
      role: guest
    taskInputConfig: '{"name":"ss_lr_1","module_name":"ss_lr","output":[{"type":"dataset","key":"result"}],"role":{"host":["alice"],"guest":["bob"]},"initiator":{"role":"host","node_id":"alice"},"task_params":{"host":{"0":{"has_label":true,"name":"perfect_logit_a.csv","namespace":"data"}},"guest":{"0":{"has_label":false,"name":"perfect_logit_b.csv","namespace":"data"}},"common":{"skip_rows":1,"algo":"ss_lr","protocol_families":"ss","batch_size":21,"last_batch_policy":"discard","num_epoch":1,"l0_norm":0,"l1_norm":0,"l2_norm":0.5,"optimizer":"sgd","learning_rate":0.0001,"sigmoid_mode":"minimax_1","protocol":"semi2k","field":64,"fxp_bits":18,"trunc_mode":"probabilistic","shard_serialize_format":"raw","use_ttp":true,"ttp_server_host":"ttp-server:9449","ttp_session_id":"interconnection-root","ttp_adjust_rank":0}}}'
    tolerable: false

算子參數描述

KusciaJob 中算子參數由 taskInputConfig 字段定義,對於不同的算子,算子的參數不同

  • 秘密分享-邏輯迴歸(SS-LR)算子相關信息可參考 SS-LR 參考實現
  • 本教程秘密分享-邏輯迴歸(SS-LR)算子對應的 KusciaJob TaskInputConfig 結構可參考 TaskInputConfig 結構示例

提交 KusciaJob

現在已經配置好了一個 KusciaJob,接下來,讓運行以下命令提交這個 KusciaJob。

kubectl apply -f job-ss-lr.yaml

通過銀聯 BFIA 協議 API 接口提交作業

數據準備好之後,將 Alice 作為任務發起方,進入 Alice 節點容器中。

docker exec -it ${USER}-kuscia-autonomy-alice bash

下面使用銀聯 BFIA 協議創建作業接口提交作業,該作業會提交給 Kuscia 互聯互通 InterConn 控制器,該控制器將銀聯 BFIA 協議規定的創建作業請求參數轉化為 Kuscia 中的 KusciaJob 作業定義。
最後,InterConn 控制器在 Kuscia 中創建 KusciaJob 資源。

curl -v -X POST 'http://127.0.0.1:8084/v1/interconn/schedule/job/create' \
--header 'Content-Type: application/json' \
-d '{"job_id":"job-ss-lr","dag":{"version":"2.0.0","components":[{"code":"ss-lr","name":"ss_lr_1","module_name":"ss_lr","version":"v1.0.0","input":[],"output":[{"type":"dataset","key":"result"}]}]},"config":{"role":{"host":["alice"],"guest":["bob"]},"initiator":{"role":"host","node_id":"alice"},"job_params":{"host":{"0":{}},"guest":{"0":{}}},"task_params":{"host":{"0":{"ss_lr_1":{"name":"perfect_logit_a.csv","namespace":"data","has_label":true}}},"arbiter":{},"guest":{"0":{"ss_lr_1":{"name":"perfect_logit_b.csv","namespace":"data","has_label":false}}},"common":{"ss_lr_1":{"skip_rows":1,"algo":"ss_lr","protocol_families":"ss","batch_size":21,"last_batch_policy":"discard","num_epoch":1,"l0_norm":0,"l1_norm":0,"l2_norm":0.5,"optimizer":"sgd","learning_rate":0.0001,"sigmoid_mode":"minimax_1","protocol":"semi2k","field":64,"fxp_bits":18,"trunc_mode":"probabilistic","shard_serialize_format":"raw","use_ttp":true,"ttp_server_host":"ttp-server:9449","ttp_session_id":"interconnection-root","ttp_adjust_rank":0}}},"version":"2.0.0"}}'

提交作業接口請求參數內容結構請參考 提交 SS-LR 作業接口請求內容示例。

{#get-kuscia-job-phase}

查看 KusciaJob 運行狀態

在提交完 KusciaJob 作業後,我們可以在 alice 容器中通過下面的命令查看 Alice 方的 KusciaJob 的運行情況。
同樣,也可以登陸到 bob 容器中查看 Bob 方的 KusciaJob 的運行情況。下面以 Alice 節點容器為例。

查看所有的 KusciaJob

kubectl get kj -n cross-domain

您可以看到如下輸出:

NAME            STARTTIME   COMPLETIONTIME   LASTRECONCILETIME   PHASE
job-ss-lr       3s                           3s                  Running
job-ss-lr 就是剛剛創建出來的 KusciaJob。

查看運行中的 KusciaJob 的詳細狀態

通過指定 -o yaml 參數,能夠以 Yaml 的形式看到 KusciaJob 的詳細狀態。job-ss-lr 是提交的作業名稱。

kubectl get kj job-ss-lr -n cross-domain -o yaml

如果任務成功了,您可以看到如下輸出:

apiVersion: kuscia.secretflow/v1alpha1
kind: KusciaJob
metadata:
  creationTimestamp: "2023-07-01T02:21:04Z"
  generation: 3
  labels:
    kuscia.secretflow/interconn-protocol-type: bfia
    kuscia.secretflow/self-cluster-as-initiator: "true"
  name: job-ss-lr
  namespace: cross-domain
  resourceVersion: "50438"
  uid: 408a03ae-69c2-4fa8-a638-b47b6dbf530f
spec:
  initiator: alice
  maxParallelism: 2
  scheduleMode: Strict
  stage: Start
  tasks:
  - alias: ss_lr_1
    appImage: ss-lr
    parties:
    - domainID: alice
      role: host
    - domainID: bob
      role: guest
    taskID: job-ss-lr-26e3489ac66e
    taskInputConfig: '{"name":"ss_lr_1","module_name":"ss_lr","output":[{"type":"dataset","key":"result"}],"role":{"host":["alice"],"guest":["bob"]},"initiator":{"role":"host","node_id":"alice"},"task_params":{"host":{"0":{"has_label":true,"name":"perfect_logit_a.csv","namespace":"data"}},"guest":{"0":{"has_label":false,"name":"perfect_logit_b.csv","namespace":"data"}},"common":{"algo":"ss_lr","batch_size":21,"field":64,"fxp_bits":18,"l0_norm":0,"l1_norm":0,"l2_norm":0.5,"last_batch_policy":"discard","learning_rate":0.0001,"num_epoch":1,"optimizer":"sgd","protocol":"semi2k","protocol_families":"ss","shard_serialize_format":"raw","sigmoid_mode":"minimax_1","skip_rows":1,"trunc_mode":"probabilistic","ttp_adjust_rank":0,"ttp_server_host":"ttp-server:9449","ttp_session_id":"interconnection-root","use_ttp":true}}}'
    tolerable: false
status:
  completionTime: "2023-07-01T02:21:14Z"
  conditions:
  - lastTransitionTime: "2023-07-01T02:21:04Z"
    status: "True"
    type: JobValidated
  - lastTransitionTime: "2023-07-01T02:21:04Z"
    status: "True"
    type: JobCreateInitialized
  - lastTransitionTime: "2023-07-01T02:21:04Z"
    status: "True"
    type: JobCreateSucceeded
  - lastTransitionTime: "2023-07-01T02:21:04Z"
    status: "True"
    type: JobStartInitialized
  - lastTransitionTime: "2023-07-01T02:21:04Z"
    status: "True"
    type: JobStartSucceeded
  lastReconcileTime: "2023-07-01T02:21:14Z"
  phase: Succeeded
  startTime: "2023-07-01T02:21:04Z"
  taskStatus:
    job-ss-lr-26e3489ac66e: Succeeded
  • status 字段記錄了 KusciaJob 的運行狀態,.status.phase 字段描述了 KusciaJob 的整體狀態,而 .status.taskStatus 則描述了包含的 KusciaTask 的狀態。
    詳細信息請參考 KusciaJob。

查看 KusciaJob 中 KusciaTask 的詳細狀態

KusciaJob 中的每一個 KusciaTask 都有一個 taskID,通過 taskID 我們可以查看 KusciaTask 的詳細狀態。

kubectl get kt job-ss-lr-26e3489ac66e -n cross-domain -o yaml

KusciaTask 的介紹,請參考 KusciaTask。

查看 SS-LR 算子運行結果

可以通過 查看 KusciaJob 運行狀態 查詢作業的運行狀態。 當作業狀態 PHASE 變成 Succeeded 時,可以查看算子輸出結果。

  1. 進入節點 Alice 或 Bob 容器
    若已經在容器中,跳過該步驟

    # Enter the alice node container
    docker exec -it ${USER}-kuscia-autonomy-alice bash
    
    # Enter the bob node container
    docker exec -it ${USER}-kuscia-autonomy-bob bash
  2. 查看 KusciaJob 作業狀態

    kubectl get kj job-ss-lr -n cross-domain
    NAME        STARTTIME   COMPLETIONTIME   LASTRECONCILETIME   PHASE
    job-ss-lr   13s         2s               2s                  Succeeded
  3. 查看 SS-LR 算子輸出結果

    輸出內容表示 SS-LR 算子權重向量的密態分片

    # View the output result in the alice container
    more /home/kuscia/var/storage/job-ss-lr-host-0/job-ss-lr-{random-id}-result
    
    # View the output result in the bob container
    more /home/kuscia/var/storage/job-ss-lr-guest-0/job-ss-lr-{random-id}-result

刪除 KusciaJob

當您想清理這個 KusciaJob 時,您可以通過下面的命令完成:

kubectl delete kj job-ss-lr -n cross-domain

當這個 KusciaJob 被清理時, 這個 KusciaJob 創建的 KusciaTask 也會一起被清理。

參考

{#ss-lr-task-input-config}

SS-LR 算子對應的 TaskInputConfig 結構示例

{
  "name": "ss_lr_1",
  "module_name": "ss_lr",
  "input":[],
  "output": [{
    "type": "dataset",
    "key": "result"
  }],
  "role": {
    "host": ["alice"],
    "guest": ["bob"]
  },
  "initiator": {
    "role": "host",
    "node_id": "alice"
  },
  "task_params": {
    "host": {
      "0": {
        "has_label": true,
        "name": "perfect_logit_a.csv",
        "namespace": "data"
      }
    },
    "guest": {
      "0": {
        "has_label": false,
        "name": "perfect_logit_b.csv",
        "namespace": "data"
      }
    },
    "common": {
      "skip_rows": 1,
      "algo": "ss_lr",
      "protocol_families": "ss",
      "batch_size": 21,
      "last_batch_policy": "discard",
      "num_epoch": 1,
      "l0_norm": 0,
      "l1_norm": 0,
      "l2_norm": 0.5,
      "optimizer": "sgd",
      "learning_rate": 0.0001,
      "sigmoid_mode": "minimax_1",
      "protocol": "semi2k",
      "field": 64,
      "fxp_bits": 18,
      "trunc_mode": "probabilistic",
      "shard_serialize_format": "raw",
      "use_ttp": true,
      "ttp_server_host": "ttp-server:9449",
      "ttp_session_id": "interconnection-root",
      "ttp_adjust_rank": 0
    }
  }
}

字段説明

  • name 描述了任務算子的名稱。
  • module_name 描述了任務算子所屬模塊名稱。
  • input 描述了任務算子的輸入,若任務不依賴其他任務的輸出,則可以將該項置為空。
  • output 描述了任務算子的輸出。
  • role 描述了任務的角色。
  • initiator 描述了任務發起方的信息。
  • task_params 描述了任務算子依賴的參數。

{#bfia-create-job-req-body}

提交 SS-LR 作業接口請求內容示例

{
  "job_id": "job-ss-lr",
  "dag": {
    "version": "2.0.0",
    "components": [{
      "code": "ss-lr",
      "name": "ss_lr_1",
      "module_name": "ss_lr",
      "version": "v1.0.0",
      "input": [],
      "output": [{
        "type": "dataset",
        "key": "result"
      }]
    }]
  },
  "config": {
    "role": {
      "host": ["alice"],
      "guest": ["bob"]
    },
    "initiator": {
      "role": "host",
      "node_id": "alice"
    },
    "job_params": {
      "host": {
        "0": {}
      },
      "guest": {
        "0": {}
      }
    },
    "task_params": {
      "host": {
        "0": {
          "ss_lr_1": {
            "name": "perfect_logit_a.csv",
            "namespace": "data",
            "has_label": true
          }
        }
      },
      "arbiter": {},
      "guest": {
        "0": {
          "ss_lr_1": {
            "name": "perfect_logit_b.csv",
            "namespace": "data",
            "has_label": false
          }
        }
      },
      "common": {
        "ss_lr_1": {
          "skip_rows": 1,
          "algo": "ss_lr",
          "protocol_families": "ss",
          "batch_size": 21,
          "last_batch_policy": "discard",
          "num_epoch": 1,
          "l0_norm": 0,
          "l1_norm": 0,
          "l2_norm": 0.5,
          "optimizer": "sgd",
          "learning_rate": 0.0001,
          "sigmoid_mode": "minimax_1",
          "protocol": "semi2k",
          "field": 64,
          "fxp_bits": 18,
          "trunc_mode": "probabilistic",
          "shard_serialize_format": "raw",
          "use_ttp": true,
          "ttp_server_host": "ttp-server:9449",
          "ttp_session_id": "interconnection-root",
          "ttp_adjust_rank": 0
        }
      }
    },
    "version": "2.0.0"
  }
}

字段説明

  • job_id 描述了作業的標識。
  • dag 描述了作業的組件之間組合的配置。
  • config 描述了作業運行時的參數配置。
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.