
    (HJj                        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 dl	Z
d dlmZmZmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZmZmZmZ ddZd	ej8                  d
fdedej<                  defdZ d Z!d Z"e#dk(  r e"        yy)    N)tree_flattentree_maptree_unflatten)tqdm)	load_data)kl_div_loss)grad_checkpoint)compute_bits_per_weightloadquantize_modelsavec                    d}d}t        dt        |      |      D ]  }||||z    } | |d d d df         j                  t        j                        }t
        j                  j                  ||d d dd f         }||j                         j                         z  }||j                  z  } t        j                  ||z        }	|	S )Ng        r      )rangelenastypemxfloat32nnlossescross_entropysumitemsizemathexp)
modeldata
batch_sizeall_lossntokssbatchlogitsr   ppls
             d/Users/ahmed/devFolder/claude-voice/.venv/lib/python3.12/site-packages/mlx_lm/quant/dynamic_quant.pyeval_pplr(      s    HE1c$i,QZ(uQV}%,,RZZ8((q!"u>FJJL%%'' - ((8e#
$CJ       Fr    gradient_accum_dtypegradient_checkpointc	           
         d t        | j                         t        j                  j                        }	|	D 
ci c]  \  }
}t        |d      s|
| }	}
}t        j                  |       t        j                  |	      }|j                         D ]>  } |j                  ||      |_	        |j                          |j                  dg       @ j                          j                  t        t        |j                                            fd}|rt!        j"                  d          t%        fdj'                               }t)        t+        t-        dt/                          t/              z  d	
      D ]n  \  }}||z    } | |      }t1        j2                  |        t        j4                  |      ||      \  }}t%        d ||      }~t1        j2                  |       p fd}t%        ||j7                         | j7                               }t1        j2                  |       t        |      D 
cg c]  \  }
}|
d d |j9                         f }}
}|S c c}}
w c c}}
w )Nc                 n    t        j                  | ||      \  } }}t        j                  | ||||      S )Nbits
group_size)scalesbiasesr0   r1   )r   quantize
dequantize)wr0   r1   r#   bs        r'   qdqz#estimate_sensitivities.<locals>.qdq1   s1    ++adzB1a}}Qq*UUr)   )is_leafto_quantizedweight)keysc                 D    t         |       |      j                         S N)r   mean)r$   targetsq_models     r'   loss_fnz'estimate_sensitivities.<locals>.loss_fnA   s    75>7388::r)   r   c                 F    t        j                  | j                        S )N)dtype)r   zerosshape)xr+   s    r'   <lambda>z(estimate_sensitivities.<locals>.<lambda>H   s    "((177*>?r)   zEstimating sensitivities)totaldescc                     | |z   S r>    )rG   ys     r'   rH   z(estimate_sensitivities.<locals>.<lambda>T   s    1q5r)   c                     t              z   dz
  z  }| |z  }  |	
      }|j                  dz  }| ||z
  z  j                         }||z  S )Nr   g    .A)r   r   r   )gradientlow_q_weightoriginal_weight	n_batcheshigh_q_weight
param_size	alignmentr    r   	high_bitshigh_group_sizer8   s          r'   compute_sensitivityz3estimate_sensitivities.<locals>.compute_sensitivityX   sf    Y+a/J>	i'OYH$))C/
!=>CCE	:%%r)   i)r   leaf_modulesr   Module	is_modulehasattrcopydeepcopyvaluesr;   freezeunfreezeupdate_modulesr   listitemsr	   layersr   trainable_parametersr   	enumerater   r   r   evalvalue_and_grad
parametersr   )r   r   low_bitslow_group_sizerV   rW   r    r+   r,   re   klq_layersrB   
grad_accumer#   r$   r@   _gradsrX   sensitivitiesrA   r8   s    `  ````               @@r'   estimate_sensitivitiesru   &   s+   V %,,.		8K8KLF%Dvtq!N)CadvFDmmE"G}}V$H__qxx>:	
	



#	 
 NN>$x~~/?*@AB; q)*?$$&J %3t9j12$i:%'1
 QZ(,
62$$Wg6ugF50*eD


& & 	M GGM4@4OP4ODAqafaffh'4OMPi Ed Qs   I:I:J c                 \   fdt        j                               }t        |      }t        |      }	d|	|z
  z  }
|	|z
  |
kD  rZ|	|z   dz  fd}t	        j
                  |       }t        j                  ||||       t        |      }||kD  r}n}	|	|z
  |
