Eggroll用于機(jī)器學(xué)習(xí)的高性能計(jì)算框架
Eggroll 是用于機(jī)器學(xué)習(xí)的簡(jiǎn)單高性能計(jì)算框架。
構(gòu)建和部署 Eggroll
1. 環(huán)境初始化
1.1. 環(huán)境要求
| 操作系統(tǒng) | CentOS 7.2 |
|---|---|
| 工具依賴(lài) | 安裝 yum 源工具:gcc gcc-c++ make autoconfig openssl-devel supervisor gmp-devel mpfr-devel libmpc-devel libaio numactl autoconf automake libtool libffi-dev snappy snappy-devel zlib zlib-devel bzip2 bzip2-devel lz4-devel libasan |
| 操作用戶 | 用戶名: app 組:apps |
| 系統(tǒng)配置 | 1. 掛載300G可用磁盤(pán)空間到/data目錄 2. 創(chuàng)建/data/projects目錄,屬主app用戶 |
1.2. 安裝軟件包
集群所有節(jié)點(diǎn)都需要安裝:jdk1.8、virtualenv獨(dú)立運(yùn)行環(huán)境(可進(jìn)入python3.6版本)
數(shù)據(jù)庫(kù)節(jié)點(diǎn):mysql8.0
2. 項(xiàng)目拉取及打包
方式一:從github拉取Eggroll項(xiàng)目,通過(guò)執(zhí)行auto-packaging.sh自動(dòng)打包腳本在同目錄下生成eggroll.tar.gz
git clone -b v2.x https://github.com/WeBankFinTech/Eggroll.git cd Eggroll sh deploy/auto-packaging.sh
方式二:從webank-ai云直接拉取
wget https://webank-ai-1251170195.cos.ap-guangzhou.myqcloud.com/eggroll-v2.x-init.tar.gz mv eggroll-v2.x-init.tar.gz eggroll.tar.gz
3. 部署發(fā)送
3.1. 解壓
將eggroll.tar.gz移到或發(fā)送到Eggroll的安裝目錄下,然后執(zhí)行:
tar -xzf eggroll.tar.gz
將eggroll.tar.gz解壓后,其目錄結(jié)構(gòu)如下:
|--bin --存放eggroll自帶啟動(dòng)腳本 |--conf --存放eggroll配置文件(包含部署需要修改文件) |--data --存放數(shù)據(jù)庫(kù)初始化及緩存文件 |--deploy --存放部署相關(guān)文件 |--lib --存放eggroll所有jar包 |--python --存放eggroll python代碼部分
3.2. 修改配置文件
配置文件一共有三個(gè)需要修改:
|--conf |----eggroll.properties |----route_tabe.json |----create-eggroll-meta-tables.sql
各配置文件修改說(shuō)明如下:
- 修改eggroll.properties配置文件
vi conf/eggroll.properties
<--數(shù)據(jù)庫(kù)配置選項(xiàng)說(shuō)明: eggroll提供兩種數(shù)據(jù)庫(kù)連接方式: 1、項(xiàng)目自帶h2數(shù)據(jù)庫(kù),適用于單節(jié)點(diǎn)部署,使用此方式則以下幾項(xiàng)jdbc配置無(wú)需修改,使用原有默認(rèn)配置即可; 2、安裝的mysql8.0數(shù)據(jù)庫(kù),建議集群版多節(jié)點(diǎn)使用,若使用此方式則需要按如下方式進(jìn)行修改配置。--> eggroll.resourcemanager.clustermanager.jdbc.driver.class.name=com.mysql.cj.jdbc.Driver eggroll.resourcemanager.clustermanager.jdbc.url=jdbc:mysql://數(shù)據(jù)庫(kù)服務(wù)器ip:端口/數(shù)據(jù)庫(kù)名稱(chēng)?useSSL=false&serverTimezone=UTC&characterEncoding=utf8&allowPublicKeyRetrieval=true eggroll.resourcemanager.clustermanager.jdbc.username=數(shù)據(jù)庫(kù)用戶名 eggroll.resourcemanager.clustermanager.jdbc.password=數(shù)據(jù)庫(kù)密碼 <--eggroll相關(guān)配置參數(shù)說(shuō)明: 1、以下包含的路徑都是相對(duì)Eggroll的實(shí)際部署目錄之下的相對(duì)路徑,若不在Eggroll的實(shí)際部署目錄之下,可用系統(tǒng)絕對(duì)路徑; 2、根據(jù)部署方法分為三個(gè)修改級(jí)別:需要修改、建議默認(rèn)、默認(rèn)即可,其中端口為建議默認(rèn)但需要根據(jù)實(shí)際服務(wù)器端口是否可用或部署方式來(lái)考慮是否修改,以避免端口沖突。--> eggroll.data.dir=data/ <--存放緩存數(shù)據(jù)目錄,默認(rèn)即可--> eggroll.logs.dir=logs/ <--存放eggroll生成日志目錄,默認(rèn)即可--> eggroll.resourcemanager.clustermanager.host=127.0.0.1 <--clustermanager服務(wù)ip地址,需要修改--> eggroll.resourcemanager.clustermanager.port=4670 <--clustermanager服務(wù)端口,建議默認(rèn)--> eggroll.resourcemanager.nodemanager.port=9394 <--nodemanager服務(wù)端口:1、部署單機(jī)版與clustermanager相同,建議默認(rèn);2、部署集群版需修改為其他可用端口,需要修改--> eggroll.resourcemanager.process.tag= <--集群服務(wù)標(biāo)簽,對(duì)不同集群需要單獨(dú)指,例如EGGROLL_TAG,需要修改--> eggroll.bootstrap.root.script=bin/eggroll_boot.sh <--eggroll_boot.sh啟動(dòng)腳本路徑,默認(rèn)即可--> eggroll.resourcemanager.bootstrap.egg_pair.exepath=bin/roll_pair/egg_pair_bootstrap.sh <--egg_pair啟動(dòng)腳本路徑,默認(rèn)即可--> eggroll.resourcemanager.bootstrap.egg_pair.venv= <--virtualenv安裝路徑,需要修改--> eggroll.resourcemanager.bootstrap.egg_pair.pythonpath=python <--python文件路徑,也作PYTHONPATH,默認(rèn)即可--> eggroll.resourcemanager.bootstrap.egg_pair.filepath=python/eggroll/roll_pair/egg_pair.py <--egg_pair.py文件路徑,默認(rèn)即可--> <--以下幾項(xiàng)默認(rèn)即可--> eggroll.resourcemanager.bootstrap.roll_pair_master.exepath=bin/roll_pair/roll_pair_master_bootstrap.sh <--roll_pair_master_bootstrap.sh文件路徑--> eggroll.resourcemanager.bootstrap.roll_pair_master.javahome= <--java環(huán)境變量,系統(tǒng)安裝jdk1.8--> eggroll.resourcemanager.bootstrap.roll_pair_master.classpath=conf/:lib/* <--eggroll啟動(dòng)時(shí)讀取classpath文件路徑--> eggroll.resourcemanager.bootstrap.roll_pair_master.mainclass=com.webank.eggroll.rollpair.RollPairMasterBootstrap <--roll_pair_master主類(lèi)--> eggroll.resourcemanager.bootstrap.roll_pair_master.jvm.options= <--jvm啟動(dòng)參數(shù)--> <--以上幾項(xiàng)默認(rèn)即可--> <--rollsite配置說(shuō)明:其服務(wù)ip、端口與partyId需要與route_table.json配置文件中對(duì)應(yīng)一致--> eggroll.rollsite.coordinator=webank <--rollsite服務(wù)標(biāo)簽,默認(rèn)即可--> eggroll.rollsite.host=127.0.0.1 <--rollsite服務(wù)ip,需要修改--> eggroll.rollsite.port=9370 <--rollsite服務(wù)端口,建議默認(rèn)--> eggroll.rollsite.party.id=10001 <--集群partyId,不同集群需要使用不同的partyId,需要修改--> eggroll.rollsite.route.table.path=conf/route_table.json <--route_table.json路由配置文件路徑,默認(rèn)即可-->
- 修改route_table.json路由信息
vi conf/route_table.json
{
"route_table":
{
"集群一partyId": <--此處需要修改-->
{
"default":[
{
"port": 集群一rollsite服務(wù)端口, <--此處需要修改-->
"ip": "集群一rollsite服務(wù)ip" <--此處需要修改-->
}
]
},
"集群二partyId": <--此處需要修改-->
{
"default":[
{
"port": 集群二rollsite服務(wù)端口, <--此處需要修改-->
"ip": "集群二rollsite服務(wù)ip" <--此處需要修改-->
}
]
}
},
"permission":
{
"default_allow": true
}
}
- 修改數(shù)據(jù)庫(kù)初始化sql腳本
<--修改說(shuō)明:此文件為初始化mysql數(shù)據(jù)庫(kù)建表及建庫(kù)使用的sql腳本,若使用默認(rèn)數(shù)據(jù)庫(kù)名為eggroll_meta則跳過(guò)此步驟,若實(shí)際需要使用其他庫(kù)名,可使用以下語(yǔ)句替換為實(shí)際的數(shù)據(jù)庫(kù)名稱(chēng),此處數(shù)據(jù)庫(kù)名稱(chēng)應(yīng)與eggroll.properties中所填數(shù)據(jù)庫(kù)名稱(chēng)一致--> sed -i "s/eggroll_meta/數(shù)據(jù)庫(kù)名稱(chēng)/" conf/create-eggroll-meta-tables.sql
3.3. 多節(jié)點(diǎn)部署
按上述說(shuō)明修改完配置文件后,若集群內(nèi)需多節(jié)點(diǎn)部署,由于各節(jié)點(diǎn)的配置文件完全相同,將其打包發(fā)送到集群各個(gè)節(jié)點(diǎn)的Eggroll安裝目錄下即可。
4. 添加元信息
集群多節(jié)點(diǎn)之間的服務(wù)之間是通過(guò)查詢(xún)數(shù)據(jù)庫(kù)存儲(chǔ)的元信息來(lái)感知的,因此需要登錄數(shù)據(jù)庫(kù)服務(wù)器對(duì)數(shù)據(jù)庫(kù)初始化并插入節(jié)點(diǎn)信息,在數(shù)據(jù)庫(kù)中執(zhí)行以下sql步驟:
登錄數(shù)據(jù)庫(kù)執(zhí)行:
<--此處注意使用create-eggroll-meta-tables.sql文件的絕對(duì)路徑-->
>>source Eggroll安裝目錄/conf/create-eggroll-meta-tables.sql;
<--將集群內(nèi)所有節(jié)點(diǎn)clustermanager和nodemanager服務(wù)信息插入server_node表中-->
>>INSERT INTO server_node (host, port, node_type, status) values ('clustermanager服務(wù)ip', 'clustermanager服務(wù)端口', 'CLUSTER_MANAGER', 'HEALTHY');
>>INSERT INTO server_node (host, port, node_type, status) values ('nodemanager服務(wù)ip', 'nodemanager服務(wù)port', 'NODE_MANAGER', 'HEALTHY');
執(zhí)行完成執(zhí)行查詢(xún)server_node表檢查數(shù)據(jù)是否準(zhǔn)確:
>>select * from server_node; >>exit
5. 服務(wù)啟動(dòng)
Eggroll的bin目錄中附帶啟動(dòng)腳本bin/eggroll.sh使用說(shuō)明:
sh bin/eggroll.sh $1 $2 <-- $1:需要執(zhí)行操作的服務(wù)名稱(chēng),例如clustermanager,nodemanager,rollsite,all(表示所有服務(wù)); $2:需要執(zhí)行的操作,例如start(啟動(dòng)),status(查看狀態(tài)),stop(關(guān)閉),restart(重啟) -->
使用例子:
<--啟動(dòng)所有服務(wù)--> sh bin/eggroll.sh all start <--查看clustermanager服務(wù)狀態(tài)--> sh bin/eggroll.sh clustermanager status <--重啟rollsite服務(wù)--> sh bin/eggroll.sh rollsite restart <--關(guān)閉nodemanager服務(wù)--> sh bin/eggroll.sh nodemanager stop
將各節(jié)點(diǎn)對(duì)應(yīng)的服務(wù)啟動(dòng)成功后,部署完成,進(jìn)入測(cè)試步驟。
6. 測(cè)試
6.1. 初始化環(huán)境變量
登錄服務(wù)器進(jìn)行測(cè)試時(shí)需要執(zhí)行以下語(yǔ)句進(jìn)行環(huán)境變量初始化
export EGGROLL_HOME=Eggroll安裝絕對(duì)路徑 --例如/data/projects/eggroll
export PYTHONPATH=${EGGROLL_HOME}/python
source virtualenv/bin/activate --進(jìn)入virtualenv獨(dú)立環(huán)境
6.2. roll_pair測(cè)試
cd ${EGGROLL_HOME}/python/eggroll/roll_pair/test
python -m unittest test_roll_pair.TestRollPairStandalone --單機(jī)模式
python -m unittest test_roll_pair.TestRollPairCluster --集群模式
等待執(zhí)行完成出現(xiàn)"OK"字段為成功。
6.3. roll_site測(cè)試
- 通信測(cè)試
(a). guest方執(zhí)行
cd ${EGGROLL_HOME}/python/eggroll/roll_site/test
python -m unittest test_roll_site.TestRollSiteCluster.test_remote
等待執(zhí)行完成出現(xiàn)"OK"字段為guest方發(fā)送成功。
(b). host方執(zhí)行
cd ${EGGROLL_HOME}/python/eggroll/roll_site/test
python -m unittest test_roll_site.TestRollSiteCluster.test_get
等待執(zhí)行完成出現(xiàn)"OK"字段為host方接收成功。
- 多partition通信測(cè)試
(a). guest方執(zhí)行
cd ${EGGROLL_HOME}/python/eggroll/roll_site/test
python -m unittest test_roll_site.TestRollSiteCluster.test_remote_rollpair_big
等待執(zhí)行完成出現(xiàn)"OK"字段為guest方發(fā)送成功。
(b). host方執(zhí)行
cd ${EGGROLL_HOME}/python/eggroll/roll_site/test
python -m unittest test_roll_site.TestRollSiteCluster.test_get_rollpair_big
等待執(zhí)行完成出現(xiàn)"OK"字段為host方接收成功。
- rollpair通信測(cè)試
(a). guest方執(zhí)行
cd ${EGGROLL_HOME}/python/eggroll/roll_site/test
python -m unittest test_roll_site.TestRollSiteCluster.test_remote_rollpair
等待執(zhí)行完成出現(xiàn)"OK"字段為guest方發(fā)送成功。
(b). host方執(zhí)行
cd ${EGGROLL_HOME}/python/eggroll/roll_site/test
python -m unittest test_roll_site.TestRollSiteCluster.test_get_rollpair
等待執(zhí)行完成出現(xiàn)"OK"字段為host方接收成功。
至此測(cè)試完成。
