2017年,百度在开源之路上究竟做了什么?

874
原文链接: mp.weixin.qq.com

作者 | 谭中意&佟建如

2017年,是百度开源的突破之年,从震撼行业的Apollo自动驾驶、到自主研发的PaddlePaddle深度学习框架、再到百度搜索的核心网页加速技术MIP……百度不但将开源提升到前所未有的战略高度,并且在这一年落实了多项重大开源技术。 本文就2017年百度重大开源事件进行回顾整理,向大家作一次系统的介绍,希望能够有更多的朋友使用、参与、贡献开源产品,让开源更为流行!

一、Apollo

Apollo(阿波罗)是由百度自主研发的全面开放自动驾驶平台,它将帮助汽车行业及自动驾驶领域的合作伙伴结合车辆和硬件系统,快速搭建一套属于自己的自动驾驶系统。

Apollo作为一套复杂的自动驾驶系统,具体包含以下重要的几项组件:

  • 感知:通过安装在车身的各类传感器如激光雷达、摄像头和毫米波雷达等获取车辆周边的环境数据。利用多传感器融合技术,车端感知算法能够实时计算出环境中交通参与者的位置、类别和速度朝向等信息。背后支持这套自动驾驶感知系统的是多年积累的大数据和深度学习技术,海量的真实路测数据经过专业人员的标注变成机器能够理解的学习样本,大规模深度学习平台和GPU集群将离线学习大量数据所耗费的时间大幅缩短,训练好的最新模型通过在线更新的方式从云端更新到车载大脑。人工智能+数据驱动的解决方案使百度无人车感知系统能够持续不断的提升检测识别能力,为自动驾驶的决策规划控制模块提供准确、稳定、可靠的输入。

  • 仿真:作为Apollo的重要组成部分之一,仿真服务拥有大量的实际路况及自动驾驶场景数据,基于大规模云端计算容量,打造日行百万公里的虚拟运行能力。通过开放的仿真服务,Apollo的合作伙伴可以接入海量的自动驾驶场景,快速完成测试、验证和模型优化等一系列工作,覆盖全面且安全高效。

  • 高精度地图与定位:百度开创了将深度学习和人工智能技术广泛应用于地图数据生产的先河,是国内少数具备量产能力的高精地图数据提供商之一,而基于GPS,IMU,高精地图以及多种传感器数据的百度自定位系统则可提供厘米级综合定位解决方案,旨在根据不同应用场景提供可定制的软、硬件一体化产品,同时确保成本可控,精度可调。

  • End-To-End:这种自动驾驶解决方案因成本低,工程复杂度低等优势正在被不断的探索。通过使用地图采集车采集的大量真实道路数据,完全基于深度学习构造横向和纵向驾驶模型,快速的在真车上进行了实践。本次开放横、纵向模型源码和1万公里数据。

  • 决策规划:由于车辆装备了综合预测,决策与规划系统,百度自动驾驶汽车能够根据实时路况、道路限速等情况做出相应的轨迹预测和智能规划,同时兼顾安全性和舒适性,提高行驶效率。现已开放不分昼夜固定道路的自动驾驶能力。

  • 智能控制:百度自动驾驶汽车的控制与底盘交互系统具有精准性,普适性和自适应性。能够适应不同路况, 不同车速, 不同车型和底盘交互协议。Apollo开放循迹自动驾驶能力,控制精度将达到10cm级别。

  • 数据开放平台:Apollo数据开放平台将通过代码开源和数据开放,形成“车端+云端”的完整开放生态,为具有较强软件、算法研发能力,但缺乏数据积累或计算能力的开发者及合作伙伴,提供多种快速灵活的数据、计算和标注能力。我们希望通过开放相关技术和资源,凝聚全球开发者和各行业合作伙伴,构建自动驾驶开放生态,赋能每一位参与者,并推动自动驾驶技术的普及。

  • 参考硬件:车载硬件是自动驾驶必不可少的部分。Apollo为全球开发者提供了完整的硬件设备参考,包括车辆选择、核心硬件选型、及辅助硬件设备。我们还提供了详尽的硬件安装指南,确保开发者无障碍进行硬件组装,为软件集成及车辆上路提供可靠保障。

  • MAP Engine:它是车载终端的高精地图数据管理服务,它封装了地图数据的组织管理机制,屏蔽底层数据细节,对应用层模块提供统一数据查询接口。它包含元素检索、空间检索、格式适配、缓存管理等核心能力,并提供了模块化、层次化、可高度定制化、灵活高效的编程接口,用户可以基于此轻松构建专属的终端高精地图解决方案。

  • DuerOS:针对联网汽车,DuerOS提供的全语音交互智能车 联解决方案,致力于为用户提供一站式车生活服务,如地图导航、智能问答和个性化音频内容推荐等,并通过开放平台持续强化车场景多维度能力,为车企赋能。

  • 安全:Apollo在基于隔离和可信的安全体系下提供了完善的安全框架及安全系统组件,Apollo安全体系通过车辆安全防火墙,隔离车内与车外的网络,车身与车机的网络,保证各系统网络边界的独立,通过汽车防火墙还能做到对每一条进入车内的指令进行过滤,保证只有可信的指令才能被正确执行;Apollo安全体系通过深度嵌入内核的网络安全组件,为自动驾驶系统产生的每一条信息提供来源认证、内容保密及可信;Apollo安全体系从系统引导开始即对系统进行安全度量及监控,保证每一个在自动驾驶系统上运行的功能都合法可信;同时Apollo安全体系也提供完善的安全OTA功能,保证每一次系统升级不会发生黑客入侵事件。Apollo安全体系通过对网络、OS、云端及OTA的安全保障,使得各功能组件能安全有序的运行。

