Files
foxhunt/docs/archive/wave_d/reports/DEPLOYMENT_QUICK_START.md
jgrusewski 433af5c25d chore: Major codebase cleanup - remove deprecated files and organize structure
- Docker: Delete 23 deprecated Dockerfiles, fix CI/CD to use Dockerfile.foxhunt-build
- Config: Remove 36 .env files, keep 4 essential, delete config/environments/
- Docs: Archive 614 Wave D files to docs/archive/wave_d/, 95% reduction in root
- Scripts: Delete 56 deprecated scripts, keep 58 production-critical (49% reduction)
- Python: Organize 37 scripts into scripts/python/ subdirectories, delete ml/python/
- Build: Remove 1GB artifacts, delete old venvs, clean Python cache from git
- Migrations: Delete deprecated directory (4,432 lines), remove duplicate database/migrations/
- Infrastructure: Delete deployment/ (61 files), docs/scripts/ (8 files)

Total impact: ~2,500 files cleaned, 750MB+ space freed, zero production impact
All deleted scripts backed up to archives. runpod/ and tests/runpod/ preserved.
data_acquisition_service retained per user request.
2025-10-30 01:02:34 +01:00

10 KiB
Raw Blame History

Deployment Quick Start Guide

Last Updated: 2025-10-25 Status: READY FOR DEPLOYMENT Estimated Time: 30 minutes (local) + 1 hour (Runpod)


Prerequisites

All prerequisites met, ready to deploy:

  • RTX 3050 Ti 4GB (local) or Runpod GPU (V100/A4000 16GB)
  • CUDA 13.0 installed and verified
  • Docker installed and running
  • Runpod Network Volume (50GB) with binaries uploaded
  • All 1,324 FP32 tests passing (100%)
  • Zero compilation errors

🚀 Local Deployment (30 minutes)

Step 1: Build All Binaries (5 minutes)

# Clean build with all optimizations
cargo build --release -p ml --examples --features "cuda,mimalloc-allocator"

# Expected output:
# Finished `release` profile [optimized] target(s) in 5m 55s

Validate binaries:

ls -lh target/release/examples/train_*

# Expected:
# train_dqn                21MB  ✅
# train_mamba2_parquet     20MB  ✅
# train_ppo                21MB  ✅
# train_tft_parquet        21MB  ✅

Step 2: Validate Mimalloc Allocator (1 minute)

# Check TFT binary
./target/release/examples/train_tft_parquet --help 2>&1 | head -1

# Expected output:
# INFO train_tft_parquet: 🚀 Using mimalloc allocator for improved performance

Verify all binaries:

for binary in train_dqn train_ppo train_tft_parquet train_mamba2_parquet; do
    echo "Checking $binary..."
    ./target/release/examples/$binary --help 2>&1 | grep -i mimalloc
done

# Expected: "🚀 Using mimalloc allocator" for all 4 binaries

Step 3: Run Local Training Smoke Test (10 minutes)

TFT Training (primary model, 60% faster with cache optimization):

time cargo run -p ml --example train_tft_parquet --release --features cuda -- \
  --parquet-file test_data/ES_FUT_180d.parquet \
  --epochs 10 \
  --batch-size 16

# Expected:
# - Startup: "🚀 Using mimalloc allocator"
# - Training: ~2 min (60% faster than baseline 5 min)
# - GPU memory: ~525-550MB
# - Result: Model saved to checkpoints/

DQN Training (batched, 20-30× faster):

time cargo run -p ml --example train_dqn --release --features cuda -- \
  --epochs 1

# Expected:
# - Training: ~15-20 sec (vs. 7 min baseline)
# - GPU memory: ~6MB
# - Result: 8 train_step() calls (vs. 1000 in old implementation)

Step 4: Validate GPU Memory Usage (2 minutes)

# Monitor GPU memory during training
watch -n 1 nvidia-smi

# Expected usage:
# TFT:     ~525-550MB (525MB baseline + 25-50MB cache)
# MAMBA-2: ~164MB
# PPO:     ~145MB
# DQN:     ~6MB
# TOTAL:   ~840-865MB (21% of 4GB, 53% of 1.6GB available)

Step 5: Test Docker Build (Optional, 12 minutes)

Build optimized Docker image:

# Multi-stage build (75% size reduction)
docker build -f Dockerfile.runpod.optimized -t foxhunt:local-test .

# Expected:
# - Build time: ~8-10 min
# - Final size: ~2.5GB (vs. 8GB current)

