+
    UV-jÍ,  ã                   ó2  € ^ RI t ^ RIt^ RIt^ RIHt ^ RIHt ^RIH	t	H
t
 ^RIHtHt ^RIHtHt ^RIHtHtHtHtHtHtHt ^RIHt ]P6                  ! ]P8                  R7       ]P:                  ! ]4      t]P:                  ! R	4      PA                  ]PB                  4       ]P:                  ! R
4      PA                  ]PB                  4       ]P:                  ! R4      PA                  ]PB                  4       RHR lt"RHR lt#R t$]R8X  EdŠ   ] PJ                  ! RR7      t&]&PO                  R](RR7       ]&PO                  RRR7       ]&PO                  RRR7       ]&PO                  R](RR7       ]&PO                  R](RR7       ]&PO                  R](RR7       ]&PO                  R])^RR 7       ]&PO                  R!](RR"R#7       ]&PO                  R$]*R%R7       ]&PO                  R&])^R7       ]&PO                  R'])R(R7       ]&PO                  R)])RR7       ]&PO                  R*])^
R7       ]&PO                  R+])^ÈR7       ]&PO                  R,])^dR7       ]&PO                  R-])^R7       ]&PO                  R.])R/R7       ]&PO                  R0RR7       ]&PO                  R1]*RR7       ]&PO                  R2RR7       ]&PO                  R3])^R7       ]&PO                  R4])R5R7       ]&PO                  R6]*^R7       ]&PO                  R7])^R7       ]&PO                  R8]*R9R7       ]&PO                  R:](R;R;R<.R=R>7       ]&PO                  R?]*R@RAR#7       ]&PO                  RB]*RCRDR#7       ]&PO                  RE](RFR7       ]&PO                  RG](RR7       ]&PW                  4       t,]$! ],4       R# R# )Ié    N)Úload_dataset)ÚPreferenceVisionDatasetÚVisionDataset)ÚORPOTrainingArgsÚ
train_orpo)ÚTrainingArgsÚtrain)ÚColorsÚapply_lora_layersÚfind_all_linear_namesÚget_peft_modelÚnot_supported_for_trainingÚprint_trainable_parametersÚunfreeze_modules)Úload)ÚlevelÚhttpxÚhttpcoreÚhuggingface_hubc                ó’  aa€ RV P                   9   ;'       g    RV P                   9   pRV P                   9   ;'       d    RV P                   9   pRV P                   9   ;'       g    RV P                   9   pV'       d   V # V'       g   \        R4      hRV P                   9   d   RMV'       d   RMRoVV3R	 lpV P                  V4      # )
aJ  
Only transform dataset to messages format for VLMs with single-turn QA and image columns.
If the dataset already has a 'messages' column, return as is.
Otherwise, require 'question' and 'answer' columns.
If present, 'image' or 'images' columns are included in the user content.
No multi-turn or template logic. No audio support.
ÚmessagesÚconversationsÚquestionÚanswerÚimagesÚimagez{Dataset must have a 'messages' column or both 'question' and 'answer' columns. Optional image columns: 'image' or 'images'.Nc                 ó  <aaaa€ V R ,          oV R,          oS	'       d
   V S	,          MRoS'       d-    \         P                  ! S4      pVVVV3R loS! V4      pRV/# RRRRS/RR	RS/./#   \         d   p\        RT 24      hRp?ii ; i)
r   r   Nc                 óx  <€ \        V \        4      '       d    V P                  SSSR 7      # \        V \        4      '       d,   V P                  4        UUu/ uF  w  rVS! V4      bK  	  upp# \        V \        4      '       d   V  Uu. uF  pS! V4      NK  	  up# V #   \         d    T u # i ; iu uppi u upi ))r   r   r   )Ú
isinstanceÚstrÚformatÚ	ExceptionÚdictÚitemsÚlist)ÚnodeÚkÚvÚaÚfillÚimgÚqs   &  €€€€Ú]/Volumes/fast/ai/experiments/ui-tars-smoke/.venv/lib/python3.14/site-packages/mlx_vlm/lora.pyr*   Ú?transform_dataset_to_messages.<locals>.to_message.<locals>.fillA   s§   ø€ Ü! $¬×,Ò,ð(Ø#'§;¡;°SÀ1ÈQ ;Ó#OÐOô " $¬×-Ò-Ø7;·z±z´|ÔD±|©t¨q ¡4¨£7¢
±|ÒDÐDÜ! $¬×-Ò-Ù15Ó6±¨A¡ Q¦±Ñ6Ð6Ø�Køô  )ô (Ø#'šKð(üó  Eùâ6s   ™B ÁB1ÂB7ÂB.Â-B.r   z.Failed to parse or fill custom prompt format: ÚroleÚuserÚcontentÚ	assistant)ÚjsonÚloadsr"   Ú
ValueError)
ÚexampleÚtemplateÚfilledÚer)   r*   r+   r,   Úcustom_prompt_formatÚ	image_cols
   &   @@@@€€r-   Ú
to_messageÚ1transform_dataset_to_messages.<locals>.to_message9   s²   ü€ Ø�JÕˆØ�HÕˆß$-ˆg�iÖ °4ˆßðWÜŸ:š:Ð&:Ó;�÷
 ð 
 ñ ˜h›�Ø" FÐ+Ð+ð
 Ø˜ ¨AÐ.Ø˜ i°Ð3ðð
ð 	
øô ô WÜ Ð#QÐRSÐQTÐ!UÓVÐVûðWús   ´*A- Á-BÁ8BÂB)Úcolumn_namesr5   Úmap)ÚdatasetÚ
model_typer:   Úhas_messagesÚhas_qaÚ
has_imagesr<   r;   s   &&f    @r-   Útransform_dataset_to_messagesrE      sÎ   ù€ ð 	�g×*Ñ*Ñ*×UÐU¨oÀ×AUÑAUÑ.Uð ð ˜7×/Ñ/Ñ/×TÐT°HÀ×@TÑ@TÑ4T€FØ˜W×1Ñ1Ñ1×TÐT°WÀ×@TÑ@TÑ5T€JçØˆçÜð Jó
ð 	
ð �w×+Ñ+Ô+ñ 	ç"‰W¨ð ö
ð@ �;‰;Øóð ó    c           	     óê  € V'       dE   \         P                  \        P                   RV \        P                   24       \        W4      p MÐVP                  '       dE   \         P                  \        P                   R\        P                   24       \        V R.4       Mz\         P                  \        P                   R\        P                   24       \        V P                  4      p\        V VVP                  VP                  VP                  RR7      p VP                  '       dE   \         P                  \        P                   R\        P                   24       \        V . RO4       V # )	z(Setup model with LoRA or full finetuningzResuming from adapter path z$Training with full weight finetuningÚlanguage_modelzSetting up LoRAF)ÚrankÚalphaÚdropoutÚverbosez$Unfreezing vision stack for training)Úvision_modelÚvision_towerÚmm_projectorÚmulti_modal_projectorÚalignerÚ	connectorÚvision_resampler)ÚloggerÚinfor
   Ú	UNDERLINEÚENDCr   Úfull_finetuner   r   rH   r   Ú	lora_rankÚ
lora_alphaÚlora_dropoutÚtrain_visionÚOKBLUE)ÚmodelÚargsÚadapter_pathÚmoduless   &&& r-   Úsetup_model_for_trainingrb   ^   s   € ÷ Ü�‰Ü×ÑÐ Ð ;¸L¸>Ì&Ï+É+ÈÐWô	
ô " %Ó6‰Ø	×	×	Ð	Ü�‰Ü×ÑÐ Ð DÄVÇ[Á[ÀMÐRô	
ô 	˜Ð!1Ð 2Õ3ä�‰”v×'Ñ'Ð(¨¼¿¹°}ÐEÔFÜ'¨×(<Ñ(<Ó=ˆÜØØØ—‘Ø—/‘/Ø×%Ñ%Øô
ˆð ××ÐÜ�‰”v—}‘}�oÐ%IÌ&Ï+É+ÈÐWÔXÜØòô	
ð €LrF   c                 óf	  € V P                   P                  R 4      '       d   V P                   MV P                   R,           V n         \        P                  \        P
                   RV P                   \        P                   24       \        V P                  RR/R7      w  r\        \        VRR4      RR4      pV\        9   d   \        R	V R
