omnisci 查询在 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 伪列上,所以不可能获得比 geo 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.
我试图在 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 伪列上,所以不可能获得比 geo 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.