
    (HJjX                     v    d dl 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 d Zd Zedk(  r e        yy)    N)batch_generateloadstream_generate)DEFAULT_MODEL)pipeline_loadsharded_loadc                     t        j                  d      } | j                  dt        dt         dd       | j                  dd	d
dt
               | j                  ddddt
               | j                  ddddt
               | j                  ddddt
               | j                  ddd       | j                  dddd       | j                  d t
        d!d"#       | j                  d$t
        d%d&#       | S )'z&Set up and return the argument parser.zLLM benchmarking script)descriptionz--modelz[The path to the local model directory or Hugging Face repo. If no model is specified, then z	 is used.N)typehelpdefaultz--prompt-tokensz-pi   zLength of prompt)r   r   r   z--generation-tokensz-gi   zLength of completionz--batch-sizez-b   z
Batch sizez--num-trialsz-n   zNumber of timing trialsz
--pipeline
store_truez,Use pipelining instead of tensor parallelism)actionr   z--quantize-activationsz-qazSQuantize activations using the same quantization config as the corresponding layer.z--prefill-step-sizei   z0Step size for prefill processing (default: 2048))r   r   r   z--delayr   z/Delay between each test in seconds (default: 0))argparseArgumentParseradd_argumentstrr   int)parsers    Z/Users/ahmed/devFolder/claude-voice/.venv/lib/python3.12/site-packages/mlx_lm/benchmark.pysetup_arg_parserr      s[   $$1JKF
..;_IG       #      &   ;  
  b	   ?	   >	   M    c            	         t               } | j                         t        j                  j	                  d       t        j
                  j                         }|j                         j                  r|nd }j                  s|nd }fd}j                  xs t        }|j                         dkD  rt        |||d      \  }n!t        |dddidj                  i      \  }i _        j                   }j"                  j$                  }|j'                  d	      xs |d
   d	   }	t        j                  j)                  d|	||f      j+                         d   fd}
fd}|dk(  r|
}n|} |d        |        g d} |d|dd|d       g t-        j.                        D ]  }j0                  dkD  rt3        j4                  j0                         t3        j6                         } |       }t3        j6                         }j9                  |       |D cg c]  }|t;        ||      f }}|D cg c]  \  }}| d|d }}}|j9                  d||z
  d        |d|dz    ddj=                  |      z           fd}|D cg c]  }| ||      f }}|D cg c]  \  }}| d|d }}} |ddj=                  |      z          y c c}w c c}}w c c}w c c}}w )Nr   c                  (    dk(  rt        | i | y y )Nr   )print)argskwargsranks     r   rprintzmain.<locals>.rprintY   s    194"6" r   r   T)return_configtrust_remote_codequantize_activations)r"   tokenizer_configmodel_config
vocab_sizetext_configc                  F    t        j                        D ]  }   S N)
max_tokensprefill_step_size)r   r,   )responser   generation_tokensmodelprompt	tokenizers    r   single_benchzmain.<locals>.single_benchu   s3    '("44
H 
 r   c                  L    t         j                        j                  S r*   )r   r,   stats)r   r.   r/   promptsr1   s   r   batch_benchzmain.<locals>.batch_bench   s,    ("44
 %	r   zRunning warmup..)
prompt_tpsgeneration_tpspeak_memoryzTiming with prompt_tokens=z, generation_tokens=z, batch_size=.=z.3fztotal_time=zTrial z:  z, c                 L      fdD        }t        |      j                  z  S )Nc              3   6   K   | ]  }t        |        y w)N)getattr).0r-   ks     r   	<genexpr>z$main.<locals>.avg.<locals>.<genexpr>   s     ?Y!$Ys   )sum
num_trials)r@   valsr   	responsess   ` r   avgzmain.<locals>.avg   s     ?Y?4y4??**r   z
Averages: )r   
parse_argsmxrandomseeddistributedinitr    pipeliner/   r   sizer   r   r$   _eos_token_idsprompt_tokensr.   
batch_sizegetrandinttolistrangerC   delaytimesleepperf_counterappendr>   join)r   grouppipeline_grouptensor_groupr!   
model_pathconfigrP   rQ   r'   r2   r6   _benchreport_keysiticr-   tocr@   resultsvrF   r   r.   r/   r0   r5   r    rE   r1   s                         @@@@@@@@r   mainrh   O   s   FDIINN1NN!E::<D"mmUN $54L# ,}Jzz|a#/D$
 y& $(1480$2K2KL	$
 y&  "I&&M..JL)PVM-B<-PJii:
M/JKRRTGQZF	 	  Q

HAK
(-))>,=+?~*aPQI4??#::>JJtzz"!8!"6ABkAwx+,kB.56gdaaS!C>g6S3YsO45!uC 499W#556 $+ %00Kq3q6{KG0*12'$!Q!AaW~'G2
Z499W--. C6 12s   :K8K=0LL__main__)r   rW   mlx.corecorerH   mlx_lmr   r   r   mlx_lm.generater   mlx_lm.utilsr   r   r   rh   __name__ r   r   <module>rq      s=       8 8 ) 4?DW/t zF r   