招聘程序员、《北京沉没》和Go语言性能

  先转发一篇招聘,我的朋友在做云计算方面的创业,招Flex/Erlang/Python程序员。工作地点在北京,有兴趣的人可以点进去看一看

  5、6月BLOG更新频率明显变慢了,有人问我是不是开始玩微博了,还有人问是不是在准备跳槽。都不是,最近公私事都有些忙,懈怠了,不好意思。另外随着年龄变老,似乎越来越倾向更长篇幅的写作,零碎的想法大多懒得动手敲(记得科学松鼠会上翻译过一篇报道,研究人员发现年龄和写作博客的长度成正比,没搜索到链接)。还是该放松点儿,有长则长,可短就短。只要写出来,总会有价值。

  前两天北京下大雨内涝。豆瓣上马上出现了一篇与此有关的小说《北京沉没》,得到众多推荐,大家都在殷切等待小说的后续情节。

  关于编程语言的性能向来是个大水坑,有诸多争论。前不久,Google公司的Robert Hundt刚刚发表了一篇论文 Loop Recognition in C++/Java/Go/Scala.,,发布了一个简明而紧凑的Performance Benchmarks,分别对C++, Go, Java, Scala四种语言进行性能比较。测试包使用的loop finding算法实现中不涉及任何高级语言特性,只使用了各语言的基础设施:基本容器类、循环和选择、内存分配机制等。文中的主要结论是在32位系统下C++程序最快,常规条件下Java语言运行时间是C++程序的12.6倍,Go语言为7倍;相同的语言条件,不同实现效果差距很大,例如:C++语言如果采用一般教科书知识的“学生式”实现,会比有经验工程师精心优化后的结果慢8倍以上。而Java语言的主要瓶颈在于其内存回收机制,如果采用SPEC优化,则速度起码提高3倍,如果在64位系统下,性能比32位系统提高超过1倍。更多细节,大家可以直接看论文。

  论文对Google自己人发明的Go语言并没有太推崇,认为其性能还比不上C++,开发难度又高于Java。于是Go语言的团队来劲了,刚在官方BLOG上指出,Go语言版本的算法还有很大的优化余地。他们使用了Go开发包里提供的性能测试工具对代码进行了改善,运行速度提高了10倍以上,而申请的内存降低了6倍。

  这篇论文在其他语言社群内也掀起不少讨论。编程语言的性能比较往往涉及到很多因素(编程者的经验和风格,比较题目与不同语言的特性之间的契合等)。对于实际工程而言,选择编程语言的着眼点应该是现有资源和经验,并考虑混合编程。我个人在pFind项目的经验是,保守些,尽量利用团队内多数人熟悉的技术。如果项目负责人只顾着添经验追时髦,把手头的正事当作尝试新技术的小白鼠,十有八九要坏事。

流水帐.2011.6.11

  哪吒系统的云服务,这个月底应该可以开始试运行。

  前一阵发生了很多与驾驶汽车有关的案件:药家鑫、陈家、高晓松……驾驶里程超过6000公里了,不再像磨合期那么诚惶诚恐。北京的路面又像战场,开着开着总会生出些懈怠、暴躁和狂妄来。握着方向盘,就应保持敬畏之心,对自己和别人的性命负责。反省中。

  Bitcoin迅速热起来。范围远远超出了技术圈子《时代周刊》和《三联生活周刊》上都见到了报道评论。前天下载了中本聪(Satoshi Nakamoto)的论文《Bitcoin: A Peer-to-Peer Electronic Cash System》读了一遍。关于其负面评价,张沈鹏向我推荐了张志强的这篇《bitcoin的技术和金融缺陷》。很多人认为,由于严重挑战了各国央行的权威,Bitcoin将会很快受到政府的限制

