Skip to content
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

Gpu support using cupy #36

Merged
merged 78 commits into from
Sep 28, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
78 commits
Select commit Hold shift + click to select a range
35bf989
Begin to rearrange solver module
loganbvh Sep 9, 2023
5217446
Add cupy sparse solve
loganbvh Sep 9, 2023
3e67eb7
Update operators.py
loganbvh Sep 9, 2023
bffe908
Update operators.py
loganbvh Sep 9, 2023
8ae72c3
Update solve.py
loganbvh Sep 9, 2023
5441f02
Use cupy where possible
loganbvh Sep 9, 2023
75eae3c
Update euler.py
loganbvh Sep 9, 2023
3c9ab99
add pdb
loganbvh Sep 9, 2023
23a0041
cupy.asarray(epsilon)
loganbvh Sep 9, 2023
45055fa
pdb
loganbvh Sep 9, 2023
fc93ed2
mu_boundary
loganbvh Sep 9, 2023
9d53425
remove .get()
loganbvh Sep 9, 2023
c6d0ab4
Log sparse solver
loganbvh Sep 9, 2023
d2ada18
Fix running_state
loganbvh Sep 9, 2023
27a023b
Bump version and fix operators
loganbvh Sep 9, 2023
b5171d8
typo
loganbvh Sep 9, 2023
1e02ef0
Only use cupy for linear solve
loganbvh Sep 9, 2023
1c479d1
fix running_state
loganbvh Sep 9, 2023
349e58b
Revert "fix running_state"
loganbvh Sep 9, 2023
45d234c
Update euler.py
loganbvh Sep 9, 2023
b78c5a2
revert changes
loganbvh Sep 9, 2023
283e16a
Try a couple optimizations
loganbvh Sep 9, 2023
2c106cd
bug
loganbvh Sep 9, 2023
a80029b
Try synchronizing stream
loganbvh Sep 9, 2023
b394ed1
profile
loganbvh Sep 9, 2023
3001e90
remove @profile
loganbvh Sep 9, 2023
1019313
profile
loganbvh Sep 9, 2023
8487634
Use cupy for screening
loganbvh Sep 18, 2023
86d326e
Update solve.py
loganbvh Sep 18, 2023
cc08591
Update solve.py
loganbvh Sep 18, 2023
f6e3165
Update solve.py
loganbvh Sep 18, 2023
30d305e
Update solve.py
loganbvh Sep 18, 2023
cfc54fe
Update solve.py
loganbvh Sep 18, 2023
3655be3
Update solve.py
loganbvh Sep 18, 2023
846bfdf
fix edges
loganbvh Sep 18, 2023
56d05f3
Update solve.py
loganbvh Sep 18, 2023
5d59829
Update screening.py
loganbvh Sep 18, 2023
cf73290
Update screening.py
loganbvh Sep 18, 2023
0feedcb
Update screening.py
loganbvh Sep 18, 2023
318e035
Update operators.py
loganbvh Sep 18, 2023
d33fbfc
Update operators.py
loganbvh Sep 18, 2023
28afa7c
Update operators.py
loganbvh Sep 18, 2023
1db91be
Update operators.py
loganbvh Sep 18, 2023
1b4e7ef
Update operators.py
loganbvh Sep 18, 2023
a56a849
Update operators.py
loganbvh Sep 18, 2023
a657181
Update operators.py
loganbvh Sep 18, 2023
eea0d11
Update solve.py
loganbvh Sep 18, 2023
0832ca2
Update solve.py
loganbvh Sep 18, 2023
4a4c9de
update
loganbvh Sep 18, 2023
2023b82
Update solve.py
loganbvh Sep 18, 2023
160ce95
Update solve.py
loganbvh Sep 18, 2023
1cc0b29
Update solve.py
loganbvh Sep 18, 2023
c63bf48
Update screening.py
loganbvh Sep 18, 2023
6e18906
update
loganbvh Sep 18, 2023
2a816da
update
loganbvh Sep 18, 2023
a88aadf
Update lint-and-test.yml: remove jax
loganbvh Sep 18, 2023
bc359fc
Cleanup
loganbvh Sep 18, 2023
d62cf09
test
loganbvh Sep 18, 2023
d752b97
test
loganbvh Sep 18, 2023
60df94e
Update screening.py
loganbvh Sep 19, 2023
751278c
cleanup
loganbvh Sep 19, 2023
a7d7f6b
cleanup docs
loganbvh Sep 19, 2023
8200193
Update docs
loganbvh Sep 19, 2023
e66ddd6
Gpu screening (#38)
loganbvh Sep 21, 2023
59b9eda
Gpu testing (#39)
loganbvh Sep 23, 2023
b8dd3bd
fix conflicts
loganbvh Sep 23, 2023
0090d9f
bug fixes
loganbvh Sep 26, 2023
e90706b
Update docs
loganbvh Sep 26, 2023
9b03e0e
Add screening test
loganbvh Sep 26, 2023
a15506b
update test
loganbvh Sep 27, 2023
51f9ba9
Cleanup options
loganbvh Sep 27, 2023
255aa1c
Fix issues in screening code
loganbvh Sep 27, 2023
eb298d2
Update docs
loganbvh Sep 27, 2023
637a028
bug
loganbvh Sep 27, 2023
874137e
Try to optimize cupy screening
loganbvh Sep 27, 2023
2a35cff
Try to optimize cupy screening
loganbvh Sep 27, 2023
e6d3811
Try to optimize cupy screening
loganbvh Sep 27, 2023
147b784
run notebooks
loganbvh Sep 27, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/lint-and-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ jobs:
run: |
python -m pip install flake8 pytest
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
python -m pip install -e .[jax]
python -m pip install -e .
- name: Lint with flake8
run: |
# stop the build if there are Python syntax errors or undefined names
Expand Down
3 changes: 3 additions & 0 deletions docs/api/solver.rst
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ in the dictionary to ensure current conservation.
.. autoclass:: tdgl.SolverOptions
:members:

.. autoclass:: tdgl.TDGLSolver
:members:

.. autoenum:: tdgl.solver.options.SparseSolver

.. autoclass:: tdgl.Parameter
Expand Down
2 changes: 1 addition & 1 deletion docs/background.rst
Original file line number Diff line number Diff line change
Expand Up @@ -465,7 +465,7 @@ The strategy for updating the induced vector potential to converge to a self-con


The integer index :math:`s` counts the number of iterations performed in the self-consistent calculation.
The parameters :math:`\alpha\in(0,\infty)` and :math:`\beta\in(0,1)` in :eq:`polyak` can be set by the user,
The parameters :math:`\alpha\in(0,\infty)` and :math:`\beta\in(0,1]` in :eq:`polyak` can be set by the user,
and the initial conditions for :eq:`polyak` are :math:`\mathbf{A}^{n,0}_{\mathrm{induced},ij} = \mathbf{A}^{n-1}_{\mathrm{induced},ij}`
and :math:`\mathbf{v}^{n,0}_{ij} = \mathbf{0}`. The iterative application of :eq:`polyak` terminates when the relative change in the
induced vector potential between iterations falls below a user-defined tolerance.
Expand Down
Binary file modified docs/images/mesh-py.pdf
Binary file not shown.
35 changes: 29 additions & 6 deletions docs/installation.rst
Original file line number Diff line number Diff line change
Expand Up @@ -53,16 +53,17 @@ To install an editable version of ``pyTDGL`` for development, run:

:ref:`Contributing to pyTDGL <about/contributing:Contributing>`

Optional dependencies
---------------------

Alternative sparse solvers
--------------------------

``tdgl`` supports multiple solvers for sparse systems of linear equations: `SuperLU <https://portal.nersc.gov/project/sparse/superlu/>`_ (the default),
`UMFPACK <https://people.engr.tamu.edu/davis/suitesparse.html>`_, and `MKL PARDISO <https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2023-0/onemkl-pardiso-parallel-direct-sparse-solver-iface.html>`_.

``SuperLU``, the default solver, is included in ``scipy`` and therefore requires no additional installation.

The other solvers, ``UMFPACK`` and ``PARDISO``, may outperform ``SuperLU`` on certain problems and certain CPU hardware.
In particular, ``PARDISO`` is optimized for Intel CPUs and, unlike ``SuperLU`` and ``UMFPACK``, is multithreaded.
In particular, ``PARDISO`` is optimized for Intel CPUs and, unlike ``SuperLU`` and ``UMFPACK``, ``PARDISO`` is multithreaded.
This means that ``PARDISO`` may perform best when solving models with very large meshes on Intel CPUs.

Your mileage may vary, so we encourage you to try the different solvers if you are looking to optimize the run time of your ``tdgl`` simulations.
Expand Down Expand Up @@ -99,10 +100,32 @@ Installing PARDISO
# or conda install -c conda-forge pypardiso
# or pip install tdgl[pardiso]

Verify the installation
-----------------------
GPU acceleration
----------------

For users with an NVIDIA or AMD GPU, ``tdgl`` can be accelerated using the `CuPy <https://cupy.dev/>`_ library.
First install the appropriate version of ``cupy`` for your GPU hardware and driver version
(see installation instructions `here <https://docs.cupy.dev/en/stable/install.html>`_).
Then set the ``gpu`` attribute of :class:`tdgl.SolverOptions` to ``True``. Setting ``tdgl.SolverOptions.gpu = True``
means that essentially all portions of the simulation *except* the sparse linear solve used to compute the scalar electric potential
:math:`\mu(\mathbf{r}, t)` will be performed on the GPU. The sparse linear solve will be performed on the CPU using the solver specified by
``tdgl.SolverOptions.sparse_solver`` (by default, ``SuperLU``). One can also perform the sparse linear solve on the GPU using
``cupy`` by setting ``tdgl.SolverOptions.sparse_solver = "cupy"``, however emperically it seems that this is slower than
performing the sparse linear solve on the CPU.

Due to overheads related to transferring data between the CPU and GPU, it is expected that ``cupy`` will provide
a significant speedup only for models with relatively large meshes and/or models that include `screening <notebooks/screening.ipynb>`_.
Please open a `GitHub issue <https://github.com/loganbvh/py-tdgl/issues>`_ if you have any problems using ``tdgl`` with ``cupy``.

.. note::

Note that ``cupy`` support for AMD GPUs is `currently experimental <https://docs.cupy.dev/en/stable/install.html#using-cupy-on-amd-gpu-experimental>`_.


Verifying the installation
--------------------------

To verify your installation by running the ``tdgl`` test suite,
If you would like to verify your installation by running the ``tdgl`` test suite,
execute the following command in a terminal:

.. code-block:: bash
Expand Down
6 changes: 3 additions & 3 deletions docs/notebooks/logo.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -233,7 +233,7 @@
"name": "stderr",
"output_type": "stream",
"text": [
"Constructing Voronoi polygons: 100%|█████| 4347/4347 [00:00<00:00, 22715.27it/s]\n"
"Constructing Voronoi polygons: 100%|██████████████████████████████████████████████████████████████████████████| 4347/4347 [00:00<00:00, 22681.73it/s]\n"
]
},
{
Expand Down Expand Up @@ -276,7 +276,7 @@
"name": "stderr",
"output_type": "stream",
"text": [
"Simulating: 100%|██████████████████████████▉| 800/800 [02:00<00:00, 6.63tau/s ]\n"
"Simulating: 100%|███████████████████████████████████████████████████████████████████████████████████████████████▉| 800/800 [01:55<00:00, 6.90tau/s ]\n"
]
}
],
Expand Down Expand Up @@ -9471,7 +9471,7 @@
{
"data": {
"text/html": [
"<table><tr><th>Software</th><th>Version</th></tr><tr><td>tdgl</td><td>0.5.1; git revision 03859ea [2023-09-21]</td></tr><tr><td>Numpy</td><td>1.24.3</td></tr><tr><td>SciPy</td><td>1.10.1</td></tr><tr><td>matplotlib</td><td>3.7.1</td></tr><tr><td>jax</td><td>None</td></tr><tr><td>numba</td><td>0.57.1</td></tr><tr><td>IPython</td><td>8.14.0</td></tr><tr><td>Python</td><td>3.10.11 | packaged by conda-forge | (main, May 10 2023, 19:01:19) [Clang 14.0.6 ]</td></tr><tr><td>OS</td><td>posix [darwin]</td></tr><tr><td>Number of CPUs</td><td>Physical: 10, Logical: 10</td></tr><tr><td>BLAS Info</td><td>OPENBLAS</td></tr><tr><td colspan='2'>Thu Sep 21 15:35:01 2023 PDT</td></tr></table>"
"<table><tr><th>Software</th><th>Version</th></tr><tr><td>tdgl</td><td>0.6.0; git revision e6d3811 [2023-09-27]</td></tr><tr><td>Numpy</td><td>1.24.3</td></tr><tr><td>SciPy</td><td>1.10.1</td></tr><tr><td>matplotlib</td><td>3.7.1</td></tr><tr><td>cupy</td><td>None</td></tr><tr><td>numba</td><td>0.57.1</td></tr><tr><td>IPython</td><td>8.14.0</td></tr><tr><td>Python</td><td>3.10.11 | packaged by conda-forge | (main, May 10 2023, 19:01:19) [Clang 14.0.6 ]</td></tr><tr><td>OS</td><td>posix [darwin]</td></tr><tr><td>Number of CPUs</td><td>Physical: 10, Logical: 10</td></tr><tr><td>BLAS Info</td><td>OPENBLAS</td></tr><tr><td colspan='2'>Wed Sep 27 14:58:29 2023 PDT</td></tr></table>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
Expand Down
2 changes: 1 addition & 1 deletion docs/notebooks/mesh.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
"name": "stderr",
"output_type": "stream",
"text": [
"Constructing Voronoi polygons: 100%|████████| 525/525 [00:00<00:00, 6318.46it/s]\n"
"Constructing Voronoi polygons: 100%|████████████████████████████████████████████████████████████████████████████| 525/525 [00:00<00:00, 21170.12it/s]\n"
]
}
],
Expand Down
8 changes: 4 additions & 4 deletions docs/notebooks/polygons.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -469,9 +469,9 @@
"name": "stderr",
"output_type": "stream",
"text": [
"Constructing Voronoi polygons: 100%|███████| 459/459 [00:00<00:00, 16340.20it/s]\n",
"Constructing Voronoi polygons: 100%|███████| 459/459 [00:00<00:00, 17271.97it/s]\n",
"Constructing Voronoi polygons: 100%|███████| 459/459 [00:00<00:00, 17162.65it/s]\n"
"Constructing Voronoi polygons: 100%|████████████████████████████████████████████████████████████████████████████| 459/459 [00:00<00:00, 16417.53it/s]\n",
"Constructing Voronoi polygons: 100%|████████████████████████████████████████████████████████████████████████████| 459/459 [00:00<00:00, 17100.75it/s]\n",
"Constructing Voronoi polygons: 100%|████████████████████████████████████████████████████████████████████████████| 459/459 [00:00<00:00, 17710.51it/s]\n"
]
},
{
Expand Down Expand Up @@ -520,7 +520,7 @@
{
"data": {
"text/html": [
"<table><tr><th>Software</th><th>Version</th></tr><tr><td>tdgl</td><td>0.5.1; git revision 03859ea [2023-09-21]</td></tr><tr><td>Numpy</td><td>1.24.3</td></tr><tr><td>SciPy</td><td>1.10.1</td></tr><tr><td>matplotlib</td><td>3.7.1</td></tr><tr><td>jax</td><td>None</td></tr><tr><td>numba</td><td>0.57.1</td></tr><tr><td>IPython</td><td>8.14.0</td></tr><tr><td>Python</td><td>3.10.11 | packaged by conda-forge | (main, May 10 2023, 19:01:19) [Clang 14.0.6 ]</td></tr><tr><td>OS</td><td>posix [darwin]</td></tr><tr><td>Number of CPUs</td><td>Physical: 10, Logical: 10</td></tr><tr><td>BLAS Info</td><td>OPENBLAS</td></tr><tr><td colspan='2'>Thu Sep 21 15:32:52 2023 PDT</td></tr></table>"
"<table><tr><th>Software</th><th>Version</th></tr><tr><td>tdgl</td><td>0.6.0; git revision e6d3811 [2023-09-27]</td></tr><tr><td>Numpy</td><td>1.24.3</td></tr><tr><td>SciPy</td><td>1.10.1</td></tr><tr><td>matplotlib</td><td>3.7.1</td></tr><tr><td>cupy</td><td>None</td></tr><tr><td>numba</td><td>0.57.1</td></tr><tr><td>IPython</td><td>8.14.0</td></tr><tr><td>Python</td><td>3.10.11 | packaged by conda-forge | (main, May 10 2023, 19:01:19) [Clang 14.0.6 ]</td></tr><tr><td>OS</td><td>posix [darwin]</td></tr><tr><td>Number of CPUs</td><td>Physical: 10, Logical: 10</td></tr><tr><td>BLAS Info</td><td>OPENBLAS</td></tr><tr><td colspan='2'>Wed Sep 27 14:54:08 2023 PDT</td></tr></table>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
Expand Down
6 changes: 3 additions & 3 deletions docs/notebooks/py-mesh.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
"import tdgl\n",
"from tdgl.geometry import box, ensure_unique, close_curve\n",
"\n",
"SAVE_FIGURES = True\n",
"SAVE_FIGURES = False\n",
"image_path = os.path.join(os.pardir, \"images\")"
]
},
Expand Down Expand Up @@ -184,7 +184,7 @@
"name": "stderr",
"output_type": "stream",
"text": [
"Constructing Voronoi polygons: 100%|█████| 4190/4190 [00:00<00:00, 21720.62it/s]\n"
"Constructing Voronoi polygons: 100%|██████████████████████████████████████████████████████████████████████████| 4190/4190 [00:00<00:00, 22042.31it/s]\n"
]
},
{
Expand Down Expand Up @@ -361,7 +361,7 @@
{
"data": {
"text/html": [
"<table><tr><th>Software</th><th>Version</th></tr><tr><td>tdgl</td><td>0.5.1; git revision 03859ea [2023-09-21]</td></tr><tr><td>Numpy</td><td>1.24.3</td></tr><tr><td>SciPy</td><td>1.10.1</td></tr><tr><td>matplotlib</td><td>3.7.1</td></tr><tr><td>jax</td><td>None</td></tr><tr><td>numba</td><td>0.57.1</td></tr><tr><td>IPython</td><td>8.14.0</td></tr><tr><td>Python</td><td>3.10.11 | packaged by conda-forge | (main, May 10 2023, 19:01:19) [Clang 14.0.6 ]</td></tr><tr><td>OS</td><td>posix [darwin]</td></tr><tr><td>Number of CPUs</td><td>Physical: 10, Logical: 10</td></tr><tr><td>BLAS Info</td><td>OPENBLAS</td></tr><tr><td colspan='2'>Thu Sep 21 15:32:40 2023 PDT</td></tr></table>"
"<table><tr><th>Software</th><th>Version</th></tr><tr><td>tdgl</td><td>0.6.0; git revision e6d3811 [2023-09-27]</td></tr><tr><td>Numpy</td><td>1.24.3</td></tr><tr><td>SciPy</td><td>1.10.1</td></tr><tr><td>matplotlib</td><td>3.7.1</td></tr><tr><td>cupy</td><td>None</td></tr><tr><td>numba</td><td>0.57.1</td></tr><tr><td>IPython</td><td>8.14.0</td></tr><tr><td>Python</td><td>3.10.11 | packaged by conda-forge | (main, May 10 2023, 19:01:19) [Clang 14.0.6 ]</td></tr><tr><td>OS</td><td>posix [darwin]</td></tr><tr><td>Number of CPUs</td><td>Physical: 10, Logical: 10</td></tr><tr><td>BLAS Info</td><td>OPENBLAS</td></tr><tr><td colspan='2'>Wed Sep 27 14:53:58 2023 PDT</td></tr></table>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
Expand Down
12 changes: 6 additions & 6 deletions docs/notebooks/quickstart.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,7 @@
"name": "stderr",
"output_type": "stream",
"text": [
"Constructing Voronoi polygons: 100%|█████| 4633/4633 [00:00<00:00, 18399.75it/s]\n"
"Constructing Voronoi polygons: 100%|██████████████████████████████████████████████████████████████████████████| 4633/4633 [00:00<00:00, 21408.45it/s]\n"
]
}
],
Expand Down Expand Up @@ -368,8 +368,8 @@
"name": "stderr",
"output_type": "stream",
"text": [
"Thermalizing: 100%|████████████████████████▉| 100/100 [00:11<00:00, 9.01tau/s ]\n",
"Simulating: 100%|██████████████████████████▉| 150/150 [00:26<00:00, 5.66tau/s ]\n"
"Thermalizing: 100%|█████████████████████████████████████████████████████████████████████████████████████████████▉| 100/100 [00:09<00:00, 10.37tau/s ]\n",
"Simulating: 100%|███████████████████████████████████████████████████████████████████████████████████████████████▉| 150/150 [00:26<00:00, 5.70tau/s ]\n"
]
}
],
Expand Down Expand Up @@ -7478,7 +7478,7 @@
"name": "stderr",
"output_type": "stream",
"text": [
"Simulating: 100%|██████████████████████████▉| 200/200 [00:51<00:00, 3.91tau/s ]\n"
"Simulating: 100%|███████████████████████████████████████████████████████████████████████████████████████████████▉| 200/200 [00:50<00:00, 3.94tau/s ]\n"
]
}
],
Expand Down Expand Up @@ -12256,7 +12256,7 @@
"name": "stderr",
"output_type": "stream",
"text": [
"Simulating: 100%|██████████████████████████▉| 200/200 [00:40<00:00, 4.96tau/s ]\n"
"Simulating: 100%|███████████████████████████████████████████████████████████████████████████████████████████████▉| 200/200 [00:39<00:00, 5.01tau/s ]\n"
]
}
],
Expand Down Expand Up @@ -25570,7 +25570,7 @@
{
"data": {
"text/html": [
"<table><tr><th>Software</th><th>Version</th></tr><tr><td>tdgl</td><td>0.5.1; git revision 03859ea [2023-09-21]</td></tr><tr><td>Numpy</td><td>1.24.3</td></tr><tr><td>SciPy</td><td>1.10.1</td></tr><tr><td>matplotlib</td><td>3.7.1</td></tr><tr><td>jax</td><td>None</td></tr><tr><td>numba</td><td>0.57.1</td></tr><tr><td>IPython</td><td>8.14.0</td></tr><tr><td>Python</td><td>3.10.11 | packaged by conda-forge | (main, May 10 2023, 19:01:19) [Clang 14.0.6 ]</td></tr><tr><td>OS</td><td>posix [darwin]</td></tr><tr><td>Number of CPUs</td><td>Physical: 10, Logical: 10</td></tr><tr><td>BLAS Info</td><td>OPENBLAS</td></tr><tr><td colspan='2'>Thu Sep 21 15:41:40 2023 PDT</td></tr></table>"
"<table><tr><th>Software</th><th>Version</th></tr><tr><td>tdgl</td><td>0.6.0; git revision e6d3811 [2023-09-27]</td></tr><tr><td>Numpy</td><td>1.24.3</td></tr><tr><td>SciPy</td><td>1.10.1</td></tr><tr><td>matplotlib</td><td>3.7.1</td></tr><tr><td>cupy</td><td>None</td></tr><tr><td>numba</td><td>0.57.1</td></tr><tr><td>IPython</td><td>8.14.0</td></tr><tr><td>Python</td><td>3.10.11 | packaged by conda-forge | (main, May 10 2023, 19:01:19) [Clang 14.0.6 ]</td></tr><tr><td>OS</td><td>posix [darwin]</td></tr><tr><td>Number of CPUs</td><td>Physical: 10, Logical: 10</td></tr><tr><td>BLAS Info</td><td>OPENBLAS</td></tr><tr><td colspan='2'>Wed Sep 27 15:04:27 2023 PDT</td></tr></table>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
Expand Down
Loading
Loading