sxlion的个人博客分享 http://blog.sciencenet.cn/u/sxlion

博文

SAS程序优化_一万次循环

已有 3263 次阅读 2020-5-11 03:02 |个人分类:教学科研|系统分类:科研笔记| 高性能程序, SAS, 编程优化

前天跑了一个验证程序,考察下数据输入对建模输出的影响,也即是同一组观察值被多次随机划分成训练集和测试集对算法模型预测效果的影响。当然涉及到具体问题时,总是有很多需要依据实际情况来考虑,比如outliers值的甄别和处理、抽样方法的选择等等,这里不做过多说明。此文的目的主要是解决一个问题:


当划分次数为10000次时,SAS程序磁盘负荷大,运行时间长,怎么优化?

  具体情况是划分次数为10次时几分钟就跑完了,100次时大概十分钟跑完,1000次时花了4个多小时10000时跑了超过24小时只跑到中间的一个PROC,还未结束。反正程序写好了,心想只要时间足够总能跑完的时候,毕竟是台15年的年老笔记本,要求不能太高。等了晚上周围都静下来的时候,只听到笔记本风扇狂转的声音,一摸键盘,感觉不对劲,烫手!打开任务管理器看看SAS占用资源的情况:内存才使用100M多一点,CPU使用才占10%左右,但是磁盘运行速度在400M/s徘徊。又查了一下主要数据集,发现有个文件大小高达2G,这个是出问题的根源。虽然老年机里面装的是号称当时地表最强SM951M.2 SSD,标称连续读写超1500M/s,当时毕竟用了这么多年,性能有所下降。隐隐约约的还有点担心使用寿命,问题很明显:面对数量级的递增打击,原程序存在读写瓶颈,需要优化io,这是也SAS处理大数据集的一个通病,相关技术文章无数。我们的优化目标,尽量让电脑的各个部件资源运行合理均衡,避免伤害(如下图所示)。

Figure_1.png

翻开SAS HELP手册,Optimizing System Performance几百条,ioSAS优化的大头,没有优化GPU的内容,毕竟SAS2019年才官宣与NVIDIA合作。说明SAS暂时既不能分析图像,又不能使用GPU加速。SAS公司Henry Bequet2018年出了本书《Deep Learning for Numerical Applications with SAS》。书名看起来很嗨,“用SAS搞深度学习”,翻开一看,我留下了苦涩的泪水。谁说当一辈子SAS程序员不需要学习新语言了,第一个例子就是使用CASSAS Cloud Analytic Services)语言,这是一门跟云有关的新SAS语言,说好的PROC HPDL怎么就没了?第六章GPU里面需要使用C/C++。当然如果以后想要愉快的使用SAS,你还得学写第二代DATA步语言简称DS2,另SAS还有一个新语言叫FedSQL,我也不知道干什么用的。

言归正传,16G的内存大部分都闲着,可以用memoryio,在Techniques for Optimizing I/O页面里搜关键词“memory”,有两个地方提示可以用增加内存来优化io

1,系统选项:BUFNO=CATCACHE,有一条提示When using both the CBUFNO= and CATCACHE= options, if one of the option's value isset higher than zero, the other option must be set to zero.大概是二选一的意思,CATCACHE与目录有关,抛弃。网上说建议使用BUFNO= 10,加到options 后面,我的SAS9.4版本的高级编辑器里面没有高亮关键词,运行了没有报错,应该是新版本增加的功能;

2,使用SASFILE语句,功能是把数据集放到内存中,减少open/close操作。感觉这个太合适我遇到情况了。有个2G的数据集放到了宏循环中,每次循环都要来次开、闭、读、写操作,太费io了,这个功能非常对症。

理论上来说上面是解决磁盘使用过高问题,运行时间过长还得考虑考虑。我还做了以下的一些小优化:

1,在data后面使用wherekeep等选项、关掉部分OUTPUTResult Viewer、还有限制log显示,其实也是减少不必要的iomemory,顺便缩短时间;

2,代码里面有写PROCs比如regpls有高性能替代的,本来想改的,发现hp系列部分功能不全,老的PROCs已经优化的很好了(主要是有BY-group processing),我的数据量不算太大,前面运行过,没花太多时间,不折腾了。

3,代码里面有几个HP的分析步,没有BY选项,不过有PERFORMANCE,属于可以单机或分布式的高级替代。刚好笔记本的CPU是48线程,就设置成THREADS=8

4,上面设置好,看起来不错。运行一下,划分10100次都没撒问题,1000次不到3小时跑完,速度也提高了不少。直接上10000次,倒水回来一看,程序不见了,速度消失。只好重来,一步一步运行,在log发现有个WARNINGout of memory。一看明白了,SAS默认使用内存不超过2G,在C:\Program Files\SASHome\SASFoundation\9.4\nls\en文件夹里打开sasv9.cfg file修改"-MEMSIZE"值,直接给8G

运行程序,发现磁盘速度大部分小于1M/s,内存300M2G之间波动,基本保持在450MBCPU使用率保持了20%左右,风扇稳定发挥,笔记本外壳不烫手。终于不用担心盘脆脆了,不过文章写完了,全部的程序还没跑完。

继续跑,大概跑了两天(48h)的样子,SAS崩溃了。很显然,数据集观察值100倍的增加给机器带来的压力不是线性的100倍,很可能会呈指数倍增,运算时间也不是简单的线性倍数。因为还是用SAS data步和笔记本,所以就不指望云计算和分布式计算了。当然代码还可以继续优化,既然HP系列的PROCs没法并行,可以用循环来解决这个稳定性的问题。10000次带来的整体压力显然对于老笔记本来说有点超了,那么把主要大size数据集等分成10份或100份,用宏来生成代码,这样带来的只是时间的线性增加,估计30小时完成运算。但是我暂时不打算继续增加代码了,毕竟已经有两个宏嵌套了,再嵌套下去,代码debug压力对脑细胞伤害大、花时间,我还得继续改论文,时间紧迫。这里有个非常简单的解决方法:把代码发给有台式机的朋友同事,帮忙跑一下,把结果数据集发我就OK了。

不得不说很多时候,解决一个问题快慢优劣,与硬件、软件、代码和程序员都有关,很多时候讲究平衡

微信公众号“SASlist”于2020年5月10日首发



https://blog.sciencenet.cn/blog-623414-1232592.html

上一篇:偏最小二乘法PLS的零碎印象
收藏 IP: 50.70.196.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-3-28 22:32

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部