-
Notifications
You must be signed in to change notification settings - Fork 13
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Create an openblas wheel #87
Conversation
The wheels are named |
xref pypa/auditwheel#392 which will enable telling auditwheel "we know openblas is outside the manylinux spec, but package anyway" |
This is starting to work. After building OpenBLAS, do something like (from CI)
or replace the last line with
And using a modified numpy (to find openblas but not add
|
Note that removing the The other direction, of mangling RPATH, LD_PRELOAD, LD_LIBPARARY_PATH, are all less attractive. They must be done at process startup, and way before any Python code is run. I don't think importing a package could modify any of that state. |
Here is the minimal diff to NumPy in order to remove the link with diff --git a/numpy/core/setup.py b/numpy/core/setup.py
index 17dc8438e..302e92c7e 100644
--- a/numpy/core/setup.py
+++ b/numpy/core/setup.py
@@ -15,6 +15,12 @@
from numpy.compat import npy_load_module
from setup_common import * # noqa: F403
+try:
+ import openblas
+ importable_openblas = True
+except ModuleNotFoundError:
+ importable_openblas = False
+
# Set to True to enable relaxed strides checking. This (mostly) means
# that `strides[dim]` is ignored if `shape[dim] == 1` when setting flags.
NPY_RELAXED_STRIDES_CHECKING = (os.environ.get('NPY_RELAXED_STRIDES_CHECKING', "1") != "0")
@@ -849,6 +855,10 @@ def get_mathlib_info(*args):
])
else:
extra_info = {}
+ if importable_openblas:
+ # TODO: use a better API for importable openblas
+ extra_info.pop('libraries', None)
+ extra_info.pop('runtime_library_dirs', None)
#######################################################################
# _multiarray_umath module - multiarray part # Edit: This is of course only a first cut. A real PR would avoid requiring successfully finding the openblas library, or enable finding it via this openblas project. Something similar must be done with linalg Edit2: this change can be found on the mattip/dynamic-openblas branch of my fork |
Rebased and added commits from #89, thanks @mayeut. Also added a |
5bd6e59
to
12b7dbd
Compare
68c771a
to
58550fa
Compare
I don't really grok what is going wrong, but meson cannot use the auditwheel-repaired shared objects to build NumPy. Somehow when building the When the CI builds with the older Maybe a more healthy approach would be to statically link libgfortran and libquadmath into the openblas shared object in the OpenBLAS build phase (like on windows) |
I'm slightly confused about the two mentions of I'm downloading the wheels from the last CI run to have a look. Do you have a numpy branch to build against an installed wheel to try?
Ah, that may be a problem. Can you repair it by adding an extra RPATH entry for |
That is what I saw in the logs: the result of cc.links is called |
Maybe. But that would be a little involved. After |
I meant just trying it locally first, to see if then everything works. |
ec4bbf1
to
8bd388a
Compare
Ah okay. That makes sense, I've seen it before. IIRC that's just a file name that was easier to keep static. It has nothing to do with Windows executables.
I quickly tried this. Here's what it looks like (note the "not found" issue) after unzipping the wheel:
Adding in an
So I think that may be an |
Binary size of |
You have to have all the pieces of the puzzle for that though. I don't have a |
Thanks. I will play with this locally. It seems complicated to get OpenBLAS to link statically when making a shared object, I get an error (note the
|
fwiw, the command to build OpenBLAS in the manylinux2014 docker is
and there is a libquadmath.a inside the gcc10-installation of the docker image. |
This seems to work now (in a numpy checkout, using the last commit here):
... which promtly segfaults. Investigating. |
be52cad
to
d6818bb
Compare
I think this is ready, it seems to work when properly setting the meson build options. I have uploaded wheels to PyPI. I will self-merge and then submit a PR to numpy/numpy to use the wheels. |
Awesome, nice work @mattip! I'm looking forward to using this:) |
Fixes #86.
There is room to bikeshed the package name: openblas, openblas_libs, ...?
The content will appear at
site-packages/openblas/{lib, include}
. The concept of installing undersys.prefix
is in discussion. If it is critical, we could move to flit rather than setuptools. We would then need an agreed upon location undersys.prefix
to put the include files, shared objects, link libraries, pkgconfig scripts, and cmake modules.In future PRs: