{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Pylops-distributed - Solvers"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In this notebook we investigate the use of pylops-distributed CG and CGLS solvers with distributed operators."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"%load_ext autoreload\n",
"%autoreload 2\n",
"%matplotlib inline\n",
"\n",
"import os\n",
"import warnings\n",
"warnings.filterwarnings('ignore')\n",
"\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import scipy as sp\n",
"import skfmm\n",
"import dask\n",
"import dask.array as da\n",
"import pylops\n",
"import pylops_distributed\n",
"\n",
"from scipy.sparse.linalg.interface import MatrixLinearOperator, aslinearoperator \n",
"from scipy.linalg import lstsq, solve\n",
"from scipy.sparse.linalg import cg, lsqr\n",
"from dask import persist\n",
"from dask.distributed import Client, LocalCluster, performance_report"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"('1', '1', '1')"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"os.getenv('OMP_NUM_THREADS'), os.getenv('MKL_NUM_THREADS'), os.getenv('OPENBLAS_NUM_THREADS')"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"\n",
"Client\n",
"\n",
" | \n",
"\n",
"Cluster\n",
"\n",
" - Workers: 4
\n",
" - Cores: 4
\n",
" - Memory: 8.59 GB
\n",
" \n",
" | \n",
"
\n",
"
"
],
"text/plain": [
""
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#nchunks = [2, 1]\n",
"#nchunks = [2, 2]\n",
"nchunks = [4, 4]\n",
"\n",
"#client = pylops_distributed.utils.backend.dask(processes=True, threads_per_worker=1, n_workers=4)\n",
"#client = Client() # same as processes=True\n",
"\n",
"client = pylops_distributed.utils.backend.dask(processes=False, threads_per_worker=1, n_workers=4)\n",
"client"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### CG for square systems"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's just try out the solver using numpy inputs (matrix and vector). As da.xx is never explicitely invoked when ``compute=False`` and ``client=None`` the solver will simply operate on numpy arrays"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"n = 3000\n",
"niter = 1000 # premature stop... # n * 2 to convergence\n",
"x = np.ones(n)\n",
"\n",
"np.random.seed(0)\n",
"A = np.random.randn(n, n)\n",
"A = np.dot(A.T, A)\n",
"#print('eigs', np.linalg.eig(A)[0])\n",
"\n",
"Aop = MatrixLinearOperator(A)\n",
"#Aop = aslinearoperator(A)\n",
"\n",
"y = Aop.matvec(x)\n",
"xinv_sp = cg(Aop, y, tol=0, maxiter=niter)[0]\n",
"xinv = pylops_distributed.optimization.cg.cg(Aop, y, np.zeros_like(x), tol=0, niter=niter)[0]\n",
"#print(xinv_sp)\n",
"#print(xinv)\n",
"\n",
"plt.figure()\n",
"plt.plot(xinv_sp,'r', xinv, '--g', x,'b')\n",
"plt.ylim(0.9, 1.1);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's now apply the forward using the LinearOperator interface"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[-1913.40090063 -3343.24939275 -423.66494977 ... 477.63396435\n",
" 134.07361261 1897.29151543] [-1913.40090063 -3343.24939275 -423.66494977 ... 477.63396435\n",
" 134.07361261 1897.29151543]\n",
"dask.array\n"
]
}
],
"source": [
"Ada = da.from_array(A, chunks=(n//nchunks[0], n//nchunks[1])).persist() # move the data to the workers once\n",
"x = da.ones(n) #, chunks=(n//nchunks[1]))\n",
"x0 = da.zeros(n) #, chunks=(n//nchunks[1]))\n",
"\n",
"Aop = MatrixLinearOperator(A)\n",
"Adaop = pylops_distributed.MatrixMult(Ada, compute=(False, False))\n",
"Ada1op = pylops_distributed.MatrixMult(Ada, compute=(True, True))\n",
"\n",
"# both of these take and return a numpy array\n",
"print(Aop.matvec(np.ones(n)), Ada1op.matvec(np.ones(n)))\n",
"\n",
"# takes and returns a dask array\n",
"print(Adaop.matvec(np.ones(n)))"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"\n",
"\n",
" \n",
" | | Array | Chunk | \n",
" \n",
" \n",
" | Bytes | 72.00 MB | 4.50 MB | \n",
" | Shape | (3000, 3000) | (750, 750) | \n",
" | Count | 16 Tasks | 16 Chunks | \n",
" | Type | float64 | numpy.ndarray | \n",
" \n",
" \n",
" | \n",
"\n",
"\n",
" | \n",
"
\n",
"
"
],
"text/plain": [
"dask.array"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"Ada"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And the inverse problem with different approches when it comes to the use of dask"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[1.02463913 0.90384892 0.95533622 ... 0.9619385 0.97546219 1.11433985]\n",
"[1.02463913 0.90384892 0.95533622 ... 0.9619385 0.97546219 1.11433985]\n",
"[1.02463913 0.90384892 0.95533622 ... 0.9619385 0.97546219 1.11433985]\n",
"[1.02463913 0.90384892 0.95533622 ... 0.9619385 0.97546219 1.11433985]\n",
"[1.02463913 0.90384892 0.95533622 ... 0.9619385 0.97546219 1.11433985]\n"
]
}
],
"source": [
"niter = 100\n",
"\n",
"y = Aop * np.ones(n)\n",
"yy = Adaop * da.ones(n)\n",
"\n",
"# scipy\n",
"xinv_sp = cg(Aop, y, maxiter=niter)[0]\n",
"\n",
"# dask with compute at each iter\n",
"xinv = pylops_distributed.optimization.cg.cg(Adaop, yy, x0, tol=0, niter=niter, compute=True)[0]\n",
"# dask with persist at each iter\n",
"xinv1 = pylops_distributed.optimization.cg.cg(Adaop, yy, x0, tol=0, niter=niter, client=client)[0]\n",
"# dask with all graph computed in one go\n",
"xinv2 = pylops_distributed.optimization.cg.cg(Adaop, yy, x0, tol=0, niter=niter)[0]\n",
"# dask for only the matvec operation (anything else numpy)\n",
"xinv3 = pylops_distributed.optimization.cg.cg(Ada1op, y, np.zeros(n), tol=0, niter=niter)[0]\n",
"\n",
"print(xinv_sp)\n",
"print(xinv)\n",
"print(xinv1.compute())\n",
"print(xinv2.compute())\n",
"print(xinv3)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"#client.cancel(xinv1)\n",
"#client.cancel(xinv2)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"588 ms ± 17.6 ms per loop (mean ± std. dev. of 3 runs, 1 loop each)\n"
]
}
],
"source": [
"# scipy\n",
"%timeit -n 1 -r 3 cg(Aop, y, maxiter=niter)[0]"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"# dask with compute at each iter\n",
"#%timeit -n 1 -r 3 pylops_distributed.optimization.cg.cg(Adaop, yy, x0, tol=0, niter=niter, compute=True)[0]"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"23.4 s ± 46.6 ms per loop (mean ± std. dev. of 3 runs, 1 loop each)\n"
]
}
],
"source": [
"# dask with persist at each iter\n",
"%timeit -n 1 -r 3 pylops_distributed.optimization.cg.cg(Adaop, yy, x0, tol=0, niter=niter, client=client)[0].compute()"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"7.7 s ± 60.6 ms per loop (mean ± std. dev. of 3 runs, 1 loop each)\n"
]
}
],
"source": [
"# dask with all graph computed in one go\n",
"%timeit -n 1 -r 3 pylops_distributed.optimization.cg.cg(Adaop, yy, x0, tol=0, niter=niter)[0].compute()"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"12.4 s ± 79.9 ms per loop (mean ± std. dev. of 3 runs, 1 loop each)\n"
]
}
],
"source": [
"# dask for only the matvec operation (anything else numpy)\n",
"%timeit -n 1 -r 3 pylops_distributed.optimization.cg.cg(Ada1op, y, np.zeros(n), tol=0, niter=niter)[0]"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"with performance_report(filename=\"dask-report-cg_compute.html\"):\n",
" pylops_distributed.optimization.cg.cg(Adaop, yy, x0, tol=0, niter=niter, compute=True)[0]"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"with performance_report(filename=\"dask-report-cg_persist.html\"):\n",
" pylops_distributed.optimization.cg.cg(Adaop, yy, x0, tol=0, niter=niter, client=client)[0].compute()"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"with performance_report(filename=\"dask-report-cg_postponed.html\"):\n",
" pylops_distributed.optimization.cg.cg(Adaop, yy, x0, tol=0, niter=niter)[0].compute()"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"with performance_report(filename=\"dask-report-cg_onlymatvec.html\"):\n",
" pylops_distributed.optimization.cg.cg(Ada1op, y, np.zeros(n), tol=0, niter=niter)[0]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### CGLS with sparse matrix"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### CGLS for rectangular systems"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
" 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
" 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"n, m = 1000, 50\n",
"x = da.ones(m, chunks=(m//nchunks[1]))\n",
"x0 = da.zeros(m, chunks=(m//nchunks[1]))\n",
"\n",
"A = np.random.randn(n, m)\n",
"Ada = da.from_array(A, chunks=(n//nchunks[0], m//nchunks[1]))\n",
"Aop = pylops_distributed.MatrixMult(Ada, compute=(False, False))\n",
"y = Aop * x\n",
"\n",
"xinv = pylops_distributed.optimization.cg.cgls(Aop, y, x0, m)[0]\n",
"xinv.compute()"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [],
"source": [
"#y.visualize(rankdir=\"LR\")\n",
"#xinv.visualize(rankdir=\"LR\")"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"9.66 s ± 44.4 ms per loop (mean ± std. dev. of 3 runs, 1 loop each)\n"
]
}
],
"source": [
"%timeit -n 1 -r 3 pylops_distributed.optimization.cg.cgls(Aop, y, x0, tol=0, niter=20, compute=True)"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"10.7 s ± 154 ms per loop (mean ± std. dev. of 3 runs, 1 loop each)\n"
]
}
],
"source": [
"%timeit -n 1 -r 3 pylops_distributed.optimization.cg.cgls(Aop, y, x0, tol=0, niter=20, client=client)[0].compute()"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"7.13 s ± 81.5 ms per loop (mean ± std. dev. of 3 runs, 1 loop each)\n"
]
}
],
"source": [
"%timeit -n 1 -r 3 pylops_distributed.optimization.cg.cgls(Aop, y, x0, tol=0, niter=20)[0].compute()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## LSQR scipy"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(array([49.1663997 , 50.56491025, 46.33127647, 49.91828739, 52.6984893 ,\n",
" 55.47269824, 54.461011 , 52.8146886 , 48.5026307 , 40.83736659,\n",
" 45.85238495, 46.39221617, 49.76043088, 53.63444822, 49.7066871 ,\n",
" 53.99700797, 45.55617584, 48.09187034, 48.2602893 , 49.9416108 ,\n",
" 52.82253291, 47.7674436 , 50.10957465, 55.37026497, 52.80309789,\n",
" 48.1086633 , 50.16474483, 50.89657529, 47.04575089, 53.82232973,\n",
" 48.26146657, 52.57065493, 47.23123338, 50.71375005, 49.81424411,\n",
" 46.81939422, 50.03993458, 55.20772363, 47.13274771, 53.26142395,\n",
" 45.3254019 , 51.07767304, 49.87357891, 52.15761628, 47.63258035,\n",
" 49.54250868, 48.12370408, 51.44552688, 47.35080766, 48.34678681,\n",
" 51.55254009, 52.59149541, 45.20839298, 48.7127196 , 57.0026704 ,\n",
" 45.35623158, 46.63943708, 47.36902913, 51.22398442, 53.34852573,\n",
" 49.54704973, 56.50673386, 49.47172904, 47.59244381, 53.38177431,\n",
" 53.96599057, 42.58664758, 48.64074614, 46.83191883, 47.62945896,\n",
" 51.24305588, 46.71508471, 51.62726875, 49.67296692, 48.75013858,\n",
" 52.52510135, 49.33720209, 49.0015986 , 48.7028421 , 48.77727954,\n",
" 52.36310927, 52.80453925, 45.46823084, 52.41624985, 52.48094079,\n",
" 48.99219033, 48.05087661, 46.97029063, 52.47243947, 48.14992253,\n",
" 48.99236362, 50.62071484, 48.1088664 , 50.47942405, 47.35118824,\n",
" 49.72057154, 49.25304843, 50.14191351, 54.58070386, 47.95908154]),\n",
" array([1.00123791, 0.99965144, 1.00107446, 1.00019625, 0.99778706,\n",
" 0.99754414, 1.00068116, 1.00158694, 1.0024654 , 1.00132535,\n",
" 1.00100949, 1.00167346, 1.00064151, 1.00010104, 0.99952415,\n",
" 1.00053871, 1.00158629, 0.99895122, 0.99933006, 0.9988364 ,\n",
" 0.99704597, 1.0008912 , 1.00265668, 0.99942655, 1.00071859,\n",
" 1.00167863, 1.0002998 , 1.00219057, 0.99839334, 0.99903575,\n",
" 1.0018371 , 0.9982381 , 1.00099775, 1.00054205, 1.00028819,\n",
" 1.00025125, 1.00074573, 0.99930032, 1.00163945, 0.99947026,\n",
" 1.00032072, 0.99847433, 0.99958077, 0.99807002, 1.00037942,\n",
" 0.99795971, 1.00071912, 1.00075464, 1.00018163, 0.99888905,\n",
" 0.99692533, 0.99999603, 0.99843641, 1.00224598, 1.00047645,\n",
" 1.00055994, 1.00064719, 0.99808737, 1.00214344, 0.99980978,\n",
" 0.99949129, 1.0015822 , 1.00251748, 0.99915141, 0.99975071,\n",
" 1.00216164, 1.00048747, 0.99971042, 0.99776691, 0.99724029,\n",
" 0.99966459, 0.99915097, 0.99944858, 1.00155234, 1.00058847,\n",
" 0.99757651, 0.99716088, 1.00042966, 1.0023474 , 0.99943304,\n",
" 0.99917602, 1.00312469, 0.99841468, 1.00041369, 0.99883748,\n",
" 1.00100147, 1.0013569 , 0.99956794, 0.99783262, 0.9979013 ,\n",
" 0.99989043, 1.00178703, 1.00049715, 1.00007657, 0.99955769,\n",
" 0.99727333, 0.9988159 , 1.00125449, 1.00050019, 0.99911199]))"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import numpy as np\n",
"import dask.array as da\n",
"import pylops_distributed\n",
"from scipy.sparse.linalg import lsqr\n",
"from scipy.sparse.linalg.interface import MatrixLinearOperator\n",
"\n",
"n, m = 100, 100\n",
"\n",
"A = da.random.random((n, m), chunks=(n//nchunks[0], m//nchunks[1]))\n",
"\n",
"# dask for everything (suboptimal as the solver is not written with dask \n",
"#in mind and bring back to numpy here and there)\n",
"#Aop = pylops_distributed.MatrixMult(A)\n",
"\n",
"# dask for only the matvec operation (anything else numpy)\n",
"Aop = MatrixLinearOperator(A)\n",
"Aop1 = pylops_distributed.MatrixMult(A, compute=(True, True))\n",
"\n",
"y = Aop * np.ones(m)\n",
"xinv = lsqr(Aop1, y, iter_lim=n)[0]\n",
"y, xinv"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 33.8 s, sys: 2.46 s, total: 36.3 s\n",
"Wall time: 35 s\n"
]
}
],
"source": [
"%%time \n",
"xinv = lsqr(Aop, y, iter_lim=n)[0]"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 32.9 s, sys: 2.44 s, total: 35.3 s\n",
"Wall time: 34.1 s\n"
]
}
],
"source": [
"%%time \n",
"xinv = lsqr(Aop1, y, iter_lim=n)[0]"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [],
"source": [
"with performance_report(filename=\"dask-report-lsqr_MatrixLinearOperator.html\"):\n",
" lsqr(Aop, y, iter_lim=n)[0]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"with performance_report(filename=\"dask-report-lsqr_pylopsMatrixMult.html\"):\n",
" lsqr(Aop1, y, iter_lim=n)[0]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"client.close()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.3"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 2
}