-
Notifications
You must be signed in to change notification settings - Fork 90
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
Data array is flattened in numcodecs which reduced the compression ratio that ZFP can provide on multi-dimension arrays #303
Comments
@lindstro @jakirkham please add your comments. |
I believe there are multiple independent issues here. First, arrays should not be flattened when used with zfp. I see no need to even make arrays contiguous as zfp supports strided compression. Second, it is true that zfp returns decompressed arrays in C order (the default layout in NumPy), regardless of the original layout. zfp does not capture the original layout, nor is it clear that it should. For instance, if the array being compressed is not contiguous (think array-of-struct storage), would we really want to return a decompressed array full of holes? We did consider supporting strided decompression with Third, it is an issue if zfp's tests break if given an original array to compress in Fortran order, and I'd be surprised if this were not handled properly. @halehawk, can you provide a simple example that illustrates such a bug? If this is indeed the case, then we need to fix the zfp implementation/tests, not numcodecs. |
Sounds like we could fix the flattening pretty easily with a new keyword argument here Line 53 in a81856e
All the existing codecs would work the same with the default Line 58 in a81856e
with |
But using Ryan's way, it cannot pass the test at test_zfpy.py if the array
is
https://github.com/zarr-developers/numcodecs/blob/a81856efbf8dfd8ea925acaac01235a096d285e4/numcodecs/tests/test_zfpy.py#L41
np.asfortranarray(np.random.normal(loc=1000, scale=1, size=(5, 10, 20))),
because zfp decoder returns a C-order multidimensional array.
…On Tue, Feb 8, 2022 at 3:59 PM Ryan Abernathey ***@***.***> wrote:
Sounds like we could fix the flattening pretty easily with a new keyword
argument here flatten=True
https://github.com/zarr-developers/numcodecs/blob/a81856efbf8dfd8ea925acaac01235a096d285e4/numcodecs/compat.py#L53
All the existing codecs would work the same with the default flatten=True,
but we could call it from zfp here
https://github.com/zarr-developers/numcodecs/blob/a81856efbf8dfd8ea925acaac01235a096d285e4/numcodecs/zfpy.py#L58
with flatten=False
—
Reply to this email directly, view it on GitHub
<#303 (comment)>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/ACAPEFDTBEMOQUEQCUVP5K3U2GN47ANCNFSM5N3H636A>
.
Triage notifications on the go with GitHub Mobile for iOS
<https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675>
or Android
<https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub>.
You are receiving this because you were mentioned.Message ID:
***@***.***>
|
So why don't we just disallow F order for the zfp codec? I am becoming more and more convinced that it is unnecessary to support it. See discussion in zarr-developers/community#41. |
@rabernat I agree with you it is great if we can skip Fortran array test here. I tested xarray.open_dataset with backend netcdf4, it always opens a netcdf file as a c-order data array even the netcdf file was written to f-order originally. I didn't check with hdf5 or scipy backends. If anyone can confirm that hdf5 and scipy are the same cases, then I think it is all right to skip the Fortran array test in the test_zfpy.py. |
HDF5 and NetCDF simply do not support F order on disk at all. I think it's fine for a particular codec to not support F-order memory layout. The user can always transform their data if need be if they happen to be creating F order. We just need to raise an informative error in the event of seeing F order inputs to the codec. |
I partially agree. HDF5 imposes C order and (to my knowledge) does not support strided storage, where strides are recorded in the file. I believe it does not support strides on reads either, e.g., to force F order. But you can always store F order data in HDF5 by simply reversing the order of dimensions. zfpy actually examines the NumPy array's strides and passes them on to zfp. Because zfp uses F order, zfpy reverses the dimensions in anticipation that in most cases, the NumPy order will be the default C order, which promotes good data locality during compression. Now, the original memory layout is not recorded by zfp, just like how this information is absent from HDF5. Therefore, if upon decompression the user wants to recover the array in the same order as it was compressed in, that kind of information would have to be stored separately and the data would have to be permuted. That said, it is not clear to me why it's necessary to ensure that compressed and decompressed data appear in the same order. Both arrays will agree on the dimensions of the array, just not how it is organized in memory. Is there a compelling reason to guarantee that both arrays have the same layout? After all, numcodecs forces both contiguous and flat storage, so the original memory layout is already lost, no? |
Ryan's suggestion seems reasonable. Forget whether we discussed this, but does zfp work with N-D data? If not, what happens if it is fed an array with N greater than what is supported by zfp. Also how would this work for decompression? Does zfp return an array of the right dimensionality? |
Only when 1 <= N <= 4. :-) For higher-dimensional arrays, you need to consolidate some dimensions (ideally the ones that are least correlated). This could for instance be done using a reshape operation, though you'd probably want to keep track of the dimensions of the original array. We're planning to support higher-dimensional arrays in future versions of zfp. It is unlikely that the compression scheme would support more than four dimensions (it's unusual to have data that is correlated in that many dimensions), but the API would allow you to describe higher-dimensional arrays and to identify the smoothest dimensions along which to compress (may be less than four). The current zfp C API does not accommodate N > 4; the zfpy module will raise an exception if asked to compress a NumPy array with N > 4. |
Thanks for the info Peter :) Follow up question, when the data is decompressed, will it return the expected N-D array or is it 1-D (IOW up to the user to reshape)? Side note: In microscopy it is common to have 5-D data (TZYXC or time + 3D spatial + channel). |
zfpy will return a decompressed N-D NumPy array of the same shape as the array that was compressed. However, the way zfpy currently interfaces with numcodecs, it is handed a 1D reshaped array to compress, which is the issue at hand. In this case, zfpy will also return a 1D decompressed array. Moreover, compression is severely handicapped by not being able to exploit higher-dimensional correlations.
Right, though I suspect there's little correlation across channels. In radiation transport, we deal with 6D data (3 spatial + 2 angular + energy group) that is correlated in all six dimensions, but there are diminishing returns in compressing more than three dimensions (at least as far as zfp is concerned). I agree that zfp should handle such data sets, but probably in the API layer and not in the compression algorithm itself. |
Peter, I saw your zfpy pip package has Python 3.9 and 3.10 version, does
your 3.9 macos version work on mac? Did you merge my PR for building that
pip package?
…On Thu, Feb 10, 2022 at 2:14 PM Peter Lindstrom ***@***.***> wrote:
Thanks for the info Peter :)
Follow up question, when the data is decompressed, will it return the
expected N-D array or is it 1-D (IOW up to the user to reshape)?
zfpy will return a decompressed N-D NumPy array of the same shape as the
array that was compressed. However, the way zfpy currently interfaces with
numcodecs, it is handed a 1D reshaped array to compress, which is the issue
at hand. In this case, zfpy will also return a 1D decompressed array.
Moreover, compression is severely handicapped by not being able to exploit
higher-dimensional correlations.
Side note: In microscopy it is common to have 5-D data (TZYXC or time + 3D
spatial + channel).
Right, though I suspect there's little correlation across channels. In
radiation transport, we deal with 6D data (3 spatial + 2 angular + energy
group) that is correlated in all six dimensions, but there are diminishing
returns in compressing more than three dimensions (at least as far as zfp
is concerned). I agree that zfp should handle such data sets, but probably
in the API layer and not in the compression algorithm itself.
—
Reply to this email directly, view it on GitHub
<#303 (comment)>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/ACAPEFFUNFYA5JQ4XBUIILLU2QTFBANCNFSM5N3H636A>
.
Triage notifications on the go with GitHub Mobile for iOS
<https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675>
or Android
<https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub>.
You are receiving this because you modified the open/close state.Message
ID: ***@***.***>
|
I just created a PR #307 , it successfully built and tested on windows/linux, I thought it still skipped the macos tests for numcodecs.zfpy. Hopefully @rabernat @jakirkham can approve the merge soon. |
I'm getting a dlopen() error using the 3.9 macOS package, which I think is something we saw earlier and what your PR addresses. I wasn't involved in generating these wheels, but it looks like we still have an outstanding PR from you. I'm sorry for dropping the ball on this. I think we ran into issues with the PR not being tested and I may have been waiting on this to get resolved. Since then, we've switched over from Travis to GitHub Actions, though it appears that we're still not testing on Mac. @da-wad Would you have some time to work with @halehawk on getting her PR tested, ideally by adding testing on macOS? We're very close to the next zfp release and it would be great to have this worked out before we build Mac wheels for the next version. |
Building wheels for Linux and Windows turned out to be way easier in Github Actions than Travis+Multibuild (not to mention faster), so for ease of maintenance that should be used going forwards. Sorry about this, @halehawk , but switching CI actually now invalidates your PR... However, reading the cuibuildwheel docs, I think there is a pretty trivial way to include macOS wheels now. All you should have to do is add corresponding tags from this table to line 27 here: https://github.com/LLNL/zfpy-wheels/blob/master/.github/workflows/wheels.yml#L27 |
@david Wade ***@***.***> Do you still use config.sh and
.travis.yaml? If you do use config.sh, could you please point me to the
lines in wheels.yaml?
…On Mon, Feb 14, 2022 at 8:43 AM David Wade ***@***.***> wrote:
Building wheels for Linux and Windows turned out to be *way* easier in
Github Actions than Travis+Multibuild (not to mention faster), so for ease
of maintenance that should be used going forwards. Sorry about this,
@halehawk <https://github.com/halehawk> , but switching CI actually now
invalidates your PR... However, reading the cuibuildwheel docs, I think
there is a pretty trivial way to include macOS wheels now. All you should
have to do is add corresponding tags from this table
<https://cibuildwheel.readthedocs.io/en/stable/options/#build-skip> to
line 27 here:
https://github.com/LLNL/zfpy-wheels/blob/master/.github/workflows/wheels.yml#L27
—
Reply to this email directly, view it on GitHub
<#303 (comment)>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/ACAPEFE2MIGXTTFVFLHV25DU3EGOTANCNFSM5N3H636A>
.
Triage notifications on the go with GitHub Mobile for iOS
<https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675>
or Android
<https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub>.
You are receiving this because you were mentioned.Message ID:
***@***.***>
|
Ah, no those are no longer used. I have removed them and updated the README. It should be no more than adding those tags! Wheels for Windows are still made in Appveyor, but this should be switched over to Github Actions too and I'd planned to do this with the release of ZFP 0.5.6 |
@david Wade ***@***.***> There is no /usr/local/lib64 directory on
Mac machine, so I cannot run the cp command in your script successfully.
…On Wed, Feb 16, 2022 at 2:38 AM David Wade ***@***.***> wrote:
Ah, no those are no longer used. I have removed them and updated the
README. It should be no more than adding those tags!
Wheels for Windows are still made in Appveyor, but this should be switched
over to Github Actions too and I'd planned to do this with the release of
ZFP 0.5.6
—
Reply to this email directly, view it on GitHub
<#303 (comment)>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/ACAPEFEBZ3FWY2RA3H46H5LU3NV7VANCNFSM5N3H636A>
.
Triage notifications on the go with GitHub Mobile for iOS
<https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675>
or Android
<https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub>.
You are receiving this because you were mentioned.Message ID:
***@***.***>
|
Ah, yes. I only said "should be"... of course reality is more complicated. Take a look at this then: |
I updated my PR at zfpy-wheel with a working macos wheel.yml. Please check
it and let me know if you can merge it or not.
…On Fri, Feb 18, 2022 at 1:22 AM David Wade ***@***.***> wrote:
Ah, yes. I only said "should be"... of course reality is more complicated.
Take a look at this
<https://cibuildwheel.readthedocs.io/en/stable/options/#before-build>then:
[image: image]
<https://user-images.githubusercontent.com/25386679/154644950-99193ee1-2349-436c-9fae-3891b197daac.png>
—
Reply to this email directly, view it on GitHub
<#303 (comment)>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/ACAPEFFFKEF6YEHBAD3H7C3U3X6U7ANCNFSM5N3H636A>
.
Triage notifications on the go with GitHub Mobile for iOS
<https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675>
or Android
<https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub>.
You are receiving this because you were mentioned.Message ID:
***@***.***>
|
May benefit from copying some changes that are being made to the Numcodecs wheel ( #309 ) |
In fact, this one is very similar
https://github.com/kivy/kivy/blob/master/.github/workflows/osx_wheels_app.yml
…On Fri, Feb 18, 2022 at 10:24 AM jakirkham ***@***.***> wrote:
May benefit from copying some changes that are being made to the Numcodecs
wheel ( #309 <#309> )
—
Reply to this email directly, view it on GitHub
<#303 (comment)>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/ACAPEFCP6LPUDJJYB44AMK3U3Z6DTANCNFSM5N3H636A>
.
Triage notifications on the go with GitHub Mobile for iOS
<https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675>
or Android
<https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub>.
You are receiving this because you were mentioned.Message ID:
***@***.***>
|
@halehawk Many thanks for your PR, I had to fix it up a bit as it appears that the PyPI upload needs to be running on Linux, so has to be separated out from the wheel building. (See: https://github.com/pypa/gh-action-pypi-publish#non-goals) Things seem to be working now... at least the job is failing at uploading pre-existing wheels (which it should). I think the existing macOS ones were broken, so we can fix them with 0.5.6 However, I wonder if you could test the 3.10 wheel on Mac? |
Sure, I am waiting this wheel to test on my other PR.
…Sent from my iPhone
On Feb 24, 2022, at 8:22 AM, David Wade ***@***.***> wrote:
@halehawk Many thanks for your PR, I had to fix it up a bit as it appears that the PyPI upload needs to be running on Linux, so has to be separated out from the wheel building. (See: https://github.com/pypa/gh-action-pypi-publish#non-goals)
Things seem to be working now... at least the job is failing at uploading pre-existing wheels (which it should). I think the existing macOS ones were broken, so we can fix them with 0.5.6 However, I wonder if you could test the 3.10 wheel on Mac?
—
Reply to this email directly, view it on GitHub, or unsubscribe.
Triage notifications on the go with GitHub Mobile for iOS or Android.
You are receiving this because you were mentioned.
|
@david Wade ***@***.***> I just downloaded zfpy-0.5.5-cp310 to my
mac, it was pip install successfully and I can run zfpy and numcodecs.zfpy
from python command line successfully too.
…On Thu, Feb 24, 2022 at 8:22 AM David Wade ***@***.***> wrote:
@halehawk <https://github.com/halehawk> Many thanks for your PR, I had to
fix it up a bit as it appears that the PyPI upload needs to be running on
Linux, so has to be separated out from the wheel building. (See:
https://github.com/pypa/gh-action-pypi-publish#non-goals)
Things seem to be working now... at least the job is failing at uploading
pre-existing wheels (which it should). I think the existing macOS ones were
broken, so we can fix them with 0.5.6 However, I wonder if you could test
the 3.10 wheel on Mac?
[image: image]
<https://user-images.githubusercontent.com/25386679/155553406-11a8cd55-523f-4a71-a74b-a1bc8405a2a7.png>
—
Reply to this email directly, view it on GitHub
<#303 (comment)>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/ACAPEFBQNN63FFOUY6XA4PDU4ZEKRANCNFSM5N3H636A>
.
Triage notifications on the go with GitHub Mobile for iOS
<https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675>
or Android
<https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub>.
You are receiving this because you were mentioned.Message ID:
***@***.***>
|
Excellent! Sounds like this is fixed, and all we need is a new commit-hash from @lindstro of a 0.5.6 tag :-) I'll look into migrating Windows builds out of Appveyor and into Github Actiosn too... |
That's great. Hopefully, we can see zfpy-0.5.6 sooner than we expected.
…On Thu, Feb 24, 2022 at 9:07 AM David Wade ***@***.***> wrote:
Excellent! Sounds like this is fixed, and all we need is a new commit-hash
from @lindstro <https://github.com/lindstro> of a 0.5.6 tag :-)
I'll look into migrating Windows builds out of Appveyor and into Github
Actiosn too...
—
Reply to this email directly, view it on GitHub
<#303 (comment)>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/ACAPEFDHQCUHRHHZQ3P3D6LU4ZJSLANCNFSM5N3H636A>
.
Triage notifications on the go with GitHub Mobile for iOS
<https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675>
or Android
<https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub>.
You are receiving this because you were mentioned.Message ID:
***@***.***>
|
It'll be a little while longer, I'm afraid, as I'm on travel this week and next. It's likely that we will release zfp as version 1.0.0 due to the many C/C++ ABI incompatibilities we've introduced. The Python interface will not change, however. Thanks to both of you for helping out with the macOS wheels. |
@david Wade ***@***.***> did you rebuild zfpy-python38-macos and
zfpy-python39-macos and upload them? Looks like they are not right yet.
…On Thu, Feb 24, 2022 at 9:18 AM Peter Lindstrom ***@***.***> wrote:
It'll be a little while longer, I'm afraid, as I'm on travel this week and
next. It's likely that we will release zfp as version 1.0.0 due to the many
C/C++ ABI incompatibilities we've introduced. The Python interface will not
change, however. Thanks to both of you for helping out with the macOS
wheels.
—
Reply to this email directly, view it on GitHub
<#303 (comment)>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/ACAPEFHHL6FZIMNK3FTY3I3U4ZK47ANCNFSM5N3H636A>
.
Triage notifications on the go with GitHub Mobile for iOS
<https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675>
or Android
<https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub>.
You are receiving this because you were mentioned.Message ID:
***@***.***>
|
Yes, they were rebuilt and upload was attempted, as I said previously: "the job is failing at uploading pre-existing wheels (which it should)". Any file uploaded to PyPI cannot be replaced, so that we can't break anything which does work... this is a feature of PyPI I guess you weren't aware of. Unfortunately this means that 0.5.5 is broken forever for Python 3.9 and 3.8 on MacOS... We could get around this by uncoupling the zfpy version number from the zfp one, but since a 1.0.0 release is imminent I don't know if this is necessary/wise. |
It's a pity that zfpy-0.5.5 has broken macos builds for Python 3.8 and 3.9,
and hopefully we don't need to stick with them for a long time. I wasn't
aware of that until you told me now.
…On Fri, Feb 25, 2022 at 12:54 AM David Wade ***@***.***> wrote:
Yes, they were rebuilt and upload was *attempted*, as I said previously:
"the job is failing at uploading pre-existing wheels (which it should)".
Any file uploaded to PyPI cannot be replaced, so that we can't break
anything which *does* work... this is a feature of PyPI I guess you
weren't aware of. Unfortunately this means that 0.5.5 is broken forever for
Python 3.9 and 3.8 on MacOS...
We could get around this by uncoupling the zfpy version number from the
zfp one, but since a 1.0.0 release is imminent I don't know if this is
necessary/wise.
—
Reply to this email directly, view it on GitHub
<#303 (comment)>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/ACAPEFFAOLWUGIUYNNC26E3U44YRVANCNFSM5N3H636A>
.
Triage notifications on the go with GitHub Mobile for iOS
<https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675>
or Android
<https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub>.
You are receiving this because you were mentioned.Message ID:
***@***.***>
|
@da-wad, one could use |
Yanking the entire 0.5.5 release because of two broken wheels seems a little extreme... @jakirkham! However, thanks for the nudge to find the proper way to do this. It turns out that there is a build tag in the wheel naming convention for solving exactly this problem: https://packaging.python.org/en/latest/specifications/binary-distribution-format/#file-name-convention Therefore... I was able to download the artifacts from the zfpy-wheels build, rename the two macosx wheels which weren't uploaded and use twine to pop them onto PyPI manually. Do these work for you now? |
Awesome, thanks! Can my PR #303 be merged now?
…On Mon, Feb 28, 2022 at 1:08 AM David Wade ***@***.***> wrote:
Yanking the entire 0.5.5 release because of two broken wheels seems a
little extreme... @jakirkham <https://github.com/jakirkham>!
However, thanks for the nudge to find the proper way to do this. It turns
out that there is a build tag in the wheel naming convention for solving
exactly this problem:
https://packaging.python.org/en/latest/specifications/binary-distribution-format/#file-name-convention
Therefore... I was able to download the artifacts from the zfpy-wheels
build, rename the two macosx wheels which weren't uploaded and use twine to
pop them onto PyPI manually. Do these work for you now?
[image: image]
<https://user-images.githubusercontent.com/25386679/155946971-3ade4ba3-1fa0-444b-962f-33dc057b595d.png>
—
Reply to this email directly, view it on GitHub
<#303 (comment)>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/ACAPEFAN3IC5HY2VHN2Y5GDU5MUQBANCNFSM5N3H636A>
.
Triage notifications on the go with GitHub Mobile for iOS
<https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675>
or Android
<https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub>.
You are receiving this because you were mentioned.Message ID:
***@***.***>
|
Minimal, reproducible code sample, a copy-pastable example if possible
Problem description
ZFP is a lossy compressor that expects to get better compression ratio when compressing multi-dimension arrays. Currently in the zfpy.encode, ensure_contiguous_ndarray function flattens the array and feeds to ZFP compressor. In this way, ZFP compressor only can get less expected compression ratio. So I tried to add a switch in ensure_contiguous_ndarray, if the codec is ZFP, I skipped the flattening. However, this only works on C-order array, it doesn't work on F-order array because ZFP decoder only returns C-order array. When the decoder returns C-order multi-dimension array for an original F-order multi-dimension array, ZFP compressor cannot pass the F-order array encode and decode test.
Version and installation information
Please provide the following:
numcodecs.__version__
The text was updated successfully, but these errors were encountered: