我有一个割炬扩展名(但我认为我得到的错误与割炬无关),我们将其称为foo
,它是由setuptools
构建的。但是,这取决于系统中是否有GPU,在这种情况下,会编译一些CUDA代码:
from torch.utils.cpp_extension import CppExtension, BuildExtension, CUDAExtension
if cuda_available:
ext = CUDAExtension(
'foo_gpu',
prefixed(prefix, ['foo.cpp', 'foo_kernel.cu']),
define_macros=[('COMPILE_CUDA', '1')])
else:
ext = CppExtension(
'foo_cpu',
prefixed(prefix, ['foo.cpp']))
setup(name=ext.name,
version='1.0.0',
ext_modules=[ext_module],
extra_compile_args=['-mmacosx-version-min=10.9'],
cmdclass={'build_ext': BuildExtension})
注意如何将模块编译为foo_gpu
或foo_cpu
。
稍后,我将其导入如下:
try:
import foo_gpu as foo_backend
CUDA_SUPPORTED = True
except ImportError:
CUDA_SUPPORTED = False
# Try importing the cpu version
try:
import foo_cpu as foo_backend
except ImportError:
...
假设我在CUDA支持下进行了编译,因此foo_gpu
进入了PIP(实际上以foo-gpu
的形式进入PIP,不确定为什么吗?)
现在,我卸载了pip uninstall foo-gpu
,并仅在CPU支持下对其进行了编译,并且pip显示foo-cpu 1.0.0
。
BUT ,现在,当我运行上面的导入代码时,它仍然会找到foo-gpu
,即第一个import语句成功!即使它没有显示在pip
中。
编辑。我检查了sys.path
,发现在conda env中有一个包含gpu
的文件夹:
$ ls ~/miniconda3/envs/cpu_env/lib/python3.7/site-packages/foo_cpu-1.0.0-py3.7-linux-x86_64.egg/
EGG-INFO
__pycache__
foo_cpu.cpython-37m-x86_64-linux-gnu.so
foo_cpu.py
foo_gpu.cpython-37m-x86_64-linux-gnu.so
但是它应该如何到达那里?在这个环境(cpu_env
中,我从未使用GPU支持进行编译。是否有一些缓存被调用?
答案 0 :(得分:0)
结果证明内置的GPU已由setuptools(build/
,dist/
等)缓存并安装!