Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

增加使用统计功能 #965

Closed
yebie opened this issue Dec 20, 2016 · 11 comments · Fixed by #1030
Closed

增加使用统计功能 #965

yebie opened this issue Dec 20, 2016 · 11 comments · Fixed by #1030
Assignees

Comments

@yebie
Copy link

yebie commented Dec 20, 2016

需求

原始需求参考 #547 :想要统计用户demo或example中使用次数、时间、用户名等。

如果扩展一下,可以提供一个在线的 log 和/或 config 的上传工具,后续一方面可以为开发人员提供统计功能(次数统计、错误统计、用户习惯统计等)以优化代码;另一方面可以通过提炼规则,为用户提供自动的优化建议。

@yebie
Copy link
Author

yebie commented Dec 20, 2016

实现简述

客户端:提供一个python脚本,通过指定参数或者自动获取,将上传所需的数据(包括可能的文件内容)搜集到,并发送http(s)请求,上传数据给服务器。更进一步的话,可封装为类似 padddle feedback的命令。

服务器:在官网<www.paddlepaddle.org> 上新增一个接口,类似 www.paddlepaddle.org/feedback/upload,只接受POST请求。如果官网所在服务器不方便添加处理代码/存储服务,可以在其它地方自行搭建一个简单服务实现上述功能,然后在官网的 nginx/apache 中利用反向代理将上传请求转发。

特殊处理:考虑到paddlepaddle的用户中,不少是百度内部用户,而内部的运行环境可能不方便访问公司外的官网。如果确实有这种情况发生,可以在内部开一个转发服务,同时客户端脚本改为支持按 官网 > 内部服务 的顺序依次尝试上传。

@yebie
Copy link
Author

yebie commented Dec 20, 2016

接口定义

服务器
服务器的上传接口支持这些参数:

  • log_file: 和config_file参数至少要存在一个。log文件内容
  • config_file: 和log_file参数至少要存在一个。配置文件内容
  • system_time: 可选,上传时的客户端时间,和服务器时间比对后,可以修正log文件中的时间
  • paddle_version: 可选,自动读取到的paddle version信息。今后若有自动诊断或人工诊断这个信息可用上。
  • git_user: 可选,当前可用于判断新老用户;今后可用于诊断后联系或通知用户。

客户端
脚本运行时可手动指定如下参数:

  • --log_file: log文件路径。若忽略此参数,则config_file必须存在。
  • --config_file: 配置文件路径。若忽略此参数,则log_file必须存在。
  • --git_user: github用户名(包括邮箱,下同)。若忽略此参数,优先读取已缓存的用户名,其次可尝试在当前目录中 git config --list找到用户名,其次(在-v的情况下)提示用户自行输入,都不满足则置空。
  • 另外,脚本应该自行读取paddle_versionsystem_time,不需要用户指定。
  • 考虑到不打扰用户的话,默认为静默方式(即不打印任何log,甚至不提示用户输入git_user),但加入-v后均可打开。

@yebie
Copy link
Author

yebie commented Dec 20, 2016

实现方案

服务器

可采用任何主流的web实现方案(我个人习惯python+django……)。

不过可能要确认下:

  • 官网是用哪个web server启动的?可以修改配置么(可能有转发相关配置需添加)
  • 官网有没有语言限制、流量限制、内存限制等等?
  • 官网有没有配置DB、缓存、单独的文件存储,如果有的话是否可以对代码开放?

如果正常的话,服务器在收到请求后要做的事情……

  1. 检查请求的参数合法性,有些可以nginx/apache做掉如请求大小限制;有些只能代码完成如log_file和config_file参数的检查
  2. 根据IP、用户名等数据,检查近期是否已有上传,如果已有上传则抛弃此请求——用于防止恶意刷压力、或用户未注意到的重复上传
  3. 存储上传的一个或多个文件(可以本地,不过更好的是有单独的文件存储),获得存储后的文件地址
  4. 通过SQL injection检查后,在DB中加入一条记录,记录下请求中其它参数、各文件地址、请求发送IP、服务器时间等。

