sparse eigen value decomposition difference
- Dominant language
- Python
- Stars
- 12.3k
- Forks
- 1.1k
- Avg merge
- 1d 20h
- Merged PRs (30d)
- 45
Description
### Description
I am doing eigen value decomposition(EVD) with cupy. I encountered Out Of Memory issue and I have to solve this problem. So I converted data from dense to sparse and did EVD but dense and sparse have different results.
### To Reproduce
```py
### numpy, sparse difference
import numpy as np
from scipy.sparse import csr_matrix
from scipy.sparse.linalg import eigsh
from scipy.linalg import eigh
# random data
np.random.seed(42)
data = np.random.rand(100, 100)
# change to sparse
data_sparse = csr_matrix(data)
# dense
L_dense, V_dense = eigh(data)
# sparse
L_sparse, V_sparse = eigsh(data_sparse, k=min(data_sparse.shape) - 1)
print("Numpy EVD (first 5 eigen values):", L_dense[-5:])
print("Scipy sparse EVD (first 5 eigen values):", L_sparse[-5:])
### dask + cupy sparse, dask + cupy difference
import cupy as cp
import cupyx.scipy.sparse as sparse
import dask.array as da
from cupyx.scipy.sparse.linalg import eigsh
from cupy.linalg import eigh
# random data
cp.random.seed(42)
data = cp.random.rand(100, 100)
# change to sparse
data_sparse = sparse.csr_matrix(data)
# change to dask array (sparse matrix)
data_dask_sparse = da.from_array(data_sparse.toarray(), chunks=(50, 50))
data_dask_sparse = data_dask_sparse.map_blocks(sparse.csr_matrix)
# change to dask array (dense matrix)
data_dask_dense = da.from_array(data, chunks=(50, 50))
# EVD (Dask + CuPy Sparse)
k = min(data_sparse.shape) // 2
L_sparse, V_sparse = eigsh(data_dask_sparse.compute(), k=k)
# EVD (Dask + CuPy Dense)
L_dense, V_dense = eigh(data_dask_dense.compute())
# compare results
print("sparse EVD :", L_sparse)
print("dense EVD :", L_dense)
```
### Installation
Wheel (`pip install cupy-***`)
### Environment
```
# Paste the output here
OS : Linux-6.1.0-28-amd64-x86_64-with-glibc2.36
Python Version : 3.12.8
CuPy Version : 13.4.0
CuPy Platform : NVIDIA CUDA
NumPy Version : 2.0.2
SciPy Version : 1.15.1
Cython Build Version : 3.0.12
Cython Runtime Version : None
CUDA Root : (omission)
nvcc PATH : (omission)
CUDA Build Version : 12080
CUDA Driver Version : 12050
CUDA Runtime Version : 12080 (linked to CuPy) [/](https://vscode-remote+ssh-002dremote-002bgpu01.vscode-resource.vscode-cdn.net/) 12080 (locally installed)
CUDA Extra Include Dirs : []
cuBLAS Version : 120803
cuFFT Version : 11303
cuRAND Version : 10309
cuSOLVER Version : (11, 7, 2)
cuSPARSE Version : 12507
NVRTC Version : (12, 8)
Thrust Version : 200800
CUB Build Version : 200800
Jitify Build Version :
cuDNN Build Version : None
cuDNN Version : None
...
Device 0 PCI Bus ID : 0000:5E:00.0
Device 1 Name : NVIDIA GeForce RTX 4090
Device 1 Compute Capability : 89
Device 1 PCI Bus ID : 0000:AF:00.0
```
### Additional Information
### numpy, sparse difference results
Numpy EVD (first 5 eigen values): [ 4.85708519 4.94942919 5.1175846 5.32760965 49.15770376]
Scipy sparse EVD (first 5 eigen values): [ 4.73640028 5.00592287 5.33095269 5.47578625 49.46127937]
### dask + cupy sparse, dask + cupy difference results
sparse EVD : [-4.45512741e+306 -3.48183487e+302 -3.07752841e+298 -3.00612562e+294
-2.67903961e+291 -2.16389084e+291 -1.27241397e+291 -1.19953054e+291
-7.06825681e+290 -3.18189194e+290 -4.99141174e+289 -1.65870727e+289
-3.86948135e+286 -3.59948952e+286 -3.40444164e+285 -4.30757276e+282
-3.14874312e+280 -5.40556317e+278 -6.71389279e+275 -5.88153386e+275
-5.76075742e+275 -4.96119623e+275 -4.56063519e+275 -4.22842007e+275
3.65612822e+275 4.00353201e+275 5.73233857e+275 5.79083691e+275
7.36749248e+275 8.35809208e+275 1.16143923e+277 5.83216533e+280
5.56965499e+283 3.09690720e+284 1.65258184e+285 3.70588588e+286
1.67907456e+288 1.72261015e+288 4.45792467e+289 2.93422062e+290
6.94309670e+290 7.13824059e+290 1.26871159e+291 1.57604462e+291
2.68197021e+291 9.93978102e+291 5.88146859e+295 3.51450956e+299
2.07627850e+303 1.18320883e+307]
dense EVD : [-5.37903294e+00 -5.22890989e+00 -5.02315648e+00 -4.63919644e+00
-4.56549816e+00 -4.47030868e+00 -4.43958883e+00 -4.25991981e+00
-4.03911121e+00 -3.88402678e+00 -3.80271549e+00 -3.71391126e+00
-3.56670932e+00 -3.48419935e+00 -3.38359906e+00 -3.32248333e+00
-3.16735785e+00 -2.97601157e+00 -2.85713080e+00 -2.81340366e+00
-2.71463180e+00 -2.67530220e+00 -2.47622713e+00 -2.39038565e+00
-2.29485190e+00 -2.22015014e+00 -2.19268461e+00 -2.04948907e+00
-1.89301271e+00 -1.82820827e+00 -1.69302010e+00 -1.61740190e+00
-1.54389868e+00 -1.48165364e+00 -1.35187636e+00 -1.27647848e+00
-1.07883645e+00 -9.78282292e-01 -9.15548167e-01 -8.60288404e-01
-7.79506559e-01 -7.27605907e-01 -6.11354409e-01 -4.82408232e-01
-4.47169700e-01 -2.87516407e-01 -2.22433620e-01 -1.65798829e-01
-9.84655970e-02 -1.61735344e-02 6.95971381e-02 2.01928635e-01
3.29287615e-01 3.60032489e-01 3.95194745e-01 4.61870750e-01
5.21138872e-01 7.29018235e-01 8.86193727e-01 9.21586204e-01
1.01412984e+00 1.15102183e+00 1.23742834e+00 1.38642805e+00
1.55071025e+00 1.55422762e+00 1.62751189e+00 1.70052087e+00
1.82270552e+00 1.87700534e+00 1.95737253e+00 2.05439316e+00
2.15363032e+00 2.20879817e+00 2.33297043e+00 2.47246475e+00
2.53397698e+00 2.58694065e+00 2.83957669e+00 2.95457503e+00
3.01706433e+00 3.13221364e+00 3.29603673e+00 3.35407321e+00
3.42798566e+00 3.54944718e+00 3.62675952e+00 3.77647045e+00
3.91100126e+00 3.92060691e+00 4.12072906e+00 4.19197272e+00
4.37306786e+00 4.53783826e+00 4.69378909e+00 4.77037438e+00
5.25918051e+00 5.32161285e+00 5.57207877e+00 5.05407736e+01]
Contributor guide
Research direction
No repository file or test is named. Start by reproducing the supplied NumPy/SciPy and CuPy examples, then verify the matrix properties and the assumptions of the sparse eigensolver before comparing results. Done means determining whether the discrepancy is expected input behavior or a reproducible CuPy defect, with a minimal failing example if it is a defect.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- numpy, python
- Domain
- data, hpc
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 25/100