CoolFace
Modelpublic

MiniMaxAI/MiniMax-Text-01

sourceHugging Faceupdated 1y agoView on Hugging Face
657likes3.7kdownloads
main.py101 linesDownload Raw Back to root
1from transformers import AutoModelForCausalLM, AutoTokenizer, AutoConfig, QuantoConfig, GenerationConfig2import torch3import argparse4 5"""6 usage:7    export SAFETENSORS_FAST_GPU=18    python main.py --quant_type int8 --world_size 8 --model_id <model_path>9"""10 11def generate_quanto_config(hf_config: AutoConfig, quant_type: str):12    QUANT_TYPE_MAP = {13        "default": None,14        "int8": QuantoConfig(15            weights="int8",16            modules_to_not_convert=[17                "lm_head",18                "embed_tokens",19            ] + [f"model.layers.{i}.coefficient" for i in range(hf_config.num_hidden_layers)]20            + [f"model.layers.{i}.block_sparse_moe.gate" for i in range(hf_config.num_hidden_layers)]21        ),22    }23    return QUANT_TYPE_MAP[quant_type]24 25 26def parse_args():27    parser = argparse.ArgumentParser()28    parser.add_argument("--quant_type", type=str, default="default", choices=["default", "int8"])29    parser.add_argument("--model_id", type=str, required=True)30    parser.add_argument("--world_size", type=int, required=True)31    return parser.parse_args()32 33 34def check_params(args, hf_config: AutoConfig):35    if args.quant_type == "int8":36        assert args.world_size >= 8, "int8 weight-only quantization requires at least 8 GPUs"37 38    assert hf_config.num_hidden_layers % args.world_size == 0, f"num_hidden_layers({hf_config.num_hidden_layers}) must be divisible by world_size({args.world_size})"39 40 41@torch.no_grad()42def main():43    args = parse_args()44    print("\n=============== Argument ===============")45    for key in vars(args):46        print(f"{key}: {vars(args)[key]}")47    print("========================================")48 49    model_id = args.model_id50 51    hf_config = AutoConfig.from_pretrained(model_id, trust_remote_code=True)52    check_params(args, hf_config)53    quantization_config = generate_quanto_config(hf_config, args.quant_type)54 55    device_map = {56        'model.embed_tokens': 'cuda:0',57        'model.norm': f'cuda:{args.world_size - 1}',58        'lm_head': f'cuda:{args.world_size - 1}'59    }60    layers_per_device = hf_config.num_hidden_layers // args.world_size61    for i in range(args.world_size):62        for j in range(layers_per_device):63            device_map[f'model.layers.{i * layers_per_device + j}'] = f'cuda:{i}'64 65    tokenizer = AutoTokenizer.from_pretrained(model_id)66    prompt = "Hello!"67    messages = [68        {"role": "system", "content": [{"type": "text", "text": "You are a helpful assistant created by Minimax based on MiniMax-Text-01 model."}]},69        {"role": "user", "content": [{"type": "text", "text": prompt}]},70    ]71    text = tokenizer.apply_chat_template(72        messages,73        tokenize=False,74        add_generation_prompt=True75    )76    model_inputs = tokenizer(text, return_tensors="pt").to("cuda")77    quantized_model = AutoModelForCausalLM.from_pretrained(78        model_id,79        torch_dtype="bfloat16",80        device_map=device_map,81        quantization_config=quantization_config,82        trust_remote_code=True,83        offload_buffers=True,84    )85    generation_config = GenerationConfig(86        max_new_tokens=20,87        eos_token_id=200020,88        use_cache=True,89    )90    generated_ids = quantized_model.generate(**model_inputs, generation_config=generation_config)91    print(f"generated_ids: {generated_ids}")92    generated_ids = [93        output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)94    ]95    response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]96    print(response)97 98if __name__ == "__main__":99    main()100 101