brainy/brainy-models-package/README.md
David Snelling 563b983fcc **feat(models): add scripts for model compression, bundling, and optimization**
- Added new scripts under `brainy-models-package/scripts`:
  - **`compress-models.js`**: Implements model compression with float16 and int8 precision to create optimized variants of Universal Sentence Encoder models.
  - **`download-full-models.js`**: Downloads the complete Universal Sentence Encoder model for offline usage.
  - **`download-model.js`**: Downloads reference files for TensorFlow Hub-based Universal Sentence Encoder.

- Introduced a demonstration script:
  - **`demo-optional-model-bundling.js`**: Highlights the solution of bundling models to eliminate network dependency, ensuring reliability and offline capability.

- Key Features:
  - **Compression**:
    - Reduced model size with float16 (balanced precision and size) and int8 (low-memory environments) options.
    - Generated compression summaries for quick insights into model variants and saved space.
  - **Offline Reliability**:
    - Bundled versions eliminate first-load delays, network dependencies, and failures.
    - Ensures rapid initialization in offline and memory-constrained scenarios.
  - **Dynamic Optimization**:
    - Tailored optimization profiles for various use cases: general, low-memory, and high-performance.
  - **Demonstration and Documentation**:
    - Comprehensive demo showcasing benefits of bundled models over online loading.
    - Examples for usage, testing, and integration with Brainy.

**Purpose**: Introduce essential scripts and tools to enable efficient, offline-ready model usage, streamlining the embedding workflow while ensuring reliability in production and resource-constrained environments.
2025-08-01 15:35:08 -07:00

366 lines
8 KiB
Markdown

