适用于 GPU 的 Python 编码



我对Python很陌生,我必须处理大约20GB的数据文件。目前我想了解是否可以编写任何 Python 代码(如下所示(并在 GPU 上运行它。实际上我只需要打开该文件,制作类似的东西:

file=open(fnTar,"w")
for iLine in List:
iLine=iLine.replace(“\”,””)
file.write(iLine)
file.close()

我知道有像 Dask 这样的高级 API 可以更有效地处理大文件,但将来我还需要以不同的方式操作数据(一些计算(。是否可以在不更改原始脚本的情况下在 GPU 上运行此类代码?像这样:

Run this on GPU:
file=open(fnTar,"w")
for iLine in List:
iLine=iLine.replace(“\”,””)
file.write(iLine)
file.close()

我的理解是,即使使用 CUDA 也需要对代码进行一些额外的更改,如果使用像 numpy 这样的模块,您必须找到为 CUDA 开发的等效模块。所以这可能也不是我正在寻找的简单快速的解决方案。

根据我对你问题的理解,这可能不是你要找的。GPU 适合执行矩阵操作,而不是显式处理大文件。为此,您确实需要更多的内存或某种以块为单位处理它的方法。

您可以在RapidsAI框架中进行强大的字符串操作。 如果您有CSV,那么数据加载速度可能会非常快:https://blog.dask.org/2019/01/13/dask-cudf-first-steps

谢谢你的这个问题。 以下是你如何使用RAPIDS和NVIDIA GPU来快速做到这一点(无论是在时间和代码上!(。 它将要求您使用 cudf 或 nvstrings。 这些只是玩具示例,因此请根据您的用例进行适当调整。

库德夫

1( 直接创建并读取文件(假设您的用例为 CSV(:

import cudf
fn = 'test.csv'
lines = """a, b, c
test \ phase 1, 2, 3
test  \phase 2, 4, 5
test\phase 3, 6, 7
"""
with open(fn, 'w') as fp:
fp.write(lines)
# File Manipulation starts here    
df = cudf.read_csv(fn)
df.head()

这是输出:

a  b   c
0   test  phase 1  2   3
1   test phase 2   4   5
2   testphase 3    6   7

2(进行更换:

df['a'] = df['a'].str.replace("\","", regex=False) # regex=False is important as this particular instance as replace won't work without it (created a github issue to fix that)!
df.head()

您的输出将是:

a             b   c
0   test  phase 1   2   3
1   test phase 2    4   5
2   testphase 3     6   7

3( 写入文件

df.to_csv("testdone.csv")

NVSTRINGS:本部分的文档链接

对于 nvstring 解决方案,请将列表发送到设备。 我没有您的文件或其格式信息,因此如果您愿意,我会要求您尝试一下:)。但是,请注意实现的 IO,因为这种延迟可能会导致它花费比 cudf 更长的时间。 将文件发送到 GPU 并仅在 GPU 上处理它真的更好(更快(。我真的不推荐这种方式,而只是向您展示您可以在玩具示例中做什么:)。

import nvstrings
s = nvstrings.to_device(["hllo","godbye"]) #Example list, s=iLine
print(s.replace('\', '', regex=False))

输出将是:

['hllo', 'godbye']

至于 20GB 的文件大小,如果你有 GPU 内存大小,比如在 Titan RTX/GV100/或 RTX8000 上,在没有 Dask 的单个 GPU 上你应该没问题。 如果没有,请将其应用于dask_cudf。 Dask_cudf字符串访问器源就在这里!

希望这有帮助!

最新更新