Compare commits

..

3 Commits
main ... main

Author SHA1 Message Date
Aash
0fe66c610e val 2026-05-28 03:15:10 -04:00
Aash
80776baff7 val 2026-05-28 03:07:35 -04:00
Aash
7530a86979 Upload files to "train" 2026-05-28 02:59:17 -04:00
47 changed files with 55 additions and 125 deletions

View File

@ -1,5 +0,0 @@
source: wavesfm
name: WavesFM Linear Probe
task: rml
epochs: 5
batch_size: 2048

View File

@ -15,11 +15,11 @@ permissions:
jobs: jobs:
WavesFM-Training: WavesFM-Training:
runs-on: "ubuntu-24.04" runs-on: "ubuntu-latest"
env: env:
WAVESFM_TASK: "rml" WAVESFM_TASK: "rml"
WAVESFM_EPOCHS: "5" WAVESFM_EPOCHS: "3"
WAVESFM_BATCH_SIZE: "2048" WAVESFM_BATCH_SIZE: "16"
WAVESFM_OUTPUT_DIR: "/opt/wavesfm/output" WAVESFM_OUTPUT_DIR: "/opt/wavesfm/output"
# Single source of truth for the cloned WavesFM repo location. # Single source of truth for the cloned WavesFM repo location.
# Referenced as ${{ env.WAVESFM_REPO_DIR }} in steps. To relocate # Referenced as ${{ env.WAVESFM_REPO_DIR }} in steps. To relocate
@ -27,8 +27,6 @@ jobs:
# downstream step uses the env var, no hard-coded paths. # downstream step uses the env var, no hard-coded paths.
WAVESFM_REPO_DIR: "/opt/wavesfm/repo" WAVESFM_REPO_DIR: "/opt/wavesfm/repo"
WAVESFM_ADAPTED_DATA: "/opt/wavesfm/adapted_data.h5" WAVESFM_ADAPTED_DATA: "/opt/wavesfm/adapted_data.h5"
# Override model-download base URL to internal LAN IP
# (external riahub.ai LFS endpoint is unreachable from runners).
RIAHUB_BASE_URL: "http://192.168.0.170:3000" RIAHUB_BASE_URL: "http://192.168.0.170:3000"
steps: steps:
- name: Display basic runner info - name: Display basic runner info
@ -44,6 +42,7 @@ jobs:
echo "No NVIDIA GPU available." echo "No NVIDIA GPU available."
fi fi
- name: "Download Model (qoherent/wavesfm-base/wavesfm-v1p0.pth)" - name: "Download Model (qoherent/wavesfm-base/wavesfm-v1p0.pth)"
shell: bash shell: bash
timeout-minutes: 4 timeout-minutes: 4
@ -180,7 +179,8 @@ jobs:
fi fi
exit 1 exit 1
fi fi
- name: Checkout Training Dataset
- name: "Checkout Dataset (qoherent/icc-demo/icc_canary_2026_05_28-v1.0.0.h5)"
shell: bash shell: bash
timeout-minutes: 10 timeout-minutes: 10
env: env:
@ -210,8 +210,16 @@ jobs:
AUTH_HEADER="" AUTH_HEADER=""
if [[ -n "${RIAHUB_USER:-}" && -n "${RIAHUB_TOKEN:-}" ]]; then if [[ -n "${RIAHUB_USER:-}" && -n "${RIAHUB_TOKEN:-}" ]]; then
AUTH_HEADER=$(printf 'Authorization: basic %s' "$(printf '%s:%s' "$RIAHUB_USER" "$RIAHUB_TOKEN" | base64 | tr -d '\n')") AUTH_HEADER=$(printf 'Authorization: basic %s' \
"$(printf '%s:%s' "$RIAHUB_USER" "$RIAHUB_TOKEN" | base64 | tr -d '\n')")
fi fi
# ``sudo env GIT_TERMINAL_PROMPT=0`` propagates the env var across
# sudo's default ``env_reset`` boundary; a bare ``sudo git`` would
# see an empty env on most distros' default sudoers, so the
# step-level ``env:`` block's GIT_TERMINAL_PROMPT=0 would NOT
# actually reach git child processes. Without it, git falls back
# to opening ``/dev/tty`` (the PTY allocated by act_runner) and
# prompting for credentials on a 401, hanging until timeout.
git_auth() { git_auth() {
if [[ -n "$AUTH_HEADER" ]]; then if [[ -n "$AUTH_HEADER" ]]; then
sudo env GIT_TERMINAL_PROMPT=0 git -c "http.extraheader=$AUTH_HEADER" "$@" sudo env GIT_TERMINAL_PROMPT=0 git -c "http.extraheader=$AUTH_HEADER" "$@"
@ -219,8 +227,9 @@ jobs:
sudo env GIT_TERMINAL_PROMPT=0 git "$@" sudo env GIT_TERMINAL_PROMPT=0 git "$@"
fi fi
} }
REPO_PATH='/qoherent/icc-demo.git' REPO_PATH='/qoherent/icc-demo.git'
DEST_ROOT='/opt/qmb/riahub/dataset/qoherent/icc-demo/main' DEST_ROOT='/opt/qmb/riahub/dataset/qoherent/icc-demo/9f87fa9fe2badd314ad81379064e236ea494e89d'
sudo mkdir -p "$(dirname "$DEST_ROOT")" sudo mkdir -p "$(dirname "$DEST_ROOT")"
if ! command -v git-lfs >/dev/null 2>&1; then if ! command -v git-lfs >/dev/null 2>&1; then
sudo apt-get update -y sudo apt-get update -y
@ -236,16 +245,31 @@ jobs:
sudo mkdir -p "$DEST_ROOT" sudo mkdir -p "$DEST_ROOT"
sudo git -C "$DEST_ROOT" init || continue sudo git -C "$DEST_ROOT" init || continue
sudo git -C "$DEST_ROOT" remote add origin "$REPO_URL" || continue sudo git -C "$DEST_ROOT" remote add origin "$REPO_URL" || continue
# See ``_render_model_checkout`` for the rationale on skipping
# ``git lfs install --local`` — short version: the smudge
# filter it would register tries its own credential lookup
# during ``git checkout FETCH_HEAD`` and hangs forever on
# /dev/tty when the repo is internal/private. We rely on
# the explicit ``git lfs fetch`` (with auth) +
# ``git lfs checkout`` (local) pair below instead.
sudo git -C "$DEST_ROOT" sparse-checkout init --no-cone || continue sudo git -C "$DEST_ROOT" sparse-checkout init --no-cone || continue
sudo git -C "$DEST_ROOT" sparse-checkout set --no-cone -- \ sudo git -C "$DEST_ROOT" sparse-checkout set --no-cone -- \
'datasets/icc28-train_v1.0.0.h5' || continue 'icc_canary_2026_05_28-v1.0.0.h5' || continue
if ! git_auth -C "$DEST_ROOT" fetch --depth=1 origin 'ef0a0e430f8e5019dec52794fccab958b3a3c2b7'; then if ! git_auth -C "$DEST_ROOT" fetch --depth=1 origin '9f87fa9fe2badd314ad81379064e236ea494e89d'; then
continue continue
fi fi
if ! sudo env GIT_TERMINAL_PROMPT=0 GIT_LFS_SKIP_SMUDGE=1 git -C "$DEST_ROOT" -c advice.detachedHead=false checkout FETCH_HEAD; then # See ``_render_model_checkout`` for the rationale on
# ``GIT_LFS_SKIP_SMUDGE=1`` — short version: the runner has
# the LFS smudge filter installed system-wide
# (``/etc/gitconfig``), so checkout fires it and the filter's
# credential helper hangs on /dev/tty for internal repos.
# Skipping smudge here lets the explicit ``git lfs fetch``
# below handle materialization with proper auth.
if ! sudo env GIT_TERMINAL_PROMPT=0 GIT_LFS_SKIP_SMUDGE=1 \
git -C "$DEST_ROOT" -c advice.detachedHead=false checkout FETCH_HEAD; then
continue continue
fi fi
if ! git_auth -C "$DEST_ROOT" lfs fetch origin --include='datasets/icc28-train_v1.0.0.h5' --exclude=""; then if ! git_auth -C "$DEST_ROOT" lfs fetch origin --include='icc_canary_2026_05_28-v1.0.0.h5' --exclude=""; then
echo "LFS fetch failed for candidate $base, trying next" >&2 echo "LFS fetch failed for candidate $base, trying next" >&2
continue continue
fi fi
@ -254,7 +278,7 @@ jobs:
continue continue
fi fi
POINTER_FOUND=0 POINTER_FOUND=0
_LFS_REL_PATH='datasets/icc28-train_v1.0.0.h5' _LFS_REL_PATH='icc_canary_2026_05_28-v1.0.0.h5'
if [[ "$(sudo head -c 9 "$DEST_ROOT/$_LFS_REL_PATH" 2>/dev/null || true)" == "version h" ]]; then if [[ "$(sudo head -c 9 "$DEST_ROOT/$_LFS_REL_PATH" 2>/dev/null || true)" == "version h" ]]; then
echo "LFS materialization left a pointer at $DEST_ROOT/$_LFS_REL_PATH for candidate $base, trying next" >&2 echo "LFS materialization left a pointer at $DEST_ROOT/$_LFS_REL_PATH for candidate $base, trying next" >&2
POINTER_FOUND=1 POINTER_FOUND=1
@ -268,7 +292,7 @@ jobs:
if [[ "$MATERIALIZED" -ne 1 ]]; then if [[ "$MATERIALIZED" -ne 1 ]]; then
echo "Failed to materialize dataset using base URL candidates derived from: $BASE_URL_SOURCE" >&2 echo "Failed to materialize dataset using base URL candidates derived from: $BASE_URL_SOURCE" >&2
if [[ -z "$AUTH_HEADER" ]]; then if [[ -z "$AUTH_HEADER" ]]; then
echo " (no credentials configured: set QMBDEMO_USER and QMBDEMO_TOKEN repo secrets for internal/private repos)" >&2 echo " (set QMBDEMO_USER+QMBDEMO_TOKEN repo secrets for internal/private repos)" >&2
fi fi
exit 1 exit 1
fi fi
@ -297,7 +321,7 @@ jobs:
# `--device cpu` from the Train step actually takes effect. # `--device cpu` from the Train step actually takes effect.
# No-op if the line already uses args.device (idempotent). # No-op if the line already uses args.device (idempotent).
if [[ -f main_finetune.py ]]; then if [[ -f main_finetune.py ]]; then
sed -i 's|torch\.amp\.GradScaler(device="cuda")|torch.cuda.amp.GradScaler(enabled=(args.device != "cpu"))|' main_finetune.py sed -i 's|torch\.amp\.GradScaler(device="cuda")|torch.amp.GradScaler(device=args.device, enabled=(args.device != "cpu"))|' main_finetune.py
echo "Patched main_finetune.py GradScaler for CPU/GPU device parity." echo "Patched main_finetune.py GradScaler for CPU/GPU device parity."
fi fi
@ -334,9 +358,11 @@ jobs:
# only when the repo is genuinely installable (has setup.py / # only when the repo is genuinely installable (has setup.py /
# setup.cfg, or pyproject.toml with [build-system]). # setup.cfg, or pyproject.toml with [build-system]).
cd "$WAVESFM_REPO_DIR" cd "$WAVESFM_REPO_DIR"
# Pre-install CPU torch + numpy<2 to make requirements.txt see them already-satisfied (saves ~600MB). # FAST-PATH: install CPU torch from pytorch.org/whl/cpu FIRST (~200MB).
# torch 2.2.2 has the NumPy 1.x ABI and crashes if numpy 2.x is installed. # This makes torch==X already-satisfied so requirements.txt does not
# pull the 755MB manylinux wheel with bundled CUDA from PyPI default.
$PIP install --index-url https://download.pytorch.org/whl/cpu --extra-index-url https://pypi.org/simple "numpy<2" "torch==2.2.2" torchvision $PIP install --index-url https://download.pytorch.org/whl/cpu --extra-index-url https://pypi.org/simple "numpy<2" "torch==2.2.2" torchvision
# Also ensure numpy<2 is pinned for the requirements.txt install below
$PIP install --upgrade --force-reinstall "numpy<2" $PIP install --upgrade --force-reinstall "numpy<2"
INSTALLED_SOMETHING=0 INSTALLED_SOMETHING=0
if [[ -f requirements.txt ]]; then if [[ -f requirements.txt ]]; then
@ -354,7 +380,9 @@ jobs:
exit 1 exit 1
fi fi
$PIP install h5py scipy $PIP install h5py scipy
# Force numpy<2 again (requirements.txt may have bumped it via transitive deps). # After requirements.txt, force numpy back to <2 (torch 2.2.2 has
# NumPy 1.x ABI; transitive deps in requirements.txt would
# otherwise leave numpy 2.x in place and crash at runtime).
$PIP install --upgrade --force-reinstall "numpy<2" $PIP install --upgrade --force-reinstall "numpy<2"
TORCH_INDEX_URL="https://download.pytorch.org/whl/cpu" TORCH_INDEX_URL="https://download.pytorch.org/whl/cpu"
TORCH_REASON="no NVIDIA GPU detected" TORCH_REASON="no NVIDIA GPU detected"
@ -375,8 +403,8 @@ jobs:
fi fi
fi fi
echo "Installing PyTorch from ${TORCH_INDEX_URL} (${TORCH_REASON})." echo "Installing PyTorch from ${TORCH_INDEX_URL} (${TORCH_REASON})."
# torch pre-installed at step head; force-reinstall disabled to avoid 755MB redownload # torch was pre-installed at the top of this step; no force-reinstall needed.
echo "Skipping torch force-reinstall ($TORCH_INDEX_URL)" echo "Skipping torch force-reinstall (already installed at step head): $TORCH_INDEX_URL"
- name: Find and adapt dataset - name: Find and adapt dataset
shell: bash shell: bash
@ -472,4 +500,4 @@ jobs:
${{ env.WAVESFM_OUTPUT_DIR }}/best.pth ${{ env.WAVESFM_OUTPUT_DIR }}/best.pth
${{ env.WAVESFM_OUTPUT_DIR }}/log.txt ${{ env.WAVESFM_OUTPUT_DIR }}/log.txt
if-no-files-found: warn if-no-files-found: warn
# committed at 2026-05-28T15:52:05.981554+00:00 # committed at 2026-05-28T06:39:26.910514+00:00

BIN
datasets/example.h5 (Stored with Git LFS)

Binary file not shown.

BIN
datasets/icc28-test_v1.0.0.h5 (Stored with Git LFS)

Binary file not shown.

BIN
datasets/icc28-train_v1.0.0.h5 (Stored with Git LFS)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
val/rec_USRP_97MHz_2026-05-26_17-57-14_1c33118.sigmf-data (Stored with Git LFS) Normal file

Binary file not shown.

BIN
val/rec_USRP_97MHz_2026-05-26_17-57-14_1c33118.sigmf-meta (Stored with Git LFS) Normal file

Binary file not shown.