--- base_model: - meta-models/Muse-Glimmer-30B tags: - int4 - vllm - compressed-tensors - llm-compressor --- # RedHatAI/Muse-Glimmer-30B-INT4 This model is a quantized version of [meta-models/Muse-Glimmer-30B](https://huggingface.co/meta-models/Muse-Glimmer-30B). ### Model Optimizations This model was obtained by quantizing the weights of [meta-models/Muse-Glimmer-30B](https://huggingface.co/meta-models/Muse-Glimmer-30B) to int4, ready for inference with vLLM. Weights are quantized to int4 with a group size of 128. Only the weights of the linear operators within transformer blocks are quantized using [LLM Compressor](https://github.com/vllm-project/llm-compressor). Vision tower, embedding, and output head layers are kept in their original precision. ## Creation ```python from compressed_tensors.offload import dispatch_model from datasets import load_dataset from transformers import ( AutoProcessor, MuseGlimmerForConditionalGeneration, ) from llmcompressor import oneshot from llmcompressor.modifiers.gptq import GPTQModifier from llmcompressor.utils import load_context MODEL_ID = "meta-models/Muse-Glimmer-30B" # Load model. with load_context(MuseGlimmerForConditionalGeneration): model = MuseGlimmerForConditionalGeneration.from_pretrained(MODEL_ID) processor = AutoProcessor.from_pretrained(MODEL_ID) DATASET_ID = "mlabonne/open-perfectblend" DATASET_SPLIT = "train" # Select number of samples. 512 samples is recommended for GPTQ. # Increasing the number of samples can improve accuracy. NUM_CALIBRATION_SAMPLES = 512 MAX_SEQUENCE_LENGTH = 2048 # Load dataset and preprocess. ds = load_dataset(DATASET_ID, split=f"{DATASET_SPLIT}") ds = ds.shuffle(seed=42) ROLE_MAP = {"human": "user", "gpt": "assistant"} def preprocess(example): messages = [ {"role": ROLE_MAP.get(msg["from"], msg["from"]), "content": msg["value"]} for msg in example["conversations"] ] return { "text": processor.apply_chat_template( messages, tokenize=False, ) } ds = ds.map(preprocess) # Tokenize inputs. def tokenize(sample): return processor.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) # Configure the quantization algorithm and scheme. recipe = GPTQModifier( targets="Linear", scheme="W4A16", ignore=["re:.*vision.*", "lm_head", "re:.*embed_tokens.*"], ) # Apply quantization. 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 = processor.tokenizer( "Hello my name is", return_tensors="pt" ).input_ids.to(model.device) output = model.generate(input_ids, max_new_tokens=100) print(processor.tokenizer.decode(output[0])) print("==========================================\n\n") # Save to disk in compressed-tensors format. SAVE_DIR = MODEL_ID.rstrip("/").split("/")[-1] + "-INT4" model.save_pretrained(SAVE_DIR) processor.save_pretrained(SAVE_DIR) ``` ## Deployment ``` docker run --gpus all \ --privileged --ipc=host -p 8000:8000 \ -v ~/.cache/huggingface:/root/.cache/huggingface \ vllm/vllm-openai:muse-glimmer RedHatAI/Muse-Glimmer-30B-INT4 \ --generation-config auto \ --tensor-parallel-size 1 \ --enable-auto-tool-choice \ --tool-call-parser muse_glimmer \ --reasoning-parser muse_glimmer ``` For detailed instructions including multi-GPU deployment, multimodal inference, etc see the [Muse-Glimmer 30B vLLM usage guide](https://recipes.vllm.ai/meta-models/Muse-Glimmer-30B).