<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Tudor Iustin</title>
    <description>The latest articles on DEV Community by Tudor Iustin (@tudor22).</description>
    <link>https://dev.to/tudor22</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4230921%2F0122a1ab-bc68-4d16-a788-aabda89b8371.png</url>
      <title>DEV Community: Tudor Iustin</title>
      <link>https://dev.to/tudor22</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tudor22"/>
    <language>en</language>
    <item>
      <title>MetalML: run scikit-learn on your Mac's GPU with one import change</title>
      <dc:creator>Tudor Iustin</dc:creator>
      <pubDate>Fri, 06 Nov 2026 18:01:04 +0000</pubDate>
      <link>https://dev.to/tudor22/metalml-run-scikit-learn-on-your-macs-gpu-with-one-import-change-29gj</link>
      <guid>https://dev.to/tudor22/metalml-run-scikit-learn-on-your-macs-gpu-with-one-import-change-29gj</guid>
      <description>&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/tudor-22/MetalML" rel="noopener noreferrer"&gt;https://github.com/tudor-22/MetalML&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MetalML started with a practical idea: keep the familiar scikit-learn workflow while making supported numerical operations available on a Mac's GPU. Instead of introducing a separate training framework, it exposes estimators with the fit, predict and transform methods Python users already know.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# pip install metalml
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;metalml&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ml&lt;/span&gt;  &lt;span class="c1"&gt;# was: import sklearn as ml
&lt;/span&gt;
&lt;span class="n"&gt;X&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;default_rng&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;normal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;astype&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;[:,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;[:,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ml&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linear_model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Ridge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;fit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;predict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;operation_backends_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# which ops ran on Metal vs CPU
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Status
&lt;/h2&gt;

&lt;p&gt;MetalML is experimental. GPU execution is verified on an Intel Mac with a Radeon Pro 5300M; Apple Silicon validation and tuning are next. If you have an M-series Mac, benchmark reports and issues are very welcome.&lt;/p&gt;

&lt;h2&gt;
  
  
  What runs on the GPU?
&lt;/h2&gt;

&lt;p&gt;Acceleration depends on the estimator and the operation. Scalers accelerate statistics and normalisation, Ridge uses GPU matrix products with a CPU solve, eligible KMeans configurations accelerate Lloyd iterations and distances, and trees, forests and kernel SVMs accelerate prediction while fitting stays on the CPU. One pipeline can mix CPU and GPU steps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Precision and fallback by design
&lt;/h2&gt;

&lt;p&gt;GPU operations use dense float32. Sparse, float64 and integer inputs keep scikit-learn's path, so precision never changes silently. Anything MetalML doesn't implement is forwarded to your installed scikit-learn, and importing MetalML never patches sklearn itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inspect instead of assuming a speedup
&lt;/h2&gt;

&lt;p&gt;operation_backends_ and fallback_reasons_ show exactly what ran where, and ml.config_context(backend="cpu") lets you compare.&lt;br&gt;
⭐ Star it, try it, or open an issue on GitHub: &lt;a href="https://github.com/tudor-22/MetalML" rel="noopener noreferrer"&gt;https://github.com/tudor-22/MetalML&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>machinelearning</category>
      <category>opensource</category>
      <category>macos</category>
    </item>
  </channel>
</rss>
