Spaces:
Sleeping
Sleeping
File size: 6,775 Bytes
86c402d |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 |
#!/bin/bash
# Скрипт для запуска экспериментов по оценке качества чанкинга с разными моделями и параметрами
# Директории и пути по умолчанию
DATA_FOLDER="data/docs"
DATASET_PATH="data/dataset.xlsx"
OUTPUT_DIR="data"
LOG_DIR="logs"
SIMILARITY_THRESHOLD=0.7
DEVICE="cuda:1"
# Создаем директории, если они не существуют
mkdir -p "$OUTPUT_DIR"
mkdir -p "$LOG_DIR"
# Список моделей для тестирования
MODELS=(
"intfloat/e5-base"
"intfloat/e5-large"
"BAAI/bge-m3"
"deepvk/USER-bge-m3"
"ai-forever/FRIDA"
)
# Параметры чанкинга (отсортированы в запрошенном порядке)
# Формат: [слов_в_чанке]:[нахлест]:[описание]
CHUNKING_PARAMS=(
"50:25:Маленький чанкинг с нахлёстом 50%"
"50:0:Маленький чанкинг без нахлёста"
"20:10:Очень мелкий чанкинг с нахлёстом 50%"
"100:0:Средний чанкинг без нахлёста"
"100:25:Средний чанкинг с нахлёстом 25%"
"150:50:Крупный чанкинг с нахлёстом 33%"
"200:75:Очень крупный чанкинг с нахлёстом 37.5%"
)
# Функция для запуска одного эксперимента
run_experiment() {
local model="$1"
local words="$2"
local overlap="$3"
local description="$4"
# Заменяем слеши в имени модели на подчеркивания для имен файлов
local model_safe_name=$(echo "$model" | tr '/' '_')
# Формируем имя файла результатов
local results_filename="results_fixed_size_w${words}_o${overlap}_${model_safe_name}.csv"
local results_path="${OUTPUT_DIR}/${results_filename}"
# Формируем имя файла лога
local timestamp=$(date +"%Y%m%d_%H%M%S")
local log_filename="log_${model_safe_name}_w${words}_o${overlap}_${timestamp}.txt"
local log_path="${LOG_DIR}/${log_filename}"
echo "=============================================================================="
echo "Запуск эксперимента:"
echo " Модель: $model"
echo " Чанкинг: $description (words=$words, overlap=$overlap)"
echo " Устройство: $DEVICE"
echo " Результаты будут сохранены в: $results_path"
echo " Лог: $log_path"
echo "=============================================================================="
# Базовая команда запуска
local cmd="python scripts/evaluate_chunking.py \
--data-folder \"$DATA_FOLDER\" \
--model-name \"$model\" \
--dataset-path \"$DATASET_PATH\" \
--output-dir \"$OUTPUT_DIR\" \
--words-per-chunk $words \
--overlap-words $overlap \
--similarity-threshold $SIMILARITY_THRESHOLD \
--device $DEVICE \
--force-recompute"
# Специальная обработка для модели ai-forever/FRIDA
if [[ "$model" == "ai-forever/FRIDA" ]]; then
cmd="$cmd --use-sentence-transformers"
fi
# Записываем информацию о запуске в лог
echo "Эксперимент запущен в: $(date)" > "$log_path"
echo "Команда: $cmd" >> "$log_path"
echo "" >> "$log_path"
# Записываем время начала
start_time=$(date +%s)
# Запускаем команду и записываем вывод в лог
eval "$cmd" 2>&1 | tee -a "$log_path"
exit_code=${PIPESTATUS[0]}
# Записываем время окончания
end_time=$(date +%s)
duration=$((end_time - start_time))
duration_min=$(echo "scale=2; $duration/60" | bc)
# Добавляем информацию о завершении в лог
echo "" >> "$log_path"
echo "Эксперимент завершен в: $(date)" >> "$log_path"
echo "Длительность: $duration секунд ($duration_min минут)" >> "$log_path"
echo "Код возврата: $exit_code" >> "$log_path"
if [ $exit_code -eq 0 ]; then
echo "Эксперимент успешно завершен за $duration_min минут"
else
echo "Эксперимент завершился с ошибкой (код $exit_code)"
fi
}
# Основная функция
main() {
local total_experiments=$((${#MODELS[@]} * ${#CHUNKING_PARAMS[@]}))
local completed_experiments=0
echo "Запуск $total_experiments экспериментов..."
# Засекаем время начала всех экспериментов
local start_time_all=$(date +%s)
# Сначала перебираем все параметры чанкинга
for chunking_param in "${CHUNKING_PARAMS[@]}"; do
# Разбиваем строку параметров на составляющие
IFS=':' read -r words overlap description <<< "$chunking_param"
echo -e "\n=== Стратегия чанкинга: $description (words=$words, overlap=$overlap) ===\n"
# Затем перебираем все модели для текущей стратегии чанкинга
for model in "${MODELS[@]}"; do
# Запускаем эксперимент
run_experiment "$model" "$words" "$overlap" "$description"
# Увеличиваем счетчик завершенных экспериментов
completed_experiments=$((completed_experiments + 1))
remaining_experiments=$((total_experiments - completed_experiments))
if [ $remaining_experiments -gt 0 ]; then
echo "Завершено $completed_experiments/$total_experiments экспериментов. Осталось: $remaining_experiments"
fi
done
done
# Рассчитываем общее время выполнения
local end_time_all=$(date +%s)
local total_duration=$((end_time_all - start_time_all))
local total_duration_min=$(echo "scale=2; $total_duration/60" | bc)
echo ""
echo "Все эксперименты завершены за $total_duration_min минут"
echo "Результаты сохранены в $OUTPUT_DIR"
echo "Логи сохранены в $LOG_DIR"
}
# Запускаем основную функцию
main |