Last active
August 17, 2024 01:12
-
-
Save crasm/41b5b11111d2f2419b31da159fa77447 to your computer and use it in GitHub Desktop.
Shell script for merging TheBloke's .gguf-split model files
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/sh | |
log() { | |
format="$1"; shift | |
# shellcheck disable=SC2059 | |
>&2 printf "$format\n" "$@" | |
} | |
usage() { | |
>&2 cat <<EOF | |
usage: $(basename "$0") [-d] <model-prefix> | |
options: | |
-d (delete split files during merge, saves space) | |
example: | |
$ $(basename "$0") airoboros-l2-70b-2.1-creative.Q8_0.gguf-split- | |
Merging: | |
airoboros-l2-70b-2.1-creative.Q8_0.gguf-split-a | |
airoboros-l2-70b-2.1-creative.Q8_0.gguf-split-b | |
Into: | |
airoboros-l2-70b-2.1-creative.Q8_0.gguf | |
... | |
EOF | |
exit 1 | |
} | |
# This is called by an interrupt | |
# shellcheck disable=SC2317 | |
cleanup() { | |
if [ -n "$1" ]; then | |
log "$@" | |
else | |
log 'Interrupted...' | |
fi | |
if [ -w "$split_a" ] && [ -n "$split_a_size" ]; then | |
log 'Truncating "%s" to original size: %s bytes\n' "$split_a" "$split_a_size" | |
truncate -c -s "$split_a_size" "$split_a" | |
fi | |
exit 1 | |
} | |
opt_delete= | |
while getopts 'd' opt; do | |
case $opt in | |
'd') | |
opt_delete='true' | |
shift | |
;; | |
'?') | |
log 'Invalid option: %s' "-$OPTARG" | |
usage | |
esac | |
done | |
if [ "$#" -ne 1 ]; then | |
usage | |
fi | |
model="$1" | |
# Load file glob into arg array | |
set -- "${model}"* | |
# Check if the glob failed to expand | |
if [ "$1" = "${model}*" ]; then | |
log 'No files found.' | |
exit 1 | |
fi | |
split_a="$1" | |
split_a_size="$(stat -c '%s' "$split_a")" | |
target="$(echo "$split_a" | sed 's/-split-a$//')" | |
log 'Merging:' | |
log '\t%s' "$@" | |
log 'Into:\n\t%s\n' "$target" | |
>&2 printf 'Continue? [Y/n] ' | |
read -r response | |
case "$response" in | |
[Yy]|"") ;; | |
*) | |
log 'Exiting...' | |
exit 0 | |
;; | |
esac | |
# Enable cleanup hook now, since we will begin operating on the files | |
trap cleanup INT | |
# Remove $1 (...-split-a) from arg array, which is the target for the appends | |
shift | |
for i in "$@"; do | |
log "Appending $i" | |
dd if="$i" of="$split_a" bs=32M oflag=append conv=notrunc status=progress || cleanup 'dd exited with error: %s' "$?" | |
if [ "$opt_delete" = 'true' ]; then | |
rm -vf "$i" || log 'failed to rm %s' "$i" | |
fi | |
done | |
mv -vf "$split_a" "$target" |
ghost
commented
Nov 3, 2023
•
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment