Commit Graph

19 Commits

Author SHA1 Message Date
jgrusewski
adce841e6b fix: H100 GPU test failures — stale profile assertions + smoke test stability
- test_embedded_h100_parses: update assertions to match h100.toml values
  (gpu_n_episodes=2048, gpu_timesteps_per_episode=100)
- dqn_training_smoke_test: apply dqn-smoketest profile to cap hidden_dim=32.
  H100's gpu profile sets hidden_dim_base=256 which causes loss explosion
  (375x in 3 epochs) with lr=0.001.
- Revert gpu-test-pipeline DAG to compile-and-test (RWO PVC constraint)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 11:08:23 +01:00
jgrusewski
922fd5e93e ci: add DQN perf benchmark step + 3Q test data for CI
GPU test pipeline:
- Add perf-benchmark step after compile-and-test
- Runs DQN training on 3Q ES.FUT (OHLCV + MBP-10 + trades)
- Reports epoch time (ms), fails if > 500ms (H100 regression guard)
- batch_size=1024, 5 epochs × 100 steps, skips epoch 1 (init)

Populate test data job:
- Copy 3 quarters per symbol (was 1) for all data types
- OHLCV: ~6MB/symbol for walk-forward + perf benchmarks
- MBP-10: 3Q for OFI feature pipeline testing
- Trades: 3Q for trade-flow feature testing

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 18:17:27 +01:00
jgrusewski
65891816ee fix: resolve all CI test failures — TFT, DQN pipeline, benchmarks
DQN pipeline tests:
- Split dqn-pipeline into per-test cargo invocations in CI (CUDA Graph
  capture corrupts async memory pool between sequential tests)
- Drop impl for GpuDqnTrainer: sync stream + destroy graph before buffers
- check_err drains in constructor and after graph capture

TFT fixes:
- forward_loss: reshape output [batch,horizon,quantiles] → [batch,quantiles]
  to match target shape (fixes DimensionMismatch {expected:3, actual:3})
- smoke test: accept step=0 for models without backward support
- benchmark: remove hardcoded batch_size≤4 assertion (H100 can be larger)

Cleanup:
- Remove debug eprintln from elementwise.rs
- GPU-native cat bounds check

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 09:09:51 +01:00
jgrusewski
9f5b88c81d revert: remove data subset hacks — need proper approach
Reverts 4 commits (8139911c, 282f3aff, b3aca96d, dad61e4e) that
tried to workaround slow CI by limiting data subsets and cleaning
caches. The real issue is debug-mode .dbn.zst parsing taking minutes.

Kept: --test-threads=1 fix (root cause), hard CUDA error, action
range fixes, #[ignore] for heavy tests.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 21:55:46 +01:00
jgrusewski
b3aca96d51 fix(ci): clean stale test binaries from PVC before GPU tests
Cargo incremental compilation on persistent PVC reuses old test
binaries even when source changed. Force cargo clean -p for ML crates
to ensure fresh compilation with latest max_bars and test fixes.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 21:15:15 +01:00
jgrusewski
10b86b4319 fix(ci): enforce --test-threads=1 for ALL GPU integration tests
Root cause: parallel test execution within a single cargo test binary
corrupts the CUDA primary context (cuDevicePrimaryCtxRetain race).

The dqn-smoke tests ran in parallel threads — 3 GPU tests using a
shared OnceLock<MlDevice> raced with smoke_e2e_dqn_training_loop
which creates a fresh CudaContext::new(0). The parallel context
init/teardown left the primary context in an error state, causing
subsequent cuInit(0) to fail silently.

Lib tests passed because they already had --test-threads=1.
Integration tests (dqn-smoke, dqn-smoke-train, ppo-barrier, etc.)
were missing it.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 20:20:30 +01:00
jgrusewski
266f7417f5 fix(ci): bump GPU test opt-level to 2, revert one-time cache clean
opt-level=1 caused DQN lib tests to timeout at the 2-hour deadline
(113 tests × debug-mode GPU init = too slow). opt-level=2 matches
local dev behavior.

Revert the cargo clean -p steps now that stale Candle cache is purged.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 12:57:49 +01:00
jgrusewski
79ab30f414 fix(ci): clean stale ML cache in GPU test pipeline + save logs
Same stale incremental cache issue as ci-pipeline. Also saves compile
output to PVC for post-mortem debugging.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 10:54:42 +01:00
jgrusewski
23a122607d feat(infra): Argo log persistence, network policies, lightweight CI images
- Argo workflow archive via PostgreSQL — persistent logs after pod GC
- Allow Argo controller to reach PostgreSQL via network policy
- Allow Argo server to reach MinIO for S3 log archival
- Replace foxhunt-runtime with lightweight images (alpine:3.21, curlimages/curl)
  in orchestration steps: fetch-binary, upload-results, detect-changes, gpu-warmup
