<?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: Ivan Hopkins</title>
    <description>The latest articles on DEV Community by Ivan Hopkins (@ihopkins).</description>
    <link>https://dev.to/ihopkins</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%2F3611436%2Fc727f919-b55d-4f72-bd63-135436710234.jpg</url>
      <title>DEV Community: Ivan Hopkins</title>
      <link>https://dev.to/ihopkins</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ihopkins"/>
    <language>en</language>
    <item>
      <title>The LLM Portability Drill: Redeploy an Open Model on a Second GPU Cloud</title>
      <dc:creator>Ivan Hopkins</dc:creator>
      <pubDate>Tue, 29 Sep 2026 19:26:22 +0000</pubDate>
      <link>https://dev.to/ihopkins/the-llm-portability-drill-redeploy-an-open-model-on-a-second-gpu-cloud-439g</link>
      <guid>https://dev.to/ihopkins/the-llm-portability-drill-redeploy-an-open-model-on-a-second-gpu-cloud-439g</guid>
      <description>&lt;p&gt;Access to open weights gives a team the right to operate a model in its own environment. I test portability by asking whether the team can reconstruct the complete service after the host, runtime, or provider changes.&lt;/p&gt;

&lt;p&gt;During an urgent move, a repository may point to a newer commit, a container tag may have changed, the tokenizer may no longer match, or the serving engine may interpret tool calls differently. The weights remain available. The production service still cannot be recreated with confidence.&lt;/p&gt;

&lt;p&gt;I use a portability drill to find that hidden state while the original deployment remains available. The drill asks whether another environment can reconstruct the same release from recorded artifacts and pass the same application checks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Define the three levels of portability
&lt;/h2&gt;

&lt;p&gt;I separate portability into three levels because each one fails differently.&lt;/p&gt;

&lt;h3&gt;
  
  
  Artifact portability
&lt;/h3&gt;

&lt;p&gt;I start with the bytes. Every required artifact must be retrievable and verifiable: the model revision, weight files, tokenizer, processor, chat template, adapters, licenses, container image, and configuration. Hugging Face supports downloading a repository at a &lt;a href="https://huggingface.co/docs/huggingface_hub/guides/download" rel="noopener noreferrer"&gt;full commit hash&lt;/a&gt;, which provides a stronger reference than a mutable &lt;code&gt;main&lt;/code&gt; branch.&lt;/p&gt;

&lt;h3&gt;
  
  
  Behavioral portability
&lt;/h3&gt;

&lt;p&gt;Next comes behavior. The reconstructed endpoint must pass the same application-specific tests within defined tolerances. Golden cases should cover normal prompts, edge cases, structured output, tool calls, refusal behavior, and any model-specific reasoning controls. Hugging Face explains that chat models expect particular &lt;a href="https://huggingface.co/docs/transformers/chat_templating" rel="noopener noreferrer"&gt;control tokens and chat templates&lt;/a&gt;; a template mismatch can materially change behavior even when the weights match.&lt;/p&gt;

&lt;h3&gt;
  
  
  Operational portability
&lt;/h3&gt;

&lt;p&gt;Operational portability covers the service around the model. I want a clean environment to expose the expected API contract, pass readiness checks, load secrets through the approved mechanism, emit logs and metrics, and support the documented rollback procedure. These checks keep the drill focused on deployability and service readiness.&lt;/p&gt;

&lt;h2&gt;
  
  
  Freeze a complete LLM release
&lt;/h2&gt;

&lt;p&gt;I keep a small release manifest in source control. This local engineering artifact remains independent of provider APIs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;release&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;support-model/2026-09-02&lt;/span&gt;
&lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;repo&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;org/model-name&lt;/span&gt;
  &lt;span class="na"&gt;revision&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;full-commit-hash&amp;gt;&lt;/span&gt;
  &lt;span class="na"&gt;files_sha256&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;checksums.txt&lt;/span&gt;
  &lt;span class="na"&gt;chat_template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;templates/chat.jinja&lt;/span&gt;

&lt;span class="na"&gt;runtime&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;registry/llm-server@sha256:&amp;lt;digest&amp;gt;&lt;/span&gt;
  &lt;span class="na"&gt;engine_version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;pinned-version&amp;gt;&lt;/span&gt;
  &lt;span class="na"&gt;launch_args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;config/serve.args&lt;/span&gt;

