Files
foxhunt/foxhunt-deploy/README.md
jgrusewski 3853988af7 feat(hyperopt): Complete DQN hyperopt analysis and PSO optimizer fix
- Fixed PSO budget calculation bug in ml/src/hyperopt/optimizer.rs
  - Root cause: Division by n_particles in sequential execution
  - Now correctly calculates max_iters = remaining_trials (no division)
  - Result: 50 trials complete instead of 23 (100% vs 46%)

- Added comprehensive DQN hyperopt results analysis
  - 39/50 trials analyzed across 2 RunPod deployments
  - Best hyperparameters identified: LR 4.89e-5 (ultra-low)
  - Created DQN_HYPEROPT_RESULTS_SUMMARY.md with expert validation

- GitLab CI/CD pipeline operational (48 lines fixed)
  - Fixed YAML syntax errors (unquoted colons)
  - All 7 jobs validated and working

- Warning cleanup complete (136 → 0 warnings)
  - Removed 143 lines dead code
  - Fixed visibility, unused imports, Debug traits

- Archived Wave D reports to docs/archive/
  - 8 early stopping reports moved
  - Root directory cleaned up

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-02 21:49:07 +01:00

421 lines
9.0 KiB
Markdown

# foxhunt-deploy
Rust CLI tool for managing Foxhunt ML training deployments on RunPod GPU infrastructure.
## Features
- 🐳 **Docker Management**: Build and push Docker images to registry
- ☁️ **RunPod Deployment**: Deploy training jobs to GPU pods with one command
- 📊 **S3 Log Monitoring**: Stream real-time logs from RunPod S3 buckets
- 🎨 **Colorized Output**: Easy-to-read log levels (INFO, WARN, ERROR)
- 🔍 **Filtering**: Regex-based log filtering
- ⚙️ **Configuration**: Flexible TOML-based configuration
## Installation
```bash
cd foxhunt-deploy
cargo build --release
# Copy to PATH
sudo cp target/release/foxhunt-deploy /usr/local/bin/
```
## Quick Start
### 1. Initialize Configuration
```bash
foxhunt-deploy init
```
This creates `~/.foxhunt/config.toml` with default settings.
### 2. Configure Credentials
Edit `~/.foxhunt/config.toml`:
```toml
[runpod]
api_key = "YOUR_RUNPOD_API_KEY"
default_gpu_type = "RTX A4000"
default_datacenter = "EUR-IS-1"
[docker]
registry = "jgrusewski"
image_name = "foxhunt"
tag = "latest"
[s3]
endpoint = "https://s3api-eur-is-1.runpod.io"
bucket = "se3zdnb5o4"
region = "us-east-1"
poll_interval_secs = 5
```
Set S3 credentials:
```bash
export AWS_ACCESS_KEY_ID="your_runpod_access_key"
export AWS_SECRET_ACCESS_KEY="your_runpod_secret_key"
```
### 3. Deploy a Training Job
```bash
foxhunt-deploy deploy \
--command "train_ppo --epochs 100" \
--gpu "RTX A4000" \
--datacenter "EUR-IS-1"
```
### 4. Monitor Logs
```bash
# List available log files
foxhunt-deploy monitor <pod_id> --list
# Show last 50 lines
foxhunt-deploy monitor <pod_id> --tail 50
# Follow logs in real-time
foxhunt-deploy monitor <pod_id> --follow
# Filter for specific patterns
foxhunt-deploy monitor <pod_id> --follow --filter "epoch|loss"
```
## Commands
### `init`
Initialize configuration file.
```bash
foxhunt-deploy init
```
Creates `~/.foxhunt/config.toml` with default settings.
### `build`
Build Docker image.
```bash
foxhunt-deploy build [OPTIONS]
Options:
--tag <TAG> Docker image tag [default: latest]
--push Push to registry after building
--dockerfile <PATH> Path to Dockerfile [default: Dockerfile.foxhunt-build]
```
**Example**:
```bash
# Build and push
foxhunt-deploy build --tag v1.0.0 --push
```
### `deploy`
Deploy training job to RunPod GPU.
```bash
foxhunt-deploy deploy [OPTIONS] --command <COMMAND>
Required:
--command <COMMAND> Training command to run
Options:
--name <NAME> Pod name (auto-generated if not provided)
--gpu <GPU> GPU type [default: RTX A4000]
--datacenter <DC> Datacenter [default: EUR-IS-1]
--tag <TAG> Docker image tag [default: latest]
--env <KEY=VALUE> Environment variables (can be repeated)
--volume-size <GB> Network volume size in GB [default: 100]
```
**Examples**:
```bash
# Deploy PPO training
foxhunt-deploy deploy \
--command "train_ppo --epochs 100" \
--gpu "RTX A4000"
# Deploy with custom env vars
foxhunt-deploy deploy \
--command "train_dqn --data /data/ES_FUT.parquet" \
--env "RUST_LOG=debug" \
--env "CUDA_VISIBLE_DEVICES=0"
# Deploy to specific datacenter
foxhunt-deploy deploy \
--command "train_tft --epochs 50" \
--datacenter "US-TX-1" \
--gpu "RTX 4090"
```
### `monitor`
Monitor pod logs from S3.
```bash
foxhunt-deploy monitor [OPTIONS] <POD_ID>
Arguments:
<POD_ID> Pod ID to monitor
Options:
-f, --follow Follow logs in real-time
-t, --tail <N> Number of recent lines to show
-l, --list List available log files
--filter <PATTERN> Filter logs by regex pattern
```
**Examples**:
```bash
# List available log files
foxhunt-deploy monitor dy2bn5ninzaxma --list
# Show last 20 lines
foxhunt-deploy monitor dy2bn5ninzaxma --tail 20
# Follow logs in real-time
foxhunt-deploy monitor dy2bn5ninzaxma --follow
# Follow with initial tail (show last 10 lines, then follow)
foxhunt-deploy monitor dy2bn5ninzaxma --follow --tail 10
# Filter for training metrics
foxhunt-deploy monitor dy2bn5ninzaxma --follow --filter "epoch.*loss"
# Filter for errors only
foxhunt-deploy monitor dy2bn5ninzaxma --follow --filter "ERROR|WARN"
```
### `run`
Execute commands in a running pod.
```bash
foxhunt-deploy run <POD_ID> <COMMAND>
Arguments:
<POD_ID> Pod ID
<COMMAND> Command to execute
```
**Example**:
```bash
foxhunt-deploy run dy2bn5ninzaxma "nvidia-smi"
```
## Configuration
### Config File
Location: `~/.foxhunt/config.toml`
```toml
[runpod]
api_key = "YOUR_API_KEY"
default_gpu_type = "RTX A4000"
default_datacenter = "EUR-IS-1"
[docker]
registry = "jgrusewski"
image_name = "foxhunt"
tag = "latest"
[s3]
endpoint = "https://s3api-eur-is-1.runpod.io"
bucket = "se3zdnb5o4"
region = "us-east-1"
poll_interval_secs = 5
[defaults]
container_disk_gb = 50
volume_path = "/runpod-volume"
volume_size_gb = 100
support_public_ip = false
```
### Environment Variables
Override config values with environment variables:
```bash
# RunPod
export RUNPOD_API_KEY="your_key"
# S3 (required for monitor command)
export AWS_ACCESS_KEY_ID="your_access_key"
export AWS_SECRET_ACCESS_KEY="your_secret_key"
# Optional overrides
export S3_ENDPOINT="https://s3api-eur-is-1.runpod.io"
export S3_BUCKET="se3zdnb5o4"
export S3_POLL_INTERVAL="10"
```
### GPU Types
Common GPU options:
- `RTX A4000` - 16GB VRAM, $0.25/hr (recommended)
- `RTX 4090` - 24GB VRAM, $0.59/hr
- `A40` - 48GB VRAM, $0.79/hr
- `A100 80GB` - 80GB VRAM, $1.89/hr
### Datacenters
Available datacenters:
- `EUR-IS-1` - Europe (Iceland)
- `US-TX-1` - US (Texas)
- `US-OR-1` - US (Oregon)
## S3 Log Monitoring
### How It Works
1. **Log Discovery**: Automatically finds log files in S3 bucket
- Priority: `training.log` > `stdout` > `stderr`
- Path: `s3://{bucket}/ml_training/{pod_id}/...`
2. **Real-Time Streaming**: Polls S3 every 5 seconds (configurable)
- Tracks last read position
- Only downloads new content (byte-range requests)
3. **Colorization**: Applies colors based on log level
- 🟢 INFO (green)
- 🟡 WARN (yellow)
- 🔴 ERROR (red)
- 🔵 DEBUG (cyan)
- ⚫ TRACE (dimmed)
4. **Completion Detection**: Exits when training completes
- Detects keywords: "training complete", "saved final model", etc.
### S3 Path Structure
```
s3://se3zdnb5o4/ml_training/
└── {pod_id}/
├── training_runs/
│ └── {model}/
│ └── run_{timestamp}/
│ ├── logs/
│ │ └── training.log (priority 1)
│ └── checkpoints/
├── stdout (priority 2)
└── stderr (priority 3)
```
### Performance
- **Poll Interval**: 5 seconds (configurable)
- **Latency**: ~5-10s lag
- **Network**: Byte-range downloads (efficient)
- **Memory**: Streams chunks, doesn't load entire file
## Examples
See `examples/monitor_demo.sh` for interactive demo:
```bash
./examples/monitor_demo.sh <pod_id>
```
## Development
### Build
```bash
cargo build --release
```
### Run Tests
```bash
cargo test
```
### Run with Verbose Logging
```bash
foxhunt-deploy --verbose monitor <pod_id> --follow
```
## Troubleshooting
### Monitor: No logs appearing
**Cause**: Missing AWS credentials or incorrect pod ID
**Solution**:
1. Check credentials: `echo $AWS_ACCESS_KEY_ID`
2. List log files: `foxhunt-deploy monitor <pod_id> --list`
3. Verify pod ID in RunPod dashboard
### Monitor: Permission denied
**Cause**: Invalid AWS credentials
**Solution**:
1. Verify RunPod API key has S3 access
2. Check bucket name in config matches RunPod
3. Ensure credentials match RunPod account
### Monitor: Slow updates
**Cause**: High poll interval or network latency
**Solution**:
1. Reduce poll interval in config: `poll_interval_secs = 2`
2. Check network: `ping s3api-eur-is-1.runpod.io`
### Deploy: GPU not available
**Cause**: Requested GPU type unavailable in datacenter
**Solution**:
1. Try different datacenter: `--datacenter "US-TX-1"`
2. Try different GPU: `--gpu "RTX 4090"`
3. Check RunPod dashboard for availability
## Architecture
```
foxhunt-deploy
├── src/
│ ├── cli/ # Command-line interface
│ │ ├── build.rs # Docker build command
│ │ ├── deploy.rs # RunPod deployment command
│ │ ├── monitor.rs # S3 log monitoring command
│ │ └── run.rs # Pod execution command
│ ├── config/ # Configuration management
│ ├── docker/ # Docker operations
│ ├── runpod/ # RunPod API client
│ ├── s3/ # S3 log monitoring
│ │ ├── mod.rs # S3LogClient
│ │ ├── monitor.rs # LogMonitor
│ │ └── parser.rs # Log parsing/colorization
│ ├── utils/ # Utilities (terminal output)
│ └── error.rs # Error handling
└── examples/
└── monitor_demo.sh # Interactive demo
```
## License
Apache-2.0
## Credits
Built for the Foxhunt HFT trading system.