o
    
۾i'                     @   s  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mZ d dl	m
Z
 d dlmZ d dlZd dlZd dlZd dlmZ d dlmZ d dlmZ eeZdeejejjB  fdd	Zd
efddZdeded
efddZd
efddZ ded
efddZ!ded
e"eef fddZ#deded
efddZ$deded
efddZ%deded
efdd Z&d
efd!d"Z'd
efd#d$Z(d
efd%d&Z)d>d(ed
e*e fd)d*Z+d
efd+d,Z,ded
ej-dB fd-d.Z.d/ed
e"eeef fd0d1Z/d?d2edededB d
efd3d4Z0			d@d5ejj1ej1B d/ed6e
d7edB d8e2dB d9edB d
ejejjB fd:d;Z3e j4		 	dAd/ed6e
d7edB d9ed8e2dB d
eej fd<d=Z5dS )B    N)IteratorSequence)Anyuuid4)	parse_url)init_loggersocketsc                 C   s"   | D ]}|d ur|j dd qd S )Nr   linger)close)r	   sock r   L/home/ubuntu/.local/lib/python3.10/site-packages/vllm/utils/network_utils.pyclose_sockets   s
   r   returnc                  C   s   t j} dtjv rdtjvrtd | r| S z&ttjtj}|	d |
 d W  d    W S 1 s6w   Y  W n	 tyE   Y nw z&ttjtj}|	d |
 d W  d    W S 1 sfw   Y  W n	 tyu   Y nw tjddd	 d
S )NHOST_IPVLLM_HOST_IPa  The environment variable HOST_IP is deprecated and ignored, as it is often used by Docker and other software to interact with the container's network stack. Please use VLLM_HOST_IP instead to set the IP address for vLLM processes to communicate with each other.)z8.8.8.8P   r   )z2001:4860:4860::8888r   zFailed to get the IP address, using 0.0.0.0 by default.The value can be set by the environment variable VLLM_HOST_IP or HOST_IP.   )
stacklevelz0.0.0.0)envsr   osenvironloggerwarningsocketAF_INET
SOCK_DGRAMconnectgetsockname	ExceptionAF_INET6warningswarn)host_ipsr   r   r   get_ip!   s8   

&

&r'   addressfamilyc                 C   s@   zt  |t j}|| df |  W dS  ty   Y dS w )Nr   TF)r   r   bindr   OSError)r(   r)   r&   r   r   r   test_loopback_bindK   s   r,   c                  C   s6   t j} | r| S tdtjrdS tdtjrdS td)Nz	127.0.0.1z::1zsNeither 127.0.0.1 nor ::1 are bound to a local interface. Set the VLLM_LOOPBACK_IP environment variable explicitly.)r   VLLM_LOOPBACK_IPr,   r   r   r"   RuntimeError)loopback_ipr   r   r   get_loopback_ipU   s   r0   c                 C   s&   zt |  W dS  ty   Y dS w )NTF)	ipaddressIPv6Address
ValueError)r(   r   r   r   is_valid_ipv6_addressg   s   
r4   	host_portc                 C   sZ   |  dr | dd\}}|dd  }|dd }|t|fS | d\}}|t|fS )N[]   :)
startswithrsplitsplitint)r5   hostportr   r   r   split_host_porto   s   
r@   r>   r?   c                 C   s&   t | rd|  d| S |  d| S )Nr6   ]:r9   r4   )r>   r?   r   r   r   join_host_port{   s   rC   ipc                 C   s
   t | |S N)get_tcp_urirD   r?   r   r   r   get_distributed_init_method   s   
rH   c                 C   s(   t | rd|  d| S d|  d| S )Nztcp://[rA   ztcp://r9   rB   rG   r   r   r   rF      s   rF   c                  C   s   t j} d|  dt  S )Nzipc:///)r   VLLM_RPC_BASE_PATHr   )base_rpc_pathr   r   r   get_open_zmq_ipc_path   s   rL   c                   C   s   dt   S )Nz	inproc://r   r   r   r   r   get_open_zmq_inproc_path   s   rM   c                  C   s:   dt jv rtj} t| | d }	 t }||vr|S qt S )a<  
    Get an open port for the vLLM process to listen on.
    An edge case to handle, is when we run data parallel,
    we need to avoid ports that are potentially used by
    the data parallel master process.
    Right now we reserve 10 ports for the data parallel master
    process. Currently it uses 2 ports.
    VLLM_DP_MASTER_PORT
   )r   r   r   rN   range_get_open_port)dp_master_portreserved_port_rangecandidate_portr   r   r   get_open_port   s   
	rU      countc                 C   s6   t t  }t|| k r|t  t|| k st|S )zGet a list of open ports.)setr=   lenaddrU   list)rW   portsr   r   r   get_open_ports_list   s
   
r]   c                  C   s6  t j} | d urD	 z$ttjtj}|d| f | W  d    W S 1 s&w   Y  W n tyB   | d7 } td| d |  Y nw qz'ttjtj}|d |	 d W  d    W S 1 sdw   Y  W d S  ty   ttj
tj}|d |	 d W  d     Y S 1 sw   Y  Y d S w )NT r8   z)Port %d is already in use, trying port %d)r^   r   )r   	VLLM_PORTr   r   SOCK_STREAMr*   r+   r   infor    r"   )r?   r&   r   r   r   rQ      s0   &	

(

*rQ   c              	   C   sv   t jdrd S t }t D ](}|jj| kr8|j	d ur8|j	|kr8z	t
|j	W   S  tjy7   Y  d S w qd S )Ndarwin)sysplatformr:   r   getpidpsutilnet_connectionsladdrr?   pidProcessNoSuchProcess)r?   our_pidconnr   r   r   find_process_using_port   s    rn   pathc                 C   s   t | }|jstd|  |j}|jpd}t|jpd}|dr-|dr-|dd }|dkr>t||fs>td|  |dkrK|rKtd|  |||fS )z Split a zmq path into its parts.zInvalid zmq path: r^   r6   r7   r8   tcp)	r   schemer3   hostnamestrr?   r:   endswithall)ro   parsedrr   r>   r?   r   r   r   split_zmq_path   s   

rx   rr   c                 C   sF   |du r|  d| S t |r|  d| d| S |  d| d| S )a8  Make a ZMQ path from its parts.

    Args:
        scheme: The ZMQ transport scheme (e.g. tcp, ipc, inproc).
        host: The host - can be an IPv4 address, IPv6 address, or hostname.
        port: Optional port number, only used for TCP sockets.

    Returns:
        A properly formatted ZMQ path string.
    Nz://z://[rA   r9   rB   )rr   r>   r?   r   r   r   make_zmq_path   s
   ry   ctxsocket_typer*   identityr   c                 C   sN  t  }| |}|jd }|jd }	|dkr|	dkrtdnd}
|du r/|tjtjtj	fv}|tj
tjtjfv rG|tjd |tj|
 |tjtjtjfv r_|tjd |tj|
 |durj|tj| |duru|tj| |tjkr|tjd t|\}}}|d	krt|r|tjd
 |r|| |S || |S )z9Make a ZMQ socket with the proper bind/connect semantics.i   @       g      Arp   Nr   Trq   r8   )rf   virtual_memoryr   total	availabler=   zmqPUSHSUBXSUBPULLDEALERROUTER
setsockoptRCVHWMRCVBUFSNDHWMSNDBUFIDENTITYLINGERXPUBXPUB_VERBOSErx   r4   IPV6r*   r   )rz   ro   r{   r*   r|   r   memr   	total_memavailable_membuf_sizerr   r>   _r   r   r   make_zmq_socket  s6   






r   c              	   c   st    t  }z-zt|| |||dV  W n ty    td Y n
w W |j|d dS W |j|d dS |j|d w )z Context manager for a ZMQ socket)r*   r|   zGot Keyboard Interrupt.r
   N)r   Contextr   KeyboardInterruptr   debugdestroy)ro   r{   r*   r   r|   rz   r   r   r   zmq_socket_ctx<  s   
r   )rV   rE   )NNN)Nr   N)6
contextlibr1   r   r   rc   r#   collections.abcr   r   typingr   uuidr   rf   r   zmq.asynciourllib3.utilr   	vllm.envsr   vllm.loggerr   __name__r   Socketasyncior   rt   r'   r=   boolr,   r0   r4   tupler@   rC   rH   rF   rL   rM   rU   r[   r]   rQ   rj   rn   rx   ry   r   bytesr   contextmanagerr   r   r   r   r   <module>   s   *
 
8