diff --git a/scripts/download-frank-large-kingjones.sh b/scripts/download-frank-large-kingjones.sh new file mode 100755 index 0000000..8d1e7b6 --- /dev/null +++ b/scripts/download-frank-large-kingjones.sh @@ -0,0 +1,91 @@ +#!/usr/bin/env bash +# Download kingjones777/Qwen3.8-27B-ROCmFP4-STRIX-MTP-GGUF for frank-large +# (Dankclaw iGPU). Public repo — no auth header, and never a token on the +# command line (it is world-readable in /proc//cmdline). +# +# The payload is the repo's highest-quality target plus its MTP draft head and +# vision projector: +# * Qwen3.8-27B-Q8_0_ROCMFPX_AGENT.gguf — ftype 115, 187 tensors at plain +# Q8_0 and 311 at GGML_TYPE_Q8_0_ROCMFPX (103). The AGENT routing keeps the +# output-head tensors at full Q8_0 (187 vs 2 in the non-AGENT build), which +# is the variant to take when serving with the MTP head. +# * mtp-Qwen3.8-27B-Q4_0.gguf — the draft head. Q4_0, NOT Q8_0: the head's +# per-step cost is its projection over a 248K vocabulary, so the cheaper +# head is faster end to end at equal acceptance (author: +6.0% at n-max 1, +# +10.2% at n-max 2). +# * mmproj-Qwen3.8-27B-BF16.gguf — the vision tower (verified 4/4 on spatial +# ground truth with -fa on). +# +# Fresh downloads, no resume (`curl -C -` once produced an oversized file on a +# 31 GiB payload); -f/--fail-with-body so an HTTP 401 is not a success, then +# byte count and the Hub LFS sha256. Idempotent: complete files are skipped. +# +# The repo's own SHA256SUMS covers only the ROCmFP4 files, so the hashes below +# come from the Hub LFS oids (api/models//tree/main). +# +# Usage: +# scripts/download-frank-large-kingjones.sh [DEST_DIR] [--verify-only] +set -euo pipefail + +REPO="kingjones777/Qwen3.8-27B-ROCmFP4-STRIX-MTP-GGUF" +BASE="https://huggingface.co/${REPO}/resolve/main" + +DEST="" +VERIFY_ONLY=0 +for arg in "$@"; do + case "$arg" in + --verify-only) VERIFY_ONLY=1 ;; + *) DEST="$arg" ;; + esac +done +DEST="${DEST:-/home/dank/models/kingjones-Qwen3.8-27B-ROCmFP4-STRIX-MTP}" + +# name bytes sha256 +FILES=( + "Qwen3.8-27B-Q8_0_ROCMFPX_AGENT.gguf 28214425952 f3ef2bdbf56e244fff14b72114dc2aa300b84a4cb4eaf54f2e5e4da1cfcae10b" + "mtp-Qwen3.8-27B-Q4_0.gguf 1680271648 051a1764cff8c4f3ee6ae8b00593a0364c7539c67fa50ffc58f3f96509fca38e" + "mmproj-Qwen3.8-27B-BF16.gguf 931145888 de2a49866988ea272c43dc2a43ee2662c25725a717ca5b9059ea420a97f53fe8" +) + +mkdir -p "$DEST" +status=0 +for entry in "${FILES[@]}"; do + read -r name size sha <<<"$entry" + f="$DEST/$name" + have=0 + if [[ -f "$f" ]] && [[ "$(stat -c%s "$f")" == "$size" ]]; then + if sha256sum -c --quiet <(printf '%s %s\n' "$sha" "$f"); then + have=1 + fi + fi + if (( have )); then + echo "OK $name" + continue + fi + if (( VERIFY_ONLY )); then + echo "MISSING $name" + status=1 + continue + fi + echo "FETCHING $name" + tmp="$f.part" + curl -fsSL --fail-with-body -o "$tmp" "$BASE/$name" + mv "$tmp" "$f" + if [[ "$(stat -c%s "$f")" != "$size" ]]; then + echo "SIZE FAIL $name ($(stat -c%s "$f") != $size)" + status=1 + continue + fi + if ! sha256sum -c --quiet <(printf '%s %s\n' "$sha" "$f"); then + echo "SHA FAIL $name" + status=1 + continue + fi + echo "VERIFIED $name" +done +if (( status == 0 )); then + echo "DOWNLOAD_DONE $DEST" +else + echo "DOWNLOAD_FAILED $DEST" >&2 +fi +exit "$status" diff --git a/scripts/download-frank-small.sh b/scripts/download-frank-small.sh new file mode 100755 index 0000000..46d2927 --- /dev/null +++ b/scripts/download-frank-small.sh @@ -0,0 +1,79 @@ +#!/usr/bin/env bash +# Download bartowski/MiMo-V2.6-Distill-Qwen-9B-GGUF:Q5_K_M for frank-small +# (llama.cpp on the RTX 3090). Public repo — no auth header, and never a token +# on the command line (it is world-readable in /proc//cmdline). +# +# Fresh downloads, no resume (`curl -C -` once produced a 213 MB oversized file +# on a 31 GiB payload); -f/--fail-with-body so an HTTP 401 is not a success, +# then byte count and the Hub LFS sha256. Idempotent: complete files are +# skipped. +# +# The Q6_K file this endpoint served until 2026-10-01 night stays on disk as +# the rollback target (7793710624 B, LFS oid +# ef96d05a2ddf2cbb450d1af1ac3860ec769d3575bafa70692ee5609bda3fad7d) — re-fetch +# it from the same repo with the same recipe if it is ever needed again. +# +# Usage: +# scripts/download-frank-small.sh [DEST_DIR] [--verify-only] +set -euo pipefail + +REPO="bartowski/MiMo-V2.6-Distill-Qwen-9B-GGUF" +BASE="https://huggingface.co/${REPO}/resolve/main" + +DEST="" +VERIFY_ONLY=0 +for arg in "$@"; do + case "$arg" in + --verify-only) VERIFY_ONLY=1 ;; + *) DEST="$arg" ;; + esac +done +DEST="${DEST:-/home/dank/models/MiMo-Q5KM}" + +# name bytes sha256 +FILES=( + "MiMo-V2.6-Distill-Qwen-9B-Q5_K_M.gguf 6876124704 04cf46f2b5584ef922697d6c063f94879434fb86c467f1a09e52daf0cddaf35f" +) + +mkdir -p "$DEST" +status=0 +for entry in "${FILES[@]}"; do + read -r name size sha <<<"$entry" + f="$DEST/$name" + have=0 + if [[ -f "$f" ]] && [[ "$(stat -c%s "$f")" == "$size" ]]; then + if sha256sum -c --quiet <(printf '%s %s\n' "$sha" "$f"); then + have=1 + fi + fi + if (( have )); then + echo "OK $name" + continue + fi + if (( VERIFY_ONLY )); then + echo "MISSING $name" + status=1 + continue + fi + echo "FETCHING $name" + tmp="$f.part" + curl -fsSL --fail-with-body -o "$tmp" "$BASE/$name" + mv "$tmp" "$f" + if [[ "$(stat -c%s "$f")" != "$size" ]]; then + echo "SIZE FAIL $name ($(stat -c%s "$f") != $size)" + status=1 + continue + fi + if ! sha256sum -c --quiet <(printf '%s %s\n' "$sha" "$f"); then + echo "SHA FAIL $name" + status=1 + continue + fi + echo "VERIFIED $name" +done +if (( status == 0 )); then + echo "DOWNLOAD_DONE $DEST" +else + echo "DOWNLOAD_FAILED $DEST" >&2 +fi +exit "$status"