2017年7月5日,百度开发者大会正式发布Apollo开放平台1.0版,并同步在GitHub上进行源码开放,按照Apollo的开放路线图,目前已经在Gitub上发布了Apollo 2.0版,即可以实现在简单的城市道路上进行自动驾驶,可以实现定速巡航、自动躲避障碍物、根据交通指示灯做出判断、变换车道等重要功能。下图中可以展示出Apollo 2.0所开放的能力。

目前全球已经有70多家合作伙伴加入Apollo计划,可以看到,通过Apollo平台开放的各项技术能力,开发者可以满足不同应用场景下实际需求。

二、PaddlePaddle

PaddlePaddle是百度自主研发的深度学习平台,是大规模并行分布式深度学习框架,易学易用、高效灵活,支持海量图像识别分类、机器翻译和自动驾驶等多个领域的业务需求,现已全面开源。

PadddlePaddle最早自2013年就开始投入百度多项业务的应用,在百度内部发展3年左右的时间,于2016年9月正式开源,然后PaddlePaddle经历了一个高速迭代优化的过程,最新版本是于2017年11月发布的PaddlePaddle Fluid,这个版本的发布,赋予了PaddlePaddle更为强大的功能和优势。

  • 可伸缩性:paddle官方支持多种集群框架,MPI,kubernetes,支持GPU集群资源的动态分配;

  • 高效性:如在RNN算法上,PaddlePaddle可以在占用更小显存资源的前提下,实现比主流DL框架快1~2倍;

  • 灵活性:PaddlePaddle可以从单机训练迅速拓展至大规模集群训练,因为对于PaddlePaddle来说,单机代码和多机多卡代码完全一致;

  • Fluid:让深度学习的开发过程更接近高级语言,暴露更多训练过程的信息,极大帮助训练过程优化;

  • EDL:即弹性深度学习,可以根据现有计算资源,调整分布式任务的数目,保证那些计算资源缺失风险的任务能够被执行;

  • Cloud:开发者无需考虑编写执行分布式程序,直接提交任务即可拓展到多台服务器的多个GPU上运行,极大扩展计算资源的使用;

在对外开放的层面上,仅仅开放PaddlePaddle深度学习框架,是无法有效帮助广大开发者训练模型的。百度在4大要素上进行全面开放,方便开发者搭建人工智能技术研发闭环。

  • 大数据:依托国家工程实验室,百度会与更多第三方共同建设开放的数据集,为更多的开发者和企业解决数据源问题;

  • 计算能力:在国家工程实验室的工程平台上,我们为符合条件的企业和开发者提供免费的计算资源;

  • 算法&模型:PaddlePaddle即为这个层次,如前所述,已在GitHub上全面开源;

  • 场景:Paddle正在和很多AI技术供应商以及企业合作,将通过paddle实现的应用场景开放出来,让大家知道深度学习可以在哪些场景上能够发挥价值,以及如何使用Paddle来实现这样的应用;

PaddlePaddle在GitHub上也已经获得了6K+ star,1.6k+ fork,更多的开发者会利用PaddlePaddle深度学习框架及数据、计算资源等开放能力,实现了自己的AI应用场景落地。

三、ECharts

2017年是国内数据可视化工业界一个小小爆发的年份,作为其中的领军产品,ECharts在这一年完成了大量地产品优化,并发布了一系列新的革新性功能,逐步完成其在可视化领域的产品矩阵布局。

ECharts主产品在17年一共发布了17个版本,增加了象形图、主题河流图、日历图、树图等新的图表类型;发布了ECharts-stat插件,率先支持了在图表产品中内置统计功能;对图表的自定义、扩展机制进行了极大的丰富和增强,允许用户基于ECharts研发出更多个性化的可视化呈现及交互;在内置图表类型无法满足需求的情况下,强大的自定义系列能够让用户设计特殊的图表渲染方式,最大程度地满足定制化需求

在主版本之外,两年前的EChartsX代表着之前我们对于ECharts在3D领域的期望,而EChartsGL则是我们交出的可实际运用在产品中的答卷,也是代表团队在WebGL领域5年多研究的集大成产品。另外,ECharts的底层依赖ZRender也在年末进行了革命性的升级,同时支持Canvas和SVG,使得ECharts开发者可以根据自己的图表应用场景,选择更合适的底层渲染技术。

除了产品上的升级迭代,ECharts也积极参与到业界社区工作中,成为了中国图像图形学会可视化与可视化分析专业委员会委员。

据了解,在2018年年初,ECharts将发布时隔两年的重大革新版本,届时希望会给开发者、用户带去更多有价值的产品和功能。

相关链接:

http://echarts.baidu.com

https://github.com/ecomfe/echarts

四、MIP

MIP(Mobile Instant Pages - 移动网页加速器), 是一套应用于移动网页的开放性技术标准。通过提供 MIP-HTML 规范、MIP-JS 运行环境以及 MIP-Cache 页面缓存系统,实现移动网页加速。

MIP主要由三部分组织成:

1. MIPHTML

2. MIPJS

3. MIPCache

MIP HTML 基于 HTML 中的基础标签制定了全新的规范,通过对一部分基础标签的使用限制或功能扩展,使 HTML 能够展现更加丰富的内容;MIP JS 可以保证 MIP HTML 页面的快速渲染;MIP Cache 用于实现 MIP 页面的高速缓存,从而进一步提高页面性能。

