如何将 CUDA 与 vaex(一个 Python 库)一起使用

Posted

技术标签:

【中文标题】如何将 CUDA 与 vaex(一个 Python 库)一起使用【英文标题】:How can I use CUDA with vaex (a Python library) 【发布时间】:2020-10-20 06:37:39 【问题描述】:

我的代码如下:

df['O_ID'] = (df.apply(get_match_id, arguments=[df['pickup_longitude'], df['pickup_latitude']])).jit_cuda()

第一次使用这个函数——jit_cuda(),报错“No Module named cupy”

但是,当我安装了 cupy-cuda101(适应我的 CUDA 版本) 我收到一个新错误

Traceback (most recent call last):
  File "F:\Anaconda3\lib\site-packages\vaex\dataframe.py", line 3580, in table_part
    values[name] = df.evaluate(name)
  File "F:\Anaconda3\lib\site-packages\vaex\dataframe.py", line 2616, in evaluate
    return self._evaluate_implementation(expression, i1=i1, i2=i2, out=out, selection=selection, filtered=filtered, internal=internal, parallel=parallel, chunk_size=chunk_size)
  File "F:\Anaconda3\lib\site-packages\vaex\dataframe.py", line 5352, in _evaluate_implementation
    dtypes[expression] = df.data_type(expression, internal=False)
  File "F:\Anaconda3\lib\site-packages\vaex\dataframe.py", line 1998, in data_type
    data = self.evaluate(expression, 0, 1, filtered=True, internal=True, parallel=False)
  File "F:\Anaconda3\lib\site-packages\vaex\dataframe.py", line 2616, in evaluate
    return self._evaluate_implementation(expression, i1=i1, i2=i2, out=out, selection=selection, filtered=filtered, internal=internal, parallel=parallel, chunk_size=chunk_size)
  File "F:\Anaconda3\lib\site-packages\vaex\dataframe.py", line 5427, in _evaluate_implementation
    value = scope.evaluate(expression)
  File "F:\Anaconda3\lib\site-packages\vaex\scopes.py", line 97, in evaluate
    result = self[expression]
  File "F:\Anaconda3\lib\site-packages\vaex\scopes.py", line 139, in __getitem__
    self.values[variable] = self.evaluate(expression)  # , out=self.buffers[variable])
  File "F:\Anaconda3\lib\site-packages\vaex\scopes.py", line 103, in evaluate
    result = eval(expression, expression_namespace, self)
  File "<string>", line 1, in <module>
  File "F:\Anaconda3\lib\site-packages\vaex\expression.py", line 1073, in __call__
    return self.f(*args, **kwargs)
  File "F:\Anaconda3\lib\site-packages\vaex\expression.py", line 1120, in wrapper
    return cupy.asnumpy(func(*args))
  File "cupy\core\fusion.pyx", line 905, in cupy.core.fusion.Fusion.__call__
  File "cupy\core\fusion.pyx", line 754, in cupy.core.fusion._FusionHistory.get_fusion
  File "<string>", line 6, in f
NameError: name 'lambda_function_1' is not defined

我该如何解决?

【问题讨论】:

【参考方案1】:

我的理解是,vaex 中的即时编译仅适用于虚拟列,或主要使用 numpy 方法或纯 python 算术的各种算术运算计算的表达式/列。

使用apply时,一个函数可以非常抽象,基本上是你想要的,所以它可能无法编译。

如果您可以使用 numpy 表达式重写您的 .apply 函数,那么您很可能可以使用 jit_cuda 方法来加速它。 Vaex 不建议使用.apply,因为它很难并行化,应该作为“最后的手段”使用。

来源:https://vaex.io/docs/tutorial.html#Just-In-Time-compilation

【讨论】:

以上是关于如何将 CUDA 与 vaex(一个 Python 库)一起使用的主要内容,如果未能解决你的问题,请参考以下文章

为什么vaex会改变包含句号的列名?

如何将 cuda 驱动程序 api 与 cuda 运行时 api 混合使用?

如何将 cuda-gdb 与使用 nvcc 编译的静态库的 g++ 链接程序一起使用?

如何将 cuPrintf 与 .cpp 文件中具有 main() 的 cuda 项目一起使用?

我应该如何以及何时将倾斜指针与 cuda API 一起使用?

如何将向量从 Cuda 直接传递到 LibSVM 结构?