kD  rZ|	|z   dz  S )Nc                 :    t        |d      sy|    |kD  rdS yNr:   Fr/   T)r\   )pmhigh_thresholdrV   rW   rt   s      r'   	predicatez%estimate_threshold.<locals>.predicatev   s+    q.)n,%_EEr)   gMbP?   c                      | |      S r>   rL   )ry   rz   midr|   s     r'   rH   z$estimate_threshold.<locals>.<lambda>   s    yAs';r)   )r1   r0   class_predicate)	rc   r_   minmaxr]   r^   r   r4   r
   )r   rt   
target_bpwrk   rl   rV   rW   	sens_valsmin_thresholdmax_threshold	tolerancer   rA   bpwr   r|   s    `   ``       @@r'   estimate_thresholdr   m   s     ]))+,I	NM	NM56I=(I
5},1;--&
%+		
 &g.MM =(I
5  M)Q..r)   c                    
 t        j                         } | j                  ddd       | j                  ddd       | j                  d	t        d
       | j                  dt        d d       | j                  dt
        dd       | j                  dt        d       | j                  dt        d       | j                  dt        d       | j                  dt        d       | j                  ddd       | j                  ddd       | j                  dd d d!gd"#       | j                         
t        j                  j                         }t        
j                  d$%      \  }}}
j                  t        j                  j                  
j                         t        |d&d'(      }t!        ||
j"                  
j$                  
j&                  
j(                  t+        t        
j,                        
j.                  )      
j                  j1                  d*d+      }t3        | d,d-      5 }t5        j6                  |       d d d        n4t3        
j                  d.      5 }t5        j                  |      d d d        t9              t        j                  j                  
j                         t        |d&d'(      }
j:                  rt=        ||      }t?        d/|d0       tA        |
jB                  
j"                  
j$                  
j&                  
j(                  1      
fd2}	tE        ||
j$                  
j"                  |	3      \  }}
j:                  rt=        ||      }t?        d4|d0       tG        
jH                  
j                  |||       t?        d5t        jJ                         d6z  d0d7       y # 1 sw Y   UxY w# 1 sw Y   bxY w)8Nz--modelz-mzQwen/Qwen3-0.6B-base)defaultz
--mlx-path	mlx_modelzPath to save the model)r   helpz--seed{   )typer   z--sensitivitiesz-Path to a pre-computed sensitivity JSON file.)r   r   r   z--target-bpwg      @zTarget bits per weight.z
--low-bitsr*   z--low-group-size@   z--high-bits   z--high-group-sizez--report-ppl
store_truez8Compute the perplexity of the base and quantized models.)actionr   z--grad-checkpointz0Use gradient checkpointing to reduce memory use.z--accumulation-dtyper   bfloat16zBWhat type to use to accumulate the gradients for the sensitivities)r   choicesr   T)return_configr   i   )num_samplessequence_length)r+   r,   /rr   z_sensitivities.jsonr6   rzOriginal PPL: z.3f)r   rk   rl   rV   rW   c                 b    t        |d      sy|    kD  rj                  j                  dS yrx   )r\   rV   rW   )ry   rz   argsrt   	thresholds     r'   quant_predicatezmain.<locals>.quant_predicate   s5    q.)i' NN$:N:NOOr)   )r1   r0   r   zQuantized PPL: zPeak memory used: i ʚ;GB)&argparseArgumentParseradd_argumentintstrfloat
parse_argsr   distributedinitr   r   rt   randomseedr   ru   rk   rl   rV   rW   getattraccumulation_dtyper	   replaceopenjsondumpdict
report_pplr(   printr   r   r   r   mlx_pathget_peak_memory)parsergroupr   	tokenizerconfigr   
model_namefidr&   r   r   rt   r   s             @@@r'   mainr      s   $$&F
	41GH
k0H   sC8
<	   UC6O   3:
*bA
C;
+#rB
G  
 ?  
 J'Q	   DNN!E#DJJdCE9f!
		tyy!CH.MMNN  !(T-D-D!E $ 4 4	
 ZZ''S1
ZL 34c:cIImS) ;: $$$c*c IIcNM + 'MIINN499YBDDud#s3i()"??**..,,I #&&]]'ME6 ud#Cy)*

 
r113g=cB"
EFe ;: +*s   =O3O)O&)O3__main__)   )$r   r]   r   r   mlx.corecorer   mlx.nnr   numpynp	mlx.utilsr   r   r   r   mlx_lm.quant.utilsr   mlx_lm.tuner.lossesr   mlx_lm.tuner.trainerr	   mlx_lm.utilsr
   r   r   r   r(   r   r   Dtypeboolru   r   r   __name__rL   r)   r'   <module>r      s           < <  ( + 0 
( %'ZZ %D D ((D DN%/PjGZ zF r)   