Linux内核即将进入3.0时代

  昨天Lyz美女编译Linux内核panic了,今天早上和她一起冲进机房去重启。每次进机房都觉得轰鸣声好像飞机的发动机。空调太冷,打喷嚏。

  5月30日,Linus在动身前往日本参加LinuxCon 会议前,将他的Kernel git tree 打上了3.0-rc1标签。漫长的2.6时代终于要结束了。

  2.4内核历时4年24个版本。2.6内核历时6年40个版本。这是关键性的10年,Linux内核已经成为互联网服务的基石,虽然PC桌面进展不明显,但在智能手机领域Android系统大红大紫。回想起99年在rainbow的机器上安装红帽子,那时候Linux刚刚摆脱黑客面纱,被IBM和Oracle等商业公司支持,很多大学老师也没听过。大学生只有在蓝宝石和AKA这类爱折腾的草根技术组织里才有机会接触开源的世界。如今计算机专业科班出身的孩子们,若没用过Linux都不好意思和别人打招呼。

LINPACK和WINE

  最近在忙哪吒提供在线服务的事。全都是配置集群节点SSH、NFS、MPI和编译安装各种库这种杂事。

  今天刚刚在集群上编译通了LINPACKATLAS两个数值计算的库。以前总在超级计算机排行榜的新闻里听到LINPACK的大名,这下有机会见识了。ATLAS编译时间好久,针对硬件做很多优化设置(Automatically Tuned)。本科学线性代数的时候总逃课去上网和编程,没学扎实。工作以后才发现,只要稍微涉及一点科研的事情,数值计算就缺不了。不懂这个的程序员,感觉工资都会少一截。连有关黑客电影都叫The Matrix。关于这个问题,参考孟岩2006年的经典BLOG《理解矩阵》

  移植工作的拦路虎之一是COM控件的问题。某质谱仪器公司的数据格式是私有的,必须用他们提供的控件去读。悲剧的是,他们只提供WIN32下的COM控件。上个月他们公司的软件部门负责人来中国访问,问他,答曰Win64很快会提供支持,但是Linux近期内不打算支持。悲剧呀。

  所以就在考虑如何在云平台里解决这个问题。一种方案是在用户的桌面导成公开的文本格式再上传,但是这样影响用户体验,尤其是对那些数据量很大的用户,数据导出(和校准过滤)本来就是他们使用云计算的可能原因之一;另外一种方案是在服务端放一台Windows,专门转换数据,或者更玄一点,用虚拟机伺候,以便维护和并行;最后一个方案是用WINE,这个能搞通,当然是最好的。

  还有若干软件的BUG等着解决。组里又都在忙着分析数据,四脚朝天,抓不到人手来帮我。哇哇哭。

  像上次说的,一旦干起来,就有大量实际问题要解决。奋力开路中。

《The Stuff of Life》中文版即将出版

  《The Stuff of Life》中文版(名为《漫画生命史话》)正在印刷,即将出版。有兴趣的朋友们可以给我捧捧场。

  09年秋天,刘未鹏(pongba) 刚到北京,TopLanguage组织了几次聚会(在那几次聚会的过程中,目睹了尚在豆瓣的张教主辞职去了美空,没多久又出来创业;还和Tinyfool一起去吃韩国烤肉)。其中一次就在图灵出版社里,我和hchi哥去参加。我无意中翻到了《The Stuff of Life》的英文原版,发现这是一本很有趣的科普漫画,与高中时代令人生畏的生物课完全不同。图灵编辑们说,唤起兴趣大于灌输知识,国内市场这种好书太少了。无知者无畏,我就接下了翻译任务。

  诚恳而言,作为非生物科班出身的我,翻译书中的生物学专业内容遇到不少困难,初稿很不令人满意。多亏图灵编辑们没放弃,又找到了火力支援,重新进行翻译和整理,本书才有机会和中国读者们见面。

  由于水平有限,译稿有诸多遗憾之处,无法100%把英文版里俏皮轻松的风格呈现出来,这些不足的责任都归于我。欢迎大家给出意见建议,我会在这个BLOG上长期维护一个勘误表。

列书单.2011.4.25

  老妈飞到欧洲去旅游,我最近也很忙,似乎没有多少有趣的内容可供BLOG上分享。工作上进展倒是很大,稍后再接着上次的话题继续写写“哪吒”和生物云计算。这次先列一下最近的书、CD和电影。最近没空逛书店,都是在网上买的。

  最近在看史蒂夫·克鲁克的《Don’t Make Me Think》科学松鼠会的《冷浪漫》尤塔·鲍尔《幸福》斯蒂格·拉森的《玩火的女孩》
  

  买了周杰伦的《魔杰座》孙燕姿的《是时候》两张CD,开车的时候换换口味。所谓OUT了,就是在KTV里,年轻人合唱《忐忑》,你却跟不上;而你正念念叨叨唱周杰伦的时候,“怎么这么多老周的歌?”。哇哇哭。

  电影,主要看了《里约大冒险》《单身男女》

生物数据处理和分布式并行计算

  写一点我对生物信息云计算的粗浅认识。首先,所谓云计算是一个商业模式的概念,其内涵里Saas占很大比重,网络服务代替软件产品。另一方面,技术角度的个人观点,一个Web服务的后台涉及到了大规模分布式并行的基础设施,才有资格被称为“云计算”(当然,这一定义有争议)。这篇Blog先写技术观点,后面再加关于用户和服务的讨论。

  技术上,大规模分布式并行计算被分为计算密集型和数据密集型两类。

  很多物理、地质和气象等领域的科学计算都是典型的计算密集型问题,CPU是瓶颈,涉及到外存I/O量相对不高。对这类问题的解决思路就是传统的“数据找CPU”。具体一点说,目前编程实现的工业标准是MPI,利用MPI提供的Master/Slave模式启动和调度集群上各个节点上的进程,数据传输共享常利用NFS,底层可以用硬件手段提高数据I/O性能。像Fold@home这一类志愿计算项目,往往本质上也是计算密集型的,当然软件架构有所不同。

  而Web领域的计算问题,例如搜索引擎的信息检索,主要是数据密集型问题(或者也称为IO密集型问题),这种情况下,CPU不再稀缺,海量数据的内外存交换的性能成了的焦点。对此MapReduce模式给出了很有效的解决思路,也就是所谓“CPU找数据”。具体来说,Hadoop是目前最热门的主流框架,先对查询对象进行索引,通过分布式文件系统备份到集群各处,再调度相对轻量的进程,分阶段执行查找和归并操作。

  那么有没有这样的需求:输入输出的数据很海量,其处理过程的算法复杂性又很高,很占CPU。有的,例如现代天文学需要对成T甚至成P的哈勃望远镜图片进行搜索过滤……面对这一类的问题,MapReduce模型就不一定适用,其瓶颈出现在海量数据的传输性能上(Web搜索模型里,尽管是数据密集型应用,但被检索的关键词和输出结果是相对很小的,而在很多科学应用里,往集群提交的待查询本身就是海量数据)。Secter/Sphere在其论文和技术报告里总结,它对Hadoop有明显性能优势的原因之一,就是专门开发的底层传输协议UDT比后者使用的通用TCP/IP要高效。

  对Hadoop这个特定产品来说,由于它是Java实现的,相对于C/C++有性能劣势,这个短板对CPU耗费型的应用来说很要命(这也是Secter/Sphere快的另一个原因)。有很多解决方案,例如Yahoo!开发了MPI on Hadoop,用MPI具体负责干活,Hadoop包裹在上层负责宏观调度和容错;而百度实现了Hadoop C++ Extension,把Hadoop里面的关键瓶颈部件都换成了C++的;前不久刚刚发布的Hadoop下一个版本的Roadmap里,也宣布要进行彻底重构,重点解决性能问题。

  生物信息领域,无论是基因测序还是质谱鉴定蛋白,产生出来的数据量巨大,其处理运算又吃CPU。对现有的分布式计算模型是个挑战。其实分布式计算领域,从来都是应用拖着技术走的。例如是物理学家发明了集群运算,是信息检索工业逼出了MapReduce模式。所以,生物领域的挑战也许可以反过来给计算领域一个发展的机会。

