o
    հiU                     @  s  d dl m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 d dl	m
Z
 dejvrEeejjjjd  rEejd eeejjj d dlmZmZmZ edZd(ddZd)ddZd)ddZd*ddZd+dd Zd!d" Zd)d#d$Zd,d%d&Ze d'kre  dS dS )-    )annotationsN)Path)AnyNO_LOCAL_GGUFzgguf-py)
GGUFReaderGGUFValueTypeReaderTensorz	gguf-dumpreaderr   returntuple[str, str]c                 C  s6   | j j}| jdkr|dkrdnd}||fS |}||fS )NSLITTLEBIG)	endianessname
byte_order)r	   file_endianhost_endian r   J/home/ubuntu/.local/lib/python3.10/site-packages/gguf/scripts/gguf_dump.pyget_file_host_endian   s   
r   argsargparse.NamespaceNonec                 C  s*  t | \}}td| d| d tdt| j d t| j dD ]\}}|js.d}n(|jd tjkrNt|jd }d	| t	|jd
 j
 d|  }nt	|jd
 j
}d|dd|ddt|jdd|j
 }|jr|jd }	|	tjkr| }
t|
dkr|
d d d }
|dt|
7 }n.|	| jv r|d| 7 }nt|td}
t|jdkr|
d d
 d }
|d|
7 }t| q$|jrd S tdt| j d t| jdD ]5\}}ddd t|jdgdt|j   D }td|dd|jdd| d|jj
dd|j
 
 qd S )Nz
* File is z  endian, script is running on a z endian host.z
* Dumping z key/value pair(s)   N/Ar   []z  5z: 10z | 8<   9   z...z = {0}   z, ...]z
 tensor(s), c                 s  s    | ]}d  |V  qdS )z{0:5}N)format).0dr   r   r   	<genexpr>A   s    z dump_metadata.<locals>.<genexpr>   7)r   printlenfields	enumeratevaluestypesr   ARRAYstrr   dataSTRINGcontentsr&   reprgguf_scalar_to_npslice
no_tensorstensorsjoinlistshape
n_elementstensor_type)r	   r   r   r   nfieldpretty_type
nest_countlog_message	curr_typecontenttensor
prettydimsr   r   r   dump_metadata    s@   "*



