426e9eeabd
Voice Workbench / headless workbench (mocked backends) (push) Has been cancelled
Voice Workbench / real acoustic lane (nightly, provisioned only) (push) Has been cancelled
ci / test (push) Has been cancelled
ci / lint-and-format (push) Has been cancelled
ci / build (push) Has been cancelled
ci / dev-startup (push) Has been cancelled
gitleaks / gitleaks (push) Has been cancelled
Markdown Links / Relative Markdown Links (push) Has been cancelled
Quality (Extended) / Homepage Build (PR smoke) (push) Has been cancelled
Quality (Extended) / Comment-only diff guard (push) Has been cancelled
Quality (Extended) / Format + Type Safety Ratchet (push) Has been cancelled
Quality (Extended) / Develop Gate (secret scan + UI determinism) (push) Has been cancelled
Quality (Extended) / Develop Gate (lint) (push) Has been cancelled
Chat shell gestures / Chat shell gesture + parity e2e (push) Has been cancelled
Cloud Gateway Discord / Test (push) Has been cancelled
Benchmark Bridge Tests / benchmark (bunx @biomejs/biome check packages/lifeops-bench/src, benchmark-lint) (push) Has been cancelled
Benchmark Bridge Tests / benchmark (bunx vitest run --config packages/lifeops-bench/vitest.config.ts --root packages/lifeops-bench --passWithNoTests, benchmark-tests) (push) Has been cancelled
Build Agent Image / build-and-push (push) Has been cancelled
Dev Smoke / bun run dev onboarding chat (push) Has been cancelled
Dev Smoke / Vite HMR dependency-level smoke (push) Has been cancelled
Electrobun Submodule Guard / electrobun gitlink is fetchable (push) Has been cancelled
Publish @elizaos/example-code / check_npm (push) Has been cancelled
Publish @elizaos/example-code / publish_npm (push) Has been cancelled
Publish @elizaos/plugin-elizacloud / verify_version (push) Has been cancelled
Publish @elizaos/plugin-elizacloud / publish_npm (push) Has been cancelled
Sandbox Live Smoke / Sandbox live smoke (push) Has been cancelled
Snap Build & Test / Build Snap (amd64) (push) Has been cancelled
Snap Build & Test / Build Snap (arm64) (push) Has been cancelled
Test Packaging / elizaos CLI global-install smoke (node + bun) (push) Has been cancelled
Cloud Gateway Webhook / Test (push) Has been cancelled
Cloud Tests / lint-and-types (push) Has been cancelled
Cloud Tests / unit-tests (push) Has been cancelled
Cloud Tests / integration-tests (push) Has been cancelled
Cloud Tests / e2e-tests (push) Has been cancelled
CodeQL Advanced / Analyze (javascript-typescript) (push) Has been cancelled
Deploy Apps Worker (Product 2) / Determine environment (push) Has been cancelled
Deploy Apps Worker (Product 2) / Deploy apps worker to apps-control host (${{ needs.determine-env.outputs.environment }}) (push) Has been cancelled
Deploy Eliza Provisioning Worker / Determine environment (push) Has been cancelled
Deploy Eliza Provisioning Worker / Deploy worker to Hetzner host (${{ needs.determine-env.outputs.environment }} @ ${{ needs.determine-env.outputs.deployment_sha }}) (push) Has been cancelled
Dev Smoke / Classify changed paths (push) Has been cancelled
supply-chain / sbom (push) Has been cancelled
supply-chain / vulnerability-scan (push) Has been cancelled
Build, Push & Deploy to Phala Cloud / build-and-push (push) Has been cancelled
Test Packaging / Validate Packaging Configs (push) Has been cancelled
Test Packaging / Build & Test PyPI Package (push) Has been cancelled
Test Packaging / PyPI on Python ${{ matrix.python }} (push) Has been cancelled
Test Packaging / Pack & Test JS Tarballs (push) Has been cancelled
UI Fixture E2E / ui-fixture-e2e (push) Has been cancelled
UI Fixture E2E / fixture-e2e (push) Has been cancelled
UI Story Gate / story-gate (push) Has been cancelled
vault-ci / test (macos-latest) (push) Has been cancelled
vault-ci / test (ubuntu-latest) (push) Has been cancelled
vault-ci / test (windows-latest) (push) Has been cancelled
vault-ci / app-core wiring tests (push) Has been cancelled
verify-patches / verify patches/CHECKSUMS.sha256 (push) Has been cancelled
Voice Benchmark Smoke / voice-emotion fixture smoke (push) Has been cancelled
Voice Benchmark Smoke / voiceagentbench fixture smoke (push) Has been cancelled
Voice Benchmark Smoke / voicebench-quality unit smoke (push) Has been cancelled
Voice Benchmark Smoke / voicebench TypeScript unit (no audio) (push) Has been cancelled
Voice Benchmark Smoke / voice bench smoke summary (push) Has been cancelled
Windows CI / windows ([bun run --cwd packages/app-core test bun run --cwd packages/elizaos test bun run --cwd packages/cloud/shared test], app-and-cli) (push) Has been cancelled
Windows CI / windows ([bun run --cwd packages/scenario-runner test bun run --cwd packages/vault test bun run --cwd packages/security test bun run --cwd plugins/plugin-coding-tools test], framework-packages) (push) Has been cancelled
Windows CI / windows ([bun run --cwd plugins/plugin-elizacloud test bun run --cwd plugins/plugin-discord test bun run --cwd plugins/plugin-anthropic test bun run --cwd plugins/plugin-openai test bun run --cwd plugins/plugin-app-control test bun run --cwd plugins/pl… (push) Has been cancelled
Windows CI / windows ([node packages/scripts/run-turbo.mjs run build --filter=@elizaos/core --filter=@elizaos/shared --filter=@elizaos/agent --concurrency=4 node packages/scripts/run-bash-linux-only.mjs scripts/verify-riscv64-buildpaths.sh node packages/scripts/run… (push) Has been cancelled
Windows CI / windows ([node packages/scripts/run-turbo.mjs run typecheck --filter=@elizaos/core --filter=@elizaos/shared --filter=@elizaos/cloud-shared --concurrency=4 bun run --cwd packages/core test bun run --cwd packages/shared test], core-runtime, 75) (push) Has been cancelled
256 lines
9.2 KiB
Bash
Executable File
256 lines
9.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# cuda_runner.sh — drive CUDA fixture parity plus graph dispatch smoke.
|
|
#
|
|
# Usage on a Linux box that has nvcc + an NVIDIA GPU and a smoke GGUF model:
|
|
# cd packages/inference/verify
|
|
# ELIZA_MTP_SMOKE_MODEL=/models/eliza-1-smoke.gguf ./cuda_runner.sh
|
|
#
|
|
# Usage from a non-CUDA dev box (e.g. M4 Max) — drive a remote CUDA host
|
|
# over ssh:
|
|
# CUDA_REMOTE=user@cuda-host CUDA_REMOTE_DIR=~/eliza ./cuda_runner.sh
|
|
#
|
|
# Environment overrides (optional):
|
|
# CUDA_HOME default /usr/local/cuda
|
|
# CUDA_TARGET default linux-x64-cuda or linux-aarch64-cuda
|
|
# CUDA_BUILD_FORK default 1; build the target before verifying
|
|
# CUDA_SKIP_GRAPH_SMOKE default 0; set 1 only for fixture-only bring-up
|
|
# CUDA_REMOTE_REPORT remote report path when driving CUDA_REMOTE
|
|
# --report output machine-readable hardware report. A publishable
|
|
# CUDA build still requires a target-matching
|
|
# cuda-runtime-dispatch-evidence.json entry
|
|
# derived from this report; CAPABILITIES.json
|
|
# fails closed when that evidence is absent.
|
|
# ELIZA_MTP_CMAKE_FLAGS extra target CMake flags passed to the build hook
|
|
# ELIZA_MTP_HARDWARE_REPORT_DIR
|
|
# graph-smoke log directory, default verify/hardware-results
|
|
# ELIZA_MTP_LLAMA_DIR default ~/.cache/eliza-mtp/eliza-llama-cpp
|
|
# ELIZA_MTP_LIBGGML_CUDA default $ELIZA_MTP_LLAMA_DIR/build-cuda/ggml/src/ggml-cuda/libggml-cuda.so
|
|
# ELIZA_MTP_SMOKE_MODEL required unless CUDA_SKIP_GRAPH_SMOKE=1
|
|
# ELIZA_MTP_SMOKE_CACHE_TYPES/TOKENS/NGL/PROMPT/EXTRA_ARGS
|
|
# forwarded to runtime_graph_smoke.sh
|
|
|
|
set -euo pipefail
|
|
|
|
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
REPO_ROOT="$(git -C "$HERE" rev-parse --show-toplevel)"
|
|
cd "$HERE"
|
|
|
|
REPORT_PATH="${ELIZA_MTP_HARDWARE_REPORT:-}"
|
|
STARTED_AT="$(date -u '+%Y-%m-%dT%H:%M:%SZ')"
|
|
FAIL_REASON=""
|
|
GPU_INFO=""
|
|
TOOLCHAIN_INFO=""
|
|
GRAPH_SMOKE_STATUS="required"
|
|
REMOTE_DELEGATED="false"
|
|
REPORT_WRITTEN_EXTERNALLY="false"
|
|
|
|
usage() {
|
|
cat <<'USAGE' >&2
|
|
Usage:
|
|
cuda_runner.sh [--report <path>]
|
|
|
|
Options:
|
|
--report <path> Write machine-readable JSON evidence for pass/fail.
|
|
Use this report to update cuda-runtime-dispatch-evidence.json;
|
|
CUDA CAPABILITIES publishability is gated on that file.
|
|
USAGE
|
|
}
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
--report)
|
|
REPORT_PATH="${2:-}"; shift 2 ;;
|
|
-h|--help)
|
|
usage; exit 0 ;;
|
|
*)
|
|
usage; echo "[cuda_runner] unknown argument: $1" >&2; exit 1 ;;
|
|
esac
|
|
done
|
|
|
|
fail() {
|
|
FAIL_REASON="$*"
|
|
echo "[cuda_runner] $FAIL_REASON" >&2
|
|
exit 1
|
|
}
|
|
|
|
on_error() {
|
|
local line="$1"
|
|
local command="$2"
|
|
if [[ -z "$FAIL_REASON" ]]; then
|
|
FAIL_REASON="command failed at line $line: $command"
|
|
fi
|
|
}
|
|
|
|
model_sha256() {
|
|
local model="${ELIZA_MTP_SMOKE_MODEL:-}"
|
|
[[ -n "$model" && -f "$model" ]] || return 0
|
|
if command -v sha256sum >/dev/null 2>&1; then
|
|
sha256sum "$model" | awk '{print $1}'
|
|
elif command -v shasum >/dev/null 2>&1; then
|
|
shasum -a 256 "$model" | awk '{print $1}'
|
|
fi
|
|
}
|
|
|
|
write_report() {
|
|
local exit_code="$1"
|
|
[[ "$REPORT_WRITTEN_EXTERNALLY" != "true" ]] || return 0
|
|
[[ -n "$REPORT_PATH" ]] || return 0
|
|
mkdir -p "$(dirname "$REPORT_PATH")"
|
|
RUNNER="cuda_runner.sh" \
|
|
STATUS="$([[ "$exit_code" == "0" ]] && printf pass || printf fail)" \
|
|
PASS_RECORDABLE="$([[ "$exit_code" == "0" && "$GRAPH_SMOKE_STATUS" == "required" ]] && printf true || printf false)" \
|
|
EXIT_CODE="$exit_code" \
|
|
FAIL_REASON="$FAIL_REASON" \
|
|
STARTED_AT="$STARTED_AT" \
|
|
FINISHED_AT="$(date -u '+%Y-%m-%dT%H:%M:%SZ')" \
|
|
HOST_OS="$(uname -s 2>/dev/null || true)" \
|
|
HOST_ARCH="$(uname -m 2>/dev/null || true)" \
|
|
TARGET="${CUDA_TARGET:-}" \
|
|
GPU_INFO="$GPU_INFO" \
|
|
TOOLCHAIN_INFO="$TOOLCHAIN_INFO" \
|
|
CMAKE_FLAGS="${ELIZA_MTP_CMAKE_FLAGS:-}" \
|
|
MODEL="${ELIZA_MTP_SMOKE_MODEL:-}" \
|
|
MODEL_SHA256="$(model_sha256)" \
|
|
GRAPH_SMOKE_STATUS="$GRAPH_SMOKE_STATUS" \
|
|
REMOTE_DELEGATED="$REMOTE_DELEGATED" \
|
|
REPORT_PATH="$REPORT_PATH" \
|
|
node <<'NODE'
|
|
const fs = require('node:fs');
|
|
const env = process.env;
|
|
const report = {
|
|
schemaVersion: 1,
|
|
runner: env.RUNNER,
|
|
status: env.STATUS,
|
|
passRecordable: env.PASS_RECORDABLE === 'true',
|
|
exitCode: Number(env.EXIT_CODE || 0),
|
|
failureReason: env.FAIL_REASON || null,
|
|
startedAt: env.STARTED_AT,
|
|
finishedAt: env.FINISHED_AT,
|
|
host: { os: env.HOST_OS, arch: env.HOST_ARCH },
|
|
target: env.TARGET || null,
|
|
remoteDelegated: env.REMOTE_DELEGATED === 'true',
|
|
requirements: {
|
|
os: 'Linux',
|
|
toolchain: ['nvcc', 'nvidia-smi'],
|
|
hardware: 'NVIDIA GPU reported by nvidia-smi',
|
|
fixtures: 'make cuda-verify all six fixtures',
|
|
graphSmoke: env.GRAPH_SMOKE_STATUS
|
|
},
|
|
evidence: {
|
|
gpuInfo: env.GPU_INFO || null,
|
|
toolchainInfo: env.TOOLCHAIN_INFO || null,
|
|
cmakeFlags: env.CMAKE_FLAGS || null,
|
|
model: env.MODEL || null,
|
|
modelSha256: env.MODEL_SHA256 || null,
|
|
runtimeDispatchEvidenceFile: 'verify/cuda-runtime-dispatch-evidence.json'
|
|
}
|
|
};
|
|
fs.writeFileSync(env.REPORT_PATH, `${JSON.stringify(report, null, 2)}\n`);
|
|
NODE
|
|
}
|
|
|
|
finish() {
|
|
local exit_code=$?
|
|
write_report "$exit_code"
|
|
}
|
|
trap finish EXIT
|
|
trap 'on_error "$LINENO" "$BASH_COMMAND"' ERR
|
|
|
|
host_arch_target() {
|
|
case "$(uname -m)" in
|
|
x86_64|amd64) printf 'linux-x64-cuda' ;;
|
|
aarch64|arm64) printf 'linux-aarch64-cuda' ;;
|
|
*) printf 'linux-unknown-cuda' ;;
|
|
esac
|
|
}
|
|
|
|
if [[ -n "${CUDA_REMOTE:-}" ]]; then
|
|
REMOTE_DELEGATED="true"
|
|
REMOTE_DIR="${CUDA_REMOTE_DIR:-~/eliza/plugins/plugin-local-inference/native/verify}"
|
|
REMOTE_LLAMA_DIR="${ELIZA_MTP_LLAMA_DIR:-\$HOME/.cache/eliza-mtp/eliza-llama-cpp}"
|
|
REMOTE_REPORT_PATH="${CUDA_REMOTE_REPORT:-}"
|
|
if [[ -n "$REPORT_PATH" && -z "$REMOTE_REPORT_PATH" ]]; then
|
|
REMOTE_REPORT_PATH="hardware-results/$(basename "$REPORT_PATH")"
|
|
fi
|
|
REMOTE_REPORT_ARG=""
|
|
if [[ -n "$REMOTE_REPORT_PATH" ]]; then
|
|
REMOTE_REPORT_ARG="--report '$REMOTE_REPORT_PATH'"
|
|
fi
|
|
echo "[cuda_runner] remote host: $CUDA_REMOTE"
|
|
echo "[cuda_runner] remote dir: $REMOTE_DIR"
|
|
if ! ssh "$CUDA_REMOTE" "cd $REMOTE_DIR && env \
|
|
CUDA_HOME='${CUDA_HOME:-/usr/local/cuda}' \
|
|
CUDA_TARGET='${CUDA_TARGET:-}' \
|
|
CUDA_BUILD_FORK='${CUDA_BUILD_FORK:-1}' \
|
|
CUDA_SKIP_GRAPH_SMOKE='${CUDA_SKIP_GRAPH_SMOKE:-0}' \
|
|
ELIZA_MTP_CMAKE_FLAGS='${ELIZA_MTP_CMAKE_FLAGS:-}' \
|
|
ELIZA_MTP_HARDWARE_REPORT_DIR='${ELIZA_MTP_HARDWARE_REPORT_DIR:-}' \
|
|
ELIZA_MTP_LLAMA_DIR=$REMOTE_LLAMA_DIR \
|
|
ELIZA_MTP_LIBGGML_CUDA='${ELIZA_MTP_LIBGGML_CUDA:-}' \
|
|
ELIZA_MTP_SMOKE_MODEL='${ELIZA_MTP_SMOKE_MODEL:-}' \
|
|
ELIZA_MTP_SMOKE_CACHE_TYPES='${ELIZA_MTP_SMOKE_CACHE_TYPES:-}' \
|
|
ELIZA_MTP_SMOKE_TOKENS='${ELIZA_MTP_SMOKE_TOKENS:-}' \
|
|
ELIZA_MTP_SMOKE_NGL='${ELIZA_MTP_SMOKE_NGL:-}' \
|
|
ELIZA_MTP_SMOKE_PROMPT='${ELIZA_MTP_SMOKE_PROMPT:-}' \
|
|
ELIZA_MTP_SMOKE_EXTRA_ARGS='${ELIZA_MTP_SMOKE_EXTRA_ARGS:-}' \
|
|
./cuda_runner.sh $REMOTE_REPORT_ARG"; then
|
|
fail "remote CUDA verification failed on $CUDA_REMOTE"
|
|
fi
|
|
if [[ -n "$REPORT_PATH" ]]; then
|
|
REMOTE_REPORT_SOURCE="$REMOTE_REPORT_PATH"
|
|
case "$REMOTE_REPORT_SOURCE" in
|
|
/*|~*) ;;
|
|
*) REMOTE_REPORT_SOURCE="$REMOTE_DIR/$REMOTE_REPORT_SOURCE" ;;
|
|
esac
|
|
mkdir -p "$(dirname "$REPORT_PATH")"
|
|
if ! scp "$CUDA_REMOTE:$REMOTE_REPORT_SOURCE" "$REPORT_PATH"; then
|
|
fail "remote CUDA verification passed but report fetch failed: $CUDA_REMOTE:$REMOTE_REPORT_SOURCE"
|
|
fi
|
|
REPORT_WRITTEN_EXTERNALLY="true"
|
|
fi
|
|
exit 0
|
|
fi
|
|
|
|
if [[ "$(uname -s)" != "Linux" ]]; then
|
|
fail "CUDA hardware verification requires Linux + NVIDIA driver; this host is $(uname -s)."
|
|
fi
|
|
|
|
if ! command -v nvcc >/dev/null 2>&1; then
|
|
fail "nvcc not on PATH — see CUDA_VERIFICATION.md; install CUDA Toolkit on Linux"
|
|
fi
|
|
|
|
if ! command -v nvidia-smi >/dev/null 2>&1; then
|
|
fail "nvidia-smi missing — refusing to count this as CUDA hardware verification"
|
|
fi
|
|
|
|
if ! nvidia-smi -L >/dev/null 2>&1; then
|
|
fail "nvidia-smi did not report an NVIDIA GPU"
|
|
fi
|
|
|
|
CUDA_TARGET="${CUDA_TARGET:-$(host_arch_target)}"
|
|
if [[ "$CUDA_TARGET" == *unknown* ]]; then
|
|
fail "unsupported host arch for CUDA target: $(uname -m)"
|
|
fi
|
|
|
|
echo "[cuda_runner] target=$CUDA_TARGET"
|
|
GPU_INFO="$(nvidia-smi --query-gpu=name,driver_version,compute_cap --format=csv,noheader 2>/dev/null || nvidia-smi -L)"
|
|
TOOLCHAIN_INFO="$(nvcc --version)"
|
|
printf '%s\n' "$GPU_INFO"
|
|
printf '%s\n' "$TOOLCHAIN_INFO"
|
|
|
|
if [[ "${CUDA_BUILD_FORK:-1}" != "0" ]]; then
|
|
node "$REPO_ROOT/packages/app-core/scripts/build-llama-cpp-mtp.mjs" --target "$CUDA_TARGET"
|
|
fi
|
|
|
|
make cuda-verify
|
|
|
|
if [[ "${CUDA_SKIP_GRAPH_SMOKE:-0}" == "1" ]]; then
|
|
GRAPH_SMOKE_STATUS="skipped"
|
|
fail "CUDA_SKIP_GRAPH_SMOKE=1 — fixture parity only; graph dispatch NOT verified, so no hardware pass can be recorded"
|
|
fi
|
|
|
|
"$HERE/runtime_graph_smoke.sh" \
|
|
--target "$CUDA_TARGET" \
|
|
--backend-pattern 'CUDA|cuda|cuBLAS|ggml_cuda|NVIDIA' \
|
|
--gen-check
|