diff --git a/scripts/download-frank-large-dflash.sh b/scripts/download-frank-large-dflash.sh new file mode 100755 index 0000000..881facc --- /dev/null +++ b/scripts/download-frank-large-dflash.sh @@ -0,0 +1,76 @@ +#!/usr/bin/env bash +# Download the z-lab Qwen3.5-9B-DFlash drafter for frank-large's DFlash +# speculative-decode arm (vLLM --speculative-config method=dflash). Public +# repo — no auth header on the command line. +# +# The drafter is a 6-layer qwen3 draft whose dflash_config pins +# target_layer_ids [1,5,9,13,17,21,25,29] and block_size 16; its hidden_size +# 4096 / vocab_size 248320 match the MiMo-V2.6-Distill-Qwen-9B target exactly +# (both preserve the Qwen3.5-9B geometry), which is what lets vLLM load it as +# the draft for that target. +# +# Usage: +# scripts/download-frank-large-dflash.sh [DEST_DIR] [--verify-only] +set -euo pipefail + +REPO="z-lab/Qwen3.5-9B-DFlash" +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/Qwen3.5-9B-DFlash}" + +# name bytes sha256(- = non-LFS, size-only check) +FILES=( + "model.safetensors 2583816465 0a42274b32554f48de1faa0d42824e9c2ceda649c30ae0a731cddf410dd698c7" + "config.json 1222 -" +) + +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 [[ "$sha" == "-" ]] || 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 [[ "$sha" != "-" ]] && ! 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-large-mimo.sh b/scripts/download-frank-large-mimo.sh new file mode 100755 index 0000000..b49573a --- /dev/null +++ b/scripts/download-frank-large-mimo.sh @@ -0,0 +1,90 @@ +#!/usr/bin/env bash +# Download the BF16 MiMo-V2.6-Distill-Qwen-9B payload for frank-large +# (vLLM/kyuz0 gfx1151, Strix Halo iGPU). Public repo — no auth header on the +# command line (a Bearer token in argv is world-readable via /proc). +# +# Per-file FRESH downloads, no resume: the house rule (see +# download-frank-small.sh); -f/--fail-with-body plus size+sha256 against the +# Hub LFS oid is what makes an access error fail instead of "succeeding". +# +# Usage: +# scripts/download-frank-large-mimo.sh [DEST_DIR] [--verify-only] +# +# The verified set below is exactly what the 2026-10-01 bench window served: +# 17.53 GiB of BF16 weights (4 shards, 18,819,720,848 B total with the rest). +set -euo pipefail + +REPO="XiaomiMiMo/MiMo-V2.6-Distill-Qwen-9B" +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-V2.6-Distill-Qwen-9B-BF16}" + +# name bytes sha256(- = non-LFS, size-only check) +FILES=( + "model-00001-of-00004.safetensors 5276436216 aab052180118aee34abc3029b54eaa49096aac606b97d703866b420dceb703c3" + "model-00002-of-00004.safetensors 5033171280 7a0486565f06d25ac4628e9dba470dc3f604353471d240d5a0bf7128f64df396" + "model-00003-of-00004.safetensors 5234499504 6c73207563d1879bfd6c143a028cc70be68edff56280458c71a43df4240300f4" + "model-00004-of-00004.safetensors 3275613848 1379a7cf8c0b8555a39ab65a47e830e0eb45e776b46045734da3afd73c09eea2" + "model.safetensors.index.json 69217 -" + "config.json 2784 -" + "generation_config.json 126 -" + "chat_template.jinja 3916 -" + "tokenizer.json 19989325 06b9509352d2af50381ab2247e083b80d32d5c0aba91c272ca9ff729b6a0e523" + "tokenizer_config.json 1165 -" + "vocab.json 6722759 -" + "merges.txt 3353259 -" + "preprocessor_config.json 443 -" + "processor_config.json 1191 -" + "video_preprocessor_config.json 385 -" +) + +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 [[ "$sha" == "-" ]] || 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 [[ "$sha" != "-" ]] && ! 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-large-qwen35.sh b/scripts/download-frank-large-qwen35.sh new file mode 100755 index 0000000..4b2dcb5 --- /dev/null +++ b/scripts/download-frank-large-qwen35.sh @@ -0,0 +1,85 @@ +#!/usr/bin/env bash +# Download the source Qwen3.5-9B checkpoint — the ONLY place this model +# family's MTP head (15 mtp.* tensors) exists. frank-large runs it as the +# vLLM cross-model MTP draft (MiMo-V2.6-Distill-Qwen-9B itself ships zero +# mtp tensors; that is why SGLang's NEXTN on frank-small draws 0.00 +# acceptance). Public repo — no auth header on the command line. +# +# NOTE the odd upstream shard names (model.safetensors-0000N-of-00004...). +# +# Usage: +# scripts/download-frank-large-qwen35.sh [DEST_DIR] [--verify-only] +set -euo pipefail + +REPO="Qwen/Qwen3.5-9B" +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/Qwen3.5-9B}" + +# name bytes sha256(- = non-LFS, size-only check) +FILES=( + "model.safetensors-00001-of-00004.safetensors 5276436216 db6f444b43d318c92f360a13a25561a6a65b10c0631b8ed305a426dbaa6c380e" + "model.safetensors-00002-of-00004.safetensors 5335161512 31c7d7e2dd5d207840b31cc59083c8f4c4718959149e0358c0364052bb9a0330" + "model.safetensors-00003-of-00004.safetensors 5368717440 7ec36ba3a4176a44c3c0876ad80c56a2f70c84bf008d82e9501df642f17dadec" + "model.safetensors-00004-of-00004.safetensors 3325995712 b62b0c4cd7e44edee103ee8f4fe225f246d5e768e07bfd5f25b63a8aa1fdd0c6" + "model.safetensors.index.json 79657 -" + "config.json 3126 -" + "chat_template.jinja 7756 -" + "tokenizer.json 12807982 5f9e4d4901a92b997e463c1f46055088b6cca5ca61a6522d1b9f64c4bb81cb42" + "tokenizer_config.json 16710 -" + "vocab.json 6722759 -" + "merges.txt 3353259 -" + "preprocessor_config.json 390 -" + "video_preprocessor_config.json 385 -" +) + +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 [[ "$sha" == "-" ]] || 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 [[ "$sha" != "-" ]] && ! 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"