客户端

提供python脚本,按之前所述获取几个参数的值,拼成POST请求发送给服务器即可。注意点是:

  • 如前所述,需要注意服务器地址的自动切换
  • 好像开发环境中有安装python的requests库……看看纯运行环境中是否也能用上它:D
  • 一开始可只有单独脚本放出,之后封装成paddle feedback之类的命令,再添加到各个demo中更合适
  • 也可以考虑做为paddle train/predict中的一个默认功能(外部配置文件可关闭),但可能不太合适,暂时不考虑这么实现吧。

@yebie
Copy link
Author

yebie commented Dec 20, 2016

欢迎大家讨论:D

@wangkuiyi
Copy link
Collaborator

wangkuiyi commented Dec 20, 2016

@reyoung 这个信息上传工作是不是可以实现在某个Python API函数里?

比如,如果有某个API函数是每个Paddle程序都会调用的,那么给那个API函数加一个参数,job_name,然后在函数实现里把包括 job_name 的作业开始信息上传到日志统计服务器。

类似的,如果每个Paddle程序正确结束的时候都会调用某个API函数,则在那个函数实现里上传作业正确结束信息。从而实现 #547 里说的统计正确运行demo的比率。

一个初步想法。抛砖引玉。

@yebie
Copy link
Author

yebie commented Dec 21, 2016

@wangkuiyi 如果某次运行是用户ctrl+c结束的,或者长期运行没结束,那是不是和程序运行错误无法分辨了?

个人觉得如果正常运行只要统计次数、name、时间即可;反而是错误运行应该多搜集些信息,分析后有助于bug修复或用户体验改进。所以想在接口中把log文件和config文件上传。

另外土土问一下,paddle该怎么配置参数,能把log输出到文件呢?我说的不是 tee命令哈,我在paddle train时加上--log_dir=/xxxx/logs,但是没看到/xxxx/logs里面有日志文件反而还是屏幕输出了

@livc
Copy link
Member

livc commented Dec 21, 2016

@yebie tee是既保存为文件又可以输出在屏幕上吧,如果只想保存 log 到文件内,可以试试 nohup command>file 2>&1 &

@yebie
Copy link
Author

yebie commented Dec 21, 2016

@livc 我不是说shell的实现方式把log重定向到文件里,我是想要在paddle的命令中支持log写入到文件。

你说的是例如:
paddle train ... >logs/train.log 2>&1
而我想要的是类似于:
paddle train ... --log_dir=/xxxx/logs

后者的好处是,如果要把log文件上传的功能集成到paddle之中,这种方式至少能知道从哪个目录里找log文件……前者就只能手动指定了。

@reyoung
Copy link
Collaborator

reyoung commented Dec 21, 2016

个人感觉收集日志和配置文件,并不太合适。对用户的隐私不太尊重。

@reyoung
Copy link
Collaborator

reyoung commented Dec 21, 2016

提供一个python脚本,通过指定参数或者自动获取,将上传所需的数据(包括可能的文件内容)搜集到,并发送http(s)请求,上传数据给服务器。更进一步的话,可封装为类似 padddle feedback的命令。

不要使用python。。因为不同用户的python解释器版本不一致,同时安装的第三方包不一致。这个很脆弱的。

如果只是请求服务的话,curl+bash应该足够搞定这些。

@reyoung
Copy link
Collaborator

reyoung commented Dec 21, 2016

另外,如果真要做的话,不要存文件系统。直接扔数据库。一些常见的数据库性能上不会比文件系统差太多,同时还有更好的可扩展性。

目前统计代码参考 https://github.com/PaddlePaddle/Stat

yebie pushed a commit to yebie/Paddle that referenced this issue Jan 6, 2017
zhhsplendid pushed a commit to zhhsplendid/Paddle that referenced this issue Sep 25, 2019
wangxicoding pushed a commit to wangxicoding/Paddle that referenced this issue Dec 9, 2021
lizexu123 pushed a commit to lizexu123/Paddle that referenced this issue Feb 23, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

5 participants