<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Imitation Learning | Saikiran Juttu | Robotics Portfolio</title><link>https://juttu-s.github.io/saikiran_juttu.github.io/tags/imitation-learning/</link><atom:link href="https://juttu-s.github.io/saikiran_juttu.github.io/tags/imitation-learning/index.xml" rel="self" type="application/rss+xml"/><description>Imitation Learning</description><generator>Hugo Blox Builder (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Thu, 27 Aug 2026 00:00:00 +0000</lastBuildDate><image><url>https://juttu-s.github.io/saikiran_juttu.github.io/media/icon_hu7729264130191091259.png</url><title>Imitation Learning</title><link>https://juttu-s.github.io/saikiran_juttu.github.io/tags/imitation-learning/</link></image><item><title>Debugging OpenVLA on LIBERO — From 0% to 99% Success</title><link>https://juttu-s.github.io/saikiran_juttu.github.io/project/vla-libero-bench/</link><pubDate>Thu, 27 Aug 2026 00:00:00 +0000</pubDate><guid>https://juttu-s.github.io/saikiran_juttu.github.io/project/vla-libero-bench/</guid><description>&lt;p>A &lt;strong>vision-language-action (VLA)&lt;/strong> model that &amp;ldquo;loads successfully&amp;rdquo; and a VLA model that &lt;em>works&lt;/em> are two very different things. This project benchmarks &lt;strong>OpenVLA&lt;/strong> and &lt;strong>OpenVLA-OFT&lt;/strong> on the &lt;strong>LIBERO&lt;/strong> manipulation benchmark, and documents the gap between those two states.&lt;/p>
&lt;p>The headline result is not the final accuracy — it is that a naive but seemingly correct integration scored &lt;strong>0% across 250 episodes&lt;/strong>, and every point of recovery came from a specific, identifiable bug at the model–simulator boundary.&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Code:&lt;/strong> &lt;a href="https://github.com/juttu-s/vla-libero-bench" target="_blank" rel="noopener">github.com/juttu-s/vla-libero-bench&lt;/a>&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h2 id="results">Results&lt;/h2>
&lt;p>Each configuration was evaluated over &lt;strong>250 episodes&lt;/strong>, with 95% Wilson confidence intervals.&lt;/p>
&lt;h3 id="libero-spatial">LIBERO-Spatial&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Configuration&lt;/th>
&lt;th>Success Rate&lt;/th>
&lt;th>95% CI&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Base OpenVLA — naive integration&lt;/td>
&lt;td>&lt;strong>0.0%&lt;/strong>&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Base OpenVLA — after bug fixes&lt;/td>
&lt;td>&lt;strong>51.6%&lt;/strong> (129/250)&lt;/td>
&lt;td>45.4 – 57.7%&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>OpenVLA-OFT&lt;/td>
&lt;td>&lt;strong>99.2%&lt;/strong> (248/250)&lt;/td>
&lt;td>97.1 – 99.8%&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="libero-object">LIBERO-Object&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Configuration&lt;/th>
&lt;th>Success Rate&lt;/th>
&lt;th>95% CI&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Base model, zero-shot&lt;/td>
&lt;td>&lt;strong>0.0%&lt;/strong>&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Custom LoRA fine-tune&lt;/td>
&lt;td>collapsed&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Official fine-tuned checkpoint&lt;/td>
&lt;td>&lt;strong>88.8%&lt;/strong> (222/250)&lt;/td>
&lt;td>84.3 – 92.1%&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The official checkpoint result reproduces the published figure, which validates the harness itself — a necessary control before trusting any of the other numbers.&lt;/p>
&lt;hr>
&lt;h2 id="the-eight-bugs">The Eight Bugs&lt;/h2>
&lt;p>Each of these produced either silent failure or plausible-but-wrong behaviour. None raised an exception.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Attention mask mismatch&lt;/strong> in &lt;code>transformers&lt;/code> — the installed attention backend disagreed with the mask layout the checkpoint expected. Resolved by pinning the &lt;strong>SDPA&lt;/strong> implementation.&lt;/li>
&lt;li>&lt;strong>Image orientation&lt;/strong> — frames required a &lt;strong>180° rotation&lt;/strong>, not the vertical flip that the obvious reading of the simulator convention suggests. A vertical flip produces images that look approximately right, which is exactly why it survives inspection.&lt;/li>
&lt;li>&lt;strong>Inverted gripper convention&lt;/strong> — the sign of the gripper channel is opposite between the training data and the simulation environment, so the policy opened when it intended to close.&lt;/li>
&lt;li>&lt;strong>Center-crop semantics&lt;/strong> — the documented 90% crop is &lt;strong>90% of &lt;em>area&lt;/em>&lt;/strong>, not 90% per side. Getting this wrong shifts the effective field of view enough to break spatial grounding.&lt;/li>
&lt;li>&lt;strong>Gripper command duration&lt;/strong> — single-step gripper commands are insufficient; the actuator needs &lt;strong>temporal persistence with hysteresis&lt;/strong> to actually complete a grasp.&lt;/li>
&lt;li>&lt;strong>Dataset statistics merging&lt;/strong> — normalization statistics from fine-tuning were only partially merged into the checkpoint, so actions were de-normalized against the wrong distribution.&lt;/li>
&lt;li>&lt;strong>LIBERO package mapping&lt;/strong> — a missing &lt;code>__init__&lt;/code> file caused the installed package to expose empty module mappings, silently resolving task suites to nothing.&lt;/li>
&lt;li>&lt;strong>Headless reset hang&lt;/strong> — exception handling inside environment reset deadlocked under headless OpenGL rendering rather than surfacing an error.&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="method">Method&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Models:&lt;/strong> OpenVLA (7B, base and LoRA-fine-tuned) and OpenVLA-OFT&lt;/li>
&lt;li>&lt;strong>Benchmark:&lt;/strong> LIBERO-Spatial and LIBERO-Object, 250 episodes per configuration&lt;/li>
&lt;li>&lt;strong>Simulator:&lt;/strong> MuJoCo with configurable OpenGL / EGL rendering backends&lt;/li>
&lt;li>&lt;strong>Diagnostics:&lt;/strong> Per-bug isolation scripts under &lt;code>scripts/&lt;/code>, with debug frame captures in &lt;code>assets/&lt;/code> to visually confirm preprocessing at each stage&lt;/li>
&lt;li>&lt;strong>Reproducibility:&lt;/strong> Pinned Conda environments under &lt;code>env/&lt;/code>, results as raw episode records under &lt;code>results/&lt;/code>&lt;/li>
&lt;/ul>
&lt;h2 id="working-under-a-single-gpu-budget">Working Under a Single-GPU Budget&lt;/h2>
&lt;p>The whole study ran on &lt;strong>one 24 GB GPU&lt;/strong>, which shaped the design:&lt;/p>
&lt;ul>
&lt;li>LoRA fine-tuning at &lt;strong>batch size 2 with 8× gradient accumulation&lt;/strong> to fit in memory&lt;/li>
&lt;li>&lt;strong>SDPA&lt;/strong> attention instead of flash-attention, since no CUDA toolkit was available to build it&lt;/li>
&lt;li>The custom LoRA run &lt;strong>collapsed&lt;/strong> — reported rather than hidden, because it marks the real boundary of what this hardware budget supports&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="takeaway">Takeaway&lt;/h2>
&lt;p>The 51.6% → 99.2% jump from OpenVLA to OpenVLA-OFT is a genuine architectural result. The 0% → 51.6% jump is not a result at all — it is the cost of integration, and it is invisible in every paper that reports only the final number. Publishing the bug list is the useful contribution here.&lt;/p></description></item></channel></rss>