Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
ElasticCTR
提交
42106f1b
E
ElasticCTR
项目概览
PaddlePaddle
/
ElasticCTR
通知
8
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
E
ElasticCTR
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
未验证
提交
42106f1b
编写于
3月 11, 2020
作者:
D
Dong Daxiang
提交者:
GitHub
3月 11, 2020
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #3 from wangjiawei04/master
modify mlruns not update bug
上级
d9c384b2
19539910
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
74 addition
and
30 deletion
+74
-30
README.md
README.md
+5
-18
elastic-ctr-cli/elastic-control.sh
elastic-ctr-cli/elastic-control.sh
+36
-12
elastic-ctr-cli/listen.py
elastic-ctr-cli/listen.py
+1
-0
elastic-ctr-cli/service_auto_port.py
elastic-ctr-cli/service_auto_port.py
+32
-0
未找到文件。
README.md
浏览文件 @
42106f1b
# Elastic
CTR
# Elastic
REC
Elastic
CTR
是分布式训练CTR预估任务和Serving流程一键部署的方案,用户只需配置数据源、样本格式即可完成一系列的训练与预测任务
Elastic
REC
是分布式训练CTR预估任务和Serving流程一键部署的方案,用户只需配置数据源、样本格式即可完成一系列的训练与预测任务
*
[
1. 总体概览
](
#head1
)
*
[
2. 配置集群
](
#head2
)
...
...
@@ -14,15 +14,15 @@ ElasticCTR是分布式训练CTR预估任务和Serving流程一键部署的方案
1.
快速部署
Elastic
CTR当前提供的方案是基于百度云的Kubernetes集群进行部署,用户可以很容易扩展到其他原生的Kubernetes环境运行ElasticCTR
。
Elastic
REC当前提供的方案是基于百度云的Kubernetes集群进行部署,用户可以很容易扩展到其他原生的Kubernetes环境运行ElasticREC
。
2.
高性能
Elastic
CTR采用PaddlePaddle提供的全异步分布式训练方式,在保证模型训练效果的前提下,近乎线性的扩展能力可以大幅度节省训练资源。在线服务方面,ElasticCTR
采用Paddle Serving中高吞吐、低延迟的稀疏参数预估引擎,高并发条件下是常见开源组件吞吐量的10倍以上。
Elastic
REC采用PaddlePaddle提供的全异步分布式训练方式,在保证模型训练效果的前提下,近乎线性的扩展能力可以大幅度节省训练资源。在线服务方面,ElasticREC
采用Paddle Serving中高吞吐、低延迟的稀疏参数预估引擎,高并发条件下是常见开源组件吞吐量的10倍以上。
3.
可定制
用户可以通过统一的配置文件,修改训练中的训练方式和基本配置,包括在离线训练方式、训练过程可视化指标、HDFS上的存储配置等。除了通过修改统一配置文件进行训练任务配置外,Elastic
CTR
采用全开源软件栈,方便用户进行快速的二次开发和改造。底层的Kubernetes、Volcano可以轻松实现对上层任务的灵活调度策略;基于PaddlePaddle的灵活组网能力、飞桨的分布式训练引擎Fleet和远程预估服务Paddle Serving,用户可以对训练模型、并行训练的模式、远程预估服务进行快速迭代;MLFlow提供的训练任务可视化能力,用户可以快速增加系统监控需要的各种指标。
用户可以通过统一的配置文件,修改训练中的训练方式和基本配置,包括在离线训练方式、训练过程可视化指标、HDFS上的存储配置等。除了通过修改统一配置文件进行训练任务配置外,Elastic
REC
采用全开源软件栈,方便用户进行快速的二次开发和改造。底层的Kubernetes、Volcano可以轻松实现对上层任务的灵活调度策略;基于PaddlePaddle的灵活组网能力、飞桨的分布式训练引擎Fleet和远程预估服务Paddle Serving,用户可以对训练模型、并行训练的模式、远程预估服务进行快速迭代;MLFlow提供的训练任务可视化能力,用户可以快速增加系统监控需要的各种指标。
本方案整体结构请参照这篇文章
[
ElasticCTR架构
](
elasticctr_arch.md
)
...
...
@@ -85,19 +85,6 @@ bash elastic-control.sh -c
```
bash
bash elastic-control.sh
-l
```
2.
mlflow可视化界面
注意:为了正常预览,请确保您本机的8111端口未被占用
在训练过程中,用户还可以通过mlflow的可视化界面来追踪训练进度,当屏幕上有如下输出后,
```
bash
mlflow ready!
```
用户可以用本机的浏览器访问127.0.0.1:8111查看训练情况界面。如果本机有公网ip且8111端口开放,那么用户可以在任何机器上用浏览器访问${external_ip}:8111 查看训练情况界面
可以看到页面显示效果如下所示:
![
elastic.png
](
https://github.com/suoych/WebChat/raw/master/MacHi%202019-11-25%2014-19-30.png
)
![
dashboard.png
](
https://github.com/suoych/WebChat/raw/master/MacHi%202019-11-25%2014-18-32.png
)
## <span id='head5'>5. 预测服务</span>
用户可以输入以下指令查看file server日志:
...
...
elastic-ctr-cli/elastic-control.sh
浏览文件 @
42106f1b
...
...
@@ -364,14 +364,14 @@ function log()
echo
"Cube Transfer Log Has not been generated"
fi
echo
""
echo
"Padddle Serving Log:"
serving_pod
=
$(
kubectl get po |
grep
paddleserving |
awk
{
'print $1'
}
)
kubectl logs
${
serving_pod
}
|
grep
__INFO__
>
paddleserving.log
if
[
-f
paddleserving.log
]
;
then
tail
-n
20 paddleserving.log
else
echo
"PaddleServing Log Has not been generated"
fi
#
echo "Padddle Serving Log:"
#
serving_pod=$(kubectl get po | grep paddleserving | awk {'print $1'})
#
kubectl logs ${serving_pod} | grep __INFO__ > paddleserving.log
#
if [ -f paddleserving.log ]; then
#
tail -n 20 paddleserving.log
#
else
#
echo "PaddleServing Log Has not been generated"
#
fi
}
datafile_config
()
...
...
@@ -395,9 +395,9 @@ function apply()
kubectl delete jobs.batch.volcano.sh fleet-ctr-demo
fi
kubectl apply
-f
fleet-ctr.yaml
python3 listen.py &
echo
"waiting for mlflow..."
python3 service.py
#
python3 listen.py &
#
echo "waiting for mlflow..."
#
python3 service.py
return
}
...
...
@@ -406,7 +406,7 @@ function apply()
###############################################################################
CMD
=
""
CPU
=
4
CPU
=
2
MEM
=
4
CUBE
=
2
TRAINER
=
2
...
...
@@ -478,6 +478,30 @@ while true; do
esac
done
if
[
$CMD
=
"config_resource"
]
;
then
if
!
grep
'^[[:digit:]]*$'
<<<
"
$CPU
"
>>
/dev/null
||
[
$CPU
-lt
1
]
||
[
$CPU
-gt
4
]
;
then
die
"Invalid CPU Num, should be greater than 0 and less than 5."
fi
if
!
grep
'^[[:digit:]]*$'
<<<
"
$MEM
"
>>
/dev/null
||
[
$MEM
-lt
1
]
||
[
$MEM
-gt
4
]
;
then
die
"Invalid MEM Num, should be greater than 0 and less than 5."
fi
if
!
grep
'^[[:digit:]]*$'
<<<
"
$PSERVER
"
>>
/dev/null
||
[
$PSERVER
-lt
1
]
||
[
$PSERVER
-gt
9
]
;
then
die
"Invalid PSERVER Num, should be greater than 0 and less than 10."
fi
if
!
grep
'^[[:digit:]]*$'
<<<
"
$TRAINER
"
>>
/dev/null
||
[
$TRAINER
-lt
1
]
||
[
$TRAINER
-gt
9
]
;
then
die
"Invalid TRAINER Num, should be greater than 0 and less than 10."
fi
if
!
grep
'^[[:digit:]]*$'
<<<
"
$CUBE
"
>>
/dev/null
||
[
$CUBE
-lt
1
]
||
[
$CUBE
-gt
9
]
;
then
die
"Invalid CUBE Num, should be greater than 0 and less than 10."
fi
fi
case
$CMD
in
config_resource
)
config_resource
...
...
elastic-ctr-cli/listen.py
浏览文件 @
42106f1b
...
...
@@ -14,6 +14,7 @@ def rewrite_yaml(path):
os
.
system
(
cmd
)
time
.
sleep
(
5
)
os
.
system
(
"rm -rf ./mlruns >/dev/null 2>&1"
)
while
True
:
r
=
os
.
popen
(
"kubectl get pod | grep fleet-ctr-demo-trainer-0 | awk {'print $3'}"
)
info
=
r
.
readlines
()
...
...
elastic-ctr-cli/service_auto_port.py
0 → 100644
浏览文件 @
42106f1b
import
time
import
os
import
socket
def
net_is_used
(
port
,
ip
=
'0.0.0.0'
):
s
=
socket
.
socket
(
socket
.
AF_INET
,
socket
.
SOCK_STREAM
)
try
:
s
.
connect
((
ip
,
port
))
s
.
shutdown
(
2
)
print
(
'Error: %s:%d is used'
%
(
ip
,
port
))
return
True
except
:
#print('%s:%d is unused' % (ip, port))
return
False
os
.
system
(
"ps -ef | grep ${USER} | grep mlflow | awk {'print $2'} | xargs kill -9 >/dev/null 2>&1"
)
os
.
system
(
"ps -ef | grep ${USER} | grep gunicorn | awk {'print $2'} | xargs kill -9 >/dev/null 2>&1"
)
current_port
=
8100
while
True
:
if
os
.
path
.
exists
(
"./mlruns"
):
if
not
net_is_used
(
current_port
):
os
.
system
(
"mlflow server --default-artifact-root ./mlruns/0 --host 0.0.0.0 --port "
+
str
(
current_port
)
+
" >/dev/null 2>&1 &"
)
time
.
sleep
(
3
)
print
(
"mlflow ready, started at port"
+
str
(
current_port
)
+
"!"
)
exit
(
0
)
else
:
current_port
=
current_port
+
1
continue
else
:
time
.
sleep
(
30
)
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录