Files
allenai--olmocr/olmocr/bench/scripts/convert_all.sh
T
wehub-resource-sync 917eedffcf
Main / Python 3.11 - Docs (push) Has been cancelled
Main / Python 3.11 - Build (push) Has been cancelled
Main / Python 3.11 - Lint (push) Has been cancelled
Main / Python 3.11 - Style (push) Has been cancelled
Main / Python 3.11 - Test (push) Has been cancelled
Main / GPU CI (push) Has been cancelled
Main / Release (push) Has been cancelled
Main / Build and Push Docker Images (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:27:09 +08:00

290 lines
12 KiB
Bash
Executable File

#!/bin/bash
# Exit on error but allow the trap to execute
set -e
# Global variables
SERVER_PID=""
BENCH_DIR="" # New variable to store the benchmark directory
# Function to show usage information
show_usage() {
echo "Usage: $0 [--dir <benchmark_directory>]"
echo " --dir Specify the benchmark data directory (default: olmOCR-bench/bench_data/)"
exit 1
}
# Parse command line arguments
while [[ $# -gt 0 ]]; do
key="$1"
case $key in
--dir)
BENCH_DIR="$2"
shift 2
;;
-h|--help)
show_usage
;;
*)
echo "Unknown option: $1"
show_usage
;;
esac
done
# Set default directory if not provided
if [ -z "$BENCH_DIR" ]; then
BENCH_DIR="olmOCR-bench/bench_data/"
echo "[INFO] Using default benchmark directory: $BENCH_DIR"
else
echo "[INFO] Using benchmark directory: $BENCH_DIR"
fi
# Trap function to handle Ctrl+C (SIGINT)
cleanup() {
echo -e "\n[INFO] Received interrupt signal. Cleaning up..."
# Find and kill any Python processes started by this script
echo "[INFO] Stopping any running Python processes"
pkill -P $$ python || true
# Stop server if running
if [ -n "$SERVER_PID" ] && kill -0 "$SERVER_PID" 2>/dev/null; then
echo "[INFO] Stopping server (PID: $SERVER_PID)"
kill -TERM "$SERVER_PID" 2>/dev/null || true
wait "$SERVER_PID" 2>/dev/null || true
fi
pkill vllm
echo "[INFO] Cleanup complete. Exiting."
exit 1
}
# Set the trap for SIGINT (Ctrl+C)
trap cleanup SIGINT
# Function to check if port 30000 is in use
check_port() {
port=30000
echo "[INFO] Checking if port $port is available..."
if command -v lsof >/dev/null 2>&1; then
# Linux/macOS
if lsof -i :$port >/dev/null 2>&1; then
echo "[ERROR] Port $port is already in use. Process details:"
lsof -i :$port
echo "[ERROR] Please stop the process using this port and try again."
echo " You can use: kill -9 <PID>"
return 1
fi
elif command -v netstat >/dev/null 2>&1; then
# Windows/other systems with netstat
if netstat -an | grep -q ":$port "; then
echo "[ERROR] Port $port is already in use. Process details:"
if command -v findstr >/dev/null 2>&1; then
# Windows
netstat -ano | findstr ":$port"
echo "[ERROR] Please stop the process using this port and try again."
echo " You can use: taskkill /F /PID <PID>"
else
netstat -an | grep ":$port "
echo "[ERROR] Please stop the process using this port and try again."
fi
return 1
fi
else
# Fallback method using nc if available
if command -v nc >/dev/null 2>&1; then
nc -z localhost $port >/dev/null 2>&1
if [ $? -eq 0 ]; then
echo "[ERROR] Port $port is already in use, but cannot determine which process."
echo "[ERROR] Please ensure port $port is available before continuing."
return 1
fi
else
echo "[WARNING] Cannot check if port $port is in use (neither lsof, netstat, nor nc available)."
echo "[WARNING] Continuing anyway, but this might fail if the port is already in use."
return 0
fi
fi
echo "[INFO] Port $port is available."
return 0
}
# Function to create conda environment if it doesn't exist
create_conda_env() {
env_name=$1
python_version=$2
# Check if environment exists
if conda info --envs | grep -q "^$env_name "; then
echo "Environment $env_name already exists, using it."
else
echo "Creating conda environment: $env_name"
conda create -y -n $env_name python=$python_version
fi
}
# Generic function to start a server (either vllm or sglang)
start_server() {
server_type=$1
model_name=$2
shift 2 # Remove server type and model name from the argument list
echo "Starting $server_type server for model: $model_name"
echo "Additional arguments: $@"
if [ "$server_type" = "sglang" ]; then
python -m sglang.launch_server --port 30000 --model "$model_name" "$@" &
elif [ "$server_type" = "vllm" ]; then
vllm serve $model_name --port 30000 "$@" &
else
echo "Unsupported server type: $server_type"
exit 1
fi
SERVER_PID=$!
# Check if the server process is running
if ! kill -0 $SERVER_PID 2>/dev/null; then
echo "Failed to start server process. Exiting."
exit 1
fi
# Wait for the server to be ready by checking the models endpoint
echo "Waiting for server to be ready..."
max_attempts=300
attempt=0
while [ $attempt -lt $max_attempts ]; do
if curl -s "http://localhost:30000/v1/models" -o /dev/null -w "%{http_code}" | grep -q "200"; then
echo "Server is ready!"
return 0
fi
attempt=$((attempt + 1))
echo "Waiting for server... attempt $attempt/$max_attempts"
sleep 2
done
echo "Server failed to become ready after multiple attempts. Exiting."
kill $SERVER_PID
SERVER_PID=""
exit 1
}
# Function to stop the server
stop_server() {
echo "Stopping server with PID: $SERVER_PID"
if [ -n "$SERVER_PID" ] && kill -0 "$SERVER_PID" 2>/dev/null; then
kill $SERVER_PID
wait $SERVER_PID 2>/dev/null || true
echo "Server stopped."
else
echo "No server to stop."
fi
SERVER_PID=""
}
# Create and activate olmocr environment
create_conda_env "olmocr" "3.11"
source $(conda info --base)/etc/profile.d/conda.sh
source activate olmocr
pip install -e .[bench]
# Run olmocr benchmarks, exactly as the pipeline.py does it
echo "Running olmocr benchmarks..."
python -m olmocr.bench.convert olmocr_pipeline --parallel 50 --dir "$BENCH_DIR"
# Install marker-pdf and run benchmarks
echo "Installing marker-pdf and running benchmarks..."
pip install marker-pdf==1.6.1
python -m olmocr.bench.convert marker --dir "$BENCH_DIR"
# Install verovio and run benchmarks
# echo "Installing verovio and running benchmarks..."
# pip install verovio
# python -m olmocr.bench.convert gotocr
# Run chatgpt benchmarks
echo "Running chatgpt benchmarks..."
python -m olmocr.bench.convert chatgpt --dir "$BENCH_DIR" --parallel 4
#python -m olmocr.bench.convert chatgpt:name=chatgpt45:model=gpt-4.5-preview-2025-02-27
# Run gemini benchmarks
echo "Running gemini benchmarks..."
python -m olmocr.bench.convert gemini:name=gemini_flash2:model=gemini-2.0-flash --parallel 4 --dir "$BENCH_DIR"
echo "Running mistral..."
pip install mistralai
python -m olmocr.bench.convert --dir "$BENCH_DIR" --parallel 4 mistral
# Run raw server benchmarks with generic server function
# For each model, start server, run benchmark, then stop server
# Check port availability at script start
check_port || exit 1
# olmocr_base_temp0_1 using sglang server
# start_server sglang "allenai/olmOCR-7B-0225-preview" --chat-template qwen2-vl --mem-fraction-static 0.7
# python -m olmocr.bench.convert --dir "$BENCH_DIR" server:name=olmocr_base_temp0_0:model=allenai/olmOCR-7B-0225-preview:temperature=0.0:prompt_template=fine_tune:response_template=json --repeats 1 --parallel 50
# python -m olmocr.bench.convert --dir "$BENCH_DIR" server:name=olmocr_base_temp0_1:model=allenai/olmOCR-7B-0225-preview:temperature=0.1:prompt_template=fine_tune:response_template=json --repeats 5 --parallel 50
# python -m olmocr.bench.convert --dir "$BENCH_DIR" server:name=olmocr_base_temp0_2:model=allenai/olmOCR-7B-0225-preview:temperature=0.2:prompt_template=fine_tune:response_template=json --repeats 1 --parallel 50
# python -m olmocr.bench.convert --dir "$BENCH_DIR" server:name=olmocr_base_temp0_3:model=allenai/olmOCR-7B-0225-preview:temperature=0.3:prompt_template=fine_tune:response_template=json --repeats 1 --parallel 50
# python -m olmocr.bench.convert --dir "$BENCH_DIR" server:name=olmocr_base_temp0_4:model=allenai/olmOCR-7B-0225-preview:temperature=0.4:prompt_template=fine_tune:response_template=json --repeats 1 --parallel 50
# python -m olmocr.bench.convert --dir "$BENCH_DIR" server:name=olmocr_base_temp0_5:model=allenai/olmOCR-7B-0225-preview:temperature=0.5:prompt_template=fine_tune:response_template=json --repeats 1 --parallel 50
# python -m olmocr.bench.convert --dir "$BENCH_DIR" server:name=olmocr_base_temp0_6:model=allenai/olmOCR-7B-0225-preview:temperature=0.6:prompt_template=fine_tune:response_template=json --repeats 1 --parallel 50
# python -m olmocr.bench.convert --dir "$BENCH_DIR" server:name=olmocr_base_temp0_7:model=allenai/olmOCR-7B-0225-preview:temperature=0.7:prompt_template=fine_tune:response_template=json --repeats 5 --parallel 50
# python -m olmocr.bench.convert server:name=olmocr_base_temp0_1:model=allenai/olmOCR-7B-0225-preview:temperature=0.1:prompt_template=fine_tune:response_template=json --repeats 5 --parallel 50
# python -m olmocr.bench.convert server:name=olmocr_base_temp0_8:model=allenai/olmOCR-7B-0225-preview:temperature=0.8:prompt_template=fine_tune:response_template=json --repeats 5 --parallel 50
# stop_server
# start_server vllm "allenai/olmOCR-7B-0225-preview"
# python -m olmocr.bench.convert --dir "$BENCH_DIR" server:name=olmocr_base_temp_vllm0_1:model=allenai/olmOCR-7B-0225-preview:temperature=0.1:prompt_template=fine_tune:response_template=json --repeats 5 --parallel 50
# python -m olmocr.bench.convert --dir "$BENCH_DIR" server:name=olmocr_base_temp_vllm0_7:model=allenai/olmOCR-7B-0225-preview:temperature=0.7:prompt_template=fine_tune:response_template=json --repeats 5 --parallel 50
# python -m olmocr.bench.convert server:name=olmocr_base_vllm_temp0_1:model=allenai/olmOCR-7B-0225-preview:temperature=0.1:prompt_template=fine_tune:response_template=json --repeats 5 --parallel 50
# python -m olmocr.bench.convert server:name=olmocr_base_vllm_temp0_8:model=allenai/olmOCR-7B-0225-preview:temperature=0.8:prompt_template=fine_tune:response_template=json --repeats 5 --parallel 50
# stop_server
# Feel free to enable if you want, but qwen2 raw is pretty low scoring
# qwen2_vl_7b using sglang server
# start_server sglang "Qwen/Qwen2-VL-7B-Instruct" --chat-template qwen2-vl --mem-fraction-static 0.7
# python -m olmocr.bench.convert server:name=qwen2_vl_7b:model=Qwen/Qwen2-VL-7B-Instruct:temperature=0.1:prompt_template=full:response_template=plain --repeats 5 --parallel 50
# stop_server
# qwen2.5 works best with vllm for now, in a fresh environment
create_conda_env "vllm" "3.11"
source activate vllm
pip install -e .[bench]
pip install --upgrade vllm==0.8.3
start_server vllm "Qwen/Qwen2.5-VL-7B-Instruct" --max-model-len 8192
python -m olmocr.bench.convert --dir "$BENCH_DIR" server:name=qwen25vl_prompt7:model=Qwen/Qwen2.5-VL-7B-Instruct:temperature=0.1:prompt_template=basic:response_template=plain --parallel 50
stop_server
start_server vllm "reducto/RolmOCR" --max-model-len 8192
python -m olmocr.bench.convert --dir "$BENCH_DIR" rolmocr --parallel 50
stop_server
# TODO: Fix this, I was not able to get it to all install successfully
# Create and activate mineru environment
# create_conda_env "mineru" "3.11"
# source activate mineru
# Install magic-pdf and run benchmarks
# echo "Installing magic-pdf and running mineru benchmarks..."
# pip install -U "magic-pdf[full]==1.2.2" --extra-index-url https://wheels.myhloli.com
# python -m pip install paddlepaddle==3.0.0rc1 -i https://www.paddlepaddle.org.cn/packages/stable/cpu/
# pip install huggingface_hub Pillow paddleocr ultralytics doclayout-yolo pycocotools
# wget https://github.com/opendatalab/MinerU/raw/master/scripts/download_models_hf.py -O download_models_hf.py
# python download_models_hf.py
# python -m olmocr.bench.convert mineru
# Final cleanup
if [ -n "$SERVER_PID" ] && kill -0 $SERVER_PID 2>/dev/null; then
stop_server
fi
echo "All benchmarks completed successfully."