截至2017年底,国内互联网中使用MIP技术的页面达到14亿个,站点数量已超过1万家。经实际验证,改造后的页面访问速度增加30%~80%,实现网页的秒开,极大增强了用户体验,那么MIP是如何做到这点儿的呢?

  • 经过精心设计的JS:为了去除臃肿的客户端脚本,MIP 文件不允许自定义 JavaScript;对一些强依赖 JavaScript 的功能(如:广告、统计和交互),MIP 提供与 MIP runtime 兼容的封装好的组件来实现。JavaScript 引用原则:

  • 目前 MIP 不允许用户自定义JavaScript,需要用MIP组件的形式引进来,从而确保安全性和性能表现;

  • 可以引用mip-iframe来引入实现部分富交互的功能,这样,即使开发时使用最影响性能的document.write,也不会影响主页面的渲染;

  • MIP 组件是开源的,允许开发者自定义功能组件,项目也将持续提供多样的组件,以适应不同的需求;

  • 所有静态资源需要标明尺寸:在页面开发时,资源常常不会被设定宽高,特别是使用广告或者通过调用`document.write() 注入的时候。由于资源大小不能确定,页面经常要进行反复重新的绘制;现在,MIP 要求将所有的资源(广告、图片、音频和视频)标明尺寸。当资源真正加载时,所有资源大小可以被立即推断出并迅速的用于计算页面布局,加载中的资源将无缝呈现,不必因为页面频繁更新布局而影响到用户的阅读体验。

  • 不允许任何机制阻止页面渲染:开发者的任何自定义脚本,都需要用MIP的tag反馈给MIP,例如mip-ad、mip-iframe等,这些方式不会阻塞页面的layout和渲染。

  • 控制外部资源加载:MIP runtime会控制外部资源的额加载来确保其高效性,从而使用户想阅读的内容尽快出现在屏幕中。

  • 封装交互功能:MIP提倡网页能给用户直接简单的体验,但这并不意味着MIP限制了页面的生动和有趣。MIP runtime提供了高度优化的被封装的JavaScript,开发者无需投入过多精力去实现复杂的交互功能。

  • 建议使用inline的CSS:CSS的加载,会阻止页面的渲染,CSS内联可以减少客户端的开销。

  • 只允许GPU加速的动画:MIP只允许用transforms和opacity来完成动画效果,当动画能在GPU上执行时,仅触发渲染层合并。

  • MIP缓存:MIP另一个重要的意义在于能够帮站长加速网页,百度将会把MIP网页缓存到百度CDN中。只要符合MIP标准,都可以使用MIP缓存。

相关链接:

MIP官网:https://www.mipengine.org/

GitHub:https://github.com/mipengine/

五、Bigflow

BaiduBigflow(以下简称Bigflow)是百度的一套计算框架,它致力于提供一套简单易用的接口来描述用户的计算任务,并使同一套代码可以运行在不同的执行引擎之上。

它的设计中有许多思想借鉴自Google Flume Java以及Google Cloud Dataflow,另有部分接口设计借鉴自Apache Spark。用户基本可以不去关心Bigflow的计算真正运行在哪里,可以像写一个单机的程序一样写出自己的逻辑,Bigflow会将这些计算分发到相应的执行引擎之上执行。

Bigflow的目标是:使分布式程序写起来更简单,测试起来更方便,跑起来更高效,维护起来更容易,迁移起来成本更小。目前Bigflow在百度公司内部对接了公司内部的批量计算引擎DCE(与社区Tez比较类似),迭代引擎Spark,以及公司内部的流式计算引擎Gemini。

Bigflow具有以下几方面的优点:

  • 高性能:Bigflow的接口设计使得Bigflow可以感知更多的用户需求的细节属性,并且Bigflow会根据计算的属性进行作业的优化;另其执行层使用C++实现,用户的一些代码逻辑会被翻译为C++执行,有较大的性能提升。在公司内部的实际业务测试来看,其性能远高于用户手写的作业。根据一些从现有业务改写过来的作业平均来看,其性能都比原用户代码提升了100%+。开源版本的benchmark正在准备中。

  • 简单易用:Bigflow的接口表面看起来很像Spark,但实际实用之后会发现Bigflow使用一些独特的设计使得Bigflow的代码更像是单机程序,例如,屏蔽了partitioner的概念,支持嵌套的分布式数据集等,使得其接口更加易于理解,并且拥有更强的代码可复用性。特别的,在许多需要优化的场景中,因为Bigflow可以进行自动的性能以及内存占用优化,所以用户可以避免许多因OOM或性能不足而必须进行的优化工作,降低用户的使用成本。

  • Python友好:在这里,Python是一等公民我们目前原生支持的语言是Python。使用PySpark时,有不少用户都困扰于PySpark的低效,或困扰于其不支持某些CPython库,或困扰于一些仅功能仅仅在Scala和Java中可用,在PySpark中暂时处于不可用状态。而在Bigflow中,以上问题在Bigflow中都不是问题,性能、功能、易用性都对Python用户比较友好。

Bigflow从2017.11.27在GitHub正式开源,目前release一个版本,短短一个多月时间,就获得了近千star,近百fork。

六、BRPC

百度内最常使用的工业级RPC框架, 有超过60万个实例(不包含client, 目前已超过100万)和500多种服务, 在百度内叫做"baidu-rpc". 目前只开源C++版本。你可以使用它:

  • 搭建一个能在同端口支持多协议的服务, 或访问http/https, h2/h2c, redis和memcached, rtmp/flv/hls, hadoop_rpc, rdma, baidu_std, streaming_rpc, hulu_pbrpc, sofa_pbrpc, nova_pbrpc,     public_pbrpc, ubrpc等百度内外使用的各种协议。

  • 从其他语言通过HTTP+json访问基于protobuf的协议.

  • 基于工业级的RAFT算法实现搭建高可用分布式系统 (即将在braft开源)

  • 创建丰富的访问模式:服务都能以同步或异步方式处理请求;通过同步、异步或半同步访问服务;使用组合channels声明式地简化复杂的分库或并发访问。

  • 通过http调试服务, 使用cpu, heap, contention profilers.

  • 获得更好的延时和吞吐.

  • 把你组织中使用的协议快速地加入brpc,或定制各类组件, 包括名字服务 (dns, zk, etcd), 负载均衡 (rr, random, consistent     hashing)

友好的接口

只有三个(主要的)用户类: Server, Channel, Controller, 分别对应server端,client端,参数集合. 建服务? 包含brpc/server.h并参考注释或示例;访问服务? 包含brpc/channel.h并参考注释或示例;调整参数? 看看brpc/controller.h. 我们尝试让事情变得更加简单,以名字服务为例,在其他RPC实现中,你也许需要复制一长段晦涩的代码才可使用,而在brpc中访问BNS可以这么写"bns://node-name",DNS是Init("http://domain-name",...),本地文件列表是"file:///home/work/server.list"。

提升服务可靠性

brpc在百度内被广泛使用: map-reduce服务和table存储;高性能计算和模型训练;各种索引和排序服务…. 它是一个经历过考验的实现。brpc特别重视开发和维护效率, 你可以通过浏览器或curl查看server内部状态, 分析在线服务的cpu热点, 内存分配和锁竞争, 通过bvar统计各种指标并通过/vars查看。

更好的延时和吞吐

虽然大部分RPC实现都声称“高性能”,但数字仅仅是数字,要在广泛的场景中做到高性能仍是困难的。为了统一百度内的通信架构,brpc在性能方面比其他RPC走得更深。

在brpc中,对不同fd的读取是完全并发的,对同一个fd中不同消息的解析也是并发的。解析一个特别大的protobuf     message不会影响同一个客户端的其他消息,更不用提其他客户端的消息了。

  • 对同一fd和不同fd的写出是高度并发的。当多个线程都要对一个fd写出时(常见于单连接),第一个线程会直接在原线程写出,其他线程会以wait-free的方式托付自己的写请求,多个线程在高度竞争下仍可以在1秒内对同一个fd写入500万个16字节的消息。

  • 尽量少的锁。高QPS服务可以充分利用一台机器的CPU。比如为处理请求创建bthread, 设置超时,     根据回复找到RPC上下文, 记录性能计数器都是高度并发的。即使服务的QPS超过50万,用户也很少在contention     profiler)中看到框架造成的锁竞争。

  • 服务器线程数自动调节。传统的服务器需要根据下游延时的调整自身的线程数,否则吞吐可能会受影响。在brpc中,每个请求均运行在新建立的bthread中,请求结束后线程就结束了,所以天然会根据负载自动调节线程数。

BRPC于2017年9月15日在GitHub上进行开源,短短几个月,已经获得了将近6000 star,fork数量达到1200+,同时发起的issue数量也有150+,可见BRPC在开源社区的受欢迎程度。

相关链接

BRPC:https://github.com/brpc/brpc

七、San

San是一套应用于Web的MVVM的组件框架,具有如下特点:

  • HTML模版: 声明式的模板,在编写视图时就像是在写一个普通的页面,更符合 HTML 开发人员的习惯。

  • 数据驱动: 修改数据,视图引擎会根据绑定关系自动刷新视图,从此摆脱手工调用 DOM API 的繁琐与可能的遗漏。

  • 组件化: 组件是数据、逻辑与视图的聚合体。通过组件,我们封装独立的功能区块,小到输入组合,大到一个页面。

  • 高性能视图: 通过修改数据的方法,视图引擎能够直接刷新需要变更的视图区域,无需进行任何检测,性能更高。

  • 体积小巧: 12k(gzipped) 的体积,无需担心对页面下载带来负担。体积强迫症患者的福音,即使应用于移动端也不会带来大的负担。

  • 良好的兼容性: 通过方法修改数据的另一好处是,可以获得更好的浏览器兼容性。毕竟有时我们产品的受众用户环境并没那么先进。

  • 使用方式自由: 项目中可以任意选择ESNext Module 或 AMD 管理模块。当然,如果你想要用全局变量也是支持的。

除此之外,我们为Web应用开发提供了一些必要的工具,并且还在不断丰富中:

  • Router: 支持hash和html5模式的router,单页或同构的Web应用通常需要它。

  • Store: 应用状态管理套件,其理念是类似flux的单向流。

  • Update: Immutable的对象更新库,和san-store配合进行应用状态数据更新。

  • DevTool: 基于Chrome扩展的开发者工具

  • MUI: 基于material-design 设计规范的组件库

San早在2016年就已对外开源,到现在16名核心贡献者累计贡献了846个commits,已经发布了71个release。从影响力看,San目前累计了近千star,100+fork量。了解更多关于San的特点、文档及其周边,可以参考官网https://ecomfe.github.io/san/

八、Palo

Palo是一个用于报表和交互式分析的MPP数据库,主要集成了Google Mesa和Apache Impala等技术。与其他流行的SQL-on-Hadoop系统不同,Palo被设计为一个不依赖于其他系统的简单且单一紧密耦合的系统。Palo不仅提供高并发低延迟点查询性能,而且提供了高吞吐量的即席分析查询;不仅提供批量数据加载,而且还提供近乎实时的小批量数据加载。Palo还具备高可用性,可靠性,容错性和可扩展性。

Palo的实现包括两个守护进程:前端(FE)和后端(BE)。架构如下图所示:

Palo基于以上架构,实现的主要功能如下:

  • 高性能的列存储引擎;

  • 小批量更新,批量原子提交,多版本支持;

  • 高效的分布式数据导入;

  • 支持RollupTable, Scheme Change, Data Recovery;

  • 较完备的分布式管理框架,使得整个PALO易用易运维;

  • 支持两层分区,减少IO开销;

  • 存储分级支持,老数据用SATA,热的新数据用SSD;

  • MPP Query Engine – 低并发大查询 + 高并发低延迟小查询;

  • 实现了Mysql网络协议,可以很容易与各种上层工具打通;

  • 支持多表join(一个大表与多个小表;大表与可以加载到分布式内存的大表);

  • Rollup表智能选择;

  • 支持谓词下推;

目前,Palo已经在GitHub上进行开源,点击 https://github.com/baidu/palo 可以查看Palo相关信息。

推荐阅读

(点击图片即可跳转)

苹果不再是悄悄进行 Service Worker 的开发了,在 Safari 46 技术预览版里,新的桌面版 Safari 里将会默认打开 Service Worker!

苹果的态度不仅明朗,而且步伐奇快,PWA 的爆发应该就在今年

——《苹果官方对PWA支持步伐奇快,iOS11.3和MacOS10.13.4将默认支持Service Worker》

Brilliant Open Web 

BOW(Brilliant Open Web)团队,是一个专门的Web技术建设小组,致力于推动 Open Web 技术的发展,让Web重新成为开发者的首选。

BOW 关注前端,关注Web;剖析技术、分享实践;谈谈学习,也聊聊管理。

关注 OpenWeb开发者,回复“加群”,让我们一起推动 OpenWeb技术的发展!

OpenWeb开发者

ID:BrilliantOpenWeb

技术连接世界,开放赢得未来