NNPOps
NNPOps copied to clipboard
Incorrect library name on Mac
I'm trying to build NNPOps on a Mac. It builds correctly, but when I try to import NNPOps
it fails with this error:
Traceback (most recent call last):
File "/Users/peastman/miniconda3/envs/openmm/lib/python3.9/runpy.py", line 188, in _run_module_as_main
mod_name, mod_spec, code = _get_module_details(mod_name, _Error)
File "/Users/peastman/miniconda3/envs/openmm/lib/python3.9/runpy.py", line 111, in _get_module_details
__import__(pkg_name)
File "/Users/peastman/miniconda3/envs/openmm/lib/python3.9/site-packages/NNPOps/__init__.py", line 7, in <module>
torch.ops.load_library(os.path.join(os.path.dirname(__file__), 'libNNPOpsPyTorch.so'))
File "/Users/peastman/miniconda3/envs/openmm/lib/python3.9/site-packages/torch/_ops.py", line 255, in load_library
ctypes.CDLL(path)
File "/Users/peastman/miniconda3/envs/openmm/lib/python3.9/ctypes/__init__.py", line 374, in __init__
self._handle = _dlopen(self._name, mode)
OSError: dlopen(/Users/peastman/miniconda3/envs/openmm/lib/python3.9/site-packages/NNPOps/libNNPOpsPyTorch.so, 0x0006): tried: '/Users/peastman/miniconda3/envs/openmm/lib/python3.9/site-packages/NNPOps/libNNPOpsPyTorch.so' (no such file), '/System/Volumes/Preboot/Cryptexes/OS/Users/peastman/miniconda3/envs/openmm/lib/python3.9/site-packages/NNPOps/libNNPOpsPyTorch.so' (no such file), '/Users/peastman/miniconda3/envs/openmm/lib/python3.9/site-packages/NNPOps/libNNPOpsPyTorch.so' (no such file)
The problem comes from this line:
https://github.com/openmm/NNPOps/blob/054d487d9fec8f98a111bc30ec6d3ec1ce423356/src/pytorch/init.py#L7
On Macs, shared libraries have the extension .dylib
rather than .so
. It also won't work on Windows where they have the extension .dll
.
I want to add that I think it would be very nice if we could have a mac build of the nnops so testing could be done locally instead of spawn a Linux EC2 instance.
There is this variable from cpp_extension that we could use:
import torch
from torch.utils.cpp_extension import LIB_EXT
import os
lib_path = os.path.join(os.path.dirname(__file__), 'libNNPOpsPyTorch' + LIB_EXT)
torch.ops.load_library(lib_path)
You also need to vary whether the name starts with "lib". It does on Linux and Mac, but not on Windows.
Linux: libNNPOpsPyTorch.so Mac: libNNPOpsPyTorch.dylib Windows: NNPOpsPyTorch.dll