2017 百度开源大事件回顾与总结

  • 谭中意
  • 佟建如

2018 年 1 月 17 日

话题:百度语言 & 开发AI

2017 年,是百度开源的突破之年,从震撼行业的 Apollo 自动驾驶、到自主研发的 PaddlePaddle 深度学习框架、再到百度搜索的核心网页加速技术 MIP……百度不但将开源提升到前所未有的战略高度,并且在这一年落实了多项重大开源技术。

本文就 2017 年百度重大开源事件进行回顾整理,向大家作一次系统的介绍,希望能够有更多的朋友使用、参与、贡献开源产品,让开源更为流行!

1. 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 的开放路线图,目前已经在 github 上发布了 Apollo 2.0 版,即可以实现在简单的城市道路上进行自动驾驶,可以实现定速巡航、自动躲避障碍物、根据交通指示灯做出判断、变换车道等重要功能。下图中可以展示出 Apollo 2.0 所开放的能力。

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

2. 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 应用场景落地。

3. ECharts

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

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

在主版本之外,两年前的 EChartsX 代表着之前我们对于 ECharts 在 3D 领域的期望,而 EChartsGL 则是我们交出的可实际运用在产品中的答卷,也是代表团队在 WebGL 领域 5 年多研究的集大成产品。

另外,ECharts 的底层依赖 ZRender 也在年末进行了革命性的升级,同时支持 Canvas 和 SVG,使得 ECharts 开发者可以根据自己的图表应用场景,选择更合适的底层渲染技术,这也是前端可视化工具领域的一大创举。

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

ECharts 一年来的工作,在百度公司内外都受到了各种认可,公司内部获得了由百度集团总裁陆奇颁发了开源先锋奖,在公司外获得了最受欢迎的中国开源软件 TOP20 的荣誉。

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

相关链接:

http://echarts.baidu.com

https://github.com/ecomfe/echarts

4. MIP

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

MIP 主要由三部分组织成:

  • MIPHTML
  • MIPJS
  • MIPCache

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

目前已经有数千个站点经过了 MIP 改造,经实际验证,改造后的页面访问速度增加 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 缓存。

5. 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。

6. BRPC:(https://github.com/brpc/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 在开源社区的受欢迎程度。

7. 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/

8. 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 相关信息。

百度语言 & 开发AI