chen459664's picture
Add files using upload-large-folder tool
64ddf8d verified
Raw
History Blame Contribute Delete
2.93 kB
import gc
import os
import random
import time
import torch
import transformers
from auto_gptq import AutoGPTQForCausalLM
from datasets import load_dataset
from tqdm import tqdm
# Adapted from: https://towardsdatascience.com/4-bit-quantization-with-gptq-36b0f4f02c34
def prepare_model(model, tokenizer, n_samples=1024, max_tokens=512, use_triton=False):
# Load data and tokenize examples
data = load_dataset(
"allenai/c4",
data_files="en/c4-train.00001-of-01024.json.gz",
split=f"train[:{n_samples}]",
)
# ~536K tokens
tokenized_data = torch.cat(
[
tokenizer(data[i]["text"], return_tensors="pt").input_ids
for i in tqdm(range(len(data)))
],
axis=-1,
)
# Format tokenized examples
random.seed(1)
examples_ids = []
for _ in range(n_samples):
i = random.randint(0, tokenized_data.shape[1] - max_tokens - 1)
j = i + max_tokens
input_ids = tokenized_data[:, i:j]
attention_mask = torch.ones_like(input_ids)
examples_ids.append({"input_ids": input_ids, "attention_mask": attention_mask})
print("Using " + str(len(examples_ids)) + " samples for calibration.")
model.quantize(examples_ids, batch_size=1, use_triton=use_triton)
# model = model.cuda()
# with torch.no_grad():
# x = model(input_ids.to('cuda'))
# del examples_ids, x
del examples_ids
torch.cuda.empty_cache()
gc.collect()
return model
def create_autogptq_model(model_id, quant_config, config_id, load_quantized, save_dir):
model_file_size = 0
quantized = False
quant_path = f"{save_dir}/{model_id}-{config_id}-gptq"
if load_quantized and os.path.exists(quant_path):
model = AutoGPTQForCausalLM.from_quantized(quant_path, device="cuda:0")
tokenizer = transformers.AutoTokenizer.from_pretrained(model_id)
quantized = True
model_file_size = _get_model_file_size(quant_path, quant_config)
else:
tokenizer = transformers.AutoTokenizer.from_pretrained(model_id)
model = AutoGPTQForCausalLM.from_pretrained(model_id, quant_config)
return model, tokenizer, quantized, model_file_size
def quantize_autogptq_model(
model, tokenizer, quant_config, model_id, config_id, save_dir
):
t1 = time.time()
model = prepare_model(model, tokenizer)
t2 = time.time()
print("Took " + str(t2 - t1) + " seconds to quantize the model with AutoGPTQ")
quant_path = f"{save_dir}/{model_id}-{config_id}-gptq"
model.save_quantized(quant_path, use_safetensors=True)
# persistent the quantized model
os.sync()
return model, t2 - t1, _get_model_file_size(quant_path, quant_config)
def _get_model_file_size(quant_path, quant_config):
b = quant_config.bits
g = quant_config.group_size
fp = os.path.join(quant_path, f"gptq_model-{b}bit-{g}g.safetensors")
return os.path.getsize(fp)