<p><span style="padding: 3px 10px; border-radius: 5px; color: #ffffff; font-weight: bold; display: inline-block; background-color: #ff0000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;External Email - Use Caution&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></p><p></p><div dir="ltr">hi Kyuhwa,<br><br>even with n_jobs=1 if you use a multithreaded linear algebra library like<br>MKL or openblas you will use more than 1 core.<br><br>to prevent this you should read about the environment variable : OMP_NUM_THREADS<br><br>HTH<br>Alex</div><br><div class="gmail_quote"><div dir="ltr">On Mon, Jul 2, 2018 at 1:52 PM Lee, KyuHwa &lt;<a href="mailto:lee.kyuh@gmail.com">lee.kyuh@gmail.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><p><span style="padding:3px 10px;border-radius:5px;color:#ffffff;font-weight:bold;display:inline-block;background-color:#ff0000">        External Email - Use Caution        </span></p><p></p><div dir="ltr"><div>Hi all,</div><div><br></div><div>I found a problem in mne.decoding.PSDEstimator.transform() method. In short, it does not respect the attribute &quot;n_jobs&quot;. This problem does not exist in MNE 0.14 and only exists in MNE 0.15 and above. I tested only on stable versions.</div><div><br></div><div>Normally, I restrict the PSD estimation to use a single core (n_jobs=1) because there are many other time-critical processes running together in the system. In MNE 0.15 and above, the transform() function uses up to 4 cores equivalent (over 50% total usage on an 8-core system). This is in contrast with the same function in MNE 0.14, where only 1 core is used as expected.</div><div><br></div><div>The following minimal code replicates the problem.</div>



