数据科学

GPU 加速 Node.js JavaScript 以实现可视化和更高的性能

NVIDIA GTC21 有大量精彩且引人入胜的内容,特别是在 RAPIDS 附近,因此很容易错过我们的首次演示“ 使用 RAPIDS 加速 Node . js JavaScript 以实现可视化和更高的速度。 ”是的–我们正在通过 Node.js 项目将 GPU 加速数据科学的力量带到 JavaScript Node.js 社区。

Node- RAPIDS 是 Node . js 中模块化 RAPIDS 库绑定的开源技术预览,以及支持基于浏览器的高性能可视化的补充方法。

Venn diagram showing intersections of Performance, Reach, and Usability, highlighting the intersection of all three.

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 等高流量网站使用。显然,这是一个强大的框架。

 XKCD "Universal Connector" commit from https://xkcd.com/1406/.
图 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('');
/* OUTPUT:
---------------------------
// 1.6GB .CSV
// GPU: Titan RTX
Cloud|Overcast time: 26.819ms
Cloud|Overcast matches: 1,896,354
Rain|T-Storm|Thunderstorm|Squalls|Drizzle time: 63.813ms
Rain|T-Storm|Thunderstorm|Squalls|Drizzle matches: 326,441
Snow time: 6.396ms
Snow matches: 68,101
Fog time: 6.997ms
Fog matches: 52,063
Ice|Hail|Freezing|Sleet time: 44.031ms
Ice|Hail|Freezing|Sleet matches: 4,698
Dust|Smoke|Sand time: 29.932ms
Dust|Smoke|Sand matches: 8,846
GPU time: 190.457ms
// CPU: AMD Ryzen Threadripper 1900X 8-Core (3.8GHZ)
Cloud|Overcast time: 244.493ms
Cloud|Overcast matches: 1,896,354
Rain|T-Storm|Thunderstorm|Squalls|Drizzle time: 192.591ms
Rain|T-Storm|Thunderstorm|Squalls|Drizzle matches: 326,441
Snow time: 206.071ms
Snow matches: 68,101
Fog time: 204.61ms
Fog matches: 52,063
Ice|Hail|Freezing|Sleet time: 214.325ms
Ice|Hail|Freezing|Sleet matches: 4,698
Dust|Smoke|Sand time: 164.633ms
Dust|Smoke|Sand matches: 8,846
CPU time: 1.230s
---------------------------
// GPU is 6.45x faster than CPU
*/

节点 – RAPIDS :计为构建块

 Notional diagram of node-rapids module structure, showing components for memory management (cuda, rmm), data science (cudf, cuml, cugraph, cuspatial), graphics, streaming, and front end.
图 2 : Node- RAPIDS 模块概述。

与节点项目类似,节点 – RAPIDS 设计为模块化。我们的目标不是构建交钥匙 web 应用程序,而是创建一个 功能清单 ,以支持或加速各种各样的用例和管道。前面是当前和计划节点的概述 – RAPIDS 模块按一般类别分组。 节点 – RAPIDS 应用程序可以根据需要使用任意数量的模块。

为了减少起步的困难,我们还构建了一个 演示目录 ,它可以作为通用应用程序的模板。随着我们开发更多绑定,我们将创建更多演示来展示它们的功能。

Notional architecture diagram showing a GPU-accelerated node.js application for crossfiltering, made possible using node-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 容器,这将大大简化当前的源代码技术预览安装过程。

一如既往,我们需要社区参与来帮助指导我们。如果您有功能请求、问题或用例,可以 伸出 向我们咨询!

这个项目有很多潜力。它可以加速各种各样的 Node . js 应用程序,并将一流、高性能的数据科学和可视化工具带到一个巨大的社区。我们希望你能在这个激动人心的项目开始时加入我们。

Resources:

Tags