Guest User

Untitled

a guest
Nov 1st, 2026
30
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 4.75 KB | None | 0 0
  1. #!/usr/bin/env bash
  2. #
  3. # ai-selector.sh — TUI-селектор локальных моделей для llama-server (dialog)
  4. #
  5. # Зависимости: dialog (sudo pacman -S dialog / sudo apt install dialog)
  6. #
  7. # Использование: ./ai-selector.sh
  8. #
  9. set -euo pipefail
  10.  
  11. LLAMA_BIN="./llama-server"          # путь к бинарнику llama-server, поправьте под себя
  12. HOST="0.0.0.0"
  13. PORT="8080"
  14.  
  15. # Общие флаги, одинаковые для всех моделей
  16. COMMON_FLAGS=(
  17.   --host "$HOST"
  18.   --port "$PORT"
  19.   -fa on
  20.   --cache-type-k q8_0
  21.   --cache-type-v q8_0
  22.   --jinja
  23.   --alias local-model
  24.   #
  25.   #--no-mmproj-offload
  26.   -np 1
  27.   -t 6 -tb 10
  28.   -b 2048 -ub 1024
  29.   -fa on
  30.   --load-mode mmap+mlock
  31.   --reasoning-format deepseek
  32.   --reasoning-preserve
  33.   --spec-type none
  34.   --image-min-tokens 1024
  35.   --temp 0.6 --top-p 0.95 --top-k 20 --min-p 0
  36. )
  37.  
  38. # ---- Реестр моделей: name | hf_repo[:quant] | ctx | ngl | n_cpu_moe | hf_file | extra_flags ----
  39. # ngl/n_cpu_moe: либо оставь ОБА пустыми, чтобы llama.cpp сам подобрал офлоад
  40. # под свободную VRAM (auto-fit), либо задавай ОБА явно. Смешивать
  41. # "auto + ручной n_cpu_moe" нельзя — auto-fit увидит ручной оверрайд и
  42. # абортится, вместо пересчёта, и словишь OOM при выделении compute-буфера.
  43. #
  44. # extra_flags идут после COMMON_FLAGS, поэтому могут переопределять
  45. # общие значения (например, --temp).
  46. declare -A MODELS=(
  47.   [1]="Qwen3.6 35B A3B (UD-Q4_K_M)|unsloth/Qwen3.6-35B-A3B-GGUF:UD-Q4_K_M|131072|999|999||-cmoe"
  48.   [2]="Tiel-Coder 35B A3B (UD-Q4_K_XL)|peculiar-ragdoll/Tiel-Coder-35B-A3B-GGUF:UD-Q4_K_XL|131072|||"
  49.   [3]="Qwen3.6 35B A3B (UD-Q5_K_XL)|unsloth/Qwen3.6-35B-A3B-GGUF:UD-Q5_K_XL|131072|999|999||-cmoe"
  50.   [4]="Gemma 4 (UD-Q5_K_XL)|unsloth/gemma-4-26B-A4B-it-GGUF:UD-Q5_K_XL|131072|999|999||-cmoe"
  51. )
  52.  
  53.  
  54.  
  55. # Проверка наличия dialog
  56. if ! command -v dialog >/dev/null 2>&1; then
  57.   echo "Ошибка: утилита 'dialog' не найдена. Установите её:"
  58.   echo "  sudo apt install dialog     # Debian/Ubuntu"
  59.   echo "  sudo pacman -S dialog       # Arch"
  60.   exit 1
  61. fi
  62.  
  63. # Сортируем пункты по ключу для стабильного порядка
  64. IFS=$'\n' sorted_keys=($(sort <<<"${!MODELS[*]}"))
  65. unset IFS
  66.  
  67. menu_items=()
  68. for key in "${sorted_keys[@]}"; do
  69.   title="${MODELS[$key]%%|*}"
  70.   menu_items+=("$key" "$title")
  71. done
  72.  
  73. CHOICE=$(dialog --clear --backtitle "Локальный AI-селектор (llama.cpp)" \
  74.   --title "Выберите модель для запуска" \
  75.   --menu "Стрелки вверх/вниз, Enter — выбрать, Esc — выход:" \
  76.   15 60 "${#sorted_keys[@]}" \
  77.   "${menu_items[@]}" \
  78.   3>&1 1>&2 2>&3) || { clear; echo "Отменено."; exit 0; }
  79.  
  80. clear
  81.  
  82. if [[ -z "${MODELS[$CHOICE]:-}" ]]; then
  83.   echo "Неизвестный выбор."
  84.   exit 1
  85. fi
  86.  
  87. IFS='|' read -r NAME REPO CTX NGL NCPUMOE HFFILE EXTRA <<<"${MODELS[$CHOICE]}"
  88.  
  89. # Защита от конфликта: n_cpu_moe задан руками, а ngl оставлен на auto (или наоборот).
  90. # Такое сочетание валит auto-fit и приводит к OOM при выделении compute-буфера.
  91. if [[ -n "$NCPUMOE" && -z "$NGL" ]]; then
  92.   echo "Ошибка конфигурации для '$NAME':"
  93.   echo "  n_cpu_moe задан ($NCPUMOE), а ngl пуст (auto)."
  94.   echo "  Это ломает auto-fit и обычно приводит к OOM."
  95.   echo "  Задайте ngl явно (например 999) либо очистите n_cpu_moe."
  96.   exit 1
  97. fi
  98. if [[ -z "$NCPUMOE" && -n "$NGL" ]]; then
  99.   echo "Ошибка конфигурации для '$NAME':"
  100.   echo "  ngl задан ($NGL), а n_cpu_moe пуст (auto)."
  101.   echo "  Задайте n_cpu_moe явно либо очистите ngl."
  102.   exit 1
  103. fi
  104.  
  105. echo "Запускаю: $NAME"
  106. echo "Репозиторий: $REPO"
  107. [[ -n "$HFFILE" ]] && echo "Файл: $HFFILE"
  108. echo "Контекст: $CTX | ngl: ${NGL:-auto} | n-cpu-moe: ${NCPUMOE:-auto}"
  109. [[ -n "$EXTRA" ]] && echo "Доп. флаги: $EXTRA"
  110. echo
  111.  
  112. HF_ARGS=(-hf "$REPO")
  113. if [[ -n "$HFFILE" ]]; then
  114.   HF_ARGS+=(--hf-file "$HFFILE")
  115. fi
  116.  
  117. TUNE_ARGS=()
  118. if [[ -n "$NGL" ]]; then
  119.   TUNE_ARGS+=(-ngl "$NGL")
  120. fi
  121. if [[ -n "$NCPUMOE" ]]; then
  122.   TUNE_ARGS+=(--n-cpu-moe "$NCPUMOE")
  123. fi
  124.  
  125. EXTRA_ARGS=()
  126. if [[ -n "$EXTRA" ]]; then
  127.   read -ra EXTRA_ARGS <<<"$EXTRA"
  128. fi
  129.  
  130. exec "$LLAMA_BIN" "${HF_ARGS[@]}" \
  131.   -c "$CTX" \
  132.   "${TUNE_ARGS[@]}" \
  133.   "${COMMON_FLAGS[@]}" \
  134.   "${EXTRA_ARGS[@]}"
Advertisement
Add Comment
Please, Sign In to add comment