198 lines
5.9 KiB
Markdown
198 lines
5.9 KiB
Markdown
# ModelRegistry Reference
|
|
|
|
In Transformers.js v4, `ModelRegistry` provides a preflight API for model assets. You can inspect required files, estimate total download size, check cache state, and clear cached artifacts before calling `pipeline()`.
|
|
|
|
This is useful for production UX where you want to:
|
|
- show accurate download estimates before loading,
|
|
- support offline-first flows,
|
|
- avoid surprise bandwidth usage,
|
|
- and keep cache management explicit.
|
|
|
|
## Table of Contents
|
|
|
|
1. [Overview](#overview)
|
|
2. [Core APIs](#core-apis)
|
|
3. [Recommended Workflow](#recommended-workflow)
|
|
4. [Examples](#examples)
|
|
5. [Best Practices](#best-practices)
|
|
|
|
## Overview
|
|
|
|
```javascript
|
|
import { ModelRegistry } from '@huggingface/transformers';
|
|
```
|
|
|
|
`ModelRegistry` works with the same task/model/options you pass to `pipeline()`.
|
|
|
|
Typical tuple:
|
|
|
|
```javascript
|
|
const task = 'feature-extraction';
|
|
const modelId = 'onnx-community/all-MiniLM-L6-v2-ONNX';
|
|
const modelOptions = { dtype: 'fp32' };
|
|
```
|
|
|
|
## Core APIs
|
|
|
|
### `get_pipeline_files(task, modelId, modelOptions)`
|
|
|
|
Returns all files needed to initialize that pipeline configuration.
|
|
|
|
```javascript
|
|
const files = await ModelRegistry.get_pipeline_files(task, modelId, modelOptions);
|
|
// Example: ['config.json', 'onnx/model.onnx', 'tokenizer.json', ...]
|
|
```
|
|
|
|
Use this to build preflight checks and download manifests.
|
|
|
|
### `get_file_metadata(modelId, file)`
|
|
|
|
Returns metadata for a single file (including size when available).
|
|
|
|
```javascript
|
|
const metadata = await ModelRegistry.get_file_metadata(modelId, 'onnx/model.onnx');
|
|
console.log(metadata);
|
|
```
|
|
|
|
Use this to compute total transfer size and identify large artifacts.
|
|
|
|
### `is_pipeline_cached(task, modelId, modelOptions)`
|
|
|
|
Checks whether required files are already available in cache.
|
|
|
|
```javascript
|
|
const cached = await ModelRegistry.is_pipeline_cached(task, modelId, modelOptions);
|
|
console.log(cached ? 'Ready offline' : 'Needs download');
|
|
```
|
|
|
|
Use this to gate offline mode and skip unnecessary preload steps.
|
|
|
|
### `clear_pipeline_cache(task, modelId, modelOptions)`
|
|
|
|
Clears cached assets for a specific pipeline tuple.
|
|
|
|
```javascript
|
|
await ModelRegistry.clear_pipeline_cache(task, modelId, modelOptions);
|
|
```
|
|
|
|
Use this for cache invalidation, testing, or space reclamation.
|
|
|
|
### `get_available_dtypes(modelId)`
|
|
|
|
Returns precision/quantization formats available for the model.
|
|
|
|
```javascript
|
|
const dtypes = await ModelRegistry.get_available_dtypes(modelId);
|
|
// Example: ['fp32', 'fp16', 'q4', 'q4f16']
|
|
```
|
|
|
|
Use this to choose the best runtime profile (quality vs. speed vs. memory).
|
|
|
|
## Recommended Workflow
|
|
|
|
For robust loading UX:
|
|
|
|
1. Resolve the exact task/model/options tuple.
|
|
2. Call `get_pipeline_files(...)`.
|
|
3. Fetch metadata per file and compute total size.
|
|
4. Call `is_pipeline_cached(...)`.
|
|
5. If not cached, show user-facing size/progress expectations.
|
|
6. Load via `pipeline(...)` and use `progress_total` in `progress_callback`.
|
|
|
|
```javascript
|
|
import { ModelRegistry, pipeline } from '@huggingface/transformers';
|
|
|
|
const task = 'feature-extraction';
|
|
const modelId = 'onnx-community/all-MiniLM-L6-v2-ONNX';
|
|
const modelOptions = { dtype: 'q8' };
|
|
|
|
const files = await ModelRegistry.get_pipeline_files(task, modelId, modelOptions);
|
|
|
|
const metadata = await Promise.all(
|
|
files.map((file) => ModelRegistry.get_file_metadata(modelId, file))
|
|
);
|
|
|
|
const totalBytes = metadata.reduce((sum, item) => sum + (item?.size ?? 0), 0);
|
|
const totalMB = (totalBytes / 1024 / 1024).toFixed(2);
|
|
|
|
const cached = await ModelRegistry.is_pipeline_cached(task, modelId, modelOptions);
|
|
console.log({ fileCount: files.length, totalMB, cached });
|
|
|
|
const pipe = await pipeline(task, modelId, {
|
|
...modelOptions,
|
|
progress_callback: (info) => {
|
|
if (info.status === 'progress_total') {
|
|
console.log(`Loading: ${info.progress.toFixed(1)}%`);
|
|
}
|
|
},
|
|
});
|
|
|
|
await pipe.dispose();
|
|
```
|
|
|
|
## Examples
|
|
|
|
### Example 1: Offer dtype choice dynamically
|
|
|
|
```javascript
|
|
import { ModelRegistry, pipeline } from '@huggingface/transformers';
|
|
|
|
const task = 'text-generation';
|
|
const modelId = 'onnx-community/Qwen2.5-0.5B-Instruct';
|
|
|
|
const dtypes = await ModelRegistry.get_available_dtypes(modelId);
|
|
const preferred = dtypes.includes('q4') ? 'q4' : dtypes[0] ?? 'fp32';
|
|
|
|
const generator = await pipeline(task, modelId, { dtype: preferred });
|
|
// ... inference
|
|
await generator.dispose();
|
|
```
|
|
|
|
### Example 2: Only clear one pipeline cache entry
|
|
|
|
```javascript
|
|
import { ModelRegistry } from '@huggingface/transformers';
|
|
|
|
await ModelRegistry.clear_pipeline_cache(
|
|
'feature-extraction',
|
|
'onnx-community/all-MiniLM-L6-v2-ONNX',
|
|
{ dtype: 'fp32' }
|
|
);
|
|
```
|
|
|
|
This avoids wiping unrelated model caches.
|
|
|
|
### Example 3: Offline gate
|
|
|
|
```javascript
|
|
import { ModelRegistry, env, pipeline } from '@huggingface/transformers';
|
|
|
|
const task = 'feature-extraction';
|
|
const modelId = 'onnx-community/all-MiniLM-L6-v2-ONNX';
|
|
const modelOptions = { dtype: 'q8' };
|
|
|
|
const cached = await ModelRegistry.is_pipeline_cached(task, modelId, modelOptions);
|
|
|
|
if (!cached) {
|
|
throw new Error('Model not cached yet. Connect once to download assets.');
|
|
}
|
|
|
|
env.allowRemoteModels = false;
|
|
const pipe = await pipeline(task, modelId, { ...modelOptions, local_files_only: true });
|
|
```
|
|
|
|
## Best Practices
|
|
|
|
1. Use `ModelRegistry` before `pipeline()` when you need predictable download UX.
|
|
2. Cache decisions should be per task/model/options tuple (dtype and revision matter).
|
|
3. Use `progress_total` for user-facing progress bars; keep per-file progress optional.
|
|
4. Prefer selective invalidation with `clear_pipeline_cache(...)` over broad cache deletion.
|
|
5. In offline mode, combine `is_pipeline_cached(...)` with `local_files_only: true` and `env.allowRemoteModels = false`.
|
|
|
|
## Related Documentation
|
|
|
|
- [Pipeline Options](./PIPELINE_OPTIONS.md) - `pipeline()` options and progress callback
|
|
- [Configuration Reference](./CONFIGURATION.md) - `env` settings for local/remote loading
|
|
- [Caching Reference](./CACHE.md) - Browser, filesystem, and custom cache behavior
|
|
- [Main Skill Guide](../SKILL.md) - Practical usage patterns
|