o
    2h                     @   s   d Z ddlmZ ddlmZ ddlmZ ddlmZ dddZd	d
 Z	dd Z
G dd deZG dd deZdd Zdd Zdd ZdS )z!Device-related support functions.    )context)configdevice)opsNc                 C   s   t | tjrtj| j} ntj| } | jdu s)| j| j ks)J d| jf tjddddd}t	
 rQtjtdd j}|jrK||}n|jdd}|r\|tj|}|| }| S )a  Canonicalize device string.

  If d has missing components, the rest would be deduced from the `default`
  argument or from '/replica:0/task:0/device:CPU:0'. For example:
    If d = '/cpu:0', default='/job:worker/task:1', it returns
      '/job:worker/replica:0/task:1/device:CPU:0'.
    If d = '/cpu:0', default='/job:worker', it returns
      '/job:worker/replica:0/task:0/device:CPU:0'.
    If d = '/gpu:0', default=None, it returns
      '/replica:0/task:0/device:GPU:0'.

  Note: This uses "job:localhost" as the default if executing eagerly.

  Args:
    d: a device string or tf.config.LogicalDevice
    default: a string for default device if d doesn't have all components.

  Returns:
    a canonicalized device string.
  Nz"Device type '%s' must be all-caps.r   CPU)replicataskdevice_typedevice_index	localhost)job)
isinstancer   LogicalDevice	tf_device
DeviceSpecfrom_stringnamer
   upperr   #executing_eagerly_outside_functionsr   list_logical_devicesr   make_merged_specreplace	to_string)ddefaultresulthost_cpu r   c/var/www/html/chatgem/venv/lib/python3.10/site-packages/tensorflow/python/distribute/device_util.pycanonicalize   s,   


r    c                 C   s,   t | }tj|}|jdddd}| S )a  Partially canonicalize device string.

  This returns device string from `d` without including job and task.
  This is most useful for parameter server strategy where the device strings are
  generated on the chief, but executed on workers.

   For example:
    If d = '/cpu:0', default='/job:worker/task:1', it returns
      '/replica:0/device:CPU:0'.
    If d = '/cpu:0', default='/job:worker', it returns
      '/replica:0/device:CPU:0'.
    If d = '/gpu:0', default=None, it returns
      '/replica:0/device:GPU:0'.

  Note: This uses "job:localhost" as the default if executing eagerly.

  Args:
    d: a device string or tf.config.LogicalDevice

  Returns:
    a partially canonicalized device string.
  Nr   )r   r	   r   )r    r   r   r   r   r   )r   canonicalized_devicespecr   r   r   !canonicalize_without_job_and_taskL   s   r#   c                 C   s   t | t dS )z0Canonicalize `d` with current device as default.)r   )r    current)r   r   r   r   resolvei   s   r%   c                   @   s    e Zd ZdZddgZdd ZdS )_FakeNodeDefz"A fake NodeDef for _FakeOperation.opr   c                 C   s   d| _ d| _d S N )r'   r   selfr   r   r   __init__s   s   
z_FakeNodeDef.__init__N)__name__
__module____qualname____doc__	__slots__r,   r   r   r   r   r&   n   s    r&   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	_FakeOperationz4A fake Operation object to pass to device functions.c                 C   s   d| _ d| _d| _t | _d S r(   )r   typer   r&   node_defr*   r   r   r   r,   {   s   z_FakeOperation.__init__c                 C   s   t || _d S N)r   _device_stringr   )r+   r   r   r   r   _set_device   s   z_FakeOperation._set_devicec                 C   s
   || _ d S r5   r   )r+   
device_strr   r   r   _set_device_from_string   s   
z&_FakeOperation._set_device_from_stringN)r-   r.   r/   r0   r,   r7   r9   r   r   r   r   r2   x   s
    r2   c                  C   s4   t  rt j} | S t }t  | |j} | S )z;Return a string (not canonicalized) for the current device.)r   r   r   device_namer2   get_default_graph_apply_device_functionsr   )r   r'   r   r   r   r$      s   
r$   c                 C   s*   t j| }t j|j|j|jddd S )z;Returns the corresponding host device for the given device.r   r   )r   r   r	   r
   r   )r   r   r   r   r   r	   r   )r   r"   r   r   r   get_host_for_device   s   r=   c                 C   s   t dd t| D pdS )z-Returns device strings for local GPUs or CPU.c                 s   s    | ]}d | V  qdS )z/device:GPU:%dNr   ).0ir   r   r   	<genexpr>   s    z.local_devices_from_num_gpus.<locals>.<genexpr>)z/device:CPU:0)tuplerange)num_gpusr   r   r   local_devices_from_num_gpus   s   rD   r5   )r0   tensorflow.python.eagerr   tensorflow.python.frameworkr   r   r   r   r    r#   r%   objectr&   r2   r$   r=   rD   r   r   r   r   <module>   s   
4
