
    <Lh                     |    d dl Z d dlZd dlZd dlZd dlZd dlZddlmZ  ej        e	          Z
 G d d          ZdS )    N   )
LLMManagerc            	       z    e Zd ZddedededefdZd Zd Zd	 Zd
e	fdZ
de	d
efdZd Zd Zde	fdZde	fdZdS )	GPUWorkerr   coordinator_hostcoordinator_port
model_pathgpu_idc                     || _         || _        || _        || _        d| dt	          t          j                               | _        d | _        d | _        d| _	        d| _
        d S )Nworker__F)r   r   r	   r
   inttime	worker_idsocketllm_managerrunning	connected)selfr   r   r	   r
   s        D:\omnillm\worker\gpu_worker.py__init__zGPUWorker.__init__   sf     0 0$>6>>C	,<,<>>    c                 "   	 t          j         t           j        t           j                  | _         | j                             | j        | j        f           d| _        t          | j        | j	                  | _
        |                                  t          j        | j        d          }|                                 |                                  dS # t"          $ r/}t$                              d|            d| _        Y d}~dS d}~ww xY w)zConnette al coordinatorT)targetdaemonz"Failed to connect to coordinator: FN)r   AF_INETSOCK_STREAMconnectr   r   r   r   r	   r
   r   _register_with_coordinator	threadingThread_heartbeat_loopstart_receive_loop	Exceptionloggererror)r   heartbeat_threades      r   r   zGPUWorker.connect   s   	# -8JKKDKK!68M NOOO!DN  *$/4;GGD ++---  )/t7KTXYYY""$$$       	# 	# 	#LLAaAABBB"DNNNNNNN	#s   CC 
D$D		Dc                 b    d| _         | j        r| j                                         d| _        dS )zDisconnette dal coordinatorFN)r   r   closer   )r   s    r   
disconnectzGPUWorker.disconnect/   s2    ; 	 Kr   c                 d   |                                  }| j                                        }d| j        |||                     |          d}| j                            t          j        |          	                    d                     t                              d| j         d           dS )z%Registra il worker con il coordinatorworker_register)typer   gpu_info
model_infoperformance_scoreutf-8Worker z registered with coordinatorN)_get_gpu_infor   get_model_infor   _calculate_performance_scorer   sendjsondumpsencoder&   info)r   r0   r1   registration_messages       r   r   z$GPUWorker._register_with_coordinator6   s    %%''%4466
 & $!%!B!B8!L!L 
  
 	$899@@IIJJJJdnJJJKKKKKr   returnc                     t           j                                        rIt           j                            | j                  }|j        |j        |j        |j         d|j	         dS ddddS )zOttiene informazioni sulla GPU.)gpu_nametotal_memory
cuda_corescompute_capabilityCPUr   )rA   rB   rC   )
torchcudais_availableget_device_propertiesr
   namerB   multi_processor_countmajorminor)r   	gpu_propss     r   r5   zGPUWorker._get_gpu_infoF   sv    :""$$ 	
88EEI%N ) 6'=)2&L&L9?&L&L	   "1AFFFr   r0   c                     |d         dk    rdS |d         dz  }|d         }|dz  dz  |d	z  d
z  z   }t          dt          d|                    S )z.Calcola score prestazionale per load balancingrA   rE   g      ?rB   i   @rC      g333333?d   g?g?g      ?)maxmin)r   r0   	memory_gbrC   scores        r   r7   z&GPUWorker._calculate_performance_scoreR   sg    J5((3 ^,8	l+
R3&*s*:c)AA3C(((r   c                    | j         r	 d| j        t          j                    d}| j                            t          j        |                              d                     t          j        d           n<# t          $ r/}t                              d|            d| _         Y d}~dS d}~ww xY w| j         dS dS )z(Invia heartbeat periodico al coordinator	heartbeat)r/   r   	timestampr3   
   zError sending heartbeat: FN)r   r   r   r   r8   r9   r:   r;   sleepr%   r&   r'   )r   heartbeat_messager)   s      r   r"   zGPUWorker._heartbeat_loop^   s    n 	'!%!%% %!
   ,=!>!>!E!Eg!N!NOOO
2   <<<===!& n 	 	 	 	 	s   A/A9 9
B2$B--B2c                    d| _         | j         r| j        r	 | j                            d                              d          }|sdS t          j        |          }|                     |           n<# t          $ r/}t          
                    d|            d| _        Y d}~dS d}~ww xY w| j         r| j        dS dS dS dS )z$Loop principale per ricevere compitiTi   r3   zError receiving data: FN)r   r   r   recvdecoder9   loads_handle_messager%   r&   r'   )r   datamessager)   s       r   r$   zGPUWorker._receive_loopn   s   l 	t~ 	{''--44W== E*T**$$W----   9a99:::!& l 	t~ 	 	 	 	 	 	 	 	 	s   /A2 )A2 2
B+<$B&&B+rb   c                     |                     d          }|dk    r|                     |           dS |dk    rt                              d           dS dS )z!Gestisce messaggi dal coordinatorr/   inference_taskregistration_confirmedz%Registration confirmed by coordinatorN)get_handle_inference_taskr&   r<   )r   rb   message_types      r   r`   zGPUWorker._handle_message   sf    {{6**+++''00000555KK?@@@@@ 65r   c                 h   |d         }|d         }|d         }	 | j                             |          }d|| j        ||d}| j                            t          j        |                              d                     t          	                    d| j         d|            dS # t          $ r}t                              d	|            d
|| j        t          |          d}| j                            t          j        |                              d                     Y d}~dS d}~ww xY w)zGestisce task di inferenza
request_idprompt_chunkchunk_idworker_response)r/   rj   r   rl   resultr3   r4   z completed task for request zError during inference: worker_error)r/   rj   r   r'   N)r   generater   r   r8   r9   r:   r;   r&   r<   r%   r'   str)	r   rb   rj   rk   rl   rn   response_messager)   error_messages	            r   rg   z GPUWorker._handle_inference_task   sZ   \*
~.:&	H%..|<<F *(!^$     KTZ(899@@IIJJJKKZ$.ZZjZZ[[[[[ 		H 		H 		HLL7A77888 '(!^Q	 M KTZ66==gFFGGGGGGGGG		Hs   BB' '
D11A5D,,D1N)r   )__name__
__module____qualname__rq   r   r   r   r,   r   dictr5   floatr7   r"   r$   r`   rg    r   r   r   r      s       	 	 	 	QT 	^a 	 	 	 	# # #0  L L L 
Gt 
G 
G 
G 
G
)T 
)e 
) 
) 
) 
)     "At A A A AHd H H H H H Hr   r   )r   r9   r    r   rF   loggingr   r   	getLoggerrt   r&   r   ry   r   r   <module>r|      s             # # # # # #		8	$	$\H \H \H \H \H \H \H \H \H \Hr   