quantization / obtain_metric.py
chen459664's picture
Add files using upload-large-folder tool
02bc7b8 verified
Raw
History Blame Contribute Delete
8.37 kB
import json
import numpy as np
import os
from zscore import kurtosis_outlier_layers
def mean_and_var(arr):
"""
输入: arr (np.ndarray 或能转成 np.array 的对象)
输出: (mean, variance)
"""
arr = np.asarray(arr, dtype=float)
mean = np.mean(arr)
var = np.var(arr) # 默认是总体方差,如果要无偏估计可用 ddof=1
return mean, var
def select_layers_shaped(kurtosis, alpha, k=5, return_scores=False,
pos_gaussians=None, neg_gaussians=None):
"""
强塑形联合指标:
score_i = (alpha_i / kurtosis_i) * ( 1
+ sum_j b_j * exp(-((kurtosis_i - c_j)^2) / s_j^2)
- sum_t d_t * exp(-((kurtosis_i - u_t)^2) / r_t^2) )
参数
----
kurtosis : list/ndarray κ
alpha : list/ndarray α
k : 取前 k 个下标
pos_gaussians : [(c, s, b), ...] 正向高斯(中心c, 带宽s>0, 系数b>0)
neg_gaussians : [(u, r, d), ...] 负向高斯(中心u, 带宽r>0, 系数d>0)
返回
----
idx_topk : list[int]
(可选) scores : ndarray
"""
krt = np.asarray(kurtosis, dtype=float)
alp = np.asarray(alpha, dtype=float)
if krt.shape != alp.shape:
raise ValueError("kurtosis 与 alpha 形状不一致")
base = alp - krt
c, sigma = mean_and_var(krt)
beta = 1.5
weight = 1.0 + beta * np.exp(-((krt - c) ** 2) / (sigma ** 2))
scores = base * weight
return scores
def joint_score(kurtosis, alpha,
alpha0=4.20, s_alpha=0.090,
s_k=1.254, w_alpha=9.48, w_k=1.02):
"""
Kurtosis-Alpha 联合指标 (Taguchi 损失型)
-------------------------
参数
kurtosis : list/ndarray
每层的 kurtosis 值
alpha : list/ndarray
每层的 alpha 值
alpha0 : float
alpha 的目标值(名义最佳点)
s_alpha : float
alpha 的尺度因子
s_k : float
kurtosis 的尺度因子
w_alpha, w_k : float
alpha 和 kurtosis 的权重
返回
scores : ndarray
每层的综合得分(越大越好)
"""
k = np.array(kurtosis)
a = np.array(alpha)
loss_k = (k / s_k) ** 2
loss_a = ((a - alpha0) / s_alpha) ** 2
scores = -(w_k * loss_k + w_alpha * loss_a)
return scores
def simple_joint_score(kurtosis, alpha, stable_rank):
"""
极简联合指标:
S_l = -k_l * (alpha_l - Q80(alpha))^2
参数
----
kurtosis : list/ndarray
每层的 kurtosis 值
alpha : list/ndarray
每层的 alpha 值
返回
----
scores : ndarray
每层的综合得分(越大越好)
"""
k = np.array(kurtosis)
a = np.array(alpha)
s = np.array(stable_rank)
print('alpha_hat_datas')
# h = np.array(alpha_hat_datas)
k = (k - k.min()) / (k.max() - k.min())
# k_exp = np.exp(k) # 防止溢出
# k = k_exp / np.sum(k_exp)
a = 1 / a
a = (a - a.min()) / (a.max() - a.min())
# a_exp = np.exp(a) # 防止溢出
# a = a_exp / np.sum(a_exp)
s = 1 / s
s = (s - s.min()) / (s.max() - s.min())
# s_exp = np.exp(s)
# s = s_exp / np.sum(s_exp)
# h = 1 / h
# # h= (h - h.min()) / (h.max() - h.min())
# h_exp = np.exp(h) # 防止溢出
# h = h_exp / np.sum(h_exp)
# alpha_target = np.percentile(a, 80) # α 的 80 分位数
# # alpha_target = 0
# scores = -k * (a - alpha_target) ** 2
# k = k * 0.5
# h = h * 0.5
# print(k)
# print(a)
# print(h)
# a = a + 0.3 * h
# a = a +1
# k = k +1
# h = h +1
print('a', {i:aa for i, aa in enumerate(a)})
print()
print('k', {i:aa for i, aa in enumerate(k)})
print()
print('s', {i:aa for i, aa in enumerate(s)})
# k = 100 * k
# scores = (k / a) * (k - a)
k = 0.2 * k
s = 1.2 * s
scores = k + a + s
# scores = (k * h) * (k + h)
# print()
# print('scores', {i:aa for i, aa in enumerate(scores)})
return scores
model_names = ['Llama-2-7b-hf',]
# 'Llama-2-13b-hf', 'Qwen3-8B', 'Qwen3-4B', 'Mistral-7B-Instruct-v0.3','Llama-3.2-3B-Instruct']
for model in model_names:
# model = "Llama-2-7b-hf"
print(model)
alpha_path = f'/mnt/bn/life-mllm/users/cxr/quantization/quantization_metric/alpha_values/alpha_values_{model}.json'
kurtosis_path = f'/mnt/bn/life-mllm/users/cxr/quantization/lm-quant-toolkit/kurtosis_means/kurtosis_means-{model}.json'
alpha_hat_path = f'/mnt/bn/life-mllm/users/cxr/quantization/quantization_metric/alpha_hat/alpha_values_{model}.json'
stable_rank_path = f'/mnt/bn/life-mllm/users/cxr/quantization/quantization_metric/stable_rank/stable_rank_{model}.json'
zd_path = f'/mnt/bn/life-mllm/users/cxr/quantization/quantization_metric/ZD/ZD_{model}.json'
bi_path = f'/mnt/bn/life-mllm/users/cxr/quantization/quantization_metric/BI/BI_{model}.json'
with open(stable_rank_path, 'r', encoding='utf-8') as f:
stable_rank_datas = json.load(f)
with open(alpha_path, 'r', encoding='utf-8') as f:
alpha_datas = json.load(f)
with open(kurtosis_path, 'r', encoding='utf-8') as f:
kurtosis_datas = json.load(f)
with open(alpha_hat_path, 'r', encoding='utf-8') as f:
alpha_hat_datas = json.load(f)
with open(zd_path, 'r', encoding='utf-8') as f:
zd_datas = json.load(f)
with open(bi_path, 'r', encoding='utf-8') as f:
bi_datas = json.load(f)
print(len(kurtosis_datas))
print('kurtosis_datas', np.argsort(kurtosis_datas))
print('stable_rank_datas', np.argsort([-a for a in stable_rank_datas]))
print('alpha_datas', np.argsort([-a for a in alpha_datas]))
print('alpha_hat_datas', np.argsort([-a for a in alpha_hat_datas]))
print('zd_datas', np.argsort([-a for a in zd_datas]))
print('bi_datas', np.argsort([a for a in bi_datas]))
scores = simple_joint_score(kurtosis_datas, alpha_datas, stable_rank_datas)
idx_sorted = np.argsort(scores)
# print('scores:', scores)
print('idx_sorted:',idx_sorted)
print()
kurtosis_idx = np.argsort(kurtosis_datas).tolist()
stable_rank_idx = np.argsort([-a for a in stable_rank_datas]).tolist()
alpha_idx = np.argsort([-a for a in alpha_datas]).tolist()
bi_idx = np.argsort([a for a in bi_datas]).tolist()
z_idx = kurtosis_outlier_layers(kurtosis_datas)
zd_idx = np.argsort([-a for a in zd_datas]).tolist()
layrs = [5, 10]
for layr in layrs:
# bits = [4 for _ in range(len(alpha_datas))]
# print(kurtosis_idx[:layr])
# for i in kurtosis_idx[:layr]:
# bits[i] = 2
# with open(os.path.join('/mnt/bn/life-mllm/users/cxr/quantization/baselines', f'{model}_kurtosis_idx_{layr}.json'), "w", encoding="utf-8") as f:
# json.dump(bits, f, ensure_ascii=False, indent=4)
# bits = [4 for _ in range(len(alpha_datas))]
# for i in alpha_idx[:layr]:
# bits[i] = 2
# with open(os.path.join('/mnt/bn/life-mllm/users/cxr/quantization/baselines', f'{model}_alpha_idx_{layr}.json'), "w", encoding="utf-8") as f:
# json.dump(bits, f, ensure_ascii=False, indent=4)
# bits = [4 for _ in range(len(alpha_datas))]
# for i in z_idx[:layr]:
# bits[i] = 2
# with open(os.path.join('/mnt/bn/life-mllm/users/cxr/quantization/baselines', f'{model}_z_idx_{layr}.json'), "w", encoding="utf-8") as f:
# json.dump(bits, f, ensure_ascii=False, indent=4)
# bits = [4 for _ in range(len(alpha_datas))]
# print(bi_idx[:layr])
# for i in bi_idx[:layr]:
# bits[i] = 2
# with open(os.path.join('/mnt/bn/life-mllm/users/cxr/quantization/baselines_1', f'{model}_bi_idx_{layr}.json'), "w", encoding="utf-8") as f:
# json.dump(bits, f, ensure_ascii=False, indent=4)
kurtosis_datas, stable_rank_datas
bits = [4 for _ in range(len(alpha_datas))]
print(idx_sorted[:layr])
for i in idx_sorted[:layr]:
bits[i] = 2
with open(os.path.join('/mnt/bn/life-mllm/users/cxr/quantization/ours2', f'{model}_aks_plus_idx_sorted_{layr}.json'), "w", encoding="utf-8") as f:
json.dump(bits, f, ensure_ascii=False, indent=4)