# Is it possible to run MNE/SkLearn on a GPU, and if so can you tell me where?

**URL:** <https://mne.discourse.group/t/is-it-possible-to-run-mne-sklearn-on-a-gpu-and-if-so-can-you-tell-me-where/6474>\
**Category:** Support & Discussions\
**Created:** [March 5, 2023, 8:05pm UTC](https://mne.discourse.group/t/is-it-possible-to-run-mne-sklearn-on-a-gpu-and-if-so-can-you-tell-me-where/6474 "2023-03-05T20:05:19Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![Steve\_Sizzou](https://avatars.discourse-cdn.com/v4/letter/s/ba8739/32.png) [@Steve\_Sizzou](https://mne.discourse.group/u/Steve_Sizzou)\
**Post date:** [March 5, 2023, 8:05pm UTC](https://mne.discourse.group/t/is-it-possible-to-run-mne-sklearn-on-a-gpu-and-if-so-can-you-tell-me-where/6474/1 "2023-03-05T20:05:19Z")

</div>

I’m running some decoding models which are taking about 2 hours per participant. Naturally, I would like this to be fast. I’ve seen mixed reports of whether you can run SKlearn on a GPU, and in turn this wold affect whether or not you can run the `SlidingEstimator` on a GPU… Do you know if it is possible and if so can you recommend a platform? Thanks!

---

<div class="post-metadata">

**Author:** ![agramfort](https://avatars.discourse-cdn.com/v4/letter/a/7c8e57/32.png) [@agramfort](https://mne.discourse.group/u/agramfort)\
**Post date:** [March 5, 2023, 9:25pm UTC](https://mne.discourse.group/t/is-it-possible-to-run-mne-sklearn-on-a-gpu-and-if-so-can-you-tell-me-where/6474/2 "2023-03-05T21:25:47Z")

</div>

are you already using n\_jobs = -1?

what is your classifier?

Alex

---

<div class="post-metadata">

**Author:** ![Steve\_Sizzou](https://avatars.discourse-cdn.com/v4/letter/s/ba8739/32.png) [@Steve\_Sizzou](https://mne.discourse.group/u/Steve_Sizzou)\
**Post date:** [March 6, 2023, 6:46am UTC](https://mne.discourse.group/t/is-it-possible-to-run-mne-sklearn-on-a-gpu-and-if-so-can-you-tell-me-where/6474/3 "2023-03-06T06:46:43Z")

</div>

I’m using n\_jobs = -1 yes. I’m using Ridge, this is my approach:

```python
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from mne.decoding import SlidingEstimator
from sklearn.linear_model import RidgeClassifier
from sklearn.model_selection import GridSearchCV, cross_val_predict, RepeatedStratifiedKFold

rlr = RidgeClassifier(max_iter=1000)
grid = {'alpha': [1e-3, 1e-2, 0.01, 0.1, 1, 5]}
cv = RepeatedStratifiedKFold(n_splits=3, n_repeats=2, random_state=1)
rlr = GridSearchCV(rlr, grid, scoring='roc_auc', cv=cv, n_jobs=-1)
clf = make_pipeline(StandardScaler(), rlr)
time_decode = SlidingEstimator(clf, n_jobs=1, scoring='roc_auc', verbose=True)
predictions = cross_val_predict(time_decode, X, y, cv=4, method='decision_function')

```

---

<div class="post-metadata">

**Author:** ![agramfort](https://avatars.discourse-cdn.com/v4/letter/a/7c8e57/32.png) [@agramfort](https://mne.discourse.group/u/agramfort)\
**Post date:** [March 9, 2023, 8:23am UTC](https://mne.discourse.group/t/is-it-possible-to-run-mne-sklearn-on-a-gpu-and-if-so-can-you-tell-me-where/6474/4 "2023-03-09T08:23:43Z")

</div>

you should use [https://scikit-learn.org/stable/modules/generated/sklearn.linear\_model.RidgeClassifierCV.html](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.RidgeClassifierCV.html)

and not a grid search for Ridge

Alex

---

<div class="post-metadata">

**Author:** ![Steve\_Sizzou](https://avatars.discourse-cdn.com/v4/letter/s/ba8739/32.png) [@Steve\_Sizzou](https://mne.discourse.group/u/Steve_Sizzou)\
**Post date:** [March 9, 2023, 1:59pm UTC](https://mne.discourse.group/t/is-it-possible-to-run-mne-sklearn-on-a-gpu-and-if-so-can-you-tell-me-where/6474/5 "2023-03-09T13:59:03Z")

</div>

Thanks! That appears to have speeded things up a bit! I also found that wrapping the model in `joblib.parallel_backend` also improved the speed, like this:

```python
def ridgeReturnProbabilitiesCV(X, y):

    cv = RepeatedStratifiedKFold(n_splits=3, n_repeats=2, random_state=1)

    rlr = RidgeClassifierCV(alphas=[1e-3, 1e-2, 0.01, 0.1, 1, 5],
                            scoring='roc_auc',
                            cv=cv)

    clf = make_pipeline(StandardScaler(), rlr)
    time_decode = SlidingEstimator(clf, n_jobs=1, scoring='roc_auc', verbose=True)
    probabilities = cross_val_predict(time_decode, X, y, cv=4, method='decision_function')

    return probabilities

import joblib
tic = time.time()
with joblib.parallel_backend(backend='loky', n_jobs=8):
    probabilities = ridgeReturnProbabilitiesCV(X, y)
toc = time.time() - tic
print(participant, 'took', toc / 60, 'minutes.')

```

---

<div class="post-metadata">

**Author:** ![richard](https://yyz2.discourse-cdn.com/free1/user_avatar/mne.discourse.group/richard/32/15_2.png) [@richard](https://mne.discourse.group/u/richard)\
**Post date:** [March 9, 2023, 2:54pm UTC](https://mne.discourse.group/t/is-it-possible-to-run-mne-sklearn-on-a-gpu-and-if-so-can-you-tell-me-where/6474/6 "2023-03-09T14:54:35Z")

</div>

> [@Steve\_Sizzou](#):
>
> I also found that wrapping the model in `joblib.parallel_backend` also improved the speed,

I believe you could achieve a similar result, yet simplify your code, by passing `n_jobs` to `cross_val_predict()`.

Best wishes,  
Richard

---

<div class="post-metadata">

**Author:** ![Steve\_Sizzou](https://avatars.discourse-cdn.com/v4/letter/s/ba8739/32.png) [@Steve\_Sizzou](https://mne.discourse.group/u/Steve_Sizzou)\
**Post date:** [March 10, 2023, 5:17pm UTC](https://mne.discourse.group/t/is-it-possible-to-run-mne-sklearn-on-a-gpu-and-if-so-can-you-tell-me-where/6474/7 "2023-03-10T17:17:27Z")

</div>

nice one, thanks!
