在非GPU情况下,使用"import numpy as cp"是一个好的做法吗?

4

我正在编写使用CuPy在GPU上运行以提高速度的代码。但是,我希望该代码能够使用numpy实现运行(尽管速度会更慢)。 目前,我正在执行以下操作:

import numpy as np
if gpu_present:
    import cupy as cp
else:
    import numpy as cp

我担心以后可能会遇到问题。这是好的做法吗?

这可能会引起您的兴趣:https://docs-cupy.chainer.org/en/stable/tutorial/basic.html#how-to-write-cpu-gpu-agnostic-code - Robert Crovella
1个回答

2
当脚本很小且在启动时可以固定使用命名空间时,我经常使用名为xp的全局变量(与您的解决方案相同)。我有时也会使用类的实例属性(同样命名为xp)来实现类似的模式;这更容易进行未来扩展,因为每个实例可以对该属性具有不同的值。一种类似但更健壮、但更繁琐的方法是使xp成为每个函数的第一个参数。
编写可能在任何情况下使用的库时(例如多线程代码,在单个进程中同时使用NumPy和CuPy),最好使每个函数/类根据参数适当地处理命名空间。我经常使用get_array_module实用程序来实现这个目的。 CuPy有这个函数,但需要安装CuPy。Chainer也有。你也可以自己编写它。使用此实用程序,您可以使代码可用于NumPy或CuPy数组,而无需全局切换。
此外,请注意,NumPy>=1.17可以将CuPy数组分派给适当的CuPy例程,因此您可以在大多数情况下直接将CuPy数组传递给numpy.*函数。如果您的代码只对给定的数组进行计算,则甚至不需要使用cupy命名空间(但是仍然需要使用它来创建一个新数组而不给出另一个数组,例如cupy.onescupy.random.*)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接