MemoryError на dask.linalg.solve (A, b) для решения Ax = b - PullRequest
2 голосов
/ 11 июня 2019

Я хочу решить уравнение Ax = b с большой, симметричной, плотной матрицей A (> 100 ГБ).Я пытаюсь использовать Dask, потому что предполагается, что это хороший API высокого уровня для работы с большими данными на python.

Это мой код:

n = 100000 # makes 75GB array
chunk_size = 5000
A = da.random.random(size=(n, n), chunks=(chunk_size, chunk_size))
b = np.random.random(n)
x = da.linalg.solve(A, b)
res = x.compute()

К сожалению, я получаю следующую ошибку, по-видимому, потому что A слишком велик.Есть ли в Dask какой-нибудь умный механизм, предотвращающий ошибку MemoryError (например, итеративное решение проблемы)?

Traceback (most recent call last):
File "test_solver.py", line 27, in <module>
x = da.linalg.solve(A, b)
File "..\venv\lib\site-packages\dask\array\linalg.py", line 916, in solve
File "..\venv\lib\site-packages\dask\array\linalg.py", line 755, in lu
MemoryError

Заранее большое спасибо!

1 Ответ

2 голосов
/ 11 июня 2019

Ваша проблема не в том, что массив слишком велик, а в том, что ваши чанки слишком малы: массив состоит из 1 000 000 частей, а граф решения содержит экспоненциально больше задач.

Например,если у вас есть размер фрагмента 5000x5000 (190 Мбайт на блок), вы получите

In [5]: n = 100000 # makes 75GB array
   ...: chunk_size = 5000
   ...: A = da.random.random(size=(n, n), chunks=(chunk_size, chunk_size))
   ...: b = np.random.random(n)
   ...: x = da.linalg.solve(A, b)
In [7]: len(x.dask)
6541

6541 задач в графе.Если размер чанка 1000x1000, вы получите 427401 задач.

https://docs.dask.org/en/latest/best-practices.html

...