143 lines
7.4 KiB
Bash
Executable File
143 lines
7.4 KiB
Bash
Executable File
#!/bin/bash
|
||
# Скрипт для тестирования vision capabilities модели gemma3n:e4b-it-fp16
|
||
|
||
set -e
|
||
|
||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||
TEST_DIR="$PROJECT_DIR/test_images"
|
||
IMAGE_URL="https://yandex-images.clstorage.net/PU5vN2154/532297ZKm/lCuSfyMn0DdbJqcFVeFiB9Ti31Te2dZ1EepiRw3Cs0Qw8cQ1ND5OQRKC1yH4LnhdRtloQ4aXHng5ZSLNmXHy_8k293YSMsBWKnOvYAXBbhPcl6pYmqi-ZGWDazZo2pYkJNHpkJHrg5yiO0bEOIeEICe5cFqrojYgyNQ6mHj4e5IUb_Lri3uxo9fmXv0dMf7f1NvH9J5YVsyhRvvmtD9eTc1QfVxV42d8OotKrLTDfHx7jfDqjpIqHAyt9ngIIHsSjLtOJ7_jTYdHLn4hJWlCj_jj69gGlApIBYaTfoxPrtHFDGlYUd-PjHI3hijAm6hIb-lUFlpOehQAJTbwEGwjcqjjVns323WrR2q6CalVyg9kZ8s0jkBm8OVGr26UH86NHaD1rKnPH6zinwJIKBv8VEdF_FrGLt6QFOVqFOQY776w47YDNy8Biwfefg0lxVaL2E9L5NbAztwh8vuCcMNSEfG8aYQFBxe0Eu9CMPhz1Axz1dgqmkpSYCAR8nSA_GMSKKPa9-tzIUc7ooKthV1ykwSjrzhORKq0eRrvBlTbajF5yAUoVX-7XM7HouyU51xMaxFMBl7atixQFW4o1BznMoi_chuL8_mTO_IKce21CosEQ6Owkkhi9EGSz5pIE56NjURBxKn7pwTKt6K4FB_YYHexZG4qlsIg8GVaiJyIB0p0bx5PF4_FIy-SItWZId5f8M9_RIqg2hRVCqP2hDvSfWGAYUjJd6c8lr9mgGj7kPQbVQBCUgIm1NB9lsxQrIO-wO92fytbOQsjjiqBqa0CK9Qjy6wi6CoIfX5vZjw_pj1BKGm0UVOXuArPFngIN2AUgz3w4mZSTvz8IQYo_IhPVlQ7PiOjhyWD6wZSVZ3NDrvsC-8w4lxmzE32T1qMuy5JOTRxaNHHH0QCp4IkgMv8LH8JeJaOUj4sVOGCBBgQi5KMX74TQzOBW9cGTu35UZr3qAfj5O6kMogxjqNanMOs"
|
||
IMAGE_FILE="$TEST_DIR/test_image.jpg"
|
||
MODEL="gemma3n:e4b-it-fp16"
|
||
|
||
echo "=== Тестирование Vision Capabilities модели $MODEL ==="
|
||
echo ""
|
||
|
||
# Определяем команду docker (с sudo или без)
|
||
DOCKER_CMD="docker"
|
||
if ! docker ps >/dev/null 2>&1; then
|
||
DOCKER_CMD="sudo docker"
|
||
fi
|
||
|
||
# Проверка контейнера Ollama
|
||
echo "1. Проверка контейнера Ollama..."
|
||
if ! $DOCKER_CMD ps --format '{{.Names}}' 2>/dev/null | grep -q "^ollama$"; then
|
||
echo " ✗ Ошибка: Контейнер ollama не запущен"
|
||
echo " Запустите: docker compose up -d ollama"
|
||
exit 1
|
||
fi
|
||
echo " ✓ Контейнер ollama запущен"
|
||
|
||
# Проверка модели
|
||
echo ""
|
||
echo "2. Проверка загруженных моделей..."
|
||
MODELS=$($DOCKER_CMD exec ollama ollama list 2>/dev/null)
|
||
if echo "$MODELS" | grep -q "$MODEL"; then
|
||
echo " ✓ Модель $MODEL найдена"
|
||
echo "$MODELS" | grep "$MODEL"
|
||
else
|
||
echo " ✗ Модель $MODEL не найдена"
|
||
echo " Загрузите модель: docker exec ollama ollama pull $MODEL"
|
||
exit 1
|
||
fi
|
||
|
||
# Создаем директорию для тестовых изображений
|
||
mkdir -p "$TEST_DIR"
|
||
cd "$TEST_DIR"
|
||
|
||
# Скачиваем изображение
|
||
echo ""
|
||
echo "3. Подготовка тестового изображения..."
|
||
if [ ! -f "$IMAGE_FILE" ]; then
|
||
echo " Скачиваю изображение..."
|
||
curl -L -o "$IMAGE_FILE" "$IMAGE_URL" || {
|
||
echo " ✗ Ошибка: не удалось скачать изображение"
|
||
exit 1
|
||
}
|
||
echo " ✓ Изображение скачано: $IMAGE_FILE"
|
||
else
|
||
echo " ✓ Изображение уже существует: $IMAGE_FILE"
|
||
fi
|
||
|
||
# Проверяем размер файла
|
||
if [ -f "$IMAGE_FILE" ]; then
|
||
FILE_SIZE=$(stat -c%s "$IMAGE_FILE" 2>/dev/null || stat -f%z "$IMAGE_FILE" 2>/dev/null)
|
||
echo " Размер файла: $(numfmt --to=iec-i --suffix=B $FILE_SIZE 2>/dev/null || echo "${FILE_SIZE} bytes")"
|
||
|
||
# Проверяем тип файла
|
||
FILE_TYPE=$(file "$IMAGE_FILE" 2>/dev/null | cut -d: -f2)
|
||
echo " Тип файла: $FILE_TYPE"
|
||
fi
|
||
|
||
# Кодируем изображение в base64
|
||
echo ""
|
||
echo "4. Кодирование изображения в base64..."
|
||
IMAGE_B64=$(base64 -w 0 "$IMAGE_FILE" 2>/dev/null || base64 "$IMAGE_FILE" | tr -d '\n')
|
||
B64_LENGTH=${#IMAGE_B64}
|
||
echo " ✓ Изображение закодировано (длина: $B64_LENGTH символов)"
|
||
|
||
# Отправляем запрос к Ollama API
|
||
echo ""
|
||
echo "5. Отправка запроса к Ollama API..."
|
||
echo " Модель: $MODEL"
|
||
echo " Промпт: Опиши это изображение на русском языке. Что ты видишь на картинке?"
|
||
echo ""
|
||
|
||
# Отправляем запрос через Docker exec к Ollama API
|
||
# Используем временный файл для передачи большого base64
|
||
echo " Отправка запроса (это может занять некоторое время)..."
|
||
TEMP_FILE=$(mktemp)
|
||
cat > "$TEMP_FILE" <<EOF
|
||
{
|
||
"model": "$MODEL",
|
||
"prompt": "Опиши это изображение на русском языке. Что ты видишь на картинке?",
|
||
"images": ["$IMAGE_B64"],
|
||
"stream": false
|
||
}
|
||
EOF
|
||
|
||
# Копируем файл в контейнер и отправляем запрос
|
||
$DOCKER_CMD cp "$TEMP_FILE" ollama:/tmp/request.json >/dev/null 2>&1
|
||
RESPONSE=$($DOCKER_CMD exec ollama sh -c "curl -s --max-time 120 -X POST http://localhost:11434/api/generate \
|
||
-H 'Content-Type: application/json' \
|
||
-d @/tmp/request.json" 2>&1)
|
||
|
||
# Удаляем временный файл
|
||
rm -f "$TEMP_FILE"
|
||
|
||
# Проверяем ответ
|
||
if echo "$RESPONSE" | grep -q '"response"'; then
|
||
echo " ✓ Успешно! Ответ модели:"
|
||
echo ""
|
||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||
# Извлекаем ответ более надежным способом
|
||
echo "$RESPONSE" | python3 -c "import sys, json; data=json.load(sys.stdin); print(data.get('response', ''))" 2>/dev/null || \
|
||
echo "$RESPONSE" | grep -o '"response":"[^"]*"' | sed 's/"response":"\(.*\)"/\1/' | sed 's/\\n/\n/g' | sed 's/\\"/"/g' | head -20
|
||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||
echo ""
|
||
echo "=== ✓ Тест завершен успешно! Vision работает! ==="
|
||
elif echo "$RESPONSE" | grep -q "error\|Error\|ERROR"; then
|
||
echo " ✗ Ошибка при запросе к API:"
|
||
echo "$RESPONSE" | grep -i error || echo "$RESPONSE"
|
||
echo ""
|
||
echo "Проверьте:"
|
||
echo " 1. Логи Ollama: $DOCKER_CMD logs ollama --tail 30"
|
||
echo " 2. Поддерживает ли модель vision: $DOCKER_CMD exec ollama ollama show $MODEL"
|
||
else
|
||
echo " ⚠ Неожиданный ответ от API:"
|
||
echo "$RESPONSE"
|
||
echo ""
|
||
echo "Попробуйте проверить через веб-интерфейс Open WebUI"
|
||
fi
|
||
|
||
echo ""
|
||
echo "6. Инструкции для тестирования через веб-интерфейс:"
|
||
echo ""
|
||
echo " Шаг 1: Откройте Open WebUI: https://odo.iieasy.ru"
|
||
echo " Шаг 2: Выберите модель: $MODEL"
|
||
echo " Шаг 3: Найдите кнопку загрузки изображения в поле ввода (📎 или 📷)"
|
||
echo " Шаг 4: Загрузите изображение: $IMAGE_FILE"
|
||
echo " Шаг 5: Задайте вопрос: \"Опиши это изображение на русском языке. Что ты видишь?\""
|
||
echo ""
|
||
echo "Файл изображения: $IMAGE_FILE"
|