- 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.
6.3 KiB
6.3 KiB
RunPod Module Integration - Complete
Summary
Successfully integrated the foxhunt_runpod Python module into scripts/runpod_deploy.py with full backward compatibility and new features.
Changes Made
1. Created foxhunt_runpod Module
Location: /home/jgrusewski/Work/foxhunt/ml/python/foxhunt_runpod/
Files:
__init__.py- Module exportsclient.py- RunPodClient class (pod management)s3_monitor.py- S3LogMonitor class (log streaming)config.py- Configuration management (existing)errors.py- Error classes (existing)s3_client.py- Enhanced S3 operations (existing)
Key Classes:
RunPodClient
from foxhunt_runpod import RunPodClient
client = RunPodClient(
api_key="your_api_key",
volume_id="your_volume_id",
registry_auth_id="optional_auth_id"
)
# Query GPUs
gpus = client.get_available_gpus(min_vram=16)
# Deploy pod
pod_data = client.deploy_pod(
gpu_id=gpus[0]['id'],
image="jgrusewski/foxhunt:latest",
command="--epochs 100",
container_disk=50
)
# Manage pods
client.stop_pod(pod_id)
client.terminate_pod(pod_id)
status = client.get_pod_status(pod_id)
S3LogMonitor
from foxhunt_runpod import S3LogMonitor
monitor = S3LogMonitor(
bucket_name="your_bucket",
aws_access_key="your_key",
aws_secret_key="your_secret"
)
# Stream logs
monitor.stream_logs(
pod_id="pod_id",
interval=10,
timeout=7200,
completion_callback=monitor.check_completion
)
2. Refactored runpod_deploy.py
New Features:
-
Module Integration:
- Automatic import of
foxhunt_runpodmodule - Graceful fallback to legacy implementation if import fails
- .venv activation check with warning
- Automatic import of
-
S3 Log Monitoring (
--monitor):- Streams training logs from RunPod S3 in real-time
- Configurable polling interval (default: 10s)
- Configurable timeout (e.g.,
30m,2h)
-
Auto-Termination (
--auto-stop):- Automatically terminates pod when training completes
- Requires
--monitorflag - Detects completion patterns in logs
- Estimates final cost
-
Enhanced Error Messages:
- Better guidance for missing dependencies
- Clear warnings for misconfiguration
New Command-Line Flags:
--monitor # Enable S3 log monitoring
--auto-stop # Auto-terminate on completion
--timeout 120m # Monitoring timeout (30m, 2h, etc.)
--monitor-interval 10 # Polling interval in seconds
Example Usage:
# Basic deployment (unchanged)
python3 scripts/runpod_deploy.py
# With monitoring
python3 scripts/runpod_deploy.py --monitor --timeout 120m
# Full automation
python3 scripts/runpod_deploy.py \
--gpu-type "RTX A4000" \
--monitor \
--auto-stop \
--timeout 2h
3. Backward Compatibility
Preserved Functionality:
- All existing flags work unchanged
- Dry-run mode preserved
- GPU fallback logic preserved
- Legacy implementation available as fallback
Dual Implementation Strategy:
get_available_gpu_types()- Wrapper that uses new or legacydeploy_pod_rest_api()- Wrapper that uses new or legacy- Functions suffixed with
_new()use RunPodClient - Functions suffixed with
_legacy()use original requests code
4. Documentation
Created:
/home/jgrusewski/Work/foxhunt/ml/python/README.md- Module documentation/home/jgrusewski/Work/foxhunt/ml/python/requirements.txt- Dependencies/home/jgrusewski/Work/foxhunt/RUNPOD_MODULE_INTEGRATION.md- This file
Updated:
scripts/runpod_deploy.pydocstring - New features- Help text (--help) - New examples and requirements
Dependencies
Required (ml/python/requirements.txt):
boto3>=1.26.0 # S3 log monitoring
python-dotenv>=0.19.0 # .env.runpod file loading
requests>=2.28.0 # RunPod REST API
Optional (for enhanced features):
pydantic>=2.0.0- Config validation (existing module)rich>=13.0.0- Progress bars (existing module)
Environment Variables
Required (.env.runpod):
RUNPOD_API_KEY- RunPod API keyRUNPOD_VOLUME_ID- Network volume ID
Optional (for monitoring):
RUNPOD_S3_BUCKET- S3 bucket nameRUNPOD_S3_ACCESS_KEY- AWS access keyRUNPOD_S3_SECRET_KEY- AWS secret keyRUNPOD_CONTAINER_REGISTRY_AUTH_ID- Docker registry auth
Testing
Verified:
- Script help output works (--help)
- Module imports correctly
- Fallback to legacy works when module unavailable
- All flags accepted by argparse
- .venv warning displays correctly
Not Tested (requires RunPod credentials):
- Actual pod deployment
- S3 log monitoring
- Auto-termination
Architecture
scripts/runpod_deploy.py (CLI)
↓
├─ USE_NEW_MODULE = True
│ ↓
│ ml/python/foxhunt_runpod/
│ ├── client.py (RunPodClient)
│ └── s3_monitor.py (S3LogMonitor)
│
└─ USE_NEW_MODULE = False
↓
Legacy implementation (requests + GraphQL)
Next Steps
-
Test with real deployment:
python3 scripts/runpod_deploy.py --dry-run -
Install dependencies (if needed):
pip install -r ml/python/requirements.txt -
Configure S3 credentials (for monitoring):
- Add RUNPOD_S3_* variables to .env.runpod
-
Full automation test:
python3 scripts/runpod_deploy.py \ --gpu-type "RTX A4000" \ --monitor \ --auto-stop \ --timeout 30m
Benefits
- Cleaner Code: Moved complexity to reusable module
- Better Testing: Can unit test RunPodClient separately
- Enhanced Features: Log monitoring + auto-termination
- Backward Compatible: Existing workflows unchanged
- Maintainability: Single source of truth for RunPod API
- Extensibility: Easy to add new features to client
Files Modified
scripts/runpod_deploy.py(refactored, ~640 lines)
Files Created
ml/python/foxhunt_runpod/__init__.py(16 lines)ml/python/foxhunt_runpod/client.py(315 lines)ml/python/foxhunt_runpod/s3_monitor.py(179 lines, reused existing)ml/python/README.md(documentation)ml/python/requirements.txt(dependencies)RUNPOD_MODULE_INTEGRATION.md(this file)
Total Lines of Code
- Module: ~510 lines
- Script refactor: ~640 lines
- Documentation: ~200 lines
- Total: ~1,350 lines