| from compressed_tensors.offload import dispatch_model |
| from datasets import load_dataset |
| from transformers import AutoModelForCausalLM, AutoTokenizer |
|
|
| from llmcompressor import oneshot |
| from llmcompressor.modifiers.quantization import QuantizationModifier |
|
|
| MODEL_ID = "RedHatAI/Llama-3.1-8B-Instruct" |
|
|
| |
| model = AutoModelForCausalLM.from_pretrained(MODEL_ID) |
| tokenizer = AutoTokenizer.from_pretrained(MODEL_ID) |
|
|
| DATASET_ID = "HuggingFaceH4/ultrachat_200k" |
| DATASET_SPLIT = "train_sft" |
|
|
| |
| |
| |
| NUM_CALIBRATION_SAMPLES = 100 |
| MAX_SEQUENCE_LENGTH = 2048 |
|
|
| |
| ds = load_dataset(DATASET_ID, split=f"{DATASET_SPLIT}[:{NUM_CALIBRATION_SAMPLES}]") |
| ds = ds.shuffle(seed=42) |
|
|
|
|
| def preprocess(example): |
| return { |
| "text": tokenizer.apply_chat_template( |
| example["messages"], |
| tokenize=False, |
| ) |
| } |
|
|
|
|
| ds = ds.map(preprocess) |
|
|
|
|
| |
| def tokenize(sample): |
| return tokenizer( |
| sample["text"], |
| padding=False, |
| max_length=MAX_SEQUENCE_LENGTH, |
| truncation=True, |
| add_special_tokens=False, |
| ) |
|
|
|
|
| ds = ds.map(tokenize, remove_columns=ds.column_names) |
|
|
| |
| recipe = QuantizationModifier( |
| targets="Linear", |
| scheme="NVFP4", |
| ignore=["lm_head"], |
| ) |
|
|
| |
| oneshot( |
| model=model, |
| dataset=ds, |
| recipe=recipe, |
| max_seq_length=MAX_SEQUENCE_LENGTH, |
| num_calibration_samples=NUM_CALIBRATION_SAMPLES, |
| ) |
|
|
| print("\n\n") |
| print("========== SAMPLE GENERATION ==============") |
| dispatch_model(model) |
| input_ids = tokenizer("Hello my name is", return_tensors="pt").input_ids.to( |
| model.device |
| ) |
| output = model.generate(input_ids, max_new_tokens=100) |
| print(tokenizer.decode(output[0])) |
| print("==========================================\n\n") |
|
|
| |
| SAVE_DIR = MODEL_ID.rstrip("/").split("/")[-1] + "-NVFP4" |
| model.save_pretrained(SAVE_DIR) |
| tokenizer.save_pretrained(SAVE_DIR) |
|
|