Skip to content

[v4] Improve download progress tracking (model cache registry and define which files will be loaded for pipelines)#1511

Merged
xenova merged 62 commits intomainfrom
v4-cache-handler
Mar 1, 2026
Merged

[v4] Improve download progress tracking (model cache registry and define which files will be loaded for pipelines)#1511
xenova merged 62 commits intomainfrom
v4-cache-handler

Conversation

@nico-martin
Copy link
Copy Markdown
Collaborator

@nico-martin nico-martin commented Feb 3, 2026

Improved Download Progress Tracking

Problem

Transformers.js couldn't reliably track total download progress because:

  • File lists weren't known before downloads started
  • File sizes were inconsistent (compressed vs uncompressed)
  • No cache awareness before initiating downloads

Solution

New Exported Functions

  • get_files(): Determines required files before downloading
  • get_model_files() / get_tokenizer_files() / get_processor_files(): Helper functions to identify files for each component
  • get_file_metadata(): Fetches file metadata using Range requests without downloading full content
    • Returns fromCache boolean to identify cached files
    • Ensures consistent uncompressed file sizes
  • is_cached(): Checks if all files from a model are already in cache

Enhanced Progress Tracking

  • readResponse() with expectedSize: Falls back to metadata when content-length header is missing
  • total_progress callback: Provides aggregate progress across all files

Review

One thing I am not super confident is the get_model_files function. I tried to test it with different model architectures, but maybe I missed some that load files that are not in that function. @xenova, could you smoke-test some models and write mie the models that fail?

Easiest way to do that is:

import {
  get_files,
  pipeline,
} from "@huggingface/transformers";

const expectedFiles = await get_files(
  "onnx-community/gemma-3-270m-it-ONNX",
  {
    dtype: "fp32",
    device: "webgpu",
  }
);
const loadedFiles = new Set();
const pipe = await pipeline(
  "text-generation",
  "onnx-community/gemma-3-270m-it-ONNX",
  {
    dtype: "fp32",
    device: "webgpu",
    progress_callback: (e) => {
      if (e.file) loadedFiles.add(e.file);
    },
  }
);

console.log(
  "SAME FILES:",
  expectedFiles.sort().join(",") === Array.from(loadedFiles).sort().join(",")
);

Closes #1345

@nico-martin nico-martin requested a review from xenova February 3, 2026 15:24
@HuggingFaceDocBuilderDev
Copy link
Copy Markdown

The docs for this PR live here. All of your documentation changes will be reflected on that endpoint. The docs are available until 30 days after the last update.

Copy link
Copy Markdown
Collaborator

@xenova xenova left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Very exciting PR! 🙌 Just a quick review from scanning the PR briefly.

Comment thread packages/transformers/src/transformers.js Outdated
Comment thread packages/transformers/src/utils/dtypes.js
Comment thread packages/transformers/src/utils/core.js Outdated
Comment thread packages/transformers/src/utils/hub/is_cached.js Outdated
Comment thread packages/transformers/src/utils/cache/get_model_files.js
Comment thread packages/transformers/src/utils/cache/get_model_files.js Outdated
Comment thread packages/transformers/src/utils/model_registry/get_model_files.js
@xenova xenova changed the base branch from v4 to main February 13, 2026 17:03
@xenova xenova self-requested a review February 18, 2026 17:08
Copy link
Copy Markdown
Collaborator

@xenova xenova left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Solid progress! Thanks 🔥

Comment thread packages/transformers/docs/source/_toctree.yml Outdated
Comment thread packages/transformers/src/utils/model_registry/clear_cache.js
Comment thread packages/transformers/src/utils/cache/clear_cache.js Outdated
Comment thread packages/transformers/src/utils/cache/clear_cache.js Outdated
Comment thread packages/transformers/src/utils/cache/clear_cache.js Outdated
Comment thread packages/transformers/src/utils/cache/ModelRegistry.js Outdated
Comment thread packages/transformers/src/utils/hub/files.js
Comment thread packages/transformers/src/utils/core.js Outdated
Comment thread packages/transformers/src/utils/hub.js Outdated
Comment thread packages/transformers/src/pipelines/index.js
@xenova xenova changed the title V4 cache handler [v4] Improve download progress tracking (model cache registry and define which files will be loaded for pipelines) Feb 19, 2026
Comment thread packages/transformers/src/models/session.js Outdated
Copy link
Copy Markdown
Collaborator

@xenova xenova left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Huge PR! 🔥 Thanks so much @nico-martin.

@xenova xenova merged commit 4811a61 into main Mar 1, 2026
4 checks passed
@xenova xenova deleted the v4-cache-handler branch March 1, 2026 00:27
AaronRohrbacher pushed a commit to AaronRohrbacher/transformers.js that referenced this pull request Apr 16, 2026
* added progress_total progress callback status info

* added get_file_metadata helper

* some clean up

* improved get_file_metadata and get_files

* added functions to main export

* removed dynamic import

* restructuring

* refactored the pipeline tasks so I can have a get_pipeline_files function that does not check for tokenizer files or processor files if the task does not use them

* updated doc

* Update packages/transformers/src/utils/core.js

Co-authored-by: Joshua Lochner <admin@xenova.com>

* added is_pipeline_cached and improved return object

* fixes after review

* added ModelRegistry to doc

* added clear_cache and clear_pipeline_cache

* Update packages/transformers/src/utils/cache/clear_cache.js

Co-authored-by: Joshua Lochner <admin@xenova.com>

* small doc fix

* changed delete logic for cache

* fixed examples in cache utilitiy files

* fixed examples

* renamed type

* refactoring get_file_metadata

* moved src/utils/pipeline-tasks.js to src/pipelines/index.js

* fixed doc builder

* fixed doc builder

* created shared getFetchHeaders function

* added case for DecoderOnlyWithoutHead and DecoderOnly

* improved console.warn

* changed to modelType = MODEL_TYPES.EncoderOnly if not foundInMapping

* removed full download from get_file_metadata

* Remove duplicate module tag (already set in ModelRegistry.js)

* Remove test file

* pnpm format

* Cleanup

* use config from_pretrained logic for ensuring config is of correct type

* Reorder file acquisition

* Add example JSDoc to file header

* Add ModelRegistry tests

* FIXME: skip cache clearing tests

breaks simultaneous loading

* Formatting

* Unify model-loader.js, get_model_files.js, and session.js

* console.warn to logger.warn

* Only resolve dtype once in session.js

* Use map + Promise.all

* map -> forEach

* Use env.fetch instead of global fetch

* Add comment to clear_cache for clarity

* Add model_file_name support in cache operations

* Update cache tests

* Fix TOCTOU race condition

* Remove dead code

* cleanup

* Cleanup pipeline import/exports

* renamed folder cache to model_registry

* changed doc title

* fix for unit tests on node 20

* standardize module name

---------

Co-authored-by: Joshua Lochner <admin@xenova.com>
Co-authored-by: Joshua Lochner <26504141+xenova@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add a supported API

4 participants