&lt;span class="na"&gt;contract&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;endpoint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/v1/chat/completions&lt;/span&gt;
  &lt;span class="na"&gt;tool_schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;tests/tool-schema.json&lt;/span&gt;
  &lt;span class="na"&gt;golden_set&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;tests/portability.jsonl&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Image tags can move, so I pin the container by digest. Docker's &lt;a href="https://docs.docker.com/build/building/best-practices/" rel="noopener noreferrer"&gt;build guidance&lt;/a&gt; recommends digest pinning when teams need the same image version and an auditable update path. The release also needs a deliberate patch process because an immutable image will not receive security fixes automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run the drill on a second environment
&lt;/h2&gt;

&lt;p&gt;Use a clean account or project on another GPU provider. Hidden state from the first environment should have no path into the exercise.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Provision a supported GPU environment and attach only documented storage and network dependencies.&lt;/li&gt;
&lt;li&gt;Pull the container by digest and download the model at the pinned commit.&lt;/li&gt;
&lt;li&gt;Verify checksums before startup.&lt;/li&gt;
&lt;li&gt;Launch from the recorded arguments, with secrets supplied through the approved external mechanism.&lt;/li&gt;
&lt;li&gt;Run artifact checks, the behavioral golden set, API contract tests, readiness checks, and rollback.&lt;/li&gt;
&lt;li&gt;Record every manual intervention, undocumented dependency, and provider-specific assumption.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;An OpenAI-compatible endpoint can reduce client changes. Route compatibility does not standardize every behavior. For example, SGLang documents model-specific reasoning parsers and chat-template parameters alongside its &lt;a href="https://docs.sglang.io/docs/basic_usage/openai_api_completions" rel="noopener noreferrer"&gt;OpenAI-compatible APIs&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use tolerances instead of chasing identical text
&lt;/h2&gt;

&lt;p&gt;I avoid using bitwise-identical text as the default target across different environments. vLLM states that it &lt;a href="https://docs.vllm.ai/en/latest/usage/reproducibility/" rel="noopener noreferrer"&gt;does not guarantee reproducibility by default&lt;/a&gt; and limits its reproducibility statement to the same hardware and vLLM version, even with the relevant controls enabled.&lt;/p&gt;

&lt;p&gt;I define behavioral acceptance around the application: valid JSON, correct tool selection, required facts, prohibited outputs, and rubric scores. Exact-output assertions remain useful for deterministic transformations where they apply.&lt;/p&gt;

&lt;h2&gt;
  
  
  Repeat the drill when the release changes
&lt;/h2&gt;

&lt;p&gt;Run the first drill while the original deployment is healthy. Repeat it after changing the checkpoint, tokenizer, serving engine, container, or API contract.&lt;/p&gt;

&lt;p&gt;Fluence's guide to the &lt;a href="https://fluence.ai/blog/best-open-source-llm-models/" rel="noopener noreferrer"&gt;best open-source and open-weight LLM models&lt;/a&gt; can help create an initial shortlist around workload, modality, license, and deployment fit. After selection, portability becomes a property of the complete release. Any undocumented file or manual fix exposed by the second environment belongs in the next manifest revision.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>cloud</category>
      <category>infrastructure</category>
      <category>llm</category>
    </item>
    <item>
      <title>Two Million Open AI Models, but Most of the Attention Goes to Just 200</title>
      <dc:creator>Ivan Hopkins</dc:creator>
      <pubDate>Thu, 20 Aug 2026 14:24:37 +0000</pubDate>
      <link>https://dev.to/ihopkins/two-million-open-ai-models-but-most-of-the-attention-goes-to-just-200-141j</link>
      <guid>https://dev.to/ihopkins/two-million-open-ai-models-but-most-of-the-attention-goes-to-just-200-141j</guid>
      <description>&lt;p&gt;Every time I open Hugging Face, the model ecosystem seems to have expanded again. There are new base models, fine-tunes, quantisations, adapters and experimental releases arriving constantly.&lt;/p&gt;

&lt;p&gt;At first glance, this looks like an incredibly diverse market. We have more models, more developers and more ways to run AI than ever before.&lt;/p&gt;

&lt;p&gt;But when I looked at where the downloads actually go, I found a much more concentrated ecosystem hiding beneath all that abundance.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Numbers Tell Two Different Stories
&lt;/h2&gt;

&lt;p&gt;Hugging Face reported that its platform grew to 13 million users, more than two million public models and over 500,000 public datasets in 2025.&lt;/p&gt;

&lt;p&gt;That is a huge amount of activity. It also shows that developers are doing far more than downloading foundation models. They are building specialised versions, adapters, benchmarks and applications around them.&lt;/p&gt;

&lt;p&gt;The distribution of attention, however, is extremely uneven.&lt;/p&gt;

&lt;p&gt;Approximately half of the models on Hugging Face have received fewer than 200 downloads. Meanwhile, the 200 most-downloaded models—roughly 0.01% of the models available—account for 49.6% of all downloads.&lt;/p&gt;

