<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>5L Labs Blog</title>
        <link>https://www.5l-labs.com/applied-home-ml-iot</link>
        <description>5L Labs Blog</description>
        <lastBuildDate>Wed, 18 Feb 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[GarageCam Lives! ExecuTorch on RPi 5]]></title>
            <link>https://www.5l-labs.com/applied-home-ml-iot/executorch-bootstrap</link>
            <guid>https://www.5l-labs.com/applied-home-ml-iot/executorch-bootstrap</guid>
            <pubDate>Wed, 18 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A deep dive into deploying a private ML pipeline for GarageCam using ExecuTorch on Raspberry Pi 5, featuring real-time inference and MQTT integration.]]></description>
            <content:encoded><![CDATA[<p>Due to competing priorities, getting the first "baby" model out the door on <strong>ExecuTorch</strong> took far longer than anticipated.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-does-the-model-do">What does the model do?<a href="https://www.5l-labs.com/applied-home-ml-iot/executorch-bootstrap#what-does-the-model-do" class="hash-link" aria-label="Direct link to What does the model do?" title="Direct link to What does the model do?" translate="no">​</a></h2>
<p>The model monitors a webcam powered by <a href="https://thingino.com/" target="_blank" rel="noopener noreferrer" class="">Thingino</a> and served to HomeKit via <a href="https://www.scrypted.app/" target="_blank" rel="noopener noreferrer" class="">Scrypted</a>. It produces two primary predictions published to MQTT, which are then exported to HomeKit via <a href="https://homebridge.io/" target="_blank" rel="noopener noreferrer" class="">Homebridge</a> using <a href="https://github.com/arachnetech/homebridge-mqttthing" target="_blank" rel="noopener noreferrer" class="">mqtt-things</a>:</p>
<ul>
<li class="">Door Open/Closed</li>
<li class="">Car Home/Away</li>
</ul>
<p>Please see the previous post on <a class="" href="https://www.5l-labs.com/applied-home-ml-iot/continued-iot-ml-on-the-cheap">GarageCam</a> for context on the evolution of this project.</p>
<p><img decoding="async" loading="lazy" src="https://www.5l-labs.com/assets/images/garagecam-20250608_195709-cef3f6d88f024f38e1304fca3a93fe64.jpeg" width="1920" height="1080" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-does-it-run">How does it run?<a href="https://www.5l-labs.com/applied-home-ml-iot/executorch-bootstrap#how-does-it-run" class="hash-link" aria-label="Direct link to How does it run?" title="Direct link to How does it run?" translate="no">​</a></h2>
<ul>
<li class=""><strong>Raspberry Pi 5</strong> - set to poll every 30s.</li>
<li class=""><strong>Raspberry Pi 4</strong> - Currently sidelined due to a build mismatch.</li>
</ul>
<p>The underlying code maps PyTorch operations to specific CPU sets via ExecuTorch, but this process is currently error-prone. Aligning the right instruction sets with the target architecture requires precise configuration, which led to the RPi 4 hiccups.</p>
<div>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token number" style="color:#36acaa">2026</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">02</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">18</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">06</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">01</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">42</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">406</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">INFO</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> model_runner</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">inference</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Loading PTE model </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token plain">app</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">model</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">model</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">pte</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">program</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">cpp</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">153</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> InternalConsistency verification requested but </span><span class="token keyword" style="color:#00009f">not</span><span class="token plain"> available</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">cpuinfo_utils</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">cpp</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">71</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> Reading </span><span class="token builtin">file</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token plain">sys</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">devices</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">soc0</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">image_version</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">cpuinfo_utils</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">cpp</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">87</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> Failed to </span><span class="token builtin">open</span><span class="token plain"> midr </span><span class="token builtin">file</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token plain">sys</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">devices</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">soc0</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">image_version</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">cpuinfo_utils</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">cpp</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> Reading </span><span class="token builtin">file</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token plain">sys</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">devices</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">system</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">cpu</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">cpu0</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">regs</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">identification</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">midr_el1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">cpuinfo_utils</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">cpp</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> Reading </span><span class="token builtin">file</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token plain">sys</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">devices</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">system</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">cpu</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">cpu1</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">regs</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">identification</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">midr_el1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">cpuinfo_utils</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">cpp</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> Reading </span><span class="token builtin">file</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token plain">sys</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">devices</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">system</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">cpu</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">cpu2</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">regs</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">identification</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">midr_el1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">cpuinfo_utils</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">cpp</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> Reading </span><span class="token builtin">file</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token plain">sys</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">devices</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">system</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">cpu</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">cpu3</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">regs</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">identification</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">midr_el1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">2026</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">02</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">18</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">06</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">01</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">42</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">408</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">INFO</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> model_runner</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">inference</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> PTE model loaded successfully</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">2026</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">02</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">18</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">06</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">01</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">42</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">408</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">INFO</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> model_runner</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">mqtt_client</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Connecting to MQTT broker mqtt_broker</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">1883</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">2026</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">02</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">18</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">06</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">01</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">42</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">412</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">INFO</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> model_runner</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">mqtt_client</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Connected to MQTT broker</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">2026</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">02</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">18</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">06</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">01</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">42</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">512</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">INFO</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> model_runner</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">healthcheck</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Healthcheck server listening on port </span><span class="token number" style="color:#36acaa">8080</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">2026</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">02</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">18</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">06</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">01</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">42</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">613</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">INFO</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> model_runner</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">runner</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> All components initialized successfully</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">2026</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">02</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">18</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">06</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">01</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">42</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">613</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">INFO</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> model_runner</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">runner</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Running inference every </span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">0s</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">2026</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">02</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">18</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">06</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">01</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">43</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">281</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">INFO</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> model_runner</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">camera</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ONVIF snapshot URI</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> http</span><span class="token punctuation" style="color:#393A34">:</span><span class="token operator" style="color:#393A34">//</span><span class="token number" style="color:#36acaa">192.168</span><span class="token number" style="color:#36acaa">.000</span><span class="token number" style="color:#36acaa">.000</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">image</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">jpg</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">2026</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">02</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">18</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">06</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">01</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">44</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">311</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">INFO</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> model_runner</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">runner</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Debug snapshot saved</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token plain">tmp</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">model_runner_debug</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">snapshot_20260218_060144</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">jpg</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">2026</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">02</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">18</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">06</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">01</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">44</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">326</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">INFO</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> model_runner</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">state</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> State change</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> car_present</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> UNKNOWN </span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> OFF </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">prob</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0.198</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">2026</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">02</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">18</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">06</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">01</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">44</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">326</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">INFO</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> model_runner</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">state</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> State change</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> door_open</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> UNKNOWN </span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> OFF </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">prob</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0.000</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">2026</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">02</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">18</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">06</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">01</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">44</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">326</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">INFO</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> model_runner</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">state</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> State change</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> door_closed</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> UNKNOWN </span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> ON </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">prob</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0.801</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
</div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-does-it-perform">How does it perform?<a href="https://www.5l-labs.com/applied-home-ml-iot/executorch-bootstrap#how-does-it-perform" class="hash-link" aria-label="Direct link to How does it perform?" title="Direct link to How does it perform?" translate="no">​</a></h2>
<p>Surprisingly well! The Raspberry Pi 5 handles the inference load with ease, maintaining a consistent polling interval without thermal or resource issues.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-efficient-is-it">How efficient is it?<a href="https://www.5l-labs.com/applied-home-ml-iot/executorch-bootstrap#how-efficient-is-it" class="hash-link" aria-label="Direct link to How efficient is it?" title="Direct link to How efficient is it?" translate="no">​</a></h3>
<ul>
<li class=""><strong>Model Size:</strong> Optimized for edge deployment using PTE formats.</li>
<li class=""><strong>CPU Consumed:</strong> Minimal impact on the Pi 5's quad-core processor.</li>
<li class=""><strong>Memory Consumed:</strong> Low footprint, leaving plenty of headroom for other services.</li>
</ul>
<p><img decoding="async" loading="lazy" src="https://www.5l-labs.com/assets/images/rpi5_perf-6cbc99ff6f70652e344b2bdf9274c1b7.jpg" width="1738" height="1244" class="img_ev3q"></p>
<p>While the resource usage is excellent, I'm still refining the observability stack to better track long-term ML accuracy and model drift.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="does-this-help-avoid-frigate--scrypted-nvr-fees">Does this help avoid <a href="https://frigate.video/" target="_blank" rel="noopener noreferrer" class="">Frigate</a> / <a href="https://docs.scrypted.app/scrypted-nvr/" target="_blank" rel="noopener noreferrer" class="">Scrypted NVR</a> fees?<a href="https://www.5l-labs.com/applied-home-ml-iot/executorch-bootstrap#does-this-help-avoid-frigate--scrypted-nvr-fees" class="hash-link" aria-label="Direct link to does-this-help-avoid-frigate--scrypted-nvr-fees" title="Direct link to does-this-help-avoid-frigate--scrypted-nvr-fees" translate="no">​</a></h2>
<p>Nope, you should still pay them. Eventually, my answer may change, but not without more observability work and scaling this across more cameras.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="where-is-the-code">Where is the code?<a href="https://www.5l-labs.com/applied-home-ml-iot/executorch-bootstrap#where-is-the-code" class="hash-link" aria-label="Direct link to Where is the code?" title="Direct link to Where is the code?" translate="no">​</a></h2>
<p>Next Time—it's not presentable to the public (yet) largely as there is still a lot of hard-coded stuff with PII that I want to remove.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="executorch-and-the-compilevm">ExecuTorch and the CompileVM<a href="https://www.5l-labs.com/applied-home-ml-iot/executorch-bootstrap#executorch-and-the-compilevm" class="hash-link" aria-label="Direct link to ExecuTorch and the CompileVM" title="Direct link to ExecuTorch and the CompileVM" translate="no">​</a></h3>
<p>Rather than bloat my main workstation with cross-compilation support, I've added a QEMU/UTM Debian VM for compiling the Python wheels for ExecuTorch. This will be factored out of the main repo as a more generic solution.</p>
<ul>
<li class=""><strong>Note</strong>: I have a compile container as well, but in principle, I could have run this on an x86 box so it wasn't a generic cross-compile/arch-agnostic pipeline.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="did-pytorch-lightning-help">Did <a href="https://lightning.ai/pytorch-lightning" target="_blank" rel="noopener noreferrer" class="">PyTorch Lightning</a> help?<a href="https://www.5l-labs.com/applied-home-ml-iot/executorch-bootstrap#did-pytorch-lightning-help" class="hash-link" aria-label="Direct link to did-pytorch-lightning-help" title="Direct link to did-pytorch-lightning-help" translate="no">​</a></h3>
<p>Tremendously versus straight PyTorch. At some point, I need to dig into what is going on under the hood.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="did-ai-assist-with-the-coding--testing--design">Did AI Assist with the coding / testing / design?<a href="https://www.5l-labs.com/applied-home-ml-iot/executorch-bootstrap#did-ai-assist-with-the-coding--testing--design" class="hash-link" aria-label="Direct link to Did AI Assist with the coding / testing / design?" title="Direct link to Did AI Assist with the coding / testing / design?" translate="no">​</a></h3>
<p>Yes. It was used for boilerplate and autocomplete. Sadly, as some of the tech (<a href="https://pytorch.org/executorch/" target="_blank" rel="noopener noreferrer" class="">ExecuTorch</a>, <a href="https://onnx.ai/" target="_blank" rel="noopener noreferrer" class="">ONNX</a>, <a href="https://www.tensorflow.org/lite" target="_blank" rel="noopener noreferrer" class="">TFLite</a>), <a href="https://daytona.io/" target="_blank" rel="noopener noreferrer" class="">Daytona</a>, BaseTen, and <a href="https://modal.com/" target="_blank" rel="noopener noreferrer" class="">Modal</a> was not familiar to me, Gemini, Claude (Opus), and Grok helpfully jumped in to help—but the subtle bugs hurt, a lot.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-does-this-really-help">How does this really help?<a href="https://www.5l-labs.com/applied-home-ml-iot/executorch-bootstrap#how-does-this-really-help" class="hash-link" aria-label="Direct link to How does this really help?" title="Direct link to How does this really help?" translate="no">​</a></h2>
<p>I've done nothing special here—but it opens the door to a generic home-ML pipeline of using bigger "Teacher" models to train smaller "Student" models that can run on non-specialized hardware.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="next-steps-for-garagecam">Next Steps for GarageCam<a href="https://www.5l-labs.com/applied-home-ml-iot/executorch-bootstrap#next-steps-for-garagecam" class="hash-link" aria-label="Direct link to Next Steps for GarageCam" title="Direct link to Next Steps for GarageCam" translate="no">​</a></h2>
<ul>
<li class=""><strong>Model Perf Tracking</strong>: Need to add in <a href="https://phoenix.arize.com/" target="_blank" rel="noopener noreferrer" class="">Arize Phoenix</a> or <a href="https://sentry.io/" target="_blank" rel="noopener noreferrer" class="">Sentry</a> for tracking model drift and inference performance.</li>
<li class=""><strong>Model Architecture</strong>: See the next post in the Frontier Research blog where I may reveal my ignorance.</li>
<li class=""><strong>Model Inference Footprint</strong>: Fix the RPi 4 and explore other smaller processors.</li>
<li class=""><strong>Data Privacy</strong>: Add in bounding, labeling, and masking of private data with the local Teacher. Once properly masked, Daytona/Modal/BaseTen/Lightning are excellent for beefy training.</li>
<li class=""><strong>Differential Privacy</strong>: Exploring how much noise can be added to the picture without breaking the classifier.</li>
</ul>]]></content:encoded>
            <category>vllm-sr</category>
            <category>semantic-router</category>
            <category>privateai</category>
            <category>executorch</category>
            <category>raspberry-pi-5</category>
            <category>mqtt</category>
            <category>scrypted</category>
            <category>thingino</category>
        </item>
        <item>
            <title><![CDATA[Thoughts on Jarvis 2.0]]></title>
            <link>https://www.5l-labs.com/applied-home-ml-iot/jarvis2.0</link>
            <guid>https://www.5l-labs.com/applied-home-ml-iot/jarvis2.0</guid>
            <pubDate>Sun, 16 Nov 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Conceptualizing "Jarvis 2.0"—a private, multi-modal AI assistant for the home, utilizing semantic routing and local speech recognition.]]></description>
            <content:encoded><![CDATA[<p>Keeping pace is impossible; the late 2025 landscape is dominated by multi-modal models that can finally "see" and "hear" with low enough latency for a home assistant. I've just now finally caught up on the "news" and "AI/news" feed in my inbox—at the expense of punting some updates to podcasts and open web tabs.</p>
<p>There are a lot of cool developments that others have been working on, and here is where I'd like to spend any free time I get over the holidays:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="jarvis-20-the-path-to-private-agency">Jarvis 2.0: The Path to Private Agency<a href="https://www.5l-labs.com/applied-home-ml-iot/jarvis2.0#jarvis-20-the-path-to-private-agency" class="hash-link" aria-label="Direct link to Jarvis 2.0: The Path to Private Agency" title="Direct link to Jarvis 2.0: The Path to Private Agency" translate="no">​</a></h3>
<p>The core of "Jarvis 2.0" is moving from a reactive chat interface to a proactive, context-aware agent. My focus for the holidays is to integrate <strong>Semantic Router</strong> for lightning-fast intent detection and <strong>vLLM-SR</strong> (vLLM Speech Recognition) for local, low-latency voice commands that stay entirely within my home's firewall.</p>
<p><strong>What makes it "2.0"?</strong></p>
<ul>
<li class=""><strong>Proactive Intelligence</strong>: Moving beyond basic voice commands to an agent that suggests actions based on observed context and historical patterns.</li>
<li class=""><strong>Local Vision</strong>: Integrating models like Qwen2-VL to understand the visual state of the house via the GarageCam/HomeKit camera network.</li>
<li class=""><strong>Zero Cloud</strong>: Ensuring every byte of audio, video, and text remains on the local M2/RPi mesh, with zero external dependencies for core functionality.</li>
</ul>]]></content:encoded>
            <category>vllm-sr</category>
            <category>semantic-router</category>
            <category>privateai</category>
            <category>llm</category>
            <category>agent</category>
            <category>home-automation</category>
        </item>
        <item>
            <title><![CDATA[Continued Adventures in CheapML for IoT]]></title>
            <link>https://www.5l-labs.com/applied-home-ml-iot/continued-iot-ml-on-the-cheap</link>
            <guid>https://www.5l-labs.com/applied-home-ml-iot/continued-iot-ml-on-the-cheap</guid>
            <pubDate>Mon, 15 Sep 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[A progress update on the GarageCam project, focusing on VLM labeling (Qwen), model conversion (PyTorch to TFLite), and the challenges of running ML on an RPi 4.]]></description>
            <content:encoded><![CDATA[<p>I have probably bit off more than I can chew with this project. However, the progress made on automated labeling and model conversion has been a game-changer for my local-first AI experiments.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-hard-or-time-consuming-about-this">What is hard (or time-consuming) about this?<a href="https://www.5l-labs.com/applied-home-ml-iot/continued-iot-ml-on-the-cheap#what-is-hard-or-time-consuming-about-this" class="hash-link" aria-label="Direct link to What is hard (or time-consuming) about this?" title="Direct link to What is hard (or time-consuming) about this?" translate="no">​</a></h2>
<ul>
<li class="">Generating the testing/training data set. I ended up using a VLM for the initial labeling, with manual overrides for edge cases. I started with Moondream, but eventually transitioned to <strong>Qwen2-VL</strong>, which proved far more robust for object identification. In retrospect, we also should have tried out <strong>Molmo</strong> instead of LLaVA for its superior zero-shot performance on high-resolution snapshots.</li>
<li class="">As I'm trying to run this with limited resources on a Raspberry Pi 4 (4GB RAM), that means starting the ML models from scratch and aggressive pruning/quantization.</li>
<li class="">Trying to leave something that is generalizable enough for other cameras in the house—or just give up and pay the $20/mo for Frigate/Scrypted Cloud. The goal of "CheapML" is to see how far we can get with pure open-source and local hardware.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-conversion-pipeline">The Conversion Pipeline<a href="https://www.5l-labs.com/applied-home-ml-iot/continued-iot-ml-on-the-cheap#the-conversion-pipeline" class="hash-link" aria-label="Direct link to The Conversion Pipeline" title="Direct link to The Conversion Pipeline" translate="no">​</a></h3>
<p>The current pipeline takes a PyTorch-trained model, converts it to <strong>ONNX</strong> for optimization, and then finally to <strong>TFLite</strong> to squeeze it onto the RPi 4's CPU/TPU. Each step requires careful calibration to avoid significant accuracy loss during quantization.</p>]]></content:encoded>
            <category>homekit</category>
            <category>wyze</category>
            <category>scrypted</category>
            <category>quartz</category>
            <category>xterm</category>
            <category>cloner</category>
            <category>pytorch</category>
            <category>onnx</category>
            <category>tflite</category>
        </item>
        <item>
            <title><![CDATA[Adventures in CheapML - GarageCam]]></title>
            <link>https://www.5l-labs.com/applied-home-ml-iot/garage-cam-on-the-cheap</link>
            <guid>https://www.5l-labs.com/applied-home-ml-iot/garage-cam-on-the-cheap</guid>
            <pubDate>Sun, 08 Jun 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[A DIY approach to garage door and car presence detection using a Wyze Cam v3, Thingino, and a custom Python script for cheap ML at the edge.]]></description>
            <content:encoded><![CDATA[<p>With <a href="https://www.scrypted.app/" target="_blank" rel="noopener noreferrer" class="">Scrypted</a> / <a href="https://thingino.com/" target="_blank" rel="noopener noreferrer" class="">Thingino</a> up and stable, the next goal is to replace my janky garage door sensor with a camera-based sensor. With some luck, I can extend this to every camera in the house cheaper and more accurately than Frigate, but let's not get ahead of ourselves.</p>
<ol>
<li class="">
<p>What I have:</p>
<ul>
<li class="">Wyze Cam v3</li>
<li class="">Scrypted</li>
<li class="">Thingino</li>
<li class="">HomeKit</li>
<li class="">RPi 4 that isn't melting</li>
</ul>
</li>
<li class="">
<p>What I need:</p>
<ul>
<li class="">A way to detect when the garage door is open or closed</li>
<li class="">A way to update MQTT with the state of the garage door</li>
<li class="">A way to update MQTT with the state of the car</li>
</ul>
</li>
</ol>
<p>So far:
The initial Python script I "vibe coded" was, to put it mildly, very hacky. It used the <a href="https://www.onvif.org/" target="_blank" rel="noopener noreferrer" class="">ONVIF Snapshot protocol</a> to capture a frame every 60 seconds from the camera. While it technically worked with <code>opencv-python</code> and <code>paho-mqtt</code> for a few days, it was brittle and prone to memory leaks on the RPi 4.</p>
<p>The real lesson here was in the data handling—capturing snapshots is easy, but making a reliable sensor out of them required a more robust architecture. This prototype was eventually rewritten to use a more stable event-driven model, which I'll cover in the follow-up post.</p>]]></content:encoded>
            <category>homekit</category>
            <category>wyze</category>
            <category>scrypted</category>
            <category>quartz</category>
            <category>xterm</category>
            <category>cloner</category>
        </item>
        <item>
            <title><![CDATA[Interoperability and Mini Minds]]></title>
            <link>https://www.5l-labs.com/applied-home-ml-iot/interoperability-and-monetization</link>
            <guid>https://www.5l-labs.com/applied-home-ml-iot/interoperability-and-monetization</guid>
            <pubDate>Sat, 12 Apr 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Exploring how multiple small language models (Mini Minds) can collaborate in a local IoT ecosystem, and the potential monetization models for private AI.]]></description>
            <content:encoded><![CDATA[<p>The monetization strategy for private AI in the home is still in its infancy. Do we monetize the orchestration server for private re-training? Or is the value in the "Private Models" themselves? Alternatively, perhaps a data-privacy-first exchange allows for anonymized datasets to be contributed back to the collective in exchange for lower hardware overhead.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="mini-minds-the-power-of-local-collaboration">Mini Minds: The Power of Local Collaboration<a href="https://www.5l-labs.com/applied-home-ml-iot/interoperability-and-monetization#mini-minds-the-power-of-local-collaboration" class="hash-link" aria-label="Direct link to Mini Minds: The Power of Local Collaboration" title="Direct link to Mini Minds: The Power of Local Collaboration" translate="no">​</a></h3>
<p>The "Mini Minds" concept involves using multiple small language models (SLMs), each specialized for a specific task—like intent detection, light control, or temperature monitoring—rather than one monolithic LLM. This approach reduces latency and compute costs while maintaining high accuracy in a local IoT environment.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-do-federated-learning-frameworks-fit-in">How do Federated Learning Frameworks fit in?<a href="https://www.5l-labs.com/applied-home-ml-iot/interoperability-and-monetization#how-do-federated-learning-frameworks-fit-in" class="hash-link" aria-label="Direct link to How do Federated Learning Frameworks fit in?" title="Direct link to How do Federated Learning Frameworks fit in?" translate="no">​</a></h3>
<p>Frameworks like <a href="https://flower.ai/" target="_blank" rel="noopener noreferrer" class="">Flower</a> are essential for this "Mini Minds" architecture. They allow multiple local devices to participate in training without sharing raw, sensitive data, enabling a collective intelligence that stays within the home's walls. This interoperability between small, specialized models is the key to a truly responsive and private smart home.</p>]]></content:encoded>
            <category>blog</category>
            <category>ml</category>
            <category>embedding_models</category>
            <category>iot</category>
            <category>interoperability</category>
        </item>
        <item>
            <title><![CDATA[Private Agents - Pim Particles]]></title>
            <link>https://www.5l-labs.com/applied-home-ml-iot/pim_particles</link>
            <guid>https://www.5l-labs.com/applied-home-ml-iot/pim_particles</guid>
            <pubDate>Sat, 05 Apr 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Exploring model shrinkage techniques like LoRA and quantization to run private agents on low-power hardware like Raspberry Pi 4.]]></description>
            <content:encoded><![CDATA[<p>A continuation of the previous blog post.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="can-we-shrink-the-size-of-the-model-using-fine-tuning-lora-and-quantization-to-fit-on-a-raspberry-pi-4-with-reasonable-performance">Can we shrink the size of the model using fine-tuning, LoRa and quantization to fit on a Raspberry Pi 4 with reasonable performance?<a href="https://www.5l-labs.com/applied-home-ml-iot/pim_particles#can-we-shrink-the-size-of-the-model-using-fine-tuning-lora-and-quantization-to-fit-on-a-raspberry-pi-4-with-reasonable-performance" class="hash-link" aria-label="Direct link to Can we shrink the size of the model using fine-tuning, LoRa and quantization to fit on a Raspberry Pi 4 with reasonable performance?" title="Direct link to Can we shrink the size of the model using fine-tuning, LoRa and quantization to fit on a Raspberry Pi 4 with reasonable performance?" translate="no">​</a></h4>
<p>The quest to run meaningful AI on a Raspberry Pi 4 led us down a rabbit hole of quantization and LoRA (Low-Rank Adaptation). While we were knee-deep in the research, it turns out we didn't get this running to our own satisfaction. Others in the open-source community beat us to the solution, providing robust implementations that far exceeded our initial prototypes. We'll not complain and just accept their work, as it allows us to focus on the next layer of the stack: private orchestration.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-pim-particle-effect-linguistic-dimensions">The Pim Particle Effect: Linguistic Dimensions<a href="https://www.5l-labs.com/applied-home-ml-iot/pim_particles#the-pim-particle-effect-linguistic-dimensions" class="hash-link" aria-label="Direct link to The Pim Particle Effect: Linguistic Dimensions" title="Direct link to The Pim Particle Effect: Linguistic Dimensions" translate="no">​</a></h3>
<p>The "Pim Particle" concept remains relevant as a way to think about semantic compression. By using actual previous calls to confirm the linguistic dimensions of possible intent, we can effectively shrink the search space required for an agent to take action.</p>
<p>To maintain these local agents, we've developed a self-healing MCP (Model Context Protocol) server workflow:</p>
<!-- -->
<p>This ensures that even when running smaller, "shrunken" models, the tools they interact with are always up-to-date and verified.</p>]]></content:encoded>
            <category>blog</category>
            <category>mcp</category>
            <category>python</category>
            <category>gemini</category>
            <category>claude</category>
            <category>warp</category>
        </item>
        <item>
            <title><![CDATA[Entirely Private Machine Learning Home Setup]]></title>
            <link>https://www.5l-labs.com/applied-home-ml-iot/offline-llms</link>
            <guid>https://www.5l-labs.com/applied-home-ml-iot/offline-llms</guid>
            <pubDate>Sun, 16 Feb 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[A deep dive into setting up a private, local machine learning environment using Podman, Langfuse, Milvus, and more on a Mac M2 Pro.]]></description>
            <content:encoded><![CDATA[<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_BuS1"><p>This setup is for educational purposes and reflects a specific point-in-time configuration. Always verify current security practices before deploying to a production-like environment.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="background">Background<a href="https://www.5l-labs.com/applied-home-ml-iot/offline-llms#background" class="hash-link" aria-label="Direct link to Background" title="Direct link to Background" translate="no">​</a></h2>
<p><strong>Caveat Emptor</strong>: This is a public blog of what probably should be a private note.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="machine-specification">Machine Specification:<a href="https://www.5l-labs.com/applied-home-ml-iot/offline-llms#machine-specification" class="hash-link" aria-label="Direct link to Machine Specification:" title="Direct link to Machine Specification:" translate="no">​</a></h3>
<ul>
<li class="">CPU: Mac M2 Pro</li>
<li class="">RAM: 96GB DDR4</li>
<li class="">Storage: 1TB NVMe SSD</li>
</ul>
<p>Tonight turned into an unexpected journey through the rabbit holes of self-hosted technologies. I decided to venture out of my comfort zone, and boy, was it an enlightening experience! Here's a rundown of gotchas:</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="models">Models<a href="https://www.5l-labs.com/applied-home-ml-iot/offline-llms#models" class="hash-link" aria-label="Direct link to Models" title="Direct link to Models" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="local-models">Local Models<a href="https://www.5l-labs.com/applied-home-ml-iot/offline-llms#local-models" class="hash-link" aria-label="Direct link to Local Models" title="Direct link to Local Models" translate="no">​</a></h3>
<ul>
<li class=""><strong>Llama 3.1 8B/70B</strong>: Our primary general-purpose LLM, running via Ollama.</li>
<li class=""><strong>Mistral NeMo</strong>: Excellent for 128k context window tasks.</li>
<li class=""><strong>nomic-embed-text</strong>: Our go-to for local embeddings.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tools--components">Tools / Components<a href="https://www.5l-labs.com/applied-home-ml-iot/offline-llms#tools--components" class="hash-link" aria-label="Direct link to Tools / Components" title="Direct link to Tools / Components" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="podman-machine-the-immutable-disk-conundrum">Podman Machine: The Immutable Disk Conundrum<a href="https://www.5l-labs.com/applied-home-ml-iot/offline-llms#podman-machine-the-immutable-disk-conundrum" class="hash-link" aria-label="Direct link to Podman Machine: The Immutable Disk Conundrum" title="Direct link to Podman Machine: The Immutable Disk Conundrum" translate="no">​</a></h3>
<p><a href="https://www.5l-labs.com/applied-home-ml-iot/offline-llms#podman-machine" class="">Podman Machine</a> on OSX has a fun caveat - the disks were traditionally not resizable! Circa this post, this behavior seemed by design to ensure stability and simplicity. <em>Update: Newer versions of Podman allow for disk expansion via <code>podman machine set --disk-size</code>.</em></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="gemini-api">Gemini API<a href="https://www.5l-labs.com/applied-home-ml-iot/offline-llms#gemini-api" class="hash-link" aria-label="Direct link to Gemini API" title="Direct link to Gemini API" translate="no">​</a></h3>
<p>While not strictly local, the <a href="https://ai.google.dev/gemini-api/docs" target="_blank" rel="noopener noreferrer" class="">Gemini API</a> (via Google AI Studio) serves as a benchmark for our local models. We use it with 'Data Sharing' disabled to maintain as much privacy as possible during testing.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="langfuse-ai-on-my-terms">Langfuse: AI on My Terms<a href="https://www.5l-labs.com/applied-home-ml-iot/offline-llms#langfuse-ai-on-my-terms" class="hash-link" aria-label="Direct link to Langfuse: AI on My Terms" title="Direct link to Langfuse: AI on My Terms" translate="no">​</a></h3>
<p><a href="https://langfuse.com/" target="_blank" rel="noopener noreferrer" class="">Langfuse</a> is a platform for managing and deploying AI models on your own infrastructure. The setup was straightforward, but what fascinated me was the control it offers over model iterations and data privacy. If you're into machine learning but worried about cloud dependencies or data security, Langfuse might just be your knight in shining armor. Be sure to <a href="https://langfuse.com/self-hosting/configuration" target="_blank" rel="noopener noreferrer" class="">turn off phone home</a> in the self-hosted config.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="valkey-open-source-redis-for-the-win">Valkey: Open-Source Redis for the Win<a href="https://www.5l-labs.com/applied-home-ml-iot/offline-llms#valkey-open-source-redis-for-the-win" class="hash-link" aria-label="Direct link to Valkey: Open-Source Redis for the Win" title="Direct link to Valkey: Open-Source Redis for the Win" translate="no">​</a></h3>
<p><strong>Valkey</strong> came as a surprise. An open-source alternative to Redis, it provides similar data structures and features. My exploration tonight wasn't just about setting it up (which was a breeze) but also understanding its ecosystem. Valkey offers a community-driven approach to key-value stores, which could be particularly appealing in environments where open-source contributions are paramount.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="minio-s3-permissions-masterclass">Minio: S3 Permissions Masterclass<a href="https://www.5l-labs.com/applied-home-ml-iot/offline-llms#minio-s3-permissions-masterclass" class="hash-link" aria-label="Direct link to Minio: S3 Permissions Masterclass" title="Direct link to Minio: S3 Permissions Masterclass" translate="no">​</a></h3>
<p>Now, <strong>Minio</strong> was where things got tricky yet incredibly educational. It’s an object storage server compatible with Amazon S3, which I installed to get a grip on handling S3-like storage locally. The real learning curve was the <strong>crash course in S3 Permissions and policy</strong>. Setting up bucket policies, managing access, and ensuring security was like solving a puzzle where every piece affects the other. It was tough but rewarding, and now I have a deeper understanding of S3's permission model, which is invaluable in cloud or self-hosting scenarios.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="clickhouse-permissions-and-peculiarities">Clickhouse: Permissions and Peculiarities<a href="https://www.5l-labs.com/applied-home-ml-iot/offline-llms#clickhouse-permissions-and-peculiarities" class="hash-link" aria-label="Direct link to Clickhouse: Permissions and Peculiarities" title="Direct link to Clickhouse: Permissions and Peculiarities" translate="no">​</a></h3>
<p><a href="https://clickhouse.com/docs/en/interfaces/http" target="_blank" rel="noopener noreferrer" class="">Clickhouse</a>, a column-oriented database management system, known for its speed in processing analytical queries, was next on my list. However, setting permissions proved to be wonky. Clickhouse's default user permissions are quite permissive, which I initially found odd. After a few hours of configuration, I realized this approach simplifies many operations but requires careful setup to secure a production environment. It's an excellent lesson in balancing convenience with security.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="milvus-vector-search-made-local">Milvus: Vector Search Made Local<a href="https://www.5l-labs.com/applied-home-ml-iot/offline-llms#milvus-vector-search-made-local" class="hash-link" aria-label="Direct link to Milvus: Vector Search Made Local" title="Direct link to Milvus: Vector Search Made Local" translate="no">​</a></h3>
<p><a href="https://milvus.io/" target="_blank" rel="noopener noreferrer" class="">Milvus</a> caught my eye for its capabilities in similarity search and AI applications, particularly with unstructured data. Setting up a local instance was a breeze, and playing with vector space indexing opened up new realms of what's possible with local infrastructure. It's clear why Milvus is gaining traction for real-time analytics and AI-powered searches.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="python-inbox-processing-a-practical-challenge">Python Inbox Processing: A Practical Challenge<a href="https://www.5l-labs.com/applied-home-ml-iot/offline-llms#python-inbox-processing-a-practical-challenge" class="hash-link" aria-label="Direct link to Python Inbox Processing: A Practical Challenge" title="Direct link to Python Inbox Processing: A Practical Challenge" translate="no">​</a></h3>
<p>Finally, I dabbled with <strong>Python inbox processing</strong>. This wasn't about setting up something new but optimizing an existing script to handle my email with better efficiency. Parsing emails, extracting information, and organizing it into a database - it was a practical challenge, blending technology with everyday utility.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion-a-night-of-learning-and-laughter">Conclusion: A Night of Learning and Laughter<a href="https://www.5l-labs.com/applied-home-ml-iot/offline-llms#conclusion-a-night-of-learning-and-laughter" class="hash-link" aria-label="Direct link to Conclusion: A Night of Learning and Laughter" title="Direct link to Conclusion: A Night of Learning and Laughter" translate="no">​</a></h3>
<p>Tonight was not just about tech exploration but also about embracing the learning curve with laughter. Each of these technologies presented unique challenges and solutions, teaching me that in the tech world, the journey itself is often more valuable than the destination.</p>
<p>Whether you're considering going self-hosted, exploring AI, or just curious about container management, I hope my little adventure inspires you to dive in yourself. Remember, tech exploration is not just about mastering tools but about enjoying the ride and learning from each step. Here's to many more nights of tech discoveries!</p>
<hr>
<p>Do let me know if you try any of these out or if you have any other cool self-hosted technologies to explore!</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="podman-machine">podman-machine<a href="https://www.5l-labs.com/applied-home-ml-iot/offline-llms#podman-machine" class="hash-link" aria-label="Direct link to podman-machine" title="Direct link to podman-machine" translate="no">​</a></h4>
<p>For those unfamiliar, Podman is a daemonless container engine for developing, managing, and running OCI Containers on your Linux System.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="apple-secure-enclaves">Apple Secure Enclaves<a href="https://www.5l-labs.com/applied-home-ml-iot/offline-llms#apple-secure-enclaves" class="hash-link" aria-label="Direct link to Apple Secure Enclaves" title="Direct link to Apple Secure Enclaves" translate="no">​</a></h4>
<p>Apple's <a href="https://security.apple.com/blog/private-cloud-compute/" target="_blank" rel="noopener noreferrer" class="">Private Cloud Compute</a> provides a blueprint for how hardware-level security can scale to the cloud without compromising privacy.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="securing-h100-gpus">Securing H100 GPUs<a href="https://www.5l-labs.com/applied-home-ml-iot/offline-llms#securing-h100-gpus" class="hash-link" aria-label="Direct link to Securing H100 GPUs" title="Direct link to Securing H100 GPUs" translate="no">​</a></h4>
<p>NVIDIA's <a href="https://developer.nvidia.com/blog/confidential-computing-on-h100-gpus-for-secure-and-trustworthy-ai/" target="_blank" rel="noopener noreferrer" class="">Confidential Computing on H100 GPUs</a> ensures that even in multi-tenant environments, your AI workloads remain isolated.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="confident-security">Confident Security<a href="https://www.5l-labs.com/applied-home-ml-iot/offline-llms#confident-security" class="hash-link" aria-label="Direct link to Confident Security" title="Direct link to Confident Security" translate="no">​</a></h4>
<p><a href="https://confident.security/" target="_blank" rel="noopener noreferrer" class="">Confident Security</a> is another player focusing on the intersection of data privacy and AI safety.</p>]]></content:encoded>
            <category>blog</category>
            <category>ml</category>
            <category>privacy</category>
            <category>self-hosted</category>
            <category>podman</category>
            <category>langfuse</category>
            <category>milvus</category>
        </item>
    </channel>
</rss>