Visual Document Retrieval
Safetensors
sentence-transformers
colpali-engine
qwen3_5
vision-language
colbert
late-interaction
multi-vector
matryoshka
vidore
token-compression
Instructions to use tencent/EVIE-4.5B with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- sentence-transformers
How to use tencent/EVIE-4.5B with sentence-transformers:
from sentence_transformers import MultiVectorEncoder model = MultiVectorEncoder("tencent/EVIE-4.5B") queries = ["Which planet is known as the Red Planet?"] documents = [ "Venus is often called Earth's twin because of its similar size and proximity.", "Mars, known for its reddish appearance, is often referred to as the Red Planet.", "Jupiter, the largest planet in our solar system, has a prominent red spot.", ] query_embeddings = model.encode_query(queries) document_embeddings = model.encode_document(documents) similarities = model.similarity(query_embeddings, document_embeddings) print(similarities) - Notebooks
- Google Colab
- Kaggle
File size: 7,407 Bytes
6e8abde c612ae7 6e8abde | 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 157 158 159 160 161 162 | #!/usr/bin/env bash
# Train EVIE-4.5B (Prefix-MRL + ARD). Requires DATA_ROOT, HARDNEG_ROOT, TEACHER_DIR.
set -euo pipefail
ROOT="${ROOT:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)}"
REPO="${REPO:-$(cd "$ROOT/../.." && pwd)}"
EVIE_ROOT="${EVIE_ROOT:-$REPO}"
# shellcheck source=/dev/null
source "$REPO/code/shared/lib.sh"
evie_resolve_python
evie_pythonpath
evie_workdirs
export PYTHONPATH="$PYTHONPATH:$ROOT/scripts"
cd "$ROOT"
PY="$PYTHON"
RUN_NAME="${RUN_NAME:-evie-4.5b}"
DATA_ROOT="${DATA_ROOT:?set DATA_ROOT}"
HARDNEG_ROOT="${HARDNEG_ROOT:?set HARDNEG_ROOT}"
BASE_MODEL="${BASE_MODEL:-tencent/EVIE-Preview-4.5B}"
COL_DIM="${COL_DIM:-2048}"
SOURCES="${SOURCES:-colpali_train_set vdr-multilingual-train VisRAG-Ret-Train-Synthetic-data VisRAG-Ret-Train-In-domain-data tatdqa_train tabfquad_train_set}"
HEAD_DIMS="${HEAD_DIMS:-64,128,256,512,1024,2048}"
ANCHOR_DIM="${ANCHOR_DIM:-128}"
KD_DIMS="${KD_DIMS:-64,128,256,512,1024,2048}"
CALIBRATION_DIM="${CALIBRATION_DIM:-128}"
TEACHER_DIR="${TEACHER_DIR:-${EVIE_8B_DIR:-}}"
TEACHER_MD5="${TEACHER_MD5:-3f9a64a729d9277c20f038a1635203e5}"
TEACHER_TEMPERATURE="${TEACHER_TEMPERATURE:-0.13}"
STUDENT_TEMPERATURES="${STUDENT_TEMPERATURES:-64:0.13,128:0.13,256:0.13,512:0.13,1024:0.13,2048:0.13}"
RELATION_WEIGHT="${RELATION_WEIGHT:-1.0}"
MARGIN_WEIGHT="${MARGIN_WEIGHT:-0.25}"
ANCHOR_WEIGHT="${ANCHOR_WEIGHT:-0.25}"
COLUMN_WEIGHT="${COLUMN_WEIGHT:-1.0}"
CONFIDENCE_FLOOR="${CONFIDENCE_FLOOR:-0.1}"
TEACHER_WRONG_FACTOR="${TEACHER_WRONG_FACTOR:-0.25}"
HEAD_WEIGHTS="${HEAD_WEIGHTS:-}"
KD_HEAD_WEIGHTS="${KD_HEAD_WEIGHTS:-}"
KD_DIRECTIONS="${KD_DIRECTIONS:-both}"
KD_INCLUDE_HARDNEGS="${KD_INCLUDE_HARDNEGS:-on}"
ANCHOR_TEACHER="${ANCHOR_TEACHER:-on}"
TASK_CONSISTENT_BATCHES="${TASK_CONSISTENT_BATCHES:-on}"
GRADIENT_TARGET_RATIO="${GRADIENT_TARGET_RATIO:-0.5}"
GRADIENT_CALIBRATION_STEPS="${GRADIENT_CALIBRATION_STEPS:-100}"
GRADIENT_CALIBRATION_INTERVAL="${GRADIENT_CALIBRATION_INTERVAL:-10}"
GRADIENT_SCALE_MIN="${GRADIENT_SCALE_MIN:-0.05}"
GRADIENT_SCALE_MAX="${GRADIENT_SCALE_MAX:-20.0}"
GRADIENT_SCALE_EMA="${GRADIENT_SCALE_EMA:-0.9}"
GRADIENT_DIAGNOSTICS="${GRADIENT_DIAGNOSTICS:-on}"
GRADIENT_DIAGNOSTIC_STEPS="${GRADIENT_DIAGNOSTIC_STEPS:-100}"
GRADIENT_DIAGNOSTIC_INTERVAL="${GRADIENT_DIAGNOSTIC_INTERVAL:-10}"
HEAD_WARMUP_STEPS="${HEAD_WARMUP_STEPS:-100}"
BSZ="${BSZ:-2}"
EFF_BATCH="${EFF_BATCH:-512}"
MVT="${MVT:-1024}"
EPOCHS="${EPOCHS:-1}"
SEED="${SEED:-42}"
BIDIR="${BIDIR:-on}"
GRAD_CHECKPOINTING="${GRAD_CHECKPOINTING:-off}"
LR="${LR:-1.5e-5}"
WEIGHT_DECAY="${WEIGHT_DECAY:-0.02}"
WARMUP_RATIO="${WARMUP_RATIO:-0.08}"
LORA_R="${LORA_R:-32}"
LORA_ALPHA="${LORA_ALPHA:-128}"
LORA_DROPOUT="${LORA_DROPOUT:-0.197}"
LOSS_TEMPERATURE="${LOSS_TEMPERATURE:-0.02}"
NUM_HARD_NEGS="${NUM_HARD_NEGS:-2}"
USE_HARDNEGATIVES="${USE_HARDNEGATIVES:-on}"
HARDNEG_IN_BATCH_WEIGHT="${HARDNEG_IN_BATCH_WEIGHT:-0.5}"
REPORT_TO="${REPORT_TO:-wandb,tensorboard}"
WANDB_PROJECT="${WANDB_PROJECT:-evie}"
WANDB_NAME="${WANDB_NAME:-$RUN_NAME}"
EVAL_AFTER_TRAIN="${EVAL_AFTER_TRAIN:-1}"
SKIP_IF_TRAINED="${SKIP_IF_TRAINED:-1}"
OVERWRITE="${OVERWRITE:-auto}"
TB_DIR="${TB_DIR:-$RUNS_DIR/$RUN_NAME/tensorboard}"
NNODES="${NNODES:-1}"
NODE_RANK="${NODE_RANK:-${RANK:-0}}"
MASTER_ADDR="${MASTER_ADDR:-127.0.0.1}"
MASTER_PORT="${MASTER_PORT:-29500}"
unset PYTHONHOME
export PATH="$(dirname "$PY"):$PATH"
evie_batch
[[ -n "$TEACHER_DIR" ]] || { echo "[fatal] set TEACHER_DIR or EVIE_8B_DIR"; exit 2; }
mkdir -p "$LOG_DIR"
LOG_FILE="$LOG_DIR/train_${RUN_NAME}_node${NODE_RANK}_$(date +%Y%m%d_%H%M%S).log"
exec > >(tee -a "$LOG_FILE") 2>&1
echo "[log] $LOG_FILE"
echo "[dist] ${NNODES}x${NPROC_PER_NODE} rank=$NODE_RANK ${MASTER_ADDR}:${MASTER_PORT}"
OUTPUT_DIR="${OUTPUT_DIR:-$RUNS_DIR/$RUN_NAME}"
WANDB_DIR="${WANDB_DIR:-$OUTPUT_DIR/wandb}"
SKIP_TRAIN=0
if [[ -f "$OUTPUT_DIR/adapter_model.safetensors" && -f "$OUTPUT_DIR/adapter_config.json" \
&& "$SKIP_IF_TRAINED" == "1" && -z "${RESUME:-}" && "${OVERWRITE:-0}" != "1" ]]; then
SKIP_TRAIN=1
echo "[train] skip: adapter already at $OUTPUT_DIR"
fi
if [[ "$SKIP_TRAIN" != "1" ]]; then
evie_nccl
export HARDNEG_SUBDIR="${HARDNEG_SUBDIR:-allpos}"
evie_wandb
RESUME="${RESUME:-}"
evie_prepare_output
read -r -a SOURCE_ARGS <<< "$SOURCES"
ARGS=(
--base-model "$BASE_MODEL" --col-dim "$COL_DIM" --data-root "$DATA_ROOT"
--output-dir "$OUTPUT_DIR" --sources "${SOURCE_ARGS[@]}"
--epochs "$EPOCHS" --seed "$SEED"
--per-device-batch-size "$BSZ" --grad-accum "$GRAD_ACCUM"
--learning-rate "$LR" --weight-decay "$WEIGHT_DECAY" --warmup-ratio "$WARMUP_RATIO"
--max-visual-tokens "$MVT" --dataloader-workers "${DL_WORKERS:-8}"
--dataloader-prefetch-factor "${DL_PREFETCH:-4}"
--bidirectional-attention "$BIDIR" --grad-checkpointing "$GRAD_CHECKPOINTING"
--lora-r "$LORA_R" --lora-alpha "$LORA_ALPHA" --lora-dropout "$LORA_DROPOUT"
--loss-temperature "$LOSS_TEMPERATURE"
--num-hard-negs "$NUM_HARD_NEGS" --use-hardnegatives "$USE_HARDNEGATIVES"
--hardneg-in-batch-weight "$HARDNEG_IN_BATCH_WEIGHT"
--report-to "$REPORT_TO" --logging-dir "$TB_DIR" --run-name "$RUN_NAME"
--hardneg-root "$HARDNEG_ROOT"
--head-dims "$HEAD_DIMS" --anchor-dim "$ANCHOR_DIM"
--kd-dims "$KD_DIMS" --calibration-dim "$CALIBRATION_DIM"
--teacher-temperature "$TEACHER_TEMPERATURE"
--student-temperatures "$STUDENT_TEMPERATURES"
--relation-weight "$RELATION_WEIGHT" --margin-weight "$MARGIN_WEIGHT"
--anchor-weight "$ANCHOR_WEIGHT" --column-weight "$COLUMN_WEIGHT"
--confidence-floor "$CONFIDENCE_FLOOR" --teacher-wrong-factor "$TEACHER_WRONG_FACTOR"
--kd-directions "$KD_DIRECTIONS" --kd-include-hardnegs "$KD_INCLUDE_HARDNEGS"
--anchor-teacher "$ANCHOR_TEACHER" --task-consistent-batches "$TASK_CONSISTENT_BATCHES"
--gradient-target-ratio "$GRADIENT_TARGET_RATIO"
--gradient-calibration-steps "$GRADIENT_CALIBRATION_STEPS"
--gradient-calibration-interval "$GRADIENT_CALIBRATION_INTERVAL"
--gradient-scale-min "$GRADIENT_SCALE_MIN" --gradient-scale-max "$GRADIENT_SCALE_MAX"
--gradient-scale-ema "$GRADIENT_SCALE_EMA"
--gradient-diagnostics "$GRADIENT_DIAGNOSTICS"
--gradient-diagnostic-steps "$GRADIENT_DIAGNOSTIC_STEPS"
--gradient-diagnostic-interval "$GRADIENT_DIAGNOSTIC_INTERVAL"
--head-warmup-steps "$HEAD_WARMUP_STEPS"
--teacher-dir "$TEACHER_DIR"
)
[[ -n "$HEAD_WEIGHTS" ]] && ARGS+=(--head-weights "$HEAD_WEIGHTS")
[[ -n "$KD_HEAD_WEIGHTS" ]] && ARGS+=(--kd-head-weights "$KD_HEAD_WEIGHTS")
[[ -n "$TEACHER_MD5" ]] && ARGS+=(--teacher-md5 "$TEACHER_MD5")
[[ -n "$RESUME" ]] && ARGS+=(--resume-from-checkpoint "$RESUME")
[[ -n "${MAX_STEPS:-}" ]] && ARGS+=(--max-steps "$MAX_STEPS")
[[ -n "${MAX_SAMPLES:-}" ]] && ARGS+=(--max-samples-per-source "$MAX_SAMPLES")
echo "[train] $RUN_NAME prefixes=$HEAD_DIMS anchor=$ANCHOR_DIM teacher=$TEACHER_DIR global_batch=$ACTUAL_GLOBAL"
"$PY" -m torch.distributed.run \
--nnodes="$NNODES" --nproc_per_node="$NPROC_PER_NODE" --node_rank="$NODE_RANK" \
--master_addr="$MASTER_ADDR" --master_port="$MASTER_PORT" scripts/train.py "${ARGS[@]}"
fi
if [[ "$EVAL_AFTER_TRAIN" == "1" ]]; then
export MASTER_PORT="${EVAL_MASTER_PORT:-29501}"
export RUN_NAME NNODES NODE_RANK MASTER_ADDR NPROC_PER_NODE
export EVAL_BASE_MODEL="${EVAL_BASE_MODEL:-$BASE_MODEL}"
bash "$REPO/code/shared/eval_run.sh"
fi
echo "== complete: $RUN_NAME =="
|