24      hVP                  P                  p\        P                  \        P
                   RV P                   \        P                   24       \        V P                  V P                   '       d   V P                   MRV P"                  R7      pV P$                  e/   \'        V4      V P(                  ,          V P$                  ,          pMV P*                  pV P,                  R8w  d   \/        WSV P0                  4      pV P,                  R8X  d   \3        VVVV P4                  R7      pM\7        VVVV P4                  R7      p\9        WV P:                  4      p\=        V4       \        P                  \        P
                   R\        P                   24       \>        P@                  ! V PB                  R7      p\        P                  \        P
                   RV P,                   R\        P                   24       V P,                  R8X  dÎ   \E        V P(                  VV PF                  V PH                  V PJ                  V PL                  V PN                  V P                   V PP                  V PB                  V PR                  V PT                  V PV                  V PX                  V PZ                  R7      p	\]        VVVRV	V P^                  V P`                  R7       M¶\c        V P(                  VV PF                  V PH                  V PJ                  V PL                  V PN                  V P                   V PP                  V PB                  V PR                  V PT                  V PV                  R7      p	\e        VVVRV	V P^                  V P`                  R7       \        P                  \        P
                   RV P                    \        P                   24       R# )z.safetensorsz/adapters.safetensorszLoading model from Útrust_remote_codeT)Úprocessor_configÚconfigNrA   zModel type z not supported for trainingzLoading dataset from )ÚsplitÚorpo)Úimage_resize_shapezSetting up optimizer)Úlearning_ratezTraining model (Ú))Ú
batch_sizeÚitersÚsteps_per_reportÚsteps_per_evalÚsteps_per_saveÚval_batchesÚmax_seq_lengthÚadapter_fileÚgrad_checkpointrj   Ú	grad_clipÚgradient_accumulation_stepsrX   ÚbetaÚeps)r^   Ú	optimizerÚtrain_datasetÚval_datasetr_   Útrain_on_completionsÚassistant_id)rl   rm   rn   ro   rp   rq   rr   rs   rt   rj   ru   rv   rX   z#Training completed! Model saved to )3Úoutput_pathÚendswithrT   rU   r
   ÚHEADERÚ
