83 lines
6.4 KiB
Bash
Executable file
83 lines
6.4 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# Writes tools/prover-floor/pc2-build-server.ps1 with proving/prover-floor/sp1-gpu-6.8.1-floor.patch embedded
|
|
# (base64), so the playbook and the patch cannot drift. Run after every change to the patch.
|
|
set -euo pipefail
|
|
HERE="$(cd "$(dirname "$0")" && pwd)"; ROOT="$(cd "$HERE/../.." && pwd)"
|
|
PATCH="$ROOT/proving/prover-floor/sp1-gpu-6.8.1-floor.patch"
|
|
SHA="$(shasum -a 256 "$PATCH" | cut -c1-64)"
|
|
B64="$(base64 < "$PATCH" | tr -d '\n')"
|
|
OUT="$HERE/pc2-build-server.ps1"
|
|
cat > "$OUT" <<PS
|
|
# Prover floor (5 October 2026): builds sp1-gpu-server 6.8.1 from source with the Igneum floor patch on PC 2 inside
|
|
# WSL2 Ubuntu-24.04 as root, into /opt/igneum-floor (the live /root/.sp1/bin/sp1-gpu-server and /opt/igneum are
|
|
# never touched). CPU only: the miners keep mining, the card is not used. Generated by make-build-playbook.sh;
|
|
# patch sha256 $SHA. CUDA_ARCHS=86,89,120 (the 12 GB tier is sm_86 (3060) and sm_89 (4070), the 16 GB tier sm_89 and sm_120; PC 2 runs sm_120; a shipped build lists every target the stock server does: 80, 86, 89, 90, 100, 120).
|
|
\$ErrorActionPreference = 'Continue'
|
|
function Stamp { (Get-Date).ToUniversalTime().ToString('yyyy-MM-ddTHH:mm:ssZ') }
|
|
"RESULT start \$(Stamp)"
|
|
\$job = \$env:IGNEUM_JOB_DIR; if (-not \$job) { \$job = Join-Path \$env:TEMP 'igneum-floor' }; New-Item -ItemType Directory -Force -Path \$job | Out-Null
|
|
function WslPath(\$p) { \$w = (& wsl.exe -d Ubuntu-24.04 -u root -- wslpath -a (\$p -replace '\\\\', '/') 2>\$null); if (\$w) { (\$w -replace "\`0", '').Trim() } else { '/mnt/c' + (\$p.Substring(2) -replace '\\\\', '/') } }
|
|
\$patchB64 = '$B64'
|
|
[IO.File]::WriteAllBytes((Join-Path \$job 'floor.patch'), [Convert]::FromBase64String(\$patchB64))
|
|
\$patchW = WslPath (Join-Path \$job 'floor.patch')
|
|
\$bash = @'
|
|
set -uo pipefail
|
|
export PATH="\$HOME/.cargo/bin:/usr/local/go/bin:\$PATH"
|
|
CUDA_DIR="\$(ls -d /usr/local/cuda-12.* 2>/dev/null | sort -V | tail -1 || true)"
|
|
if [ -z "\$CUDA_DIR" ]; then echo "RESULT build_failed no /usr/local/cuda-12.*"; exit 2; fi
|
|
export CUDA_PATH="\$CUDA_DIR" CUDACXX="\$CUDA_DIR/bin/nvcc" PATH="\$CUDA_DIR/bin:\$PATH" LD_LIBRARY_PATH="\$CUDA_DIR/lib64:/usr/lib/wsl/lib:\${LD_LIBRARY_PATH:-}"
|
|
stamp() { date -u +%Y-%m-%dT%H:%M:%SZ; }
|
|
FLOOR=/opt/igneum-floor; SRC=\$FLOOR/sp1; mkdir -p \$FLOOR/bin \$FLOOR/home/.sp1/bin \$FLOOR/logs
|
|
PATCH="PATCH_PATH_PLACEHOLDER"
|
|
echo "RESULT patch_sha256 \$(sha256sum "\$PATCH" | cut -c1-64) expected $SHA"
|
|
echo "RESULT toolchain nvcc=\$(nvcc --version | grep -o 'release [0-9.]*') cargo=\$(cargo --version) go=\$(go version 2>/dev/null || echo MISSING) protoc=\$(protoc --version 2>/dev/null || echo MISSING) cmake=\$(cmake --version 2>/dev/null | head -1 || echo MISSING) nproc=\$(nproc) disk_avail=\$(df -BG /opt | awk 'NR==2 {print \$4}')"
|
|
if [ ! -d "\$SRC/.git" ]; then
|
|
echo "STAGE clone \$(stamp)"
|
|
git clone -q --depth 1 --branch v6.8.1 https://github.com/succinctlabs/sp1 "\$SRC" 2>&1 | tail -2 || { echo "RESULT build_failed clone"; exit 2; }
|
|
fi
|
|
cd "\$SRC"
|
|
git checkout -q -- . && git clean -qfd sp1-gpu/crates >/dev/null 2>&1
|
|
echo "RESULT source \$(git describe --tags --always) \$(git rev-parse HEAD)"
|
|
git apply "\$PATCH" || { echo "RESULT build_failed patch does not apply"; exit 2; }
|
|
touch sp1-gpu/crates/prover_components/src/builder.rs sp1-gpu/crates/jagged_tracegen/src/lib.rs sp1-gpu/crates/server/src/server.rs
|
|
echo "RESULT patched \$(git diff --stat | tail -1)"
|
|
# Go, as the release workflow installs it (the server's native-gnark feature compiles the gnark library with go;
|
|
# the wrap path is never run by a compressed proof, but the feature is upstream's and stays): a pinned tarball
|
|
# unpacked under /opt/igneum-floor, on this job's PATH only, no package installed on the PC.
|
|
if ! command -v go >/dev/null 2>&1; then
|
|
if [ ! -x \$FLOOR/go/bin/go ]; then
|
|
echo "STAGE go \$(stamp) fetching go1.27.1 (70,553,950 bytes, sha256 63d339f0...)"
|
|
curl -sSL -o \$FLOOR/go.tgz https://go.dev/dl/go1.27.1.linux-amd64.tar.gz || { echo "RESULT build_failed go download"; exit 2; }
|
|
echo "63d339f0da5ab53635a56f2490a7984dfe12dfcff22ad749f63edaf590168445 \$FLOOR/go.tgz" | sha256sum -c - >/dev/null || { echo "RESULT build_failed go sha256 mismatch: \$(sha256sum \$FLOOR/go.tgz)"; exit 2; }
|
|
echo "RESULT go_tarball sha256 \$(sha256sum \$FLOOR/go.tgz | cut -c1-64) matches 63d339f0da5ab53635a56f2490a7984dfe12dfcff22ad749f63edaf590168445"
|
|
tar -xzf \$FLOOR/go.tgz -C \$FLOOR && rm -f \$FLOOR/go.tgz
|
|
fi
|
|
export PATH="\$FLOOR/go/bin:\$PATH" GOPATH=\$FLOOR/gopath GOCACHE=\$FLOOR/gocache GOFLAGS=-mod=mod
|
|
fi
|
|
echo "RESULT go \$(go version 2>&1 | head -1)"
|
|
LOG=\$FLOOR/logs/build.log; : > "\$LOG"
|
|
echo "RESULT dirs \$(ls -ld \$FLOOR \$FLOOR/logs 2>&1 | tr '\\n' ' ') pwd=\$(pwd)"
|
|
export CUDA_ARCHS=86,89,120 CARGO_TARGET_DIR=\$FLOOR/target
|
|
JOBS=8
|
|
echo "STAGE build \$(stamp) jobs=\$JOBS"
|
|
t0=\$(date +%s)
|
|
nice -n 19 cargo build --release --bin sp1-gpu-server -j \$JOBS >> "\$LOG" 2>&1 &
|
|
BP=\$!
|
|
while kill -0 \$BP 2>/dev/null; do sleep 120; echo "STAGE building \$(stamp) \$(( (\$(date +%s) - t0) / 60 )) min: \$(grep -c '^ Compiling' "\$LOG") crates compiled, last: \$(grep '^ Compiling' "\$LOG" | tail -1 | tr -s ' ' | cut -c1-80)"; done
|
|
wait \$BP; rc=\$?
|
|
echo "RESULT build_exit \$rc time_s=\$(( \$(date +%s) - t0 )) crates=\$(grep -c '^ Compiling' "\$LOG")"
|
|
if [ \$rc -ne 0 ]; then echo "RESULT build_failed"; echo "== error lines =="; grep -n -B2 -A12 -E '^(error|warning: unused manifest| process didn|caused by)' "\$LOG" | head -100; echo "== log tail =="; tail -n 60 "\$LOG"; exit 2; fi
|
|
BIN=\$FLOOR/target/release/sp1-gpu-server
|
|
cp "\$BIN" \$FLOOR/bin/sp1-gpu-server && cp "\$BIN" \$FLOOR/home/.sp1/bin/sp1-gpu-server && chmod +x \$FLOOR/bin/sp1-gpu-server \$FLOOR/home/.sp1/bin/sp1-gpu-server
|
|
echo "RESULT binary bytes=\$(stat -c %s "\$BIN") sha256=\$(sha256sum "\$BIN" | cut -c1-64) version=\$(\$BIN --version 2>/dev/null)"
|
|
echo "RESULT elf_targets \$(cuobjdump --list-elf "\$BIN" 2>/dev/null | grep -o 'sm_[0-9]*' | sort -u | tr '\n' ' ')"
|
|
echo "RESULT live_server_untouched sha256=\$(sha256sum /root/.sp1/bin/sp1-gpu-server | cut -c1-16) (expected c2642ad1c42e85d8)"
|
|
echo "RESULT end \$(stamp)"
|
|
'@
|
|
\$bash = \$bash.Replace('PATCH_PATH_PLACEHOLDER', \$patchW)
|
|
\$bashFile = Join-Path \$job 'build.sh'
|
|
[IO.File]::WriteAllText(\$bashFile, (\$bash -replace "\`r\`n", "\`n"), (New-Object System.Text.UTF8Encoding \$false))
|
|
& wsl.exe -d Ubuntu-24.04 -u root -- bash (WslPath \$bashFile) 2>&1 | ForEach-Object { (\$_ -replace "\`0", '') }
|
|
"RESULT end \$(Stamp)"
|
|
PS
|
|
echo "wrote $OUT ($(wc -c < "$OUT") bytes, patch $SHA)"
|