# @soulcraft/brainy-models
Pre-bundled TensorFlow models for maximum reliability with Brainy vector database.
## Overview
This package provides offline access to the Universal Sentence Encoder model, eliminating network dependencies and ensuring consistent performance. It's designed as an optional companion to the main `@soulcraft/brainy` package for applications requiring maximum reliability.
## Features
- 🔒 **Maximum Reliability**: Fully offline model loading with zero network dependencies
- 📦 **Pre-bundled Models**: Complete Universal Sentence Encoder model (~25MB) included
- 🗜️ **Model Compression**: Multiple optimized variants (float16, int8) for different use cases
-**Performance Optimized**: Use case-specific optimizations for memory and speed
- 🛠️ **Easy Integration**: Drop-in replacement for online model loading
- 📊 **Comprehensive Metrics**: Detailed model information and performance statistics
## Installation
```bash
npm install @soulcraft/brainy-models
```
### Prerequisites
- Node.js >= 18.0.0
- `@soulcraft/brainy` >= 0.33.0
## Quick Start
### Basic Usage
```typescript
import { BundledUniversalSentenceEncoder } from '@soulcraft/brainy-models'
// Create encoder instance
const encoder = new BundledUniversalSentenceEncoder({
verbose: true,
preferCompressed: false
})
// Load the bundled model
await encoder.load()
// Generate embeddings
const texts = ['Hello world', 'How are you?', 'Machine learning is amazing']
const embeddings = await encoder.embedToArrays(texts)
console.log(`Generated ${embeddings.length} embeddings of ${embeddings[0].length} dimensions`)
// Clean up
encoder.dispose()
```
### Integration with Brainy
```typescript
import Brainy from '@soulcraft/brainy'
import { BundledUniversalSentenceEncoder } from '@soulcraft/brainy-models'
// Create bundled encoder
const bundledEncoder = new BundledUniversalSentenceEncoder({ verbose: true })
await bundledEncoder.load()
// Use with Brainy (custom integration)
const brainy = new Brainy({
// Configure Brainy to use the bundled encoder
customEmbedding: async (texts) => {
return await bundledEncoder.embedToArrays(texts)
}
})
```
### Using Compressed Models
```typescript
import { BundledUniversalSentenceEncoder } from '@soulcraft/brainy-models'
// Use compressed model for memory-constrained environments
const encoder = new BundledUniversalSentenceEncoder({
preferCompressed: true,
verbose: true
})
await encoder.load()
// The encoder will automatically use the most appropriate compressed variant
const embeddings = await encoder.embedToArrays(['Sample text'])
```
## API Reference
### BundledUniversalSentenceEncoder
Main class for loading and using bundled models.
#### Constructor
```typescript
new BundledUniversalSentenceEncoder(options)
```
**Options:**
- `verbose?: boolean` - Enable detailed logging (default: false)
- `preferCompressed?: boolean` - Prefer compressed model variants (default: false)
#### Methods
##### `load(): Promise<void>`
Load the bundled model from local files.
```typescript
await encoder.load()
```
##### `embed(texts: string[]): Promise<tf.Tensor2D>`
Generate embeddings as TensorFlow tensors.
```typescript
const embeddings = await encoder.embed(['Hello world'])
// Remember to dispose of tensors when done
embeddings.dispose()
```
##### `embedToArrays(texts: string[]): Promise<number[][]>`
Generate embeddings as JavaScript arrays (automatically disposes tensors).
```typescript
const embeddings = await encoder.embedToArrays(['Hello world'])
console.log(embeddings[0].length) // 512
```
##### `getMetadata(): ModelMetadata | null`
Get model metadata information.
```typescript
const metadata = encoder.getMetadata()
console.log(metadata?.dimensions) // 512
```
##### `isLoaded(): boolean`
Check if the model is loaded.
```typescript
if (encoder.isLoaded()) {
// Model is ready to use
}
```
##### `getModelInfo(): { inputShape: number[], outputShape: number[] } | null`
Get model input/output shape information.
```typescript
const info = encoder.getModelInfo()
console.log(info?.outputShape) // [-1, 512]
```
##### `dispose(): void`
Clean up model resources.
```typescript
encoder.dispose()
```
### ModelCompressor
Utility class for model compression and optimization.
#### Static Methods
##### `quantizeModel(modelPath: string, outputPath: string, options?): Promise<void>`
Compress a model using quantization.
```typescript
import { ModelCompressor } from '@soulcraft/brainy-models'
await ModelCompressor.quantizeModel(
'/path/to/model.json',
'/path/to/compressed/model.json',
{ dtype: 'int8' }
)
```
##### `getModelSize(modelPath: string): Promise<ModelSizeInfo>`
Get detailed model size information.
```typescript
const sizeInfo = await ModelCompressor.getModelSize('/path/to/model.json')
console.log(`Total size: ${sizeInfo.totalSize} bytes`)
```
### Utility Functions
#### `utils.checkModelsAvailable(): boolean`
Check if bundled models are available.
```typescript
import { utils } from '@soulcraft/brainy-models'
if (utils.checkModelsAvailable()) {
console.log('Models are ready to use')
}
```
#### `utils.listAvailableModels(): string[]`
List available bundled models.
```typescript
const models = utils.listAvailableModels()
console.log('Available models:', models)
```
## Model Variants
The package includes multiple model variants optimized for different use cases:
### Original (Float32)
- **Size**: ~25MB
- **Use case**: Maximum accuracy
- **Memory**: High
- **Speed**: Fast
### Float16 Compressed
- **Size**: ~12-15MB
- **Use case**: Balanced performance
- **Memory**: Medium
- **Speed**: Fast
### Int8 Quantized
- **Size**: ~6-8MB
- **Use case**: Memory-constrained environments
- **Memory**: Low
- **Speed**: Medium
## Scripts
The package includes several utility scripts:
### Download Models
Download the complete Universal Sentence Encoder model:
```bash
npm run download-models
```
### Compress Models
Create optimized model variants:
```bash
npm run compress-models
```
### Test Models
Verify model functionality:
```bash
npm test
```
## Development
### Building the Package
```bash
npm run build
```
### Running Tests
```bash
npm test
```
### Creating a Release
```bash
npm run pack
```
## Comparison with Online Loading
| Feature | Online Loading | Bundled Models |
|---------|----------------|----------------|
| **Reliability** | Network dependent | 100% offline |
| **First load time** | 30-60 seconds | < 1 second |
| **Subsequent loads** | Cached (~1 second) | < 1 second |
| **Package size** | ~3KB | ~25MB |
| **Network required** | Yes (first time) | No |
| **Offline support** | Limited | Complete |
## Use Cases
### When to Use Bundled Models
- Production applications requiring maximum reliability
- Offline or air-gapped environments
- Applications with strict SLA requirements
- Edge computing and IoT devices
- Development environments with unreliable internet
### When to Use Online Loading
- Development and prototyping
- Applications where package size matters
- Environments with reliable internet connectivity
- Applications that rarely use embeddings
## Troubleshooting
### Model Not Found Error
```
Error: Bundled model not found. Please run "npm run download-models"
```
**Solution**: Run the download script to fetch the model files:
```bash
cd node_modules/@soulcraft/brainy-models
npm run download-models
```
### Memory Issues
If you encounter memory issues, try using compressed models:
```typescript
const encoder = new BundledUniversalSentenceEncoder({
preferCompressed: true
})
```
### Performance Optimization
For optimal performance:
1. **Memory-constrained**: Use int8 quantized models
2. **Speed-critical**: Use original float32 models
3. **Balanced**: Use float16 compressed models
## License
MIT
## Contributing
Contributions are welcome! Please see the main [Brainy repository](https://github.com/soulcraft-research/brainy) for contribution guidelines.
## Support
For issues and questions:
- [GitHub Issues](https://github.com/soulcraft-research/brainy/issues)
- [Documentation](https://github.com/soulcraft-research/brainy)