openmm / NNPOps

High-performance operations for neural network potentials
Other
81 stars 17 forks source link

Incorrect library name on Mac #102

Open peastman opened 1 year ago

peastman commented 1 year ago

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.

xiki-tempula commented 1 year ago

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.

RaulPPelaez commented 1 year ago

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)
peastman commented 1 year ago

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