- Use ci-builder for training steps (hyperopt, train-best, evaluate) — nvcc required
- Fix --hyperopt-results → --hyperopt-params flag in train-best step
- Remove invalid podGCGracePeriod from Argo Helm values
- Archive RBAC, kustomization updates

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 12:00:46 +01:00
jgrusewski
3112e07a5a perf(ci): serialize dqn-pipeline tests to avoid GPU contention
4 concurrent DQN trainers on a shared H100 causes severe GPU contention
(28-39% utilization, 42 GB VRAM). Serializing with --test-threads=1
gives each test full GPU access, reducing total wallclock time despite
sequential execution.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 19:52:04 +01:00
jgrusewski
0c571c351b fix(cuda): deterministic SHA-256 PTX cache key + extend deadline to 120min
DefaultHasher (SipHash) uses random per-process keys — the PTX cache
would never hit across separate cargo test runs. Switch to SHA-256
(deterministic) so cached PTX persists on the PVC across CI runs.

Also extend activeDeadlineSeconds from 90min to 120min to accommodate
the one-time cold-start NVRTC compilation (30+ min for the fused
experience collector kernel).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 16:16:04 +01:00
jgrusewski
fefb9e3185 perf(ci): enable opt-level=1 for GPU test builds
Integration tests (e2e DQN training on 148k bars) take 30+ minutes
in debug mode (opt-level=0). CARGO_PROFILE_TEST_OPT_LEVEL=1 enables
basic optimizations for test binaries — requires recompile but tests
run 5-10x faster. Local dev unaffected (env override only in CI).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 13:34:26 +01:00
jgrusewski
2c9d929777 chore(ci): restore podGC OnPodCompletion after successful validation
Pipeline validated end-to-end on H100: 3/3 steps green, 539 tests pass.
Switch podGC back to OnPodCompletion to auto-clean all pods after runs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 12:55:53 +01:00
jgrusewski
5b0b5ef917 fix(ci): add LD_LIBRARY_PATH for CUDA runtime, fix git checkout
1. CUDA_ERROR_STUB_LIBRARY: ci-builder image has CUDA stubs ahead of
   real NVIDIA driver libs in LD_LIBRARY_PATH. Prepend
   /usr/local/nvidia/lib64 (device-plugin mount) so real driver is
   found first.
2. Git checkout: `git checkout --force main` stays on local main
   without pulling. Add `git reset --hard origin/$REF` to fast-forward
   branch to latest remote commit.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 12:42:30 +01:00
jgrusewski
13e36a14d3 fix(ci): use bash for compile-and-test, fix --nocapture placement
Two bugs in gpu-test-pipeline-template.yaml:
1. /bin/sh doesn't support bash-isms (<<<, read -ra, arrays) used in
   the test runner script. Switch to /bin/bash.
2. --nocapture was appended as a cargo argument instead of a test binary
   argument. Now detects whether -- separator exists in args and places
   --nocapture correctly after it.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 12:36:30 +01:00
jgrusewski
5cb9be71e4 fix(infra): add gpu-test egress NetworkPolicy, revert archiveLogs hack
Root cause: default-deny-all blocks egress from gpu-test pods to MinIO,
causing the Argo wait sidecar to hang on log upload. Fix: add egress
policy for gpu-test component (DNS, git, MinIO, Mattermost, registry).
Revert archiveLogs: false — logs should be stored.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 12:20:26 +01:00
jgrusewski
337aff80df fix(infra): disable archiveLogs on gpu-test templates (MinIO not running)
The wait sidecar blocks indefinitely trying to save logs to MinIO which
has no running pods. Disable log archiving on all 3 templates since test
output is captured in Argo's pod logs already.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 12:14:36 +01:00
jgrusewski
5ca26d2da0 fix(infra): use runtime image for gpu-warmup (Argo emissary compat)
busybox doesn't support Argo's emissary executor protocol, causing the
wait sidecar to hang indefinitely and hold the GPU allocation. Switch to
foxhunt-runtime which has proper /bin/sh and lets the sidecar detect
container exit. Also adds nvidia-smi check during warmup.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 12:09:10 +01:00
jgrusewski
1520c56e41 infra: add gpu-test-pipeline WorkflowTemplate for H100 test suite
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 11:55:36 +01:00