| #!/bin/bash |
|
|
| set -euo pipefail |
|
|
| BASE_MODEL="${BASE_MODEL:-llava-hf/llava-1.5-7b-hf}" |
| VAL_CSV="${VAL_CSV:-/home/users/ntu/cong045/scratch/testing/hallucination/CC3M-Dataset/data-qwenvl32b/bathroom_toilet_labels.csv}" |
| VAL_IMAGE_DIR="${VAL_IMAGE_DIR:-CC3M-Dataset/cc3m_images/train}" |
| OUTPUT_DIR="${OUTPUT_DIR:-./step4_outputs}" |
| NUM_PER_CATEGORY="${NUM_PER_CATEGORY:-50}" |
| MAX_NEW_TOKENS="${MAX_NEW_TOKENS:-300}" |
| MENTION_METHOD="${MENTION_METHOD:-both}" |
| JUDGE_DEVICE="${JUDGE_DEVICE:-cuda}" |
| JUDGE_MODEL="${JUDGE_MODEL:-Qwen/Qwen3-VL-32B-Instruct}" |
| MODEL_TYPE="${MODEL_TYPE:-lora}" |
| MODEL_PATH="${MODEL_PATH:-step3_lora_outputs/lora_adapter}" |
| INFERENCE_BACKEND="${INFERENCE_BACKEND:-transformers}" |
| VLLM_BATCH_SIZE="${VLLM_BATCH_SIZE:-64}" |
| VLLM_TENSOR_PARALLEL_SIZE="${VLLM_TENSOR_PARALLEL_SIZE:-1}" |
| VLLM_GPU_MEMORY_UTILIZATION="${VLLM_GPU_MEMORY_UTILIZATION:-0.9}" |
| VLLM_MAX_MODEL_LEN="${VLLM_MAX_MODEL_LEN:-4096}" |
|
|
| if [ "${INFERENCE_BACKEND}" = "vllm" ] && [ -n "${CUDA_VISIBLE_DEVICES:-}" ] && [[ "${CUDA_VISIBLE_DEVICES}" == *GPU-* ]]; then |
| _orig_cvd="${CUDA_VISIBLE_DEVICES}" |
| declare -A _uuid_to_index=() |
| while IFS=, read -r idx uuid; do |
| idx="$(echo "${idx}" | xargs)" |
| uuid="$(echo "${uuid}" | xargs)" |
| if [ -n "${idx}" ] && [ -n "${uuid}" ]; then |
| _uuid_to_index["${uuid}"]="${idx}" |
| fi |
| done < <(nvidia-smi --query-gpu=index,uuid --format=csv,noheader) |
|
|
| IFS=',' read -r -a _requested <<< "${_orig_cvd}" |
| _mapped=() |
| _ok=1 |
| for raw in "${_requested[@]}"; do |
| uuid="$(echo "${raw}" | xargs)" |
| if [ -n "${_uuid_to_index[${uuid}]:-}" ]; then |
| _mapped+=("${_uuid_to_index[${uuid}]}") |
| else |
| _ok=0 |
| break |
| fi |
| done |
|
|
| if [ "${_ok}" -eq 1 ] && [ "${#_mapped[@]}" -gt 0 ]; then |
| CUDA_VISIBLE_DEVICES="$(IFS=,; echo "${_mapped[*]}")" |
| export CUDA_VISIBLE_DEVICES |
| echo "Normalized CUDA_VISIBLE_DEVICES for vLLM: ${CUDA_VISIBLE_DEVICES}" |
| else |
| echo "WARNING: failed to map UUID CUDA_VISIBLE_DEVICES, keeping original: ${_orig_cvd}" |
| fi |
| fi |
|
|
| if [ "${INFERENCE_BACKEND}" = "vllm" ]; then |
| export VLLM_WORKER_MULTIPROC_METHOD="${VLLM_WORKER_MULTIPROC_METHOD:-spawn}" |
| echo "VLLM_WORKER_MULTIPROC_METHOD=${VLLM_WORKER_MULTIPROC_METHOD}" |
| fi |
|
|
| if [ "${MODEL_TYPE}" = "delta_w" ]; then |
| MODEL_ARG=(--checkpoint "${MODEL_PATH}") |
| else |
| MODEL_ARG=(--model_dir "${MODEL_PATH}") |
| fi |
|
|
| python -m experiment.evaluation.validate \ |
| --model_type "${MODEL_TYPE}" \ |
| "${MODEL_ARG[@]}" \ |
| --base_model_name "${BASE_MODEL}" \ |
| --val_csv "${VAL_CSV}" \ |
| --val_image_dir "${VAL_IMAGE_DIR}" \ |
| --num_per_category "${NUM_PER_CATEGORY}" \ |
| --max_new_tokens "${MAX_NEW_TOKENS}" \ |
| --mention_method "${MENTION_METHOD}" \ |
| --judge_model "${JUDGE_MODEL}" \ |
| --judge_device "${JUDGE_DEVICE}" \ |
| --inference_backend "${INFERENCE_BACKEND}" \ |
| --vllm_batch_size "${VLLM_BATCH_SIZE}" \ |
| --vllm_tensor_parallel_size "${VLLM_TENSOR_PARALLEL_SIZE}" \ |
| --vllm_gpu_memory_utilization "${VLLM_GPU_MEMORY_UTILIZATION}" \ |
| --vllm_max_model_len "${VLLM_MAX_MODEL_LEN}" \ |
| --use_val_split \ |
| --output_dir "${OUTPUT_DIR}" |
|
|