<pre style="text-decoration-style:initial;text-decoration-color:initial;color:rgb(209,209,209);background:rgb(0,0,0)"><span style="color:rgb(230,97,112);font-weight:bold">import</span> numpy <span style="color:rgb(230,97,112);font-weight:bold">as</span> np
<span style="color:rgb(230,97,112);font-weight:bold">import</span> mne
<span style="color:rgb(230,97,112);font-weight:bold">import</span> time
mne<span style="color:rgb(210,205,134)">.</span>set_log_level<span style="color:rgb(210,205,134)">(</span><span style="color:rgb(0,196,196)">&#39;WARNING&#39;</span><span style="color:rgb(210,205,134)">)</span>

psde <span style="color:rgb(210,205,134)">=</span> mne<span style="color:rgb(210,205,134)">.</span>decoding<span style="color:rgb(210,205,134)">.</span>PSDEstimator<span style="color:rgb(210,205,134)">(</span>sfreq<span style="color:rgb(210,205,134)">=</span><span style="color:rgb(0,168,0)">512</span><span style="color:rgb(210,205,134)">,</span> fmin<span style="color:rgb(210,205,134)">=</span><span style="color:rgb(0,168,0)">1</span><span style="color:rgb(210,205,134)">,</span> fmax<span style="color:rgb(210,205,134)">=</span><span style="color:rgb(0,168,0)">40</span><span style="color:rgb(210,205,134)">,</span> n_jobs<span style="color:rgb(210,205,134)">=</span><span style="color:rgb(0,168,0)">1</span><span style="color:rgb(210,205,134)">)</span>
iterations <span style="color:rgb(210,205,134)">=</span> <span style="color:rgb(0,168,0)">1000</span>
w <span style="color:rgb(210,205,134)">=</span> np<span style="color:rgb(210,205,134)">.</span>random<span style="color:rgb(210,205,134)">.</span>rand<span style="color:rgb(210,205,134)">(</span><span style="color:rgb(0,168,0)">1</span><span style="color:rgb(210,205,134)">,</span> <span style="color:rgb(0,168,0)">64</span><span style="color:rgb(210,205,134)">,</span> <span style="color:rgb(0,168,0)">256</span><span style="color:rgb(210,205,134)">)</span>
<span style="color:rgb(230,97,112);font-weight:bold">print</span><span style="color:rgb(210,205,134)">(</span><span style="color:rgb(0,196,196)">&#39;Start %d iteratinos&#39;</span> <span style="color:rgb(0,221,221)">%</span> iterations<span style="color:rgb(210,205,134)">)</span>
t_start <span style="color:rgb(210,205,134)">=</span> time<span style="color:rgb(210,205,134)">.</span>time<span style="color:rgb(210,205,134)">(</span><span style="color:rgb(210,205,134)">)</span>
<span style="color:rgb(230,97,112);font-weight:bold">for</span> i <span style="color:rgb(230,97,112);font-weight:bold">in</span> <span style="color:rgb(230,97,112);font-weight:bold">range</span><span style="color:rgb(210,205,134)">(</span>iterations<span style="color:rgb(210,205,134)">)</span><span style="color:rgb(210,205,134)">:</span>
    psd <span style="color:rgb(210,205,134)">=</span> psde<span style="color:rgb(210,205,134)">.</span>transform<span style="color:rgb(210,205,134)">(</span>w<span style="color:rgb(210,205,134)">)</span>
<span style="color:rgb(230,97,112);font-weight:bold">print</span><span style="color:rgb(210,205,134)">(</span><span style="color:rgb(0,196,196)">&#39;Took %.3f seconds&#39;</span> <span style="color:rgb(0,221,221)">%</span> <span style="color:rgb(210,205,134)">(</span>time<span style="color:rgb(210,205,134)">.</span>time<span style="color:rgb(210,205,134)">(</span><span style="color:rgb(210,205,134)">)</span> <span style="color:rgb(0,221,221)">-</span> t_start<span style="color:rgb(210,205,134)">)</span><span style="color:rgb(210,205,134)">)</span></pre>

<div>In Windows 10 Pro with 

<span style="background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">i7-4790K CPU (8 logical cores)</span>, I ran the above code 5 times each with 1000 computations. In the idle period, the cpu usage was maximum 3%. </div><div><br></div><div>

<div style="text-decoration-style:initial;text-decoration-color:initial"><b>Results</b><br></div>- mne 0.14: CPU 

<span style="background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">usage<span> </span></span>17% (equivalent to approx. 1 core = 12.5%)</div><div><span style="background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">10.461, 10.755, 10.861, 10.843, 10.636 seconds</span>.<br></div><div>Average: 10.711s per 1000 computations.</div><div> <br></div><div>- mne 0.15, 0.16: CPU usage 56%
<span style="background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">(equivalent to approx. 4 cores = 50%)</span>

</div><div>11.608, 10.737, 10.734, 11.283, 10.909 

<span style="background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">seconds.</span></div><div>Average: 11.054s per 1000 computations.</div><div><br></div><div>So, I don&#39;t see much difference in computation time but the CPU usage was 4x higher in MNE 0.15 and above. It seems to me that there&#39;s a bug in PSDEstimator class that always prefers to use multiple cores even when n_jobs=1, causing a lot of overhead by forced multiprocessing.</div><div><br></div><div>Please have a look and fix this issue. Thanks!</div><div><br></div><div>Best,</div><div>Kyuhwa Lee</div><div><br></div></div>
_______________________________________________<br>
Mne_analysis mailing list<br>
<a href="mailto:Mne_analysis@nmr.mgh.harvard.edu" target="_blank">Mne_analysis@nmr.mgh.harvard.edu</a><br>
<a href="https://mail.nmr.mgh.harvard.edu/mailman/listinfo/mne_analysis" rel="noreferrer" target="_blank">https://mail.nmr.mgh.harvard.edu/mailman/listinfo/mne_analysis</a><br>
<br>
<br>
The information in this e-mail is intended only for the person to whom it is<br>
addressed. If you believe this e-mail was sent to you in error and the e-mail<br>
contains patient information, please contact the Partners Compliance HelpLine at<br>
<a href="http://www.partners.org/complianceline" rel="noreferrer" target="_blank">http://www.partners.org/complianceline</a> . If the e-mail was sent to you in error<br>
but does not contain patient information, please contact the sender and properly<br>
dispose of the e-mail.<br>
</blockquote></div>