关于志愿计算

  3月份,尤其是最后两周,开发‘哪吒’进度压力很大,每天回到家脑袋都木木的。关于上次提到的Mozilla Drumbeat大会,那天有个小花絮:23日和zf双人编程一整天,晚饭都没吃就听workshop,晚上10点钟才筋疲力竭地开车回家。因为疲惫所以车速放得很慢。恰好四环上发生了严重的十几辆车的追尾事故,我却因为开得慢,幸运地躲过去了。

  所以就一直没有在BLOG写,时间一拉长,印象就淡了,现在好像写不出有趣的文字了。不好意思。科学松鼠会刚发表了一篇《志愿计算:足不出户,窥探星辰》,值得推荐,大家不妨看看。

  我个人而言,感觉David Anderson 、Carl Christensen和Elizabeth Cochran的QCN项目(通过大量志愿者的笔记本收集地震波信号)最有趣。尽管普通笔记本电脑安装的廉价震动传感器比不上专业的地震仪器,而且数据里会有日常使用的噪音,但是架不住志愿者数量众多,通过合适的统计工具,就能得到很多有意义的工作成果。23日在北京workshop,他们只给出年初新西兰大地震的数据和分析成果。上网跟进搜索了一下,稍后在台北的Asia@Home workshop里就给出了这次日本地震的数据。

  很多人对报告当天最后一个提问者不满:那个人长篇大论提了很多未必高明的空泛观点,要求在研究成果中占有股份,还建议研究者们把帮助他们的志愿者电脑上的个人隐私信息卖给Google赚钱。且不说Google到底需不需要,会不会买,感觉这个年轻人对商业、法律、科研、公益似乎都缺乏常识,完全丧失了好奇心和想象力。这又让人联想起《非诚勿扰》里那位美国博士安田的事

敬畏自己的代码

  我一向对zf非常赞赏。zf在5年前刚来组里,不夸张地说,编程能力很弱。我记得是我告诉他应该用delete[]删除数组,而delete会导致内存泄漏。但是现在,同样不夸张地说,他写的每一行代码都是精品。BOSS H以前说:“joyfire的意思,好像如果zf愿意加入他的团队,他就有胆子去月球”,没错,我就是这个意思。

  为什么?简单统计了一下,zf总共提交了17万行代码(当然,我统计的方式很简陋,有很多代码在不同版本重复提交,也有很多是临时性脚本,和一线实战的工业级产品不同),他的pParse(包括此前的pCompare)大概进行了39个版本的迭代重构和不断改进。组里有很多编程天才,在SVN提交代码是爆炸式的(例如我经常惊叹,hchi哥能在一下午敲出我一周的满载工作量)。但zf是独特的,他在SVN里提交代码量统计,永远是一条平稳的直线,每天,每周,每个月……这家伙最让人感到恐惧的,就是近乎机械的执行能力。

  这不仅仅体现在他的代码上。我记得BOSS H有一次说他“过于内向,不敢发问,不善交流,会制约自己的发展”。那以后,我注意到,每次报告,无论规模场合和内容,zf必会举手向报告者提几个问题,一开始显得很勉强,时间长了,性格居然都变了。现在这家伙去全是老外的万圣节聚会上扮演凯撒大帝,谁敢再说他的内向障碍发展?BOSS H说,最早是在走廊上捡到个面试其他导师失败的彷徨考生,这么多年下来,zf教育了他这个导师。

  能进我们组的新生,很多都得过ACM或者各种比赛的金、银、铜、铁奖。但并不一定实现过真正实用的大系统,达到合格软件工程师的标准。前两天发邮件给全组,以zf为例子,建议大家踏实一点,敬畏自己的代码,最终有本事在pFind代码里,留下自己的长久印记。