model_pathrW   r   Úgetattrr   r5   rf   Ú__dict__r@   r   Údataset_configrg   ÚepochsÚlenrl   rm   Ú
train_moderE   r:   r   ri   r   rb   r`   r   ÚoptimÚAdamrj   r   rn   ro   rp   rq   rr   rt   ru   rv   rX   rw   rx   r   r|   r}   r   r	   )
r_   r^   Ú	processorrA   rf   r@   rm   rz   ry   Útraining_argss
   &         r-   ÚmainrŒ   ‰   sÈ  € ð ×Ñ×$Ñ$ ^×4Ò4ð 	×Òà×ÑÐ 7Õ7ð 	Ôô ‡K�K”6—=‘=�/Ð!4°T·_±_Ð4EÄfÇkÁkÀ]ÐSÔTÜØ�‰Ð+>ÀÐ*EôÑ€Eô
 œ ¨°$Ó7¸ÀtÓL€JØÔ/Ô/Ü˜; z lÐ2MÐNÓOÐOà�\‰\×"Ñ"€Fô ‡K�K”6—=‘=�/Ð!6°t·|±|°nÄVÇ[Á[ÀMÐRÔSÜØ�‰Ø#×2×2Ð2ˆ×Ò¸Ø�j‰jô€Gð ‡{�{ÒÜ�W“ §¡Õ0°D·K±KÕ?‰à—
‘
ˆð ‡�˜&Ô Ü/Ø ×!:Ñ!:ó
ˆð
 ‡�˜&Ô Ü/ØØØØ#×6Ñ6ô	
‰ô &ØØØØ#×6Ñ6ô	
ˆô % U°$×2CÑ2CÓD€EÜ˜uÔ%ô ‡K�K”6—=‘=�/Ð!5´f·k±k°]ÐCÔDÜ—
’
¨×);Ñ);Ô<€Iô ‡K�K”6—=‘=�/Ð!1°$·/±/Ð1BÀ!ÄFÇKÁKÀ=ÐQÔRØ‡�˜&Ô Ü(Ø—‘ØØ!×2Ñ2Ø×.Ñ.Ø×.Ñ.Ø×(Ñ(Ø×.Ñ.Ø×)Ñ)Ø ×0Ñ0Ø×,Ñ,Ø—n‘nØ(,×(HÑ(HØ×,Ñ,Ø—‘Ø—‘ô
ˆô" 	ØØØ'ØØØ!%×!:Ñ!:Ø×*Ñ*ö	
ô %Ø—‘ØØ!×2Ñ2Ø×.Ñ.Ø×.Ñ.Ø×(Ñ(Ø×.Ñ.Ø×)Ñ)Ø ×0Ñ0Ø×,Ñ,Ø—n‘nØ(,×(HÑ(HØ×,Ñ,ô
ˆô 	ØØØ'ØØØ!%×!:Ñ!:Ø×*Ñ*õ	
ô ‡K�KÜ�=‰=ˆ/Ð<¸T×=MÑ=MÐ<NÌvÏ{É{ÈmÐ\örF   Ú__main__zTrain Vision-Language Model)Údescriptionz--model-pathz'mlx-community/Qwen2-VL-2B-Instruct-bf16)ÚtypeÚdefaultz--full-finetuneÚ
store_true)Úactionz--train-visionz	--datasetT)r�   Úrequiredz--splitr	   z--dataset-configz--image-resize-shape)r�   Únargsr�   z--custom-prompt-formatz®Custom JSON prompt template. Example: {"user": [{"type": "image","image":"{image}"}, {"type": "text","text":"{question}"}], "assistant": [{"type": "text","text":"{answer}"}]})r�   r�   Úhelpz--learning-rategñhãˆµøô>z--batch-sizez--itersiè  z--epochsz--steps-per-reportz--steps-per-evalz--steps-per-savez--val-batchesz--max-seq-lengthi   z--grad-checkpointz--grad-clipz--train-on-completionsz--gradient-accumulation-stepsz--assistant-idi#- z--lora-alphaz--lora-rankz--lora-dropoutg        z--train-modeÚsftrh   z(Training mode: 'sft' (default) or 'orpo')r�   r�   Úchoicesr•   z--betagš™™™™™¹?zORPO beta (odds-ratio weight)z--epsg:Œ0âŽyE>z ORPO numerical stability epsilonz--output-pathzadapters.safetensorsz--adapter-path)N)-Úargparser3   ÚloggingÚmlx.optimizersÚ
optimizersrˆ   Údatasetsr   Útrainer.datasetsr   r   Útrainer.orpo_trainerr   r   Útrainer.sft_trainerr   r	   Útrainer.utilsr
   r   r   r   r   r   r   Úutilsr   ÚbasicConfigÚINFOÚ	getLoggerÚ__name__rT   ÚsetLevelÚWARNINGrE   rb   rŒ   ÚArgumentParserÚparserÚadd_argumentr    ÚintÚfloatÚ
parse_argsr_   © rF   r-   Ú<module>r¯      sº  ðÛ Û Û å Ý !ç Dß >ß 4÷÷ ñ õ à × Ò ˜'Ÿ,™,Õ 'Ø	×	Ò	˜8Ó	$€Ø × Ò �'Ó × #Ñ # G§O¡OÔ 4Ø × Ò �*Ó × &Ñ & w§¡Ô 7Ø × Ò Ð#Ó $× -Ñ -¨g¯o©oÔ >ô>ôB(òVxðv ˆzÕØ×$Ò$Ð1NÔO€Fð ×ÑØ˜SÐ*Sð ô ð ×ÑÐ)°,ÐÔ?Ø
×ÑÐ(°ÐÔ>ð ×Ñ˜¨#¸ÐÔ=Ø
×Ñ˜	¨°WÐÔ=Ø
×ÑÐ*°¸dÐÔCØ
×ÑÐ.°SÀÈ4ÐÔPØ
×ÑØ ØØð ~ð	 ô ð ×ÑÐ)°¸tÐÔDØ
×Ñ˜¨S¸!ÐÔ<Ø
×Ñ˜	¨°TÐÔ:Ø
×Ñ˜
¨°dÐÔ;Ø
×ÑÐ,°3ÀÐÔCØ
×ÑÐ*°¸cÐÔBØ
×ÑÐ*°¸cÐÔBØ
×Ñ˜¨c¸1ÐÔ=Ø
×ÑÐ*°¸dÐÔCØ
×ÑÐ+°LÐÔAØ
×Ñ˜¨E¸4ÐÔ@Ø
×ÑÐ0¸ÐÔFØ
×ÑÐ7¸cÈ1ÐÔMØ
×ÑÐ(¨s¸EÐÔBð ×Ñ˜¨U¸BÐÔ?Ø
×Ñ˜¨C¸ÐÔ;Ø
×ÑÐ(¨u¸cÐÔBð ×ÑØØØØ˜�Ø7ð ô ð ×ÑØ�u cÐ0Oð ô ð ×ÑØ�e TÐ0Rð ô ð
 ×Ñ˜¨cÐ;QÐÔRØ
×ÑÐ(¨s¸DÐÔAà×ÑÓ€DÙˆ†JñC rF   