.6rJ   c                 C  s  dd l }t| \}}i }i }|j|||d}t| j D ]C\}}	||	jr+|	jd jnd|	jd}
|
||	j< |	jd d t	j
gkrZdd |	jD dd  |
d< |jsSq|	 |
d	< q|	 |
d	< q|jst| jD ]\}}||j |jj|jjd
||j< qi||tj d S )Nr   )filenameendianmetadatar;   UNKNOWN)indextypeoffsetr   c                 S  s   g | ]}|j qS r   )r   )r'   tr   r   r   
<listcomp>X   s    z&dump_metadata_json.<locals>.<listcomp>array_typesvalue)rO   r>   rP   rQ   )jsonr   modelr/   r.   r0   r1   r   rQ   r   r2   
json_arrayr6   r:   r;   r>   tolistr@   rB   dumpsysstdout)r	   r   rV   r   r   rM   r;   resultidxrB   currrH   r   r   r   dump_metadata_jsonE   s:   
r`   
header_maplist[dict[str, str]]r4   list[dict[str, Any]]c                   s
  ddddd	d
i t | D ]%\} t fdd|D ddd }t d d }||kr1|n||< qg }|dfddt | D  |dfddt | D  |D ]|dfddt | D  q^d}|D ]
}|d| d7 }qx|S )Npaddingint	alignMode
str | NonestrValr3   c                 S  sX   |dkr	| | S |dkr|| d d S |dkr#d|| d  S d|| d  S )Ncenterrightr    left)ri   rjustljust)rd   rf   rh   r   r   r   strAlignm   s   
z7markdown_table_with_alignment_support.<locals>.strAlignc                 S  sT   |dkrdd| d   d S |dkrd| d  d S |dkr&dd| d   S d|  S )Nri   :-   rj   r   rl   r   )rd   rf   r   r   r   	dashAlignw   s   z8markdown_table_with_alignment_support.<locals>.dashAlignc                   s6   g | ]}|  D ]\}}| d  krtt|qqS )key_name)itemsr-   r3   )r'   r(   kv)columnEntryr   r   rS      s   6 z9markdown_table_with_alignment_support.<locals>.<listcomp>r   defaultrr   header_name|c                 3  s2    | ]\}} | | d t|d V  qdS )alignr{   Ngetr3   r'   rO   rx   )rowsPaddingro   r   r   r)      s   0 z8markdown_table_with_alignment_support.<locals>.<genexpr>c                 3  s(    | ]\}} | | d V  qdS )r}   N)r   r   )rs   r   r   r   r)      s   & c                 3  s6    | ]\}}| | d t |d  V  qdS )r}   rt   Nr~   r   )itemr   ro   r   r   r)      s   4  z|
)rd   re   rf   rg   rh   r3   )rd   re   rf   rg   )r/   maxr-   appendr<   )ra   r4   rO   padCountheaderPadCountrowstableStringrowr   )rx   rs   r   r   ro   r   %markdown_table_with_alignment_supporti   s    


$$(r   countre   r3   c                 C  s   | dkr| d }d}n0| dkr| d }d}n%| dkr!| d }d	}n| d
kr,| d }d}n| dkr7| d }d}n| }d}| dkrAdnd t | | S )Ng  4&kCgV瞯<Qg   mBg-q=Tg    eAg&.>Bg    .Agư>Mg     @@gMbP?Kr   ~)round)r   scaled_amountscale_suffixr   r   r   element_count_rounded_notation   s$    r   c                 C  s   |  d}i dddddddd	d
ddddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/}g }|D ]}|  }||v rc|||   qM||  qMd0|S )1N.
token_embdzToken embeddingpos_embdzPosition embeddingoutput_normzOutput normalizationoutputOutput	attn_normzAttention normalizationattn_norm_2attn_qkvzAttention query-key-valueattn_qzAttention queryattn_kzAttention keyattn_vzAttention valueattn_outputzAttention outputffn_normz"Feed-forward network normalizationffn_upzFeed-forward network "up"ffn_gatezFeed-forward network "gate"ffn_downzFeed-forward network "down"ffn_gate_inpzMExpert-routing layer for the Feed-forward network in Mixture of Expert modelsffn_gate_expzHFeed-forward network "gate" layer per expert in Mixture of Expert modelszHFeed-forward network "down" layer per expert in Mixture of Expert modelszFFeed-forward network "up" layer per expert in Mixture of Expert modelsz#State space model input projectionszState space model rolling/shiftz+State space model selective parametrizationz#State space model state compressionz!State space model skip connectionzState space model time stepz#State space model output projectionBlockEncoderDecoder)ffn_down_exp
ffn_up_expssm_in
ssm_conv1dssm_xssm_assm_dssm_dtssm_outblkencdecrk   )splitstriplowerr   titler<   )r   wordsabbreviation_dictionaryexpanded_wordsword	word_normr   r   r   translate_tensor_name   sp   
	
 
r   c           0        s  t | \}}d}|d|j d7 }|d| d7 }|d7 }|d7 }|dt| j d	7 }|d7 }g }t| j d
D ]>\}}|jsEd}n(|jd tjkret|jd
 }	d|	 t	|jd j
 d|	  }nt	|jd j
}dd }
t|j}d}t|jd
kr|jd }|tjkrd}t	t|jd dd}t||kr|
|d |d  }|
|| d d  }dj||d}n|
|}n|| jv rt	|jd d }n|jd tjkrm|jd
 }g }|tjkr2td|}t|D ]D}d}t	t|jd|| d
 d   dd}t||kr'|
|d |d  }|
|| d d  }dj||d}n|
|}|| qn%|| jv rWtd|}t|D ]}|t	|jd|| d
   d  qAdd|  |t|krhdnd d}|||||j
|d q:d d!d"d#d$d%d&d#d'd(d"d#d)d*d&d#d+d,d&d#g}|t||7 }|d7 }|jsg }i }i }td-d. | jD }t| jD ]e\}}|j
d/}d0}|d d1kr|d  d/|d
  }n+|d d2v r|d
 d1kr|d  d/|d
  d/|d  }n|d d2v r|d  }||vrg ||< || || | |||j
< q|d3t| d47 }|d5| d67 }|d7 }|D ]&}|| }td7d. |D }|d8t| d9t| d:|d/d; d<7 }q7|d7 }|d=7 }|d7 }|d>7 }|d7 }g } t| jD ]\}}d?|j}!d?|j}"| ||j
|!|"d@ qydAdBd"d#dCdDd&d#dEdFd"d#dGdHd"d#g}#|t|#| 7 }|d7 }|D ]}|| }tdId. |D }|| dJ }$|dK|d/d; dLt| dMt| dN7 }d
}%d
}&i  |D ]?}t |%tt	t|j!}%t |&tt	|j!}&tt"|j#d
gdOt|j#   D ]\}'}(t  $|'d
tt	|( |'< qqg })|D ]Y}t|j
dPdQdRdS}*dT fdUd.tt"|j#d
gdOt|j#   D }+dVt|j!dW|% dX},|, dY|j!dW|& }-|j%j
 }.|)||j
 |j
|*|-|+|.dZ q1dAdBd"d#dCdDd&d#d[d\d&d#d]d^d&d#d_d`d&d#dadbd&d#g}/|t|/|)7 }|d7 }|dc| ddt|dedf| d7 }|dg|$dhdi7 }|dj7 }qt&| d S )kNr   z# z - GGUF Internal File Dump

