fine_tune¶
training.fine_tune
¶
ORION QLoRA fine-tuning pipeline - trains a LoRA adapter on the LFM2.5-VL-1.6B base model.
Loads the base Liquid VLM in 4-bit NF4 quantisation via bitsandbytes, injects
LoRA adapters into the attention projections (q/k/v/o, rank 16, alpha 32), and
trains for 3 epochs on the ORION dataset (240 train images with coordinate-dropout
augmentation). The best checkpoint (by validation loss) is saved to
orion_lora_weights/.
Requirements: NVIDIA CUDA GPU with >= 8 GB VRAM. The training stack uses
bitsandbytes (NF4 quantisation + paged_adamw_8bit), which is CUDA-only -
this script will not run on Apple Silicon (MPS), AMD GPUs, or CPU-only
machines. Verified on NVIDIA RTX 4070 Ti, 12 GB, CUDA 12.2, driver 535.x.
Usage:
export ORION_DATASET_ROOT=/path/to/dir/containing/orion_dataset
cd ground_segment/training
uv run fine_tune.py
See the training guide for the full walkthrough and the ground segment budgets for compute requirements.
OrionDataset
¶
Bases: Dataset
Thin wrapper around a JSONL split for use with the HuggingFace Trainer.
Loads the JSONL file via datasets.load_dataset at init time. Each item
is a raw conversation dict; image loading and tokenisation are deferred to
VLMDataCollator so that batching and padding happen in one place.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
jsonl_file
|
Path to a |
required |
Source code in ground_segment/training/fine_tune.py
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | |
VLMDataCollator
¶
Batch collator that loads images and tokenises conversations for the VLM.
For each item in the batch, opens the corresponding 512x512 RGB tile from
disk, formats the user/assistant conversation via the processor's chat
template, and returns a single padded batch tensor with cloned
input_ids as labels for causal-LM loss.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
processor
|
|
required | |
dataset_root
|
Root directory containing the |
required |
Source code in ground_segment/training/fine_tune.py
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 | |
__call__(batch)
¶
Collate a list of conversation dicts into a model-ready batch.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
batch
|
List of dicts, each with |
required |
Returns:
| Type | Description |
|---|---|
|
A dict of padded tensors ( |
|
|
|
Source code in ground_segment/training/fine_tune.py
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 | |
main()
¶
Run the full QLoRA fine-tuning pipeline and save the adapter weights.
Steps: load the base LFM2.5-VL-1.6B in 4-bit NF4, prepare for k-bit
training, monkey-patch enable_input_require_grads to handle
non-tensor outputs safely, inject LoRA adapters (rank 16, alpha 32) into
q/k/v/o projections, train for 3 epochs with paged_adamw_8bit, and
save the best checkpoint to orion_lora_weights/.
Source code in ground_segment/training/fine_tune.py
139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 | |