171 steps (901 examples / 16 grad-accum * 3 epochs, ceil-rounded, not the 168 the plan estimated with floor), trained decoupled on spark against the merged bf16 checkpoint that already has LoRA #1 folded in. No OOM, no aborts: train_runtime 24370s (~6h46m, within the ~7.3h projection), eval_loss 0.6306, peak CUDA 74.58GB, trainable% 0.1220 (matches phase 3 exactly). adapter_config.json confirms the guarded hyperparameters: use_rslora and use_dora both false, lora_bias false, modules_to_save null, r=32, lora_alpha=64 -- the combination 20_merge_lora.py's scaling math depends on. Weights never touched the worktree: OUTPUT_DIR was /workspace/ft-models/lora-adapter-penpot on spark (outside the worktree, root-owned by the training container), copied out via `docker exec cat` piped to a non-root file and verified by matching sha256 (79167dfa...) before landing here. Intermediate checkpoint-*/ directories stay on spark; only the final adapter is versioned, same as phase 3's out/lora-adapter/, which this leaves untouched. .gitignore was missing the negation lines for out/lora-adapter-penpot/ despite already documenting that the final adapter should be committed -- added the same two exceptions that out/lora-adapter/ has.
33 lines
1.1 KiB
JSON
33 lines
1.1 KiB
JSON
{
|
|
"add_prefix_space": false,
|
|
"audio_bos_token": "<|audio_start|>",
|
|
"audio_eos_token": "<|audio_end|>",
|
|
"audio_token": "<|audio_pad|>",
|
|
"backend": "tokenizers",
|
|
"bos_token": null,
|
|
"clean_up_tokenization_spaces": false,
|
|
"eos_token": "<|im_end|>",
|
|
"errors": "replace",
|
|
"image_token": "<|image_pad|>",
|
|
"is_local": true,
|
|
"local_files_only": false,
|
|
"model_max_length": 262144,
|
|
"model_specific_special_tokens": {
|
|
"audio_bos_token": "<|audio_start|>",
|
|
"audio_eos_token": "<|audio_end|>",
|
|
"audio_token": "<|audio_pad|>",
|
|
"image_token": "<|image_pad|>",
|
|
"video_token": "<|video_pad|>",
|
|
"vision_bos_token": "<|vision_start|>",
|
|
"vision_eos_token": "<|vision_end|>"
|
|
},
|
|
"pad_token": "<|endoftext|>",
|
|
"pretokenize_regex": "(?i:'s|'t|'re|'ve|'m|'ll|'d)|[^\\r\\n\\p{L}\\p{N}]?[\\p{L}\\p{M}]+|\\p{N}| ?[^\\s\\p{L}\\p{M}\\p{N}]+[\\r\\n]*|\\s*[\\r\\n]+|\\s+(?!\\S)|\\s+",
|
|
"split_special_tokens": false,
|
|
"tokenizer_class": "Qwen2Tokenizer",
|
|
"unk_token": null,
|
|
"video_token": "<|video_pad|>",
|
|
"vision_bos_token": "<|vision_start|>",
|
|
"vision_eos_token": "<|vision_end|>"
|
|
}
|