z
- Endian: z endian

z## Key Value Metadata Store

z
There are z key-value pairs in this file
r   r   r   r   r   r   c                 S  sZ   t dd td| D dd}d|d  }| ds| dr%d|  d} | |  | S )	Nc                 s  s    | ]
}t |d V  qdS )r   N)r-   group)r'   matchr   r   r   r)      s    zNdump_markdown_metadata.<locals>.escape_markdown_inline_code.<locals>.<genexpr>z`+r   ry   `r   rk   )r   refinditer
startswithendswith)value_stringmax_backticksinline_code_markerr   r   r   escape_markdown_inline_code   s
   z;dump_markdown_metadata.<locals>.escape_markdown_inline_coder"   zutf-8)encodingrr   z{head}...{tail})headtail         z[ r%   z, ...z ])rA   rC   total_elements
field_namerU   rA   POSrj   )rt   r{   r}   rC   TYPErl   r   Countr   KeyrU   Valuec                 s      | ]}|j V  qd S Nr?   r'   rH   r   r   r   r)   ?      z)dump_markdown_metadata.<locals>.<genexpr>r   baser   )r   r   z## Tensors Overview z Elements

z)Total number of elements in all tensors: z
 Elements
c                 s  r   r   r   r   r   r   r   r)   ^  r   z- [z Tensor Group - z Elements](#_z)
z### Tensor Data Offset
zJThis table contains the offset and data segment relative to start of file
z{0:#16x})t_id
layer_namedata_offset	data_sizer   T_IDr   zTensor Layer Namer   zData Offset (B)r   zData Size (B)c                 s  r   r   r   r   r   r   r   r)   z  r   d   z### <a name="z">z Tensor Group : z Elements</a>

r*   z.weightz.(W)z.biasz.(B)z x c                 3  s*    | ]\}}t |d  |  V  qdS )>N)r3   )r'   ir(   prettify_dimension_max_widthsr   r   r)     s   ( (r   )rk   )r   r   human_layer_nameelement_countpretty_dimensionr@   r   z Human Friendly Tensor Layer Namer   Elementsr   Shaper@   Typez- Total elements in z: (z>4z) z - Percentage of total elements: z.2fz%
z

)'r   rW   r-   r.   r/   r0   r1   r   r2   r3   r   r4   r5   bytespartsr&   r8   minranger   r<   r   r   r:   sumr;   r   r   r   replacer   n_bytesr   r?   r=   r>   r   r@   r,   )0r	   r   r   r   markdown_contentkv_dump_tablerA   rB   rC   rD   r   r   rU   rF   truncate_lengthr   r   r   array_elementsrender_elementelement_poskv_dump_table_header_maptensor_prefix_ordertensor_name_to_keytensor_groupskeyrH   tensor_componentstensor_group_namer   r;   group_elementstensor_mapping_tabledata_offset_prettydata_size_pretty tensors_mapping_table_header_mapgroup_percentageprettify_element_est_count_sizeprettify_element_count_sizer   dimension_sizetensor_dump_tablehuman_friendly_namer   element_count_estelement_count_stringtype_name_stringtensor_dump_table_header_mapr   r   r   dump_markdown_metadata   s  "






&
(,




"


0




,*"6
$





	"r  c                  C  sX  t jdd} | jdtdd | jdddd	 | jd
ddd	 | jdddd	 | jdddd	 | jdddd	 | jdddd	 | jdddd	 | ttjdkrQd ndg}tj	|j
r]tjntjd |jsw|jsw|jsw|jswtd|j  t|jd}|jrt|| d S |jrt|| d S |jrt|j d S |jrt|j d S t|| d S )NzDump GGUF file metadata)descriptionrW   zGGUF format model filename)rP   helpz--no-tensors
store_truezDon't dump tensor metadata)actionr  z--jsonzProduce JSON outputz--json-arrayz/Include full array values in JSON output (long)z--data-offsetzStart of data offsetz--data-alignmentz-Data alignment applied globally to data fieldz
--markdownzProduce markdown outputz	--verbosezincrease output verbosityr   z--help)levelz* Loading: r)argparseArgumentParseradd_argumentr3   
parse_argsr-   r[   argvloggingbasicConfigverboseDEBUGINFOrV   markdownr   data_alignmentloggerinforW   r   r`   r  r,   	alignmentrJ   )parserr   r	   r   r   r   main  s.   r/  __main__)r	   r   r
   r   )r	   r   r   r   r
   r   )ra   rb   r4   rc   )r   re   r
   r3   )r
   r   )!
__future__r   r$  r  osr   r[   pathlibr   typingr   environ__file__parentexistspathinsertr3   ggufr   r   r   	getLoggerr+  r   rJ   r`   r   r   r   r  r/  __name__r   r   r   r   <module>   s0   "



%
$
0
/ 
B 
