brainy/docs/guides/offline-model-reliability.md
David Snelling 5e0c02e363 chore: Update repository references from soulcraft-research to soulcraftlabs
- Updated GitHub URLs to github.com/soulcraftlabs/brainy
- Updated git remote origin URL
- Updated all documentation references
2025-08-10 16:42:02 -07:00

316 lines
No EOL
8.5 KiB
Markdown

# Offline Model Reliability Guide
## Overview
Brainy provides automatic offline model reliability for production deployments through the optional `@soulcraft/brainy-models` package. This solves critical production issues where the Universal Sentence Encoder fails to load in Docker, Cloud Run, or other restricted environments due to network timeouts or blocked URLs.
## The Problem
In production environments, the Universal Sentence Encoder model (used for generating embeddings) must be downloaded from Google's servers at runtime. This creates several reliability issues:
- **Network Timeouts**: Cloud Run and similar platforms have strict request timeouts
- **Blocked URLs**: Corporate firewalls or security policies may block model downloads
- **Cold Start Delays**: Model downloads add significant latency to application startup
- **Intermittent Failures**: Network connectivity issues can cause random failures
## The Solution
Brainy automatically detects and uses pre-bundled models when available, providing:
- **100% Offline Reliability**: No network requests required for model loading
- **Zero Configuration**: Automatic detection with graceful fallback
- **Backward Compatibility**: Existing code continues to work unchanged
- **Production Ready**: Optimized for Docker, serverless, and cloud deployments
## Quick Start
### Development (Online Models)
```bash
npm install @soulcraft/brainy
```
### Production (Offline Reliability)
```bash
npm install @soulcraft/brainy @soulcraft/brainy-models
```
That's it! No code changes required. Brainy will automatically detect and use the bundled models when available.
## How It Works
Brainy uses a hierarchical loading strategy:
1. **Local Bundled Models** (if `@soulcraft/brainy-models` is installed)
- Zero network requests
- Instant loading
- Maximum reliability
2. **Online Model Download** (fallback)
- Downloads from TensorFlow Hub
- Caches locally after first download
- Standard behavior for development
3. **Error Handling** (if all fails)
- Clear error messages
- Helpful troubleshooting information
## Docker Example
### Dockerfile with Offline Models
```dockerfile
FROM node:18-slim
# Install your application
COPY . /app
WORKDIR /app
# Install dependencies including the offline model package
RUN npm install @soulcraft/brainy @soulcraft/brainy-models
# Build your application
RUN npm run build
# Start your application
CMD ["npm", "start"]
```
### Multi-stage Build for Optimization
```dockerfile
# Build stage
FROM node:18 as builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
# Install the offline model package
RUN npm install @soulcraft/brainy-models
COPY . .
RUN npm run build
# Production stage
FROM node:18-slim
WORKDIR /app
# Copy built application and dependencies
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./
CMD ["npm", "start"]
```
## Cloud Platform Deployment
### Google Cloud Run
```yaml
# cloudbuild.yaml
steps:
- name: 'gcr.io/cloud-builders/docker'
args: [
'build',
'--build-arg', 'NODE_ENV=production',
'-t', 'gcr.io/$PROJECT_ID/brainy-app',
'.'
]
- name: 'gcr.io/cloud-builders/docker'
args: ['push', 'gcr.io/$PROJECT_ID/brainy-app']
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
entrypoint: 'gcloud'
args: [
'run', 'deploy', 'brainy-app',
'--image', 'gcr.io/$PROJECT_ID/brainy-app',
'--platform', 'managed',
'--region', 'us-central1',
'--memory', '2Gi',
'--timeout', '300s'
]
```
### AWS Lambda with Container
```dockerfile
FROM public.ecr.aws/lambda/nodejs:18
# Copy function code and dependencies
COPY package*.json ${LAMBDA_TASK_ROOT}/
RUN npm ci --production
# Install offline model package for reliability
RUN npm install @soulcraft/brainy-models
COPY . ${LAMBDA_TASK_ROOT}
CMD [ "index.handler" ]
```
### Azure Container Instances
```yaml
# azure-container-instance.yaml
apiVersion: 2019-12-01
location: eastus
name: brainy-app
properties:
containers:
- name: brainy-app
properties:
image: myregistry.azurecr.io/brainy-app:latest
environmentVariables:
- name: NODE_ENV
value: production
resources:
requests:
cpu: 1.0
memoryInGb: 2.0
ports:
- port: 80
osType: Linux
restartPolicy: Always
```
## Verification
### Check If Offline Models Are Being Used
```javascript
import { BrainyData } from '@soulcraft/brainy'
const db = new BrainyData({
verbose: true // Enable logging to see which models are being used
})
// Look for this log message:
// "✅ Found @soulcraft/brainy-models package, using bundled model for maximum reliability"
```
### Test Offline Functionality
```javascript
// Temporarily block network access to test offline capability
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'
const db = new BrainyData({ verbose: true })
const vector = await db.embed('test text')
console.log('✅ Embedding generated offline:', vector.length, 'dimensions')
```
## Troubleshooting
### Common Issues
**Issue**: `Cannot find module '@soulcraft/brainy-models'`
```bash
# Solution: Install the offline model package
npm install @soulcraft/brainy-models
```
**Issue**: Models still downloading from internet
```bash
# Check if the package is properly installed
npm list @soulcraft/brainy-models
# Enable verbose logging to see the detection process
const db = new BrainyData({ verbose: true })
```
**Issue**: Out of memory errors in containers
```dockerfile
# Increase memory limit for containers
# Cloud Run: --memory 2Gi
# Docker: --memory=2g
# Lambda: MemorySize: 3008
```
### Performance Considerations
- **Package Size**: `@soulcraft/brainy-models` adds ~25MB to your deployment
- **Memory Usage**: Bundled models require ~200MB RAM when loaded
- **Loading Time**: Offline models load in ~100ms vs 5-30s for downloads
- **Storage**: Models are included in your application bundle
### Debugging Commands
```bash
# Check package installation
npm list @soulcraft/brainy-models
# Verify model files exist
ls node_modules/@soulcraft/brainy-models/models/
# Test model loading directly
node -e "import('@soulcraft/brainy-models').then(m => console.log('✅ Package loaded'))"
```
## Migration Guide
### From Development to Production
1. **Install the offline package**:
```bash
npm install @soulcraft/brainy-models
```
2. **Update your Dockerfile** (if using Docker):
```dockerfile
# Add this line to your package installation
RUN npm install @soulcraft/brainy-models
```
3. **No code changes required** - Brainy automatically detects and uses bundled models
4. **Test locally**:
```bash
# Temporarily disable internet to test offline functionality
npm test
```
### Gradual Rollout Strategy
1. **Test in staging** with bundled models
2. **Deploy to a small percentage** of production traffic
3. **Monitor performance metrics** (startup time, memory usage)
4. **Gradually increase** traffic to bundled model instances
5. **Complete migration** once verified
## Benefits Summary
| Aspect | Online Models | Offline Models |
|--------|---------------|----------------|
| **Reliability** | Depends on network | 100% reliable |
| **Startup Time** | 5-30 seconds | ~100ms |
| **Bundle Size** | Small | +25MB |
| **Memory Usage** | Lower | +200MB |
| **Network Required** | Yes | No |
| **Production Ready** | ⚠️ Risky | ✅ Recommended |
## Advanced Configuration
### Custom Model Loading Options
```javascript
import { createRobustModelLoader } from '@soulcraft/brainy/utils/robustModelLoader'
const loader = createRobustModelLoader({
preferLocalModel: true, // Default: true
maxRetries: 3, // Default: 3
timeout: 60000, // Default: 60 seconds
verbose: true, // Default: false
useExponentialBackoff: true // Default: true
})
```
### Environment-Specific Configuration
```javascript
// Load different models based on environment
const modelConfig = {
development: { preferLocalModel: false },
staging: { preferLocalModel: true },
production: { preferLocalModel: true, maxRetries: 1 }
}
const config = modelConfig[process.env.NODE_ENV] || modelConfig.production
```
## Support and Resources
- **GitHub Issues**: [Report deployment issues](https://github.com/soulcraftlabs/brainy/issues)
- **Documentation**: Complete API reference and examples
- **Community**: Join discussions about production deployments
For additional support with production deployments, please open an issue with your specific environment details.