&lt;p&gt;So we have millions of choices, but a surprisingly small group of models captures almost half the activity.&lt;/p&gt;

&lt;h2&gt;
  
  
  More Models Do Not Necessarily Mean More Choice
&lt;/h2&gt;

&lt;p&gt;I do not think this concentration is automatically bad.&lt;/p&gt;

&lt;p&gt;Developers tend to gather around models that work well, have clear documentation and are supported by popular inference tools. That creates useful network effects. Bugs are identified sooner, integrations improve and community knowledge becomes easier to find.&lt;/p&gt;

&lt;p&gt;The problem begins when we confuse repository count with meaningful choice.&lt;/p&gt;

&lt;p&gt;A model may technically be available but still be difficult to deploy because it lacks maintained serving templates, current dependencies or reliable quantisations. Another may perform well in a benchmark but have a restrictive licence. Some experimental fine-tunes may never receive another update.&lt;/p&gt;

&lt;p&gt;In other words, the usable ecosystem is much smaller than the visible catalogue.&lt;/p&gt;

&lt;h2&gt;
  
  
  Community Depth Is Becoming a Selection Metric
&lt;/h2&gt;

&lt;p&gt;When I evaluate an open or open-weight model, I no longer look only at its benchmark scores and parameter count. I also want to know what exists around it.&lt;/p&gt;

&lt;p&gt;I look for signals such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Recent maintenance and active issue resolution&lt;/li&gt;
&lt;li&gt;Compatibility with established inference frameworks&lt;/li&gt;
&lt;li&gt;Community-created quantisations and deployment guides&lt;/li&gt;
&lt;li&gt;Clear licensing and permitted commercial use&lt;/li&gt;
&lt;li&gt;Fine-tunes or adapters for relevant domains&lt;/li&gt;
&lt;li&gt;Evidence of adoption beyond the original developer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These signals do not prove that a model is production-ready. But they tell me whether I am selecting an isolated repository or joining an ecosystem that other developers are actively improving.&lt;/p&gt;

&lt;p&gt;That distinction matters when a model becomes part of a product rather than a weekend experiment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Popularity Is Useful, but It Can Also Mislead
&lt;/h2&gt;

&lt;p&gt;Download volume is one useful signal, not a final verdict.&lt;/p&gt;

&lt;p&gt;A highly specialised medical, legal or regional-language model may have modest downloads while still being extremely valuable to its intended users. Hugging Face itself describes open AI as a collection of overlapping sub-ecosystems rather than one uniform market.&lt;/p&gt;

&lt;p&gt;The opposite is also true. A widely downloaded model is not automatically the right choice for every workload. Popularity cannot tell me whether it meets my latency target, fits the GPUs available to me or behaves reliably with my application’s prompts.&lt;/p&gt;

&lt;p&gt;I normally begin with a manageable shortlist. A &lt;a href="https://www.fluence.network/blog/best-open-source-llm-models/" rel="noopener noreferrer"&gt;practical overview of leading open model families&lt;/a&gt; can help narrow the field, after which I compare the candidates using the workload they will actually handle.&lt;/p&gt;

&lt;p&gt;That process gives me something a general leaderboard cannot: evidence that the model works inside my system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open AI Has a Supply-Chain Question
&lt;/h2&gt;

&lt;p&gt;The concentration of downloads also creates a less obvious risk.&lt;/p&gt;

&lt;p&gt;Thousands of applications may depend on a relatively small number of base models, maintainers and supporting tools. If one licence changes, a repository becomes inactive or a critical component develops a vulnerability, the effects can spread well beyond the original project.&lt;/p&gt;

&lt;p&gt;That makes model selection resemble software supply-chain management.&lt;/p&gt;

&lt;p&gt;Teams need to understand where a model came from, which components it depends on, how actively it is maintained and whether they could migrate if necessary. Downloading the weights gives teams more control than relying exclusively on a closed API, but it does not eliminate dependency.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Shortage Is Confidence
&lt;/h2&gt;

&lt;p&gt;We do not have a shortage of models. We have a shortage of dependable ways to determine which ones deserve long-term trust.&lt;/p&gt;

&lt;p&gt;The next phase of the open AI ecosystem will not be defined only by how many models get published. It will depend on how well developers can evaluate, maintain, secure and deploy them.&lt;/p&gt;

&lt;p&gt;Two million models sounds like unlimited choice. In practice, the models that matter are the ones surrounded by enough evidence, tooling and community support to survive contact with production.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>machinelearning</category>
    </item>
  </channel>
</rss>
