@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
title Llama.cpp Librarian and Benchmark Tool v10
REM =========================================================
REM CONFIG & DEFAULTS
REM =========================================================
set "BASE=%~dp0"
set "MODELS_DIR=%BASE%models"
set "BENCH_DB=%BASE%model_library_benchmark.csv"
set "LLAMA_BENCH=%BASE%llama-bench.exe"
REM --- Keywords for Role Detection ---
set "KEYWORDS=NSFW Uncensored Amoral Dark Fallen Rivermind Snowpiercer Abyss Erebus Lewd Heretic"
REM Default Bench Settings
set THREADS=8
set GPU_LAYERS=999
REM =========================================================
REM HARDWARE DETECTION
REM =========================================================
:GET_STATS
echo Detecting Hardware Context...
set "CPU_NAME=Unknown"
set "GPU_NAME=N/A"
set "VRAM_TOTAL_GB=0"
set "VRAM_FREE_GB=0"
set "RAM_TOTAL_GB=0"
set "DRIVER_VER=N/A"
REM --- CPU ---
for /f "skip=1 delims=" %%a in ('wmic cpu get name 2^>nul') do if not defined CPU_NAME set "CPU_NAME=%%a"
for /f "tokens=* delims= " %%a in ("%CPU_NAME%") do set "CPU_NAME=%%a"
REM --- RAM ---
for /f "skip=1" %%p in ('wmic os get TotalVisibleMemorySize') do if not defined RAM_RAW set "RAM_RAW=%%p"
set /a RAM_TOTAL_GB=%RAM_RAW%/1024/1024
REM --- GPU ---
nvidia-smi --query-gpu=name,memory.total,memory.free,driver_version --format=csv,noheader,nounits > "%BASE%gpu.tmp" 2>nul
if %errorlevel%==0 (
for /f "tokens=1,2,3,4 delims=," %%a in ('type "%BASE%gpu.tmp"') do (
set "GPU_NAME=%%a"
set /a VRAM_TOTAL_GB=%%b/1024
set /a VRAM_FREE_GB=%%c/1024
set "DRIVER_VER=%%d"
)
del "%BASE%gpu.tmp"
)
REM =========================================================
REM MAIN MENU
REM =========================================================
:MAIN_MENU
cls
echo ========================================================
echo LIBRARIAN AND BENCHMARK v10
echo ========================================================
echo SYSTEM CONTEXT:
echo GPU: %GPU_NAME% (%VRAM_FREE_GB%GB / %VRAM_TOTAL_GB%GB)
echo RAM: %RAM_TOTAL_GB%GB System Memory
echo Drv: %DRIVER_VER%
echo ========================================================
echo.
echo [1] Scan Library (Sorted by Size/Quant)
echo [2] View Leaderboard (Top Speed)
echo [3] View Full Database
echo [4] Exit
echo.
set /p "CHOICE=Selection: "
if "%CHOICE%"=="1" goto :SCAN_MODELS
if "%CHOICE%"=="2" goto :LEADERBOARD
if "%CHOICE%"=="3" goto :VIEW_DB
if "%CHOICE%"=="4" exit
goto :MAIN_MENU
REM =========================================================
REM INTELLIGENT SCANNING ENGINE
REM =========================================================
:SCAN_MODELS
cls
echo Indexing Library...
echo.
set count=0
REM --- Initialize CSV Header if missing ---
if not exist "%BENCH_DB%" (
echo Model_Name,Size_GB,Quant,Role,Template_Guess,Fit_Status,Ingest_PP512,Gen_TG128,Rating,GPU,Date > "%BENCH_DB%"
)
for %%F in ("%MODELS_DIR%\*.gguf") do (
set "fname=%%~nxF"
set "fpath=%%F"
echo !fname! | findstr /i "mmproj" >nul
if !errorlevel! NEQ 0 (
set /a count+=1
REM --- 1. Size Calculation ---
set "size_gb=0"
for /f "usebackq" %%S in (`powershell -NoProfile -Command "[int][math]::Round(%%~zF / 1GB)"`) do set "size_gb=%%S"
REM --- 2. Fit Analysis ---
set "fit_status=Unknown"
if !size_gb! LSS !VRAM_FREE_GB! (
set "fit_status=GPU_FAST"
) else (
set /a total_mem=!VRAM_FREE_GB! + !RAM_TOTAL_GB!
if !size_gb! LSS !total_mem! (
set "fit_status=CPU_SPLIT"
) else (
set "fit_status=TOO_LARGE"
)
)
REM --- 3. Role Detection ---
set "role=General"
echo !fname! | findstr /I "%KEYWORDS%" >nul
if !errorlevel! EQU 0 set "role=Specialized/NSFW"
REM --- 4. Template Heuristics ---
set "tmpl=Unknown"
echo !fname! | findstr /I "llama-3 llama3 dark-nexus rivermind snowpiercer" >nul
if !errorlevel! EQU 0 set "tmpl=Llama3"
echo !fname! | findstr /I "mistral v0.1 v0.2 v0.3" >nul
if !errorlevel! EQU 0 set "tmpl=Mistral"
echo !fname! | findstr /I "chatml heremes dolphin yi looking-glass" >nul
if !errorlevel! EQU 0 set "tmpl=ChatML"
echo !fname! | findstr /I "alpaca" >nul
if !errorlevel! EQU 0 set "tmpl=Alpaca"
echo !fname! | findstr /I "vicuna" >nul
if !errorlevel! EQU 0 set "tmpl=Vicuna"
echo !fname! | findstr /I "gemma" >nul
if !errorlevel! EQU 0 set "tmpl=Gemma"
echo !fname! | findstr /I "qwen" >nul
if !errorlevel! EQU 0 set "tmpl=Qwen"
echo !fname! | findstr /I "olmo" >nul
if !errorlevel! EQU 0 set "tmpl=Olmo"
echo !fname! | findstr /I "phi" >nul
if !errorlevel! EQU 0 set "tmpl=Phi"
echo !fname! | findstr /I "glm" >nul
if !errorlevel! EQU 0 set "tmpl=GLM"
REM --- 5. B-Parameter Tag (Reversed for Correctness) ---
set "b_tag=Other"
REM Loop from Smallest to Largest so exact matches overwrite partial matches
REM e.g. "12B" will overwrite "1B" (from v1b)
for %%B in (0.5B 1B 1.5B 2B 3B 4B 6B 7B 8B 9B 11B 12B 13B 14B 16B 20B 24B 27B 30B 32B 34B 70B 72B) do (
echo !fname! | findstr /I "%%B" >nul
if !errorlevel! EQU 0 set "b_tag=%%B"
)
REM --- 6. Quantization Detection ---
set "quant=Unknown"
echo !fname! | findstr /I "f32" >nul
if !errorlevel! EQU 0 set "quant=F32"
echo !fname! | findstr /I "f16" >nul
if !errorlevel! EQU 0 set "quant=F16"
echo !fname! | findstr /I "Q8_0" >nul
if !errorlevel! EQU 0 set "quant=Q8_0"
echo !fname! | findstr /I "Q6_K" >nul
if !errorlevel! EQU 0 set "quant=Q6_K"
echo !fname! | findstr /I "Q5_K_M" >nul
if !errorlevel! EQU 0 set "quant=Q5_K_M"
echo !fname! | findstr /I "Q5_K_S" >nul
if !errorlevel! EQU 0 set "quant=Q5_K_S"
echo !fname! | findstr /I "Q5_0" >nul
if !errorlevel! EQU 0 set "quant=Q5_0"
echo !fname! | findstr /I "Q4_K_M" >nul
if !errorlevel! EQU 0 set "quant=Q4_K_M"
echo !fname! | findstr /I "Q4_K_S" >nul
if !errorlevel! EQU 0 set "quant=Q4_K_S"
echo !fname! | findstr /I "Q4_0" >nul
if !errorlevel! EQU 0 set "quant=Q4_0"
echo !fname! | findstr /I "Q3_K_M" >nul
if !errorlevel! EQU 0 set "quant=Q3_K_M"
echo !fname! | findstr /I "IQ3" >nul
if !errorlevel! EQU 0 set "quant=IQ3"
echo !fname! | findstr /I "Q2_K" >nul
if !errorlevel! EQU 0 set "quant=Q2_K"
REM --- Store in Array ---
set "m_name[!count!]=!fname!"
set "m_path[!count!]=!fpath!"
set "m_size[!count!]=!size_gb!"
set "m_fit[!count!]=!fit_status!"
set "m_role[!count!]=!role!"
set "m_tmpl[!count!]=!tmpl!"
set "m_quant[!count!]=!quant!"
set "m_btag[!count!]=!b_tag!"
)
)
if %count% EQU 0 (
echo No models found.
pause
goto :MAIN_MENU
)
REM =========================================================
REM NESTED SORT DISPLAY (Size -> Quant)
REM =========================================================
echo.
echo ID STATUS QUANT ROLE MODEL
echo -------------------------------------------------------------
for %%S in (72B 70B 34B 32B 30B 27B 24B 20B 16B 14B 13B 12B 11B 9B 8B 7B 6B 4B 3B 2B 1.5B 1B 0.5B Other) do (
call :PRINT_SIZE_GROUP "%%S"
)
echo.
echo [A] Benchmark ALL models
echo [B] Back to Menu
echo.
set /p "B_SEL=Select ID to benchmark (or A): "
if /I "%B_SEL%"=="B" goto :MAIN_MENU
if /I "%B_SEL%"=="A" goto :BENCH_ALL
if defined m_path[%B_SEL%] (
call :RUN_BENCH "%B_SEL%"
pause
goto :SCAN_MODELS
)
goto :SCAN_MODELS
REM =========================================================
REM HELPER: PRINT SIZE GROUP
REM =========================================================
:PRINT_SIZE_GROUP
set "size_found=0"
for /L %%i in (1,1,%count%) do (
if "!m_btag[%%i]!"=="%~1" set "size_found=1"
)
if !size_found! EQU 1 (
echo.
echo --- %~1 CLASS MODELS ---
for %%Q in (F32 F16 Q8_0 Q6_K Q5_K_M Q5_K_S Q5_0 Q4_K_M Q4_K_S Q4_0 Q3_K_M IQ3 Q2_K Unknown) do (
for /L %%i in (1,1,%count%) do (
if "!m_btag[%%i]!"=="%~1" (
if /I "!m_quant[%%i]!"=="%%Q" (
echo [%%i] [!m_fit[%%i]!] [!m_quant[%%i]!] [!m_role[%%i]!] !m_name[%%i]!
)
)
)
)
)
exit /b
REM =========================================================
REM BENCHMARK RUNNER (REGEX FIXED)
REM =========================================================
:BENCH_ALL
for /L %%i in (1,1,%count%) do (
call :RUN_BENCH "%%i"
)
echo All tasks complete.
pause
goto :SCAN_MODELS
:RUN_BENCH
set "idx=%~1"
set "target_name=!m_name[%idx%]!"
set "target_path=!m_path[%idx%]!"
set "target_fit=!m_fit[%idx%]!"
set "target_quant=!m_quant[%idx%]!"
set "target_tmpl=!m_tmpl[%idx%]!"
set "target_role=!m_role[%idx%]!"
set "target_size=!m_size[%idx%]!"
set "target_btag=!m_btag[%idx%]!"
cls
echo ========================================================
echo BENCHMARKING: %target_name%
echo ========================================================
echo Class: %target_btag%
echo Quant: %target_quant%
echo Fit: %target_fit%
echo --------------------------------------------------------
if exist "%BASE%bench_temp.txt" del "%BASE%bench_temp.txt"
REM Run llama-bench
"%LLAMA_BENCH%" -m "%target_path%" -t %THREADS% -ngl %GPU_LAYERS% > "%BASE%bench_temp.txt" 2>&1
type "%BASE%bench_temp.txt"
REM --- PARSING WITH POWERSHELL REGEX (ROBUST) ---
set "PP512=0"
set "TG128=0"
for /f "usebackq tokens=*" %%v in (`powershell -NoProfile -Command "$c = Get-Content '%BASE%bench_temp.txt' | Select-String '\|\s*pp512\s*\|\s*([0-9\.]+)'; if ($c) { $c.Matches.Groups[1].Value } else { '0' }"`) do set "PP512=%%v"
for /f "usebackq tokens=*" %%v in (`powershell -NoProfile -Command "$c = Get-Content '%BASE%bench_temp.txt' | Select-String '\|\s*tg128\s*\|\s*([0-9\.]+)'; if ($c) { $c.Matches.Groups[1].Value } else { '0' }"`) do set "TG128=%%v"
REM --- CALCULATE RATING ---
set "rating=SLOW"
for /f "tokens=1 delims=." %%n in ("!TG128!") do set "INT_TG=%%n"
if !INT_TG! GEQ 10 set "rating=USABLE"
if !INT_TG! GEQ 25 set "rating=SMOOTH"
if !INT_TG! GEQ 50 set "rating=GODLIKE"
echo.
echo ================================
echo SPEED RATING: %rating% (!TG128! t/s)
echo ================================
echo.
REM Save to CSV
echo logging to %BENCH_DB%...
for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /value') do set datetime=%%I
set "TS=%datetime:~0,4%-%datetime:~4,2%-%datetime:~6,2%"
echo %target_name%,%target_size%,%target_quant%,%target_role%,%target_tmpl%,%target_fit%,!PP512!,!TG128!,%rating%,%GPU_NAME%,%TS% >> "%BENCH_DB%"
echo Done.
exit /b
REM =========================================================
REM LEADERBOARD
REM =========================================================
:LEADERBOARD
cls
echo ========================================================
echo SPEED LEADERBOARD
echo ========================================================
if not exist "%BENCH_DB%" (
echo No database found. Please scan/benchmark first.
pause
goto :MAIN_MENU
)
echo.
echo TOP 15 FASTEST MODELS (Generation Speed):
echo -------------------------------------------------------------------------------
REM PowerShell magic with ErrorAction Ignore for bad data rows
powershell -NoProfile -Command ^
"$data = Import-Csv '%BENCH_DB%';" ^
"$clean_data = $data | Where-Object { $_.Gen_TG128 -match '^\d+(\.\d+)?$' };" ^
"$sorted = $clean_data | Sort-Object -Property @{Expression={[double]$_.Gen_TG128}; Descending=$true};" ^
"$sorted | Select-Object -First 15 Model_Name, Size_GB, Quant, Gen_TG128, Rating | Format-Table -AutoSize"
echo.
pause
goto :MAIN_MENU
REM =========================================================
REM VIEW DATABASE
REM =========================================================
:VIEW_DB
cls
if not exist "%BENCH_DB%" (
echo Database not found.
pause
goto :MAIN_MENU
)
echo Opening Database in default CSV viewer...
start "" "%BENCH_DB%"
goto :MAIN_MENU