发布日期:2022-04-22 点击率:35
NVIDIA GTC21 有大量精彩且引人入胜的内容,特别是在 RAPIDS 附近,因此很容易错过我们的首次演示“ 使用 RAPIDS 加速 Node. js Javascript 以实现可视化和更高的速度。 ”是的–我们正在通过 Node.js 项目将 GPU 加速数据科学的力量带到 Javascript Node.js 社区。
Node- RAPIDS 是 Node.js 中模块化 RAPIDS 库绑定的开源技术预览,以及支持基于浏览器的高性能可视化的补充方法。
web viz 有什么问题?
大约十年前 是围绕基于 web 的数据可视化的迷你复兴,它展示了 D3 等高度交互、易于共享和使用的工具的好处。虽然性能不如 C / C ++或 Python 框架,但由于 Javascript 的可访问性,它们的受欢迎程度开始上升。毫不奇怪,它通常被列为 最流行的开发人员语言 ,排在 Python 或 Java 之前,现在有了完整的可视化和数据工具目录。
然而,这个庞大的 Javascript 开发社区由于缺乏首选语言中的一流加速数据工具而受到阻碍。当分析与数据源、科学和可视化尽可能接近时,分析是最有效的。要使用 Javascript 完全访问 GPU 硬件(超越 webGL 限制和黑客),需要精通多种语言来设置复杂的中间件管道或使用 Plotly Dash 等非 js 框架。因此,数据工程师、数据科学家、可视化专家和前端开发人员往往被孤立起来,甚至在组织内部也是如此。这是有害的,因为数据可视化是这些群体之间交流的理想媒介。
至于 RAPIDS Viz 团队 自从我们第一次证明概念 ,我们希望构建能够通过浏览器与数亿个数据点实时无缝交互的工具——我们终于找到了一种方法。
为什么选择 Node 。 js
如果您不熟悉 Node.js ,它是一个基于 C / C ++的开源跨平台运行时环境,在 web 浏览器之外执行 Javascript 代码。超过 100 万 Node. js 下载量 per day 。 节点包管理器 ( NPM )是默认的 Javascript 包管理器,微软拥有它。 Node.js 用于 eBay 、 AliExpress 等在线市场的后端,并被 Netflix 、 PayPal 和 Groupon 等高流量网站使用。显然,这是一个强大的框架。
图 1 : XKCD Node 。 js 是一个通用连接器。
Node. js 是一个连接器,它为我们提供了直接访问硬件的 Javascript ,从而简化了 API 并能够使用 NVIDIA CUDA.
. 通过创建节点 – RAPIDS 绑定,我们使一个庞大的开发人员社区能够使用 GPU 加速,而无需学习新语言或在新环境中工作。我们还为同一社区提供高性能数据科学平台: RAPIDS !
下面是一个基于 我们的基本笔记本 的节点 – RAPIDS 的片段,它显示了一个小型正则表达式示例的 6x 加速:
// Using https://github.com/rapidsai/node-rapids/ | |
const cudf = require('@rapidsai/cudf'); | |
const regexps = [ | |
/Cloud|Overcast/, | |
/Rain|T-Storm|Thunderstorm|Squalls|Drizzle/, | |
/Snow/, | |
/Fog/, | |
/Ice|Hail|Freezing|Sleet/, | |
/Dust|Smoke|Sand/, | |
]; | |
? | |
console.log(''); | |
? | |
const weather_condition_gpu = cudf.Dataframe.readCSV({ | |
header: 0, | |
sourceType: 'files', | |
sources: [`${__dirname}/US_Accidents_Dec20.csv`], | |
dataTypes: { | |
id: 'str', source: 'str', tmc: 'float64', severity: 'int32', start_time: 'str', end_time: 'str', | |
start_lat: 'float64', start_lng: 'float64', end_lat: 'float64', end_lng: 'float64', | |
distance: 'float64', description: 'str', number: 'int32', street: 'str', side: 'str', | |
city: 'str', county: 'str', state: 'str', zipcode: 'str', country: 'str', timezone: 'str', airport_code: 'str', | |
weather_timestamp: 'str', temperature: 'float64', wind_chill: 'float64', humidity: 'float64', pressure: 'float64', | |
visibility: 'float64', wind_direction: 'str', wind_speed: 'float64', precipitation: 'float64', weather_condition: 'str', | |
amenity: 'bool', bump: 'bool', crossing: 'bool', give_way: 'bool', junction: 'bool', no_exit: 'bool', railway: 'bool', | |
roundabout: 'bool', station: 'bool', stop: 'bool', traffic_calming: 'bool', traffic_signal: 'bool', turning_loop: 'bool', | |
sunrise_sunset: 'str', civil_twilight: 'str', nautical_twighlight: 'str', astronomical_twighlight: 'str' | |
}, | |
}).get('weather_condition'); | |
? | |
console.time(`GPU time`); | |
? | |
regexps.forEach((regexp) => { | |
console.time(`${regexp.source} time`); | |
const matches = weather_condition_gpu.containsRe(regexp.source).sum(); | |
console.timeEnd(`${regexp.source} time`); | |
console.log(`${regexp.source} matches: ${matches.toLocaleString()}`); | |
}); | |
? | |
console.timeEnd(`GPU time`); | |
? | |
console.log(''); | |
? | |
const weather_condition_cpu = (() => { | |
const categorical = weather_condition_gpu.cast(new cudf.Categorical(new cudf.Utf8String)); | |
const categories = [...categorical.categories]; | |
const codes = [...categorical.codes]; | |
return codes.map((i) => categories[i]); | |
})(); | |
? | |
console.time(`CPU time`); | |
? | |
regexps.forEach((regexp) => { | |
console.time(`${regexp.source} time`); | |
const matches = weather_condition_cpu.reduce((matches, weather_condition) => { | |
return matches + (regexp.exec(weather_condition) || []).length; | |
}, 0); | |
console.timeEnd(`${regexp.source} time`); | |
console.log(`${regexp.source} matches: ${matches.toLocaleString()}`); | |
}); | |
? | |
console.timeEnd(`CPU time`); | |
? | |
console.log(''); | |
节点 – RAPIDS :计为构建块
图 2 : Node- RAPIDS 模块概述。
与节点项目类似,节点 – RAPIDS 设计为模块化。我们的目标不是构建交钥匙 web 应用程序,而是创建一个 功能清单 ,以支持或加速各种各样的用例和管道。前面是当前和计划节点的概述 – RAPIDS 模块按一般类别分组。 节点 – RAPIDS 应用程序可以根据需要使用任意数量的模块。
为了减少起步的困难,我们还构建了一个 演示目录 ,它可以作为通用应用程序的模板。随着我们开发更多绑定,我们将创建更多演示来展示它们的功能。
图 3 :交叉过滤器应用程序的示例。
前面是使用 RAPIDS cuDF 和 RAPIDS cuSpatial 库的地理空间交叉过滤仪表板应用程序的理想堆栈。我们有一个使用 Deck.gl 的简单演示,您可以使用我们的 video 进行预览,并在 Github 上探索 演示代码 。
图 4 :流式 ETL 流程的示例。
前面的最后一个示例是一个仅服务器端的 ETL 管道,没有任何可视化。我们有一个使用 cuDF 绑定和 互动笔记本 桌面应用程序的简单 ETL 流程示例,您可以在 Notebook 上使用 video 进行预览,并使用(获取)交互。
下一步是什么?
虽然我们考虑这个项目已经有一段时间了,但我们才刚刚开始开发。 RAPIDS 是一个令人难以置信的框架,我们希望将它带给更多的人和更多的应用程序— RAPIDS 正如我们所说的那样。
近期下一步:
接下来的一些短期步骤是继续构建核心 RAPIDS 绑定特性,您可以在我们的 当前绑定覆盖率表 上查看这些特性。
如果直接从您的 web 应用程序中使用 GPU 加速 SQL 查询的想法听起来很有趣(对我们来说的确如此),那么我们也希望尽快开始使用一些 blazingSQL 绑定。
最值得注意的是,我们计划开始创建和发布模块化 docker 容器,这将大大简化当前的源代码技术预览安装过程。
关于作者
Allan Enemark ,数据可视化设计, NVIDIA RAPIDS 数据可视化团队负责人,致力于建立概念证明,开发工具,并与 RAPIDS 集成框架,通过 GPU 加速推进可视化分析领域。
Ajay Thorve 是 NVIDIA 的软件工程师, RAPIDS 组织的可视化团队的一部分。 Ajay 的背景是全栈开发和数据科学,主要兴趣包括 Javascript / Typescript 和 Python 。目前, Ajay 在 RAPIDS viz 团队的工作主要集中在为 cuXfilter 和 node- RAPIDS 项目做出贡献。
Bryan Van de Ven 是 NVIDIA 的高级系统软件工程师,负责 RAPIDS 的前端和可视化工具。此前,他曾在微软和 Anaconda 工作,在那里他创建了 conda 软件包管理器,并共同创建了 Bokeh 可视化库。布莱恩获得了 UT 奥斯汀大学的计算机科学和数学学士学位,以及加州大学洛杉矶分校的物理学硕士学位。
Paul Taylor 是 NVIDIA RAPIDS 的高级工程师。
审核编辑:郭婷
下一篇: PLC、DCS、FCS三大控
上一篇: 如何借助高均匀性的 S