Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env bash
- #
- # ai-selector.sh — TUI-селектор локальных моделей для llama-server (dialog)
- #
- # Зависимости: dialog (sudo pacman -S dialog / sudo apt install dialog)
- #
- # Использование: ./ai-selector.sh
- #
- set -euo pipefail
- LLAMA_BIN="./llama-server" # путь к бинарнику llama-server, поправьте под себя
- HOST="0.0.0.0"
- PORT="8080"
- # Общие флаги, одинаковые для всех моделей
- COMMON_FLAGS=(
- --host "$HOST"
- --port "$PORT"
- -fa on
- --cache-type-k q8_0
- --cache-type-v q8_0
- --jinja
- --alias local-model
- #
- #--no-mmproj-offload
- -np 1
- -t 6 -tb 10
- -b 2048 -ub 1024
- -fa on
- --load-mode mmap+mlock
- --reasoning-format deepseek
- --reasoning-preserve
- --spec-type none
- --image-min-tokens 1024
- --temp 0.6 --top-p 0.95 --top-k 20 --min-p 0
- )
- # ---- Реестр моделей: name | hf_repo[:quant] | ctx | ngl | n_cpu_moe | hf_file | extra_flags ----
- # ngl/n_cpu_moe: либо оставь ОБА пустыми, чтобы llama.cpp сам подобрал офлоад
- # под свободную VRAM (auto-fit), либо задавай ОБА явно. Смешивать
- # "auto + ручной n_cpu_moe" нельзя — auto-fit увидит ручной оверрайд и
- # абортится, вместо пересчёта, и словишь OOM при выделении compute-буфера.
- #
- # extra_flags идут после COMMON_FLAGS, поэтому могут переопределять
- # общие значения (например, --temp).
- declare -A MODELS=(
- [1]="Qwen3.6 35B A3B (UD-Q4_K_M)|unsloth/Qwen3.6-35B-A3B-GGUF:UD-Q4_K_M|131072|999|999||-cmoe"
- [2]="Tiel-Coder 35B A3B (UD-Q4_K_XL)|peculiar-ragdoll/Tiel-Coder-35B-A3B-GGUF:UD-Q4_K_XL|131072|||"
- [3]="Qwen3.6 35B A3B (UD-Q5_K_XL)|unsloth/Qwen3.6-35B-A3B-GGUF:UD-Q5_K_XL|131072|999|999||-cmoe"
- [4]="Gemma 4 (UD-Q5_K_XL)|unsloth/gemma-4-26B-A4B-it-GGUF:UD-Q5_K_XL|131072|999|999||-cmoe"
- )
- # Проверка наличия dialog
- if ! command -v dialog >/dev/null 2>&1; then
- echo "Ошибка: утилита 'dialog' не найдена. Установите её:"
- echo " sudo apt install dialog # Debian/Ubuntu"
- echo " sudo pacman -S dialog # Arch"
- exit 1
- fi
- # Сортируем пункты по ключу для стабильного порядка
- IFS=$'\n' sorted_keys=($(sort <<<"${!MODELS[*]}"))
- unset IFS
- menu_items=()
- for key in "${sorted_keys[@]}"; do
- title="${MODELS[$key]%%|*}"
- menu_items+=("$key" "$title")
- done
- CHOICE=$(dialog --clear --backtitle "Локальный AI-селектор (llama.cpp)" \
- --title "Выберите модель для запуска" \
- --menu "Стрелки вверх/вниз, Enter — выбрать, Esc — выход:" \
- 15 60 "${#sorted_keys[@]}" \
- "${menu_items[@]}" \
- 3>&1 1>&2 2>&3) || { clear; echo "Отменено."; exit 0; }
- clear
- if [[ -z "${MODELS[$CHOICE]:-}" ]]; then
- echo "Неизвестный выбор."
- exit 1
- fi
- IFS='|' read -r NAME REPO CTX NGL NCPUMOE HFFILE EXTRA <<<"${MODELS[$CHOICE]}"
- # Защита от конфликта: n_cpu_moe задан руками, а ngl оставлен на auto (или наоборот).
- # Такое сочетание валит auto-fit и приводит к OOM при выделении compute-буфера.
- if [[ -n "$NCPUMOE" && -z "$NGL" ]]; then
- echo "Ошибка конфигурации для '$NAME':"
- echo " n_cpu_moe задан ($NCPUMOE), а ngl пуст (auto)."
- echo " Это ломает auto-fit и обычно приводит к OOM."
- echo " Задайте ngl явно (например 999) либо очистите n_cpu_moe."
- exit 1
- fi
- if [[ -z "$NCPUMOE" && -n "$NGL" ]]; then
- echo "Ошибка конфигурации для '$NAME':"
- echo " ngl задан ($NGL), а n_cpu_moe пуст (auto)."
- echo " Задайте n_cpu_moe явно либо очистите ngl."
- exit 1
- fi
- echo "Запускаю: $NAME"
- echo "Репозиторий: $REPO"
- [[ -n "$HFFILE" ]] && echo "Файл: $HFFILE"
- echo "Контекст: $CTX | ngl: ${NGL:-auto} | n-cpu-moe: ${NCPUMOE:-auto}"
- [[ -n "$EXTRA" ]] && echo "Доп. флаги: $EXTRA"
- echo
- HF_ARGS=(-hf "$REPO")
- if [[ -n "$HFFILE" ]]; then
- HF_ARGS+=(--hf-file "$HFFILE")
- fi
- TUNE_ARGS=()
- if [[ -n "$NGL" ]]; then
- TUNE_ARGS+=(-ngl "$NGL")
- fi
- if [[ -n "$NCPUMOE" ]]; then
- TUNE_ARGS+=(--n-cpu-moe "$NCPUMOE")
- fi
- EXTRA_ARGS=()
- if [[ -n "$EXTRA" ]]; then
- read -ra EXTRA_ARGS <<<"$EXTRA"
- fi
- exec "$LLAMA_BIN" "${HF_ARGS[@]}" \
- -c "$CTX" \
- "${TUNE_ARGS[@]}" \
- "${COMMON_FLAGS[@]}" \
- "${EXTRA_ARGS[@]}"
Advertisement
Add Comment
Please, Sign In to add comment