omn​​isci 查询在 NVIDIA GPU + CUDA 中受到限制

omnisci query is throttling in NVIDIA GPU + CUDA

我试图在 GPU 中对 omnisci 中的一些查询进行基准测试 server.But 我遇到的查询是 choking.Then 我试图对 omnisci 本身提供的示例数据进行实验 flights 数据集.

以下是我的观察(我正在使用 JDBC 连接器)

1.PreparedStatement pstmt2 = conn.prepareStatement("select * from flights_2008_7M natural join omnisci_countries");
    pstmt2.execute(); # with 8 parallel threads 
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 410.104      Driver Version: 410.104      CUDA Version: 10.0     
|
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla P100-SXM2...  On   | 00000000:18:00.0 Off |                    0 |
| N/A   43C    P0    45W / 300W |   2343MiB / 16280MiB |     10%      Default |
+-------------------------------+----------------------+----------------------+
|   1  Tesla P100-SXM2...  On   | 00000000:3B:00.0 Off |                    0 |
| N/A   35C    P0    42W / 300W |   2343MiB / 16280MiB |     15%      Default |
+-------------------------------+----------------------+----------------------+
|   2  Tesla P100-SXM2...  On   | 00000000:86:00.0 Off |                    0 |
| N/A   33C    P0    42W / 300W |   2343MiB / 16280MiB |     14%      Default |
+-------------------------------+----------------------+----------------------+
|   3  Tesla P100-SXM2...  On   | 00000000:AF:00.0 Off |                    0 |
| N/A   38C    P0    42W / 300W |   2343MiB / 16280MiB |     10%      Default |
+-------------------------------+----------------------+----------------------+


2.PreparedStatement pstmt2 = conn.prepareStatement(
    "select * from flights_2008_7M where dest = 'TPA' limit 100000");
    pstmt2.execute(); # with 8 threads

脚本挂起,没有任何动静,实际上也没有 GPU 利用率。只是想检查它的配置问题。我如何最大限度地提高 GPU 利用率并使用更大的数据集执行一些复杂的查询。

Omnisci 被设计为一个分析数据库,因此它不太适合 运行 简单的投影查询,只需一点过滤即可返回大量列;然而,像您这样的查询 运行ning 在我的工作站上只用了 31 毫秒,它只使用了两个游戏 class GPU

select * from flights_2008_7m  natural join omnisci_countries where dest='DEN' ;
7 rows returned.
Execution time: 29 ms, Total time: 31 ms.

正如预期的那样,GPU 的利用率在百分之一左右浮动,因为数据集很小,并且在 GPU 上完成的操作只是连接和过滤。 要在 gpu 上看到 运行ning 的东西,你应该 运行 查询更多的记录和更少的列(只是你计算所需的列),就像这个

select so.name,sd.name,so.id,arrdelay, depdelay,st_area(so.omnisci_geo) 

来自 flights_b 在 dest_state=sd.abbr 加入 omnisci_states sd 加入 omnisci_states 等等 origin_state=so.abbr
其中 dep_timestamp 在“2007-04-05 00:00:00”和“2007-10-07 00:00:00”之间 延迟时间在 10 到 30 之间 和 depdelay>arrdelay 限制 1000;

我更改了连接条件,因为使用自然连接 tables 连接在 rowid 伪列上,所以不可能获得比 g​​eo table 上的行更多的行。

查询在同一数据集上 运行 而 flights_b table 包含 12 亿行而不是示例中的 700 万行 因为我在游戏 class GPU 上,st_area 函数非常费力,所以这个查询需要 917 毫秒到 运行;在带有 Tesla class GPU 的系统上,它会少很多

这里是 nvidia-smi 的输出,同时 运行 查询 0%、0%、1920 兆赫、10989 兆字节、540 兆字节、10449 兆字节 0%、0%、1875 兆赫、10988 兆字节、538 兆字节、10450 兆字节 88%、71%、1920 兆赫、10989 兆字节、540 兆字节、10449 兆字节 85%、74%、1875 兆赫、10988 兆字节、538 兆字节、10450 兆字节 0%、0%、1920 兆赫、10989 兆字节、540 兆字节、10449 兆字节 0 %、0 %、1875 MHz、10988 MiB、538 MiB、10450 MiB

来自 omnisql 的

运行 或使用 jdbc 驱动程序的 dbeaver 等 java 工具是相同的。

您是否尝试过使用像 dbeaver 和/或 tableau 这样的 java 工具进行查询? (后者用于查询并发)

您确定查询不会因 CPU 执行而失败吗?我使用优化的 DDL 来确保查询使用的列适合 VRAM 内存。

为确保查询不会发送到 CPU 执行,请进入 mapd_log/omnisci_server.INFO 并在 运行 查询后确保您没有收到类似的消息那。

无法在 GPU 模式下查询 运行,正在 CPU 上重试。

我在 4xV100 GPU 的 AWS 服务器上使用 1.2B+ 做了一个简短的尝试,未优化 table,我不得不更改参数 GPU-input-mem-limit=4,因为一个错误(你可以更改将其添加到 omnisci.conf 文件,然后重新启动实例)默认片段大小为 32M。

您是否更改了航班 table 上的片段大小?因为flights_7m里面的那个很低。 如果不重新创建 table,默认片段大小为 32000000 或更大。

单线程执行时间在290ms左右

78 %, 84 %, 1530 MHz, 16130 MiB, 6748 MiB, 9382 MiB
81 %, 88 %, 1530 MHz, 16130 MiB, 6924 MiB, 9206 MiB
77 %, 84 %, 1530 MHz, 16130 MiB, 8972 MiB, 7158 MiB
76 %, 83 %, 1530 MHz, 16130 MiB, 8972 MiB, 7158 MiB
79 %, 85 %, 1530 MHz, 16130 MiB, 6748 MiB, 9382 MiB
73 %, 80 %, 1530 MHz, 16130 MiB, 6924 MiB, 9206 MiB
91 %, 99 %, 1530 MHz, 16130 MiB, 8972 MiB, 7158 MiB
77 %, 84 %, 1530 MHz, 16130 MiB, 8972 MiB, 7158 MiB
95 %, 100 %, 1530 MHz, 16130 MiB, 6748 MiB, 9382 MiB
76 %, 82 %, 1530 MHz, 16130 MiB, 6924 MiB, 9206 MiB
94 %, 100 %, 1530 MHz, 16130 MiB, 8972 MiB, 7158 MiB
93 %, 100 %, 1530 MHz, 16130 MiB, 8972 MiB, 7158 MiB
82 %, 88 %, 1530 MHz, 16130 MiB, 6748 MiB, 9382 MiB
95 %, 100 %, 1530 MHz, 16130 MiB, 6924 MiB, 9206 MiB
75 %, 82 %, 1530 MHz, 16130 MiB, 8972 MiB, 7158 MiB
94 %, 100 %, 1530 MHz, 16130 MiB, 8972 MiB, 7158 MiB
77 %, 83 %, 1530 MHz, 16130 MiB, 6748 MiB, 9382 MiB
78 %, 85 %, 1530 MHz, 16130 MiB, 6924 MiB, 9206 MiB
76 %, 83 %, 1530 MHz, 16130 MiB, 8972 MiB, 7158 MiB
75 %, 82 %, 1530 MHz, 16130 MiB, 8972 MiB, 7158 MiB
90 %, 97 %, 1530 MHz, 16130 MiB, 6748 MiB, 9382 MiB
74 %, 80 %, 1530 MHz, 16130 MiB, 6924 MiB, 9206 MiB
94 %, 100 %, 1530 MHz, 16130 MiB, 8972 MiB, 7158 MiB
75 %, 82 %, 1530 MHz, 16130 MiB, 8972 MiB, 7158 MiB

运行宁 four-thread 响应时间增加到 1100 毫秒左右,GPU 利用率略有增加

93 %, 100 %, 1530 MHz, 16130 MiB, 8972 MiB, 7158 MiB
85 %, 93 %, 1530 MHz, 16130 MiB, 8972 MiB, 7158 MiB
89 %, 95 %, 1530 MHz, 16130 MiB, 6748 MiB, 9382 MiB
95 %, 100 %, 1530 MHz, 16130 MiB, 6924 MiB, 9206 MiB
90 %, 98 %, 1530 MHz, 16130 MiB, 8972 MiB, 7158 MiB
94 %, 100 %, 1530 MHz, 16130 MiB, 8972 MiB, 7158 MiB
89 %, 96 %, 1530 MHz, 16130 MiB, 6748 MiB, 9382 MiB
84 %, 91 %, 1530 MHz, 16130 MiB, 6924 MiB, 9206 MiB
92 %, 100 %, 1530 MHz, 16130 MiB, 8972 MiB, 7158 MiB
87 %, 95 %, 1530 MHz, 16130 MiB, 8972 MiB, 7158 MiB
94 %, 100 %, 1530 MHz, 16130 MiB, 6748 MiB, 9382 MiB
94 %, 100 %, 1530 MHz, 16130 MiB, 6924 MiB, 9206 MiB
89 %, 98 %, 1530 MHz, 16130 MiB, 8972 MiB, 7158 MiB
94 %, 100 %, 1530 MHz, 16130 MiB, 8972 MiB, 7158 MiB
89 %, 95 %, 1530 MHz, 16130 MiB, 6748 MiB, 9382 MiB
84 %, 91 %, 1530 MHz, 16130 MiB, 6924 MiB, 9206 MiB
88 %, 97 %, 1530 MHz, 16130 MiB, 8972 MiB, 7158 MiB

有些 GPU 没有其他 GPU 繁忙,因为数据不平衡;我们应该对 table 进行分片以获得 GPU 之间的均匀分布。

运行时间如此之高,因为在这样的投影查询中,服务器一次处理一个片段(默认 32M,因此从 [=36= 来回传输一些数据会产生一些开销] 和 GPU 以及 vice-versa.