<?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: Blake Price</title>
    <description>The latest articles on DEV Community by Blake Price (@tiny_price).</description>
    <link>https://dev.to/tiny_price</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%2F4214116%2F30a4b04a-c536-4049-afe9-90c071fda9eb.jpg</url>
      <title>DEV Community: Blake Price</title>
      <link>https://dev.to/tiny_price</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tiny_price"/>
    <language>en</language>
    <item>
      <title>Notebook to service: the three files I add before deploying a model</title>
      <dc:creator>Blake Price</dc:creator>
      <pubDate>Sun, 01 Nov 2026 15:03:23 +0000</pubDate>
      <link>https://dev.to/tiny_price/notebook-to-service-the-three-files-i-add-before-deploying-a-model-183d</link>
      <guid>https://dev.to/tiny_price/notebook-to-service-the-three-files-i-add-before-deploying-a-model-183d</guid>
      <description>&lt;p&gt;Every model I've shipped started as a notebook, and every one of them needed the same three files before it could be a service.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;config.py&lt;/strong&gt; — one place for paths, model names, thresholds, and timeouts. The alternative is six constants copied into four notebooks, and then a month later nobody remembers which threshold is the real one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;serve.py&lt;/strong&gt; — a thin FastAPI wrapper with a health endpoint and one predict endpoint. No business logic, no training code. Load the model once at startup, not per request.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;test_smoke.py&lt;/strong&gt; — two tests: the model loads, and a known input returns the expected shape. That's it. It catches 80% of the deploy failures I've caused.&lt;/p&gt;

&lt;p&gt;The part I keep relearning: pin the versions. torch + numpy + your GPU driver are a triangle of pain, and "it worked in the notebook" means nothing when the container resolves different wheels.&lt;/p&gt;

&lt;p&gt;What else do you add before calling a notebook production-ready?&lt;/p&gt;

</description>
      <category>python</category>
      <category>machinelearning</category>
      <category>devops</category>
    </item>
    <item>
      <title>The migration I would do differently next time</title>
      <dc:creator>Blake Price</dc:creator>
      <pubDate>Thu, 29 Oct 2026 02:14:40 +0000</pubDate>
      <link>https://dev.to/tiny_price/the-migration-i-would-do-differently-next-time-4jlh</link>
      <guid>https://dev.to/tiny_price/the-migration-i-would-do-differently-next-time-4jlh</guid>
      <description>&lt;p&gt;Moved a table with about twenty million rows last month and learned three things the hard way.&lt;/p&gt;

&lt;p&gt;Do the double-write before the backfill, not after. We did it the other way and spent two evenings reconciling.&lt;/p&gt;

&lt;p&gt;Measure replication lag before you start, not during. Ours spiked and we had no baseline.&lt;/p&gt;

&lt;p&gt;Write the rollback plan first. We had one, sort of, in someone's head. That is not a plan.&lt;/p&gt;

</description>
      <category>database</category>
      <category>postgres</category>
      <category>backend</category>
    </item>
  </channel>
</rss>
