打開鏈接即可點亮社區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)算子鏡像
-
準備 Alice 節點中算子鏡像
./bfia/prepare_ss_lr_image.sh -k ${USER}-kuscia-autonomy-alice -
準備 Bob 節點中算子鏡像
./bfia/prepare_ss_lr_image.sh -k ${USER}-kuscia-autonomy-bob -
工具幫助信息
./bfia/prepare_ss_lr_image.sh -h
部署 TTP Server 服務
因為秘密分享-邏輯迴歸(SS-LR)算子依賴一個可信第三方 TTP(Trusted Third Party)Server,所以本教程使用本地 Docker 容器的方式和運行銀聯 BFIA 協議的節點容器部署在同一套環境中,從而方便快速搭建運行互聯互通銀聯 BFIA 協議作業的體驗環境。
-
部署 TTP Server 服務
./bfia/deploy_ttp_server.sh -
工具幫助信息
./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 時,可以查看算子輸出結果。
-
進入節點 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 -
查看 KusciaJob 作業狀態
kubectl get kj job-ss-lr -n cross-domain NAME STARTTIME COMPLETIONTIME LASTRECONCILETIME PHASE job-ss-lr 13s 2s 2s Succeeded -
查看 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描述了作業運行時的參數配置。