MTrd并行编程与py量化性能优化
zw-ps:几年前d老文章了,现在依然有参考价值,特别是对于初学者。
参见:
zw公开课与哈佛、斯坦福MBA案例教学
TQ极宽量化·课程简介
这几天,在做py量化的性能优化,
GPU并行开发,因为cuda8SDK的正式版本,迟迟未能推出,其中的关键python模块库在测试版,又是空缺,所以只能押后。
多cpu并行,numexpr,numba是首选,而且numba对于GPU加速,也有部分支持,专业的numbaPro版本,可能更加方便。
为了优化,除了这些模块库外,也参考了pycuda、pyopencl、firearray等模块库,甚至连冷门的parakeet模块库,都专门看过文档。
幸运的是,在所有的编程语言里面,python的多cpu并发开发,是最简单的,基本上:numexpr,就可以完成。
简单的代价就是限制,目前numexpr内部的字符串是8位的,对于双字节的utf内码字符串,支持度基本为零,据说,numexpr3.0,会解决这个问题。
在处理tick数据时,numexpr,numba,虽然能够进行局部优化。
不过,绝大部分环节,还是力有未逮、
MTrd是zw前些年,处理字库数据,设计的一种简单、高效的并发编程框架,而且还曾经设计过一个logo图标。
MTrd是Mul-Tread,多线程的缩写,看起来:高大上,其实是一种非常“土鳖”的设计
原理是:利用windows、linux等操作系统的均衡负载,内部调度,把大任务,分拆成n个小任务,用bat等批命令脚本及参数完成。
以字库为例,每套字库6千多个汉字,图像数据,非一般多,一种字体,同样的流程,就要运行6千多遍。
如果采用MTrd架构,拆分成60组,每组100个汉字,而且可以放到多台电脑同时运行,理论上,速度可以快60倍。
py量化,其实与字库数据处理非常类似。
股票量化,如果全盘测试,差不多3000支股票,和国标一级字库的汉字数差不多。
按每组100只股票,分拆30组,分分钟速度可以提高30倍。
mtrd的一个好处就是,基本上,无需修改任何源码,自动加速。
以py量化为例,以下py代码,文件名:pysub010.py:
xv1=sys.argv[1];xd1=int(xv1)
xv2=sys.argv[2];xd2=int(xv2)
print('xd,',xd1,xd2)
#
xtick2tim_allcode(qx,xd1,xd2)
其中,函数:xtick2tim_allcode
是把所有的tick数据,按设定的时间,转为5分钟、10分钟的分钟合成数据。
函数当中的参数变量:xd1,xd2,分别是起始股票编号、结束股票编号
如:xd1=100,xd2=200
表示,针对序号:100-200的股票,进行tick数据转换。
股票代码文件,可以参看zwdat里面inx目录下的:stk_code.csv文件
如果,采用传统的py模式,单独2015年一年的tick数据,双e5平台,都要运行一个晚上。
虽然时间长,看系统的cpu负载,只有15%左右,说明,绝大部分cpu的计算能力,处于空载状态。
原来的MTrd,主控程序,是用delphi编写的,会随时监控子程序运行状态,自动调度参数。
python版本的MTrd,为了简化,直接采用bat批命令,进行调度。
python版本的MTrd的一个优势是,每个python副本,都是一个独立的、完整的python系统,单个子程序崩溃,不会影响其他程序。
这个也是python处理并发,比较啰嗦,而且需要耗费较多的系统资源的主要原因。
不过,现在内存白菜价,非一般便宜,64G属于py量化的标配,这些都不是问题。
下面,先编写一个调用pysub010.py程序的批命令文件:mx001.bat
脚本代码如下:
python pysub010.py %1 %2
@ping -n 10 127.1>nul
exit
其中
@ping -n 10 127.1>nul
表示:运行完成后,等待10秒,再运行exit命令,退出命令窗口
python pysub010.py %1 %2
表示,调用python,运行pysub010.py程序代码,并向程序传递参数:%1 %2
其中:%1 表示第一个参数,对应py程序的变量xd1;%2类推
相关细节,可以参考bat语法
由于python运行,需要设置环境参数,因此调用bat批命令时,需要通过zwpython\py35\目录下的程序:
WinPython Command Prompt.exe
进入dos命令窗口,再切换到py源码和bat所在目录,调用bat脚本。
为简化设计,默认bat、py源码,全部位于同一目录。
此外,通过:WinPython Control Panel.exe程序,把python与系统环境进行绑定,理论上:可以直接调用bat批命令。
如果出现问题,还是采用以上的手工模式,调用bat脚本。
mx001.bat批命令文件,只是调用单个程序,相当于MTrd的一个sub子程序。
因此,需要另外编写主控bat脚本。
MTrd主控脚本,文件名是:mx100.bat
源码如下:
start mx001.bat 0 100
@ping -n 3 127.1>nul
start mx001.bat 100 200
@ping -n 3 127.1>nul
start mx001.bat 200 300
@ping -n 3 127.1>nul
start mx001.bat 300 400
@ping -n 3 127.1>nul
start mx001.bat 400 500
@ping -n 3 127.1>nul
...
注意,以上脚本,采用start命令,调用mx001.bat脚本,是为了并发运行。
@ping -n 3 127.1>nul,每个子程序,调度间隔时间为3秒,这个可以自己修改。
同时运行的子程序数目,一般为系统软内核的80%,这个是经验参数。
剩余的20%内核,保留给操作系统,否则,可能会影响整体运行速度。
以zw-GPU工作站为例,双e5-2670cpu,共32个软内核,80%就是25-26个。
A股的股票数目大约2900多只,勉强开29个,也是可以的。
口说无凭,还是看看贴图吧:
下面是MTrd同时运行18个子程序的调度截图。
由截图可以看出,cpu的负载非常均衡:
整体负载75-85%,单个python子程序3%左右
运行效率比单一的py程序,快了18倍。
如果再增加子程序到25-30个,也是可以的,这个大家自行测试。
关于MTrd的介绍,到此打住,更多细节,大家自己研究。
MTrd与,numexpr,numba,python性能优化,属于比较专业的领域。
zw量化培训班,也是作为高级班的课件进行讲述的。
【8-11补充】
早上,重新优化了bat+python版本的MTrd架构,并且实盘运行30组,全市场2900多只股票的tick数据: 十分钟数据线转换。
以下是运行截图:
由截图可以看到,cpu的运行负荷是100%,稳定速度是2.97-2.99G
e5-2670的默认频率是2.6,睿频是2.97-2.99G,相当于超频10%,cpu的计算能力,已经被充分利用了。
【MTrd的特点】
MTrd虽然简单,但非常实用,无需修改源码,而且可以用于win、linux、OSX等各种平台。
MTrd对于速度的提升也是非常明显的,一般是cpu软内核总数多少,就可以提升多少倍。
无需考虑进程调度、负载均衡,这些,都由操作系统负责。
无需修改,即可支持多cpu,多电脑集群模式
【优化BAT主控脚本】
windows平台的bat脚本,其实也是支持多行for命令的。
其他平台的脚本,相对win强大n倍,自己看看bat,修改一下就可以了。
修改后的主控脚本文件名是:mx100.bat
源码如下
f:
cd\zm100
for /L %%i in (0,100,2900) do (
start mx010.bat %%i
@ping -n 5 127.1>nul
)
f:\zm100 是笔者的源码工作目录。
经测试,可以直接运行mx100.bat命令,运行整个程序,无需手工进入dos命令窗口。
这其中的关键就是,最前面的两条命令:
f:
cd\zm100
首先,切换到源码所在的工作目录。
另外,sub子程序调用,也增加了python的路径。
sub子程序调用文件名是:mx010.bat
源码如下
F:\zwPython\py35\python-3.5.2.amd64\python m3x1.py %1
@ping -n 10 127.1>nul
rem exit
其中,F:\zwPython\py35\python-3.5.2.amd64\
是笔者zwpython的运行目录。
另外,bat修改变量,相对python啰嗦不少,因此,默认只使用一个参数变量。
py脚本当中的xd2变量,改为:xd2=xd1+100
源码就不再重复了。
最后,看看鲁大师的监控截图
cpu的内核温度在65度左右
硬盘虽然30个线程,并发频繁读写,温度也控制在46度,SSD还是不错的
cpu整体温度,主板温度,都控制在38度
要知道,这几天,刚刚立秋,北京部分热点地区,局部室外温度都超过50度
由此可见,zw-GPU工作站的整体设计,还是靠谱的
机箱内的散热风道、辅助风扇,设计合理
4U加长版超大机箱,四铜管大风扇散热器,非常给力
【MTrd-demo源码】
MTrd文章发布后,不少学员、网友咨询相关细节,
特意做了个MTrd-demo,发布在zwpy量化群文件和zw网盘。
运行前,注意根据自己的zwpy安装路径 修改相关参数




请大家关注TOP极宽量化公众号:TOP极宽量化,浏览,TopQuant.vip极宽网站,大量原创量化资料和课件、案例源码。关注公众号,即可获得最新网盘下载地址。TQ极宽·相关网络QQ社群如下:
- QQ群号:124134140,TOP极宽金融量化总群,面向专业金融实盘用户,三千人大群。
- QQ群号:1057170501,zwPython.com学习群,面向py初学者和大众小白用户,两千人大群。
- QQ群号:699266891,TFB极宽足球大数据,TFB=TopFootBall
- QQ群号:790548107,FASTAI智能量化
- QQ群号:663952322,PytorchLightning智能框架
- QQ群号:655402626,CBF中华大字库,ziwang.com字王网站,已升级为元字库: metafont.vip