“哪咤”系统第一个milestone明天组内alpha发布

  最近半个月和zf双人编程,全力开发“哪吒”系统

  和Web搜索引擎不同,pFind有自己的专业特点,最大特点就是要求尽可能高的查全率和查准率:平常Web搜索,大多数用户很少翻看三、五页以外更多的搜索结果。而对我们这个领域而言,质谱仪器原本就有很高的精度,数据集里那些含量稀少信号相对较弱的蛋白质,却往往正是科学家和医生们最重视的研究对象。pFind引擎有几十个参数,虽然很多默认推荐值经受过数百万数据的考验,但是在具体数据集上总会有优化的空间。

  也就是说,花费上万块钱成本得到珍贵实验数据,不能只拿pFind引擎常规参数“一搜了之”,需要进一步大量深入分析。例如过滤和校准质谱数据,极端情况下通过数据发现前端实验过程和仪器维护中的问题,回去重做实验;再如进行初次试搜之后,对鉴定结果进行统计分析,优化参数,改变选项,再进行迭代搜索;又如,利用多种搜索引擎交叉验证,甚至是多种方法结果的相互对比验证(例如常规的基因翻译蛋白序列库搜索引擎,最近新兴的谱库搜索,以及探索性最高的de novo算法)……

  每年iPRG国际评测中,使用同样搜索引擎的人,有排名前十位的,也有结果完全不像样子的。蛋白质组学的领军人物发表论文说:“赛车好,还需要王牌赛车手。生物组学领域的瓶颈目前是数据分析,而分析成果又很依赖优秀分析人员的经验”。像rxsun,yfu,zf,hchi,cliu等虾米,都是江湖上知名的质谱数据分析专家了。

  深入解析依赖人工工作大大降低了效率。随着pFind的进展,我们与越来越多国内外生物学家建立了合作关系。然而每月收到成T的数据,每周要提交的分析报告,海量的工作量,把所有人都压垮了,不得不放弃很多送上门来的合作机会和经费。

  数据解析的全流程自动化,国际上都在全力探索。例如现在红得发紫的Maxquant就做得不错。pFind组有不错的基础,由于有牛人yfu和他那一帮超常的算法研究天才在,我们在谱图搜索、de novo、修饰发现等等方面也有自己的独特之处。至于工程能力,生物实验室那些非计算机专业作者用C#写的桌面级别代码,要进一步拓展到大规模集群,甚至通过云计算提供在线服务,还差得很远。而这方面是计算所的长项。在超级计算机并行加速方面,我去年论文成果数据的可拓展性达到了320核,不谦虚地吹嘘,超过了全世界竞争对手目前为止公开报告数据效果一个量级,其实我已经做到了1000核,马上要做2000核。

  通过pFind云提供对外服务,这始终是我的梦想。为此努力了5年,今年终于开始着手了。也许,它能成为未来生物医药数据处理的基础构件之一。

  要建立实用的平台,就需要把方方面面的工作集成起来,解决大量很有挑战性的难题,例如单从并行加速这一个技术需求来看,不再像加速pFind搜索引擎这一具体环节这么简单,需要考虑整个流程各个环节的不同特点:在海量数据吞吐的地方,如全基因组翻译和索引,用得到MapReduce这一套;而打分鉴定这种95%CPU的工作,需要精心设计MPI类的程序;另一些特别的算法,例如de novo里面的动态规划,也许得考虑GPU加速……其实,加速还是最好做的事。

  加班很累,一写BLOG又兴奋了,也是最近密集开发,没空上网,想写的东西比较多吧。明天带“哪咤”的雏形出来见人,这个平台尝试把组里pFind、pBuild、pCluster、pMatch、pXtract、pParse、pNovo等等主力软件串联起来,无人值守的对海量数据进行尽可能全面的挖掘,我们希望听取各位的意见。