如何在vaex中使用CUDAPython库

问题描述

我的代码如下:

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

当我第一次使用此功能- jit_cuda()时,出现错误“没有名为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,1,filtered=True,internal=True,parallel=False)
  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

我应该如何解决

解决方法

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

使用apply时,一个函数可能非常抽象,基本上是您想要的任何东西,因此可能无法编译。

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

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