Ë
    ëÓ^jX`  ã                   óœ  — d Z ddlZddlmZ ddlZddlmZ ddlmZm	Z	m
Z
 ddlmZ ddlmZmZmZmZ ddlmZ 	 dd	lmZ dd
lmZmZmZ ddlmZmZmZm Z  ddl!m"Z" ddl#m$Z$  e$«       Z%dd„Z&e� G d„ de«      Z'ndZ' G d„ de«      Z(de)de*fd„Z+de)dz  de*fd„Z,d de-e)z  de)dz  de*fd„Z.ddœdedede)dz  dedef
d„Z/y# e$ r dZY ŒŠw xY w)!uA   Trainer factory â€” assembles a PTL Trainer from RF-DETR configs.é    N)ÚAny)ÚTrainer)ÚModelCheckpointÚRichProgressBarÚTQDMProgressBar)ÚRichProgressBarTheme)Ú	CSVLoggerÚMLFlowLoggerÚTensorBoardLoggerÚWandbLogger)ÚDDPStrategy)Ú_MultiProcessingLauncher)ÚKeypointTrainConfigÚModelConfigÚTrainConfig)ÚBestModelCallbackÚDropPathCallbackÚRFDETREarlyStoppingÚRFDETREMACallback)ÚCOCOEvalCallback)Ú
get_loggerÚreturnc                  ó   — ddl m}  y)a¯  Probe the full tensorboard import chain to surface numpy/tensorflow incompatibilities early.

    When tensorboard is installed alongside a numpy-2.0-incompatible tensorflow, importing
    ``torch.utils.tensorboard`` raises ``AttributeError`` at module level (e.g. ``np.float_`` was
    removed in NumPy 2.0).  Calling this function inside the logger-construction try/except lets
    ``build_trainer`` degrade gracefully to CSV-only logging instead of crashing mid-training.

    Raises:
        ImportError: If the ``tensorboard`` package is absent.
        AttributeError: If ``torch.utils.tensorboard`` fails to import due to a NumPy 2.0 /
            tensorflow incompatibility.
    r   ©ÚSummaryWriterN)Útorch.utils.tensorboardr   r   s    úb/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/rfdetr/training/trainer.pyÚ&_try_import_tensorboard_summary_writerr   '   s   € ö 6ó    c                   ó&   — e Zd ZdZedefd„«       Zy)Ú_InteractiveSpawnLauncherz=Spawn launcher that reports itself as interactive-compatible.r   c                  ó   — y)NT© ©Úselfs    r   Úis_interactive_compatiblez3_InteractiveSpawnLauncher.is_interactive_compatibleO   s   € àr   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚpropertyÚboolr&   r#   r   r   r!   r!   L   s   „ ÙKà	ð	¨tò 	ó 
ñ	r   r!   c                   ó   — e Zd ZdZdd„Zy)Ú_NotebookSpawnDDPStrategyzFSpawn-based DDP strategy that works inside Jupyter / Kaggle notebooks.Nc                 óŒ   — | j                   €t        d«      ‚t        €t        d«      ‚t        | | j                  ¬«      | _        y )Nzs_NotebookSpawnDDPStrategy requires a cluster environment; ensure the strategy is initialised through PTL's Trainer.zýNotebook spawn strategy requires pytorch_lightning.strategies.launchers.multiprocessing._MultiProcessingLauncher. Your installed PyTorch Lightning version changed this private API; pin/upgrade PTL to a compatible version in the supported >=2.6,<3 range.)Ústart_method)Úcluster_environmentÚRuntimeErrorr!   Ú_start_methodÚ	_launcherr$   s    r   Ú_configure_launcherz-_NotebookSpawnDDPStrategy._configure_launcherZ   sR   € Ø×#Ñ#Ð+ÜðLóð ô %Ð,Üð[óð ô 3°4Àd×FXÑFXÔYˆ�r   ©r   N)r'   r(   r)   r*   r5   r#   r   r   r.   r.   W   s   „ ÙPôZr   r.   Ústrategyc                 óL   ‡— | j                  «       Št        ˆfd„dD «       «      S )zLReturn whether a TrainConfig strategy string requests distributed execution.c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­w©Nr#   )Ú.0ÚtokenÚstrategy_names     €r   ú	<genexpr>z5_is_distributed_strategy_requested.<locals>.<genexpr>m   s   øè ø€ ÒP¨%ˆu˜Ô%ÑPùs   ƒ)ÚddpÚfsdpÚ	deepspeed)ÚlowerÚany)r7   r=   s    @r   Ú"_is_distributed_strategy_requestedrD   j   s!   ø€ à—N‘NÓ$€MÜÓPÐ3OÔPÓPÐPr   Úacceleratorc                 óÒ   — | xs dj                  «       j                  «       }|dv rAt        j                  j	                  «       xr! t        j                  j                  «       dkD  S y)zJReturn whether PTL auto/all device resolution can select multiple devices.Úauto)rG   ÚcudaÚgpué   F)ÚstriprB   ÚtorchrH   Úis_availableÚdevice_count)rE   Úaccelerator_names     r   Ú&_accelerator_has_multiple_auto_devicesrP   p   sU   € à#Ò- v×4Ñ4Ó6×<Ñ<Ó>ÐØÐ2Ñ2Ü�z‰z×&Ñ&Ó(ÒJ¬U¯Z©Z×-DÑ-DÓ-FÈÑ-JÐJØr   Údevicesc                 ón  — t        | t        «      r| dk(  rt        |«      S | dkD  S | j                  «       j	                  «       }|dv rt        |«      S |j                  «       rt        |«      dkD  S d|v r<t        |j                  d«      D �cg c]  }|j                  «       sŒ|‘Œ c}«      dkD  S yc c}w )zQReturn whether the configured devices value explicitly requests multiple devices.éÿÿÿÿrJ   )rG   z-1ú,F)Ú
isinstanceÚintrP   rK   rB   ÚisdigitÚlenÚsplit)rQ   rE   Údevices_nameÚentrys       r   Ú_requests_multiple_devicesr\   x   s«   € ä�'œ3ÔØ�bŠ=Ü9¸+ÓFÐFØ˜‰{ÐØ—=‘=“?×(Ñ(Ó*€LØ�~Ñ%Ü5°kÓBÐBØ×ÑÔÜ�<Ó  1Ñ$Ð$Ø
ˆlÑÜ |×'9Ñ'9¸#Ó'>ÖP˜eÀ%Ç+Á+Å-’EÒPÓQÐTUÑUÐUØùò Qs   ÂB2Â#B2)rE   Útrain_configÚmodel_configÚtrainer_kwargsc                óÂ  ‡‡‡‡— | Š‰€‰j                   Šdt        fˆˆˆfd„}|j                  d‰j                  «      Š|j                  d‰j                  «      }|j                  d‰j
                  «      }t        ‰t        «      r‰j                  «       j                  «       nd}t        ‰j                  «      }t        ‰t        «      |k7  r*t        dt        ‰t        «      › d‰j                  › d	�«      ‚t        t        ‰«      «      xs |d
kD  xs t        |‰«      }	|r|	rt        d‰›d|›d|›d�«      ‚|dv r$t!        dd¬«      Št"        j%                  d|«       nH|dk(  s|dk(  r>|	r<t'        d¬«      Š|dk(  rt"        j%                  d«       nt"        j%                  d«       t)        ˆfd„dD «       «      }
t        ‰j*                  «      xr |
 }‰j*                  r"|
r t-        j.                  d‰›d�t0        d¬«       g }‰j2                  dk(  r'|j5                  t7        d t9        d!¬"«      ¬#«      «       n*‰j2                  d$k(  r|j5                  t;        d ¬%«      «       |r;|j5                  t=        ‰j>                  ‰j@                  ‰jB                  ¬&«      «       ‰jD                  d'kD  r%|j5                  tG        ‰jD                  ¬(«      «       |j5                  tI        ‰jJ                  ‰jL                  ‰jN                  ‰jP                  ‰jR                  ¬)«      «       ‰jT                  d
k7  r+|j5                  tW        ‰jX                  d*d
d
d+d+d+¬,«      «       |j5                  tW        ‰jX                  d-‰jT                  d.d+d+d+¬,«      «       |rd/}d0}n‰jL                  rd1}d2}nd3}d4}|r|nd}‰jZ                  }|j5                  t]        ‰jX                  ||‰j^                  ‰j`                  |¬5«      «       ‰jb                  rH|j5                  te        ‰jf                  ‰jh                  ‰jj                  ||‰j`                  ¬6«      «       tm        ‰jX                  d7d7¬8«      g}‰jn                  r2	 tq        «        |j5                  ts        ‰jX                  d7d7¬8«      «       ‰jz                  r<	 |j5                  t}        ‰j~                  ‰j€                  ‰jX                  ¬:«      «       ‰j„                  r@	 |j5                  t‡        ‰j€                  xs d<‰j~                  ‰jX                  ¬=«      «       ‰jˆ                  rt        d?«      ‚‰jŠ                  }‰jŒ                  }|}|rd
}d}n‰jŽ                  }|}‰j�                  ‰‰j                  ‰j
                  ‰ |«       |||||r|nd+‰j2                  du‰jX                  d@d+dAœ}|j“                  |«       ‰|d<   |rWdBD ]H  }||v sŒ|dCk(  rdDndE}|dCk(  rdFndG}t-        j.                  dH|›dI||   ›dJ|› dK|› dL|› dM�t0        d¬«       ŒJ d
|dC<   d|dN<   t•        dOi |¤ŽS # tt        tv        f$ r!}t"        jy                  d9|«       Y d}~�ŒÎd}~ww xY w# t‚        $ r!}t"        jy                  d;|«       Y d}~�Œ³d}~ww xY w# t‚        $ r!}t"        jy                  d>|«       Y d}~�Œ”d}~ww xY w)Paj  Assemble a PTL ``Trainer`` with the full RF-DETR callback and logger stack.

    Resolves training precision from ``model_config.amp`` and device capability, guards EMA against sharded strategies,
    wires conditional loggers, and applies promoted training knobs (sync_batchnorm, strategy).

    Args:
        train_config: Training hyperparameter configuration.
        model_config: Architecture configuration. Used for precision resolution
            (``model_config.amp``) and to guard against unsupported distributed
            configurations for keypoint models.
        accelerator: PTL accelerator string (e.g. ``"auto"``, ``"cpu"``, ``"gpu"``).
            Defaults to ``None`` which reads from ``train_config.accelerator`` (itself defaulting to ``"auto"``). Pass
            ``"cpu"`` to override auto-detection (e.g. when the caller explicitly requests CPU training via
            ``device="cpu"``).
        **trainer_kwargs: Extra keyword arguments forwarded to ``pytorch_lightning.Trainer``. Use this to pass
            PTL-native flags that are not exposed through ``TrainConfig``, for example::

                build_trainer(tc, mc, fast_dev_run=2)

            Most keys present in both ``trainer_kwargs`` and the built config dict are overridden by the value in
            ``trainer_kwargs``. Detection and segmentation models forward ``accumulate_grad_batches`` from
            ``train_config.grad_accum_steps`` and ``gradient_clip_val`` from ``train_config.clip_max_norm`` to the
            Trainer normally. Keypoint models force ``accumulate_grad_batches=1`` and ``gradient_clip_val=None``
            because ``RFDETRModelModule`` owns both operations under manual optimization; passing those keys for a
            keypoint config raises a ``UserWarning`` to make the override explicit.

    Returns:
        A configured ``pytorch_lightning.Trainer`` instance.
    Nr   c                  ó¬  •— ‰j                   s:‰j                  dk7  r*t        j                  d‰j                  ›d�t        d¬«       y‰dk(  ry‰j                  } t
        j                  j                  «       r~| dk(  ry	| d
k(  rQt
        j                  j                  «       ryt        j                  d«       t        j                  dt        d¬«       y	t
        j                  j                  «       rdS d	S t
        j                  j                  j                  «       r7| d
k(  r1t        j                  d«       t        j                  dt        d¬«       y	y)NrG   z
amp_dtype=z+ has no effect when model_config.amp=False.é   ©Ú
stacklevelz32-trueÚcpuÚfp16z16-mixedÚbf16z
bf16-mixedzqamp_dtype='bf16' was requested but this CUDA device does not support bfloat16; falling back to fp16 ('16-mixed').zXamp_dtype='bf16' is not applied on MPS; RF-DETR uses fp16 ('16-mixed') for MPS autocast.)ÚampÚ	amp_dtypeÚwarningsÚwarnÚUserWarningrL   rH   rM   Úis_bf16_supportedÚ_loggerÚwarningÚbackendsÚmps)ri   rE   r^   Útcs    €€€r   Ú_resolve_precisionz)build_trainer.<locals>._resolve_precision±   s&  ø€ Ø×ÒØ�|‰|˜vÒ%Ü—‘Ø  §¡Ð 0Ð0[Ð\ÜØ õð
 ð ˜%ÒØð —L‘Lˆ	ô �:‰:×"Ñ"Ô$Ø˜FÒ"Ø!Ø˜FÒ"Ü—:‘:×/Ñ/Ô1Ø'Ü—‘ð9ôô —‘ð9äØ õ	ð "ä#(§:¡:×#?Ñ#?Ô#A�<ÐQÀzÐQÜ�>‰>×Ñ×*Ñ*Ô,Ø˜FÒ"Ü—‘Ønôô —‘ØnÜØ õð
 Ør   r7   rQ   Ú	num_nodesz;Config/model mismatch: isinstance(tc, KeypointTrainConfig)=z* but model_config.use_grouppose_keypoints=zT. Pass KeypointTrainConfig for keypoint models and TrainConfig for detection models.rJ   zMKeypoint training currently does not support distributed execution (strategy=z
, devices=z, num_nodes=z]). Use single-process training for now (for example strategy='auto', devices=1, num_nodes=1).)Úddp_notebookÚ	ddp_spawnÚspawnT)r0   Úfind_unused_parametersuI   %s â†’ spawn-based DDP to avoid OpenMP thread pool corruption after fork.r?   rG   )rx   uX   strategy='auto' with distributed execution â†’ DDPStrategy(find_unused_parameters=True).u<   strategy='ddp' â†’ DDPStrategy(find_unused_parameters=True).c              3   óT   •K  — | ]  }|t        ‰«      j                  «       v –— Œ! y ­wr:   )ÚstrrB   )r;   Úsr7   s     €r   r>   z build_trainer.<locals>.<genexpr>*  s#   øè ø€ ÒL°�!”s˜8“}×*Ñ*Ó,Ô,ÑLùs   ƒ%()r@   rA   zTEMA disabled: RFDETREMACallback is not compatible with sharded strategies (strategy=z.). Set use_ema=False to suppress this warning.rb   rc   Úriché   z.3e)Úmetrics_format)Úrefresh_rateÚthemeÚtqdm)r   )ÚdecayÚtauÚupdate_interval_stepsg        )Ú	drop_path)Úmax_detsÚsegmentationÚeval_intervalÚlog_per_class_metricsÚkeypoint_oks_sigmasÚlastF)ÚdirpathÚfilenameÚevery_n_epochsÚ
save_top_kÚenable_version_counterÚauto_insert_metric_nameÚverbosezcheckpoint_{epoch}rS   zval/keypoint_map_50_95zval/ema_keypoint_map_50_95zval/segm_mAP_50_95zval/ema_segm_mAP_50_95zval/mAP_50_95zval/ema_mAP_50_95)Ú
output_dirÚmonitor_regularÚmonitor_emaÚrun_testÚskip_best_epochsÚsmooth_alpha)ÚpatienceÚ	min_deltaÚuse_emar”   r•   r—   Ú )Úsave_dirÚnameÚversionzéTensorBoard logging disabled: %s. If using NumPy 2.x, ensure your TensorBoard installation is NumPy 2.0 compatible (the failure can originate from tensorboard.compat.tensorflow_stub). Install TensorBoard with: pip install tensorboard)rž   Úprojectr�   z;WandB logging disabled: %s. Install with: pip install wandbÚrfdetr)Úexperiment_nameÚrun_namer�   z=MLflow logging disabled: %s. Install with: pip install mlflowzKClearML logging is not yet supported. Remove clearml=True from TrainConfig.é2   )Ú
max_epochsrE   rQ   rt   r7   Ú	precisionÚaccumulate_grad_batchesÚgradient_clip_valÚsync_batchnormÚ	callbacksÚloggerÚenable_progress_barÚdefault_root_dirÚlog_every_n_stepsÚdeterministic)r§   r¨   r§   Ú1ÚNoneÚgrad_accum_stepsÚclip_max_normz'build_trainer() ignored trainer_kwargs[z]=z1 for a keypoint model. The model will train with ú=z± regardless of the value passed here because RFDETRModelModule owns gradient accumulation and clipping under manual optimization. To change the effective value, set TrainConfig.z	 instead.r¨   r#   )KrE   rz   Úgetr7   rQ   rt   rU   rK   rB   r,   Úuse_grouppose_keypointsr   Ú
ValueErrorrD   r\   ÚNotImplementedErrorr.   rn   ÚinfoÚ_DDPStrategyrC   r›   rj   rk   rl   Úprogress_barÚappendr   r   r   r   Ú	ema_decayÚema_tauÚema_update_intervalr…   r   r   Úeval_max_detsÚsegmentation_headrˆ   r‰   rŠ   Úcheckpoint_intervalr   r“   r˜   r   r–   r—   Úearly_stoppingr   Úearly_stopping_patienceÚearly_stopping_min_deltaÚearly_stopping_use_emar	   Útensorboardr   r   ÚImportErrorÚAttributeErrorro   Úwandbr   Úrunr    ÚModuleNotFoundErrorÚmlflowr
   Úclearmlr³   Úsync_bnr²   ÚepochsÚupdater   )r]   r^   rE   r_   rs   rQ   rt   r=   Úhas_keypointsÚdistributed_requestedÚshardedÚ
enable_emarª   r”   Úearly_stopping_monitor_emar•   Úbest_model_smooth_alphaÚloggersÚexcr³   rÏ   Úmanual_optimizationr§   r¨   Útrainer_configÚkeyÚ	effectiveÚaltr7   rr   s    ``                         @@r   Úbuild_trainerrß   ˆ   sû  û€ ðH 
€BØÐØ—n‘nˆð?¤÷ ?ðD ×!Ñ! *¨b¯k©kÓ:€HØ× Ñ  ¨B¯J©JÓ7€GØ×"Ñ" ;°·±Ó=€IÜ0:¸8ÄSÔ0I�H—N‘NÓ$×*Ñ*Ô,Èt€MÜ˜×=Ñ=Ó>€MÜ�"Ô)Ó*¨mÒ;ÜØIÌ*ÐUWÔYlÓJmÐInð o8Ø8D×8\Ñ8\Ð7]ð ^aðaó
ð 	
ô 	+¬3¨x«=Ó9ò 	<Ø�q‰=ò	<ä% g¨{Ó;ð ñ
 Ñ.ô "ðØ!˜ J¨w¨k¸ÀiÀ]ð Siðió
ð 	
ð Ð5Ñ5Ü,¸'ÐZ^Ô_ˆÜ�‰ØWØõ	
ð 
˜%Ò	 M°VÒ$;Ñ@Uô  °tÔ<ˆØ˜FÒ"Ü�L‰LØjõô �L‰LØNôô ÓLÐ6KÔLÓL€GÜ�b—j‘jÓ!Ò1¨' k€JØ	‡z‚z‘gÜ�‰ðØ!˜Ð$RðTäØõ		
ð €Ià	‡�˜&Ò Ø×ÑÜØÜ*¸%Ô@ôõ	
ð 
�‰˜FÒ	"Ø×Ñœ°aÔ8Ô9áØ×ÑÜØ—l‘lØ—J‘JØ&(×&<Ñ&<ôô	
ð 
‡|�|�cÒØ×ÑÔ)°B·L±LÔAÔBð ×ÑÜØ×%Ñ%Ø%×7Ñ7Ø×*Ñ*Ø"$×":Ñ":Ø "× 6Ñ 6ô	
ôð 
×Ñ Ò"Ø×ÑÜØŸ™ØØ ØØ',Ø(-Øôô
	
ð ×ÑÜØ—M‘MØ)Ø×1Ñ1ØØ#(Ø$)Øô	
ô
ñ Ø2ˆØ%AÑ"Ø	×	'Ò	'Ø.ˆØ%=Ñ"à)ˆØ%8Ð"Ù0:Ñ,À€Kà Ÿo™oÐð ×ÑÜØ—}‘}Ø+Ø#Ø—[‘[Ø×0Ñ0Ø0ô	
ô	ð 
×ÒØ×ÑÜØ×3Ñ3Ø×5Ñ5Ø×1Ñ1Ø /Ø6Ø!#×!4Ñ!4ôô		
ô" ¨¯©¸BÈÔKÐL€Gà	‡~‚~ð	Ü2Ô4Ø�N‰NÜ!ØŸ]™]ØØôôð  
‡x‚xð		`Ø�N‰NÜØŸ™ØŸJ™JØŸ]™]ôôð 
‡y‚yð		bØ�N‰NÜØ$&§J¡JÒ$:°(ØŸV™VØŸ]™]ôôð 
‡z‚zÜ!Ð"oÓpÐpð ×+Ñ+€MØ—J‘J€Gð (ÐÙØ'(ÐØ*.Ñà"$×"5Ñ"5ÐØ)Ðð —i‘iØ"Ø—:‘:Ø—\‘\ØÙ'Ó)Ø#:Ø.Ø!ØÙ$‘'¨%Ø!Ÿ™°dÐ:ØŸM™MØØñ&€Nð" ×Ñ˜.Ô)Ø!)€N�:ÑÙð
 Dò 	ˆCØ�nÒ$Ø#&Ð*CÒ#C™CÈ�	Ø,/Ð3LÒ,LÑ(ÐRa�Ü—‘Ø=¸c¸WÀBÀ~ÐVYÑGZÐF]ð ^8Ø8;°u¸A¸i¸[ð ITàTWÐSXÐXaðcô  Ø öð		ð 56ˆÐ0Ñ1ð /3ˆÐ*Ñ+ÜÑ$�^Ñ$Ð$øôA œ^Ð,ò 	Ü�O‰OðDð ÷ò ûð	ûô$ #ò 	`Ü�O‰OÐYÐ[^×_Ò_ûð	`ûô #ò 	bÜ�O‰OÐ[Ð]`×aÒaûð	búsH   Ò 1Y Ò>;Z Ô?Z4 ÙZÙ#Y?Ù?ZÚ	Z1ÚZ,Ú,Z1Ú4	[Ú=[Û[r6   r:   )0r*   rj   Útypingr   rL   Úpytorch_lightningr   Úpytorch_lightning.callbacksr   r   r   Ú2pytorch_lightning.callbacks.progress.rich_progressr   Úpytorch_lightning.loggersr	   r
   r   r   Úpytorch_lightning.strategiesr   rº   Ú6pytorch_lightning.strategies.launchers.multiprocessingr   rÈ   Úrfdetr.configr   r   r   Úrfdetr.training.callbacksr   r   r   r   Ú#rfdetr.training.callbacks.coco_evalr   Úrfdetr.utilities.loggerr   rn   r   r!   r.   rz   r,   rD   rP   rV   r\   rß   r#   r   r   ú<module>rë      s/  ðñ Hã Ý ã Ý %ß YÑ YÝ Sß ]Ó ]Ý Dð
$Ý_÷ HÑ G÷ó õ AÝ .á
‹,€ó6ðF Ð'ôÐ$<õ ð !%ÐôZ ô Zð&Q°ð Q¸ó Qð¸¸d¹
ð Àtó ñ¨¨c©	ð ÀÀdÁ
ð ÐVZó ð( #ò	J%ØðJ%àðJ%ð �t‘ð	J%ð
 ðJ%ð ôJ%øðc ò $Ø#Òð$ús   ºC ÃCÃ
C