Validate image:

# Check size
docker images | grep foxhunt

# Expected:
# foxhunt  local-test  2.5GB  (69% reduction vs. 8GB)

# Test GPU access
docker run --rm --gpus all foxhunt:local-test nvidia-smi

# Expected: GPU detected, CUDA 13.0

☁️ Runpod Deployment (1 hour)

Phase 1: Upload Binaries to Volume (15 minutes)

Option A: SSH Upload:

# SSH into Runpod volume pod
ssh root@<RUNPOD_POD_IP>

# Create directory structure
mkdir -p /runpod-volume/binaries /runpod-volume/test_data

# Upload binaries (from local machine)
scp target/release/examples/train_* root@<RUNPOD_POD_IP>:/runpod-volume/binaries/

# Upload test data
scp test_data/*.parquet root@<RUNPOD_POD_IP>:/runpod-volume/test_data/

Option B: Runpod Web UI Upload:

  1. Open Runpod console → My Pods
  2. Select volume pod → File Manager
  3. Navigate to /runpod-volume/binaries/
  4. Upload train_dqn, train_ppo, train_tft_parquet, train_mamba2_parquet
  5. Navigate to /runpod-volume/test_data/
  6. Upload ES_FUT_180d.parquet, NQ_FUT_180d.parquet, etc.

Verify uploads:

# SSH into volume pod
ls -lh /runpod-volume/binaries/
ls -lh /runpod-volume/test_data/

# Expected:
# binaries/: 4 files, ~80MB total
# test_data/: 9 files, ~30MB total

Phase 2: Push Docker Image (10 minutes)

# Tag optimized image
docker tag foxhunt:local-test jgrusewski/foxhunt:latest

# Push to Docker Hub (PRIVATE repository)
docker push jgrusewski/foxhunt:latest

# Expected:
# - Upload size: ~2.5GB (compressed)
# - Time: ~8-10 min (depends on bandwidth)

Verify on Docker Hub:

  1. Login to hub.docker.com
  2. Navigate to jgrusewski/foxhunt
  3. Confirm :latest tag shows 2.5GB size
  4. CRITICAL: Set repository to PRIVATE (not public)

Phase 3: Deploy Training Pod (5 minutes)

Runpod Console:

  1. Navigate to: Secure Cloud → Deploy
  2. Select GPU: Tesla V100-PCIE-16GB ($0.10/hr)
  3. Select Template: Custom (create new)

Template Configuration:

Container Image: jgrusewski/foxhunt:latest
Container Disk: 10 GB (minimal)
Volume Mount: /runpod-volume → <YOUR_VOLUME_ID>
Environment Variables:
  BINARY_NAME: train_tft_parquet
Docker Command:
  /runpod-volume/binaries/train_tft_parquet \
  --parquet-file /runpod-volume/test_data/ES_FUT_180d.parquet \
  --epochs 50 \
  --batch-size 32
Datacenter: EUR-IS-1 (matches volume location)

Deploy pod:

  • Click "Deploy"
  • Pod ID will be generated (e.g., pod-9wx83rmzeguvsm)
  • Wait for startup (~1-2 min with optimized image)

Phase 4: Monitor Training (30 minutes)

View pod logs:

# Via Runpod console
# Navigate to: My Pods → <POD_ID> → Logs

# Expected output:
INFO train_tft_parquet: 🚀 Using mimalloc allocator for improved performance
INFO train_tft_parquet: 🚀 Starting TFT Training with Parquet Data
INFO train_tft_parquet: 📊 Loading data from /runpod-volume/test_data/ES_FUT_180d.parquet
INFO train_tft_parquet: ✅ Loaded 43,200 samples (180 days × 240 bars/day)
INFO train_tft_parquet: 🎯 Training TFT with 225 features, batch_size=32
...
INFO train_tft_parquet: Epoch 1/50: loss=0.1234, Q-value=0.567, duration=2.1s
...
INFO train_tft_parquet: ✅ Training complete - model saved to /workspace/models/

Monitor GPU metrics:

# SSH into pod (if enabled)
ssh root@<POD_IP>

# Check GPU utilization
watch -n 1 nvidia-smi

# Expected:
# GPU: Tesla V100-PCIE-16GB (16GB VRAM)
# Memory Used: ~550MB (TFT with cache optimization)
# Utilization: 85-95% (batched training)

Training completion:

  • Expected time: ~2 min per epoch × 50 epochs = ~100 min total (1.67 hours)
  • Cost: 1.67 hours × $0.10/hr = $0.167 per training run
  • Pod auto-terminates after success (self-termination wrapper)

📊 Success Criteria

Local Deployment

  • All 4 binaries built successfully (<21MB each)
  • Mimalloc allocator active ("🚀 Using mimalloc" logs)
  • TFT training: ~2 min per 10 epochs (60% speedup)
  • DQN training: ~15-20 sec per epoch (20-30× speedup)
  • GPU memory: ~840-865MB total (fits on 4GB GPU)

Runpod Deployment

  • Binaries uploaded to /runpod-volume/binaries/ (80MB total)
  • Test data uploaded to /runpod-volume/test_data/ (30MB total)
  • Docker image pushed to hub.docker.com (2.5GB, PRIVATE)
  • Pod deployed in EUR-IS-1 datacenter (matches volume)
  • Training started within 1-2 min (optimized startup)
  • GPU utilization: 85-95% (batched training)
  • Training completed successfully (model saved)
  • Pod self-terminated after completion

🐛 Troubleshooting

Issue: Binary not found on Runpod

Symptom: bash: /runpod-volume/binaries/train_tft_parquet: No such file or directory

Fix:

# SSH into volume pod
ls -la /runpod-volume/binaries/

# If missing, re-upload binaries
scp target/release/examples/train_* root@<VOLUME_POD_IP>:/runpod-volume/binaries/

# Make executable
chmod +x /runpod-volume/binaries/*

Issue: Volume mount not working

Symptom: No such file or directory for /runpod-volume/

Fix:

  1. Check pod template → Volume Mount section
  2. Verify volume ID matches your actual volume
  3. Confirm datacenter matches volume location (EUR-IS-1)
  4. Restart pod if volume mount changed

Issue: GPU out of memory (OOM)

Symptom: CUDA error: out of memory during training

Fix (QAT only, FP32 should never OOM):

# Reduce batch size
--batch-size 16  # (vs. 32 default)

# Or enable QAT OOM recovery (automatic)
--use-qat \
--qat-min-batch-size 2  # Auto-retry with halved batch size

Issue: Training slower than expected

Symptom: TFT training taking >5 min per 10 epochs (vs. ~2 min expected)

Diagnosis:

# Check cache size (should be 2000)
grep "MAX_CACHE_ENTRIES" ml/src/tft/mod.rs

# Expected:
# pub const MAX_CACHE_ENTRIES: usize = 2000;

# Check mimalloc active
./target/release/examples/train_tft_parquet --help 2>&1 | grep mimalloc

# Expected:
# "🚀 Using mimalloc allocator"

Fix: Rebuild with correct features:

cargo build --release -p ml --examples --features "cuda,mimalloc-allocator"

📚 Next Steps

After Successful Local Deployment

  1. Validate all 4 models locally (DQN, PPO, TFT, MAMBA-2)
  2. Upload binaries to Runpod Network Volume
  3. Deploy first Runpod training pod (TFT smoke test)
  4. Validate training success and metrics

After Successful Runpod Deployment

  1. Run production training (50 epochs, all symbols)
  2. Benchmark actual speedup vs. estimates
  3. Monitor cost per training run
  4. Establish baseline metrics for model retraining

Production Rollout (Week 2)

  1. Deploy optimized Docker image (:latest tag)
  2. Run 5 production training runs (validate stability)
  3. Update deployment scripts with new image
  4. Decommission old 8GB image

  • FINAL_VALIDATION_SUMMARY.md - Full validation report (17 agents)
  • PRE_DEPLOYMENT_CHECKLIST.md - Go/no-go checklist
  • KNOWN_ISSUES.md - Blockers and workarounds
  • RUNPOD_DEPLOYMENT_CHECKLIST.md - Detailed deployment guide (27KB)
  • DOCKER_OPTIMIZATION_QUICK_REFERENCE.md - Docker optimization guide (4KB)

Conclusion

Status: READY FOR DEPLOYMENT

This quick start guide provides a streamlined path to deploy FP32 models locally and on Runpod GPU. Follow the steps sequentially for a successful deployment in ~90 minutes total (30 min local + 60 min Runpod).

Next: Review PRE_DEPLOYMENT_CHECKLIST.md for final go/no-go decision.


Last Updated: 2025-10-25 Author: Foxhunt Deployment Team Status: Production Ready