# streamlinedbp **Repository Path**: whaleeric/streamlinedbp ## Basic Information - **Project Name**: streamlinedbp - **Description**: a streamlined blockchain platform using hyperledger fabric - **Primary Language**: Go - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2023-05-04 - **Last Updated**: 2023-05-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 简介 一个更加轻便的`区块链+联邦学习`平台,使用`golang`编写,训练脚本使用`python`编写 ## 快速使用 为了确保正常工作,需要以下版本或工具: + ubuntu 20.04/22.04 + go 1.17(.5) + ssh server/ssh client + python 3.7(.16) + docker (23.0.4) + docker-compose (1.25.0) **运行每台主机都克隆该克隆该仓库:** ```sh git clone https://gitee.com/elcucuycr/streamlinedbp.git ``` **进入该仓库并编译:** ```shell cd streamlinedbp go mod tidy # 该步负责下载项目所需要的依赖包 go build main.go ``` 编译后会在目录下生成二进制文件`main`,可以输入`./main --help`查看详细用法 **在第一台主机上,修改`myConfig.yaml`:** ```yaml OrdererOrganization: OrgName: example Orderers: - Name: orderer1 IP: 192.168.177.137 Port: 32000 - Name: orderer2 IP: 192.168.177.138 Port: 32000 - Name: orderer3 IP: 192.168.177.138 Port: 32010 PeerOrganizations: - OrgName: org1 Peers: - Name: peer1 IP: 192.168.177.137 Port: 32010 - Name: peer2 IP: 192.168.177.138 Port: 32020 Users: - IP: 192.168.177.137 Port: 32050 - IP: 192.168.177.138 Port: 32050 - OrgName: org2 Peers: - Name: peer1 IP: 192.168.177.138 Port: 32030 Users: - IP: 192.168.177.139 Port: 32050 BlockchainSettings: BlockTimeout: 2s BlockMaxTransactionNum: 10 Task: TaskName: mnist Iteration: 20 UserNum: 3 Plugin: Timer: Enabled: true EnergyMeter: Enabled: true Interval: 500 ``` 按照yaml文件的编写规范来修改该文件 + `OrdererOrganization`是排序组织(排序组织只有一个),`OrgName`表示组织名,`Orderers`列举了所有的排序节点,`Name`表示该排序节点的名字(名字可以随便设置但是同一组织下不同节点不可重名),`IP`表示该排序节点所在的主机ip,`Port`表示该排序节点所监听的端口,**不同节点不能占用同一主机上的同一端口,所以请错开不同节点的端口**,至少错开5个端口(因为一个节点要占用连续的多个端口) + `PeerOrganizations`是普通组织,普通组织可以有多个,例如上面的Org1/Org2,每个组织下面可以有多个peer节点以及user(user在本情景中为联邦学习参与方),peer和user的配置规则类似于上文orderer,但是user不需要指定`Name`,因为其默认按照`User1/User2/User3...`命名 + `Task`是训练任务的配置,目前训练的是`手写数据集mnist`,`Iteration`表示训练多少代,`UserNum`代表参与联邦学习的用户数量 + `BlockchainSettings`是区块链的设置。`BlockTimeout`表征了区块的超时时间,超过该时间则区块即使未被填满也会出块。`BlockMaxTransactionNum`表征了区块的最大容量,达到该容量则出块。 + `Plugin`是插件 + `Timer`负责时间测量,设置`Enabled`为`true`来开启它,开启后可以监测第一个user端每一轮迭代的各个阶段耗时(各个阶段:下载全局模型、本地训练、上传本地模型、等待其他user都上传本地模型、聚合全局模型),结果自动保存至csv文件 + `EnergyMeter`负责功耗测量,设置`Enabled`为`true`来开启它,开启后可以监测每一台主机上各个cpu占用百分比,设置`Interval`来改变测量时间间隔, 500表示每500ms读取一次CPU占用信息。**需要注意的是,如果某台主机上没有user,只有orderer/peer节点,那么它无法知道什么时候该停止监测,所以请手动按enter键来结束监测**,结果自动保存至csv文件 **生成材料:** 在第一台主机上执行该命令 ```shell ./main generate ``` 过程中会将生成好的材料发送到`myConfig.yaml`中的所有主机,如果这一步出现了问题,那么大概率是部分主机ssh server或者ssh client没有安装或者正确配置,无法收发文件,请自行搜索相关博客解决,如果`scp 被发送文件 root@收端主机IP:收端目录`命令能够正常执行,则代表问题得到解决 **开启节点:** 在所有主机上执行该命令 ```shell ./main start ``` 使用`docker ps -a`可以查看节点所在的容器是否正常工作 **开始训练:** 在所有主机上执行该命令(请确保每台主机上都有mnist训练环境,见详细说明) ```shell ./main train ``` **关停网络:** ```shell ./main down ``` 上述命令会关停网络但不会删除材料,因此在**再次开启网络时,直接从`开启节点`步骤开始** 如果需要修改网络配置,也即修改`myConfig.yaml`文件,则使用下列命令来关停网络并删除材料: ```shell ./main down -p all ``` 上述命令会关停网络并删除材料,因此在再次开启网络时,需要从`生成材料`步骤开始,`myConfig.yaml`中的更改将在新生成的材料中生效 下面是第一次运行时的流程图: ```mermaid graph LR;   主机1修改myConfig.yaml-->主机1生成材料-->所有主机开启节点-->所有主机开始训练; ``` ## 详细说明 ### 手写数字集mnist脚本运行环境 建议使用python包管理工具anaconda,安装方法: https://www.cnblogs.com/chencoolandclear/p/16560077.html 创建一个python=3.7的运行环境,激活该环境并安装: conda中安装pytorch: https://blog.csdn.net/weixin_46288319/article/details/124432168 conda中安装scipy包: ``` conda install scipy ``` 至此环境已经可以正常工作,如果仍旧存在python环境问题,则对照下列每一个包的版本: ``` # Name Version Build Channel _libgcc_mutex 0.1 main _openmp_mutex 5.1 1_gnu blas 1.0 mkl brotlipy 0.7.0 py37h27cfd23_1003 bzip2 1.0.8 h7b6447c_0 ca-certificates 2023.01.10 h06a4308_0 certifi 2022.12.7 py37h06a4308_0 cffi 1.15.1 py37h5eee18b_3 charset-normalizer 2.0.4 pyhd3eb1b0_0 cpuonly 2.0 0 pytorch cryptography 39.0.1 py37h9ce1e76_0 ffmpeg 4.3 hf484d3e_0 pytorch fftw 3.3.9 h27cfd23_1 freetype 2.12.1 h4a9f257_0 giflib 5.2.1 h5eee18b_3 gmp 6.2.1 h295c915_3 gnutls 3.6.15 he1e5248_0 idna 3.4 py37h06a4308_0 intel-openmp 2021.4.0 h06a4308_3561 jpeg 9e h5eee18b_1 lame 3.100 h7b6447c_0 lcms2 2.12 h3be6417_0 ld_impl_linux-64 2.38 h1181459_1 lerc 3.0 h295c915_0 libdeflate 1.17 h5eee18b_0 libffi 3.4.2 h6a678d5_6 libgcc-ng 11.2.0 h1234567_1 libgfortran-ng 11.2.0 h00389a5_1 libgfortran5 11.2.0 h1234567_1 libgomp 11.2.0 h1234567_1 libiconv 1.16 h7f8727e_2 libidn2 2.3.2 h7f8727e_0 libpng 1.6.39 h5eee18b_0 libstdcxx-ng 11.2.0 h1234567_1 libtasn1 4.16.0 h27cfd23_0 libtiff 4.5.0 h6a678d5_2 libunistring 0.9.10 h27cfd23_0 libwebp 1.2.4 h11a3e52_1 libwebp-base 1.2.4 h5eee18b_1 lz4-c 1.9.4 h6a678d5_0 mkl 2021.4.0 h06a4308_640 mkl-service 2.4.0 py37h7f8727e_0 mkl_fft 1.3.1 py37hd3c417c_0 mkl_random 1.2.2 py37h51133e4_0 ncurses 6.4 h6a678d5_0 nettle 3.7.3 hbbd107a_1 numpy 1.21.5 py37h6c91a56_3 numpy-base 1.21.5 py37ha15fc14_3 openh264 2.1.1 h4ff587b_0 openssl 1.1.1t h7f8727e_0 pillow 9.4.0 py37h6a678d5_0 pip 22.3.1 py37h06a4308_0 pycparser 2.21 pyhd3eb1b0_0 pyopenssl 23.0.0 py37h06a4308_0 pysocks 1.7.1 py37_1 python 3.7.16 h7a1cb2a_0 pytorch 1.13.1 py3.7_cpu_0 pytorch pytorch-mutex 1.0 cpu pytorch readline 8.2 h5eee18b_0 requests 2.28.1 py37h06a4308_0 scipy 1.7.3 py37h6c91a56_2 setuptools 65.6.3 py37h06a4308_0 six 1.16.0 pyhd3eb1b0_1 sqlite 3.41.1 h5eee18b_0 tk 8.6.12 h1ccaba5_0 torchaudio 0.13.1 py37_cpu pytorch torchvision 0.14.1 py37_cpu pytorch typing_extensions 4.3.0 py37h06a4308_0 urllib3 1.26.14 py37h06a4308_0 wheel 0.38.4 py37h06a4308_0 xz 5.2.10 h5eee18b_1 zlib 1.2.13 h5eee18b_0 zstd 1.5.4 hc292b87_0 ``` ## 常见问题及解决方案 ### SDK问题 报错:SDK运行后报错,configure MSP failed: sanitizeCert failed the supplied identity is not valid: x509:certificate signed by unknown authority 原因:Go的版本过高,切换至1.17 ### 缺包问题 报错:python: no package named 'xxx' 原因:python/conda环境没有配置好,或者环境中没有安装该包,按照上述环境配置教程安装