Qwen3.5-2B-FP8-Dynamic-LLMCompressor

ๅŸบไบŽ Qwen3.5-2B ๅˆถไฝœ็š„ ๅŠจๆ€ FP8 ้‡ๅŒ–ๆจกๅž‹๏ผŒไฝฟ็”จ llm-compressor 0.14.0 ๅˆถไฝœ๏ผŒไปฅ compressed-tensors 0.19.0 ๆ ผๅผไฟๅญ˜ใ€‚

้‡ๅŒ–้…็ฝฎ

้‡‡็”จ FP8_DYNAMIC ๅฏน 96 ไธช่ฏญ่จ€็บฟๆ€งๅฑ‚ๅš้‡ๅŒ–ใ€‚ๆƒ้‡ๆŒ‰่พ“ๅ‡บ้€š้“ไฝฟ็”จ้™ๆ€ๅฐบๅบฆ๏ผŒๆฟ€ๆดปๆŒ‰ token ๅŠจๆ€็ผฉๆ”พ๏ผŒๅˆถไฝœๆ—ถๆ— ้œ€ๆ กๅ‡†ๆ•ฐๆฎใ€‚ๆƒ้‡ๅ…ฑ 3.311 GiBใ€‚ visualใ€linear_attnใ€lm_head ๅŠๅ…ถไป–้ž็›ฎๆ ‡ๅฑ‚ไฟ็•™ๆตฎ็‚น็ฒพๅบฆ๏ผŒKV cache ๆฒฟ็”จๆŽจ็†ๅผ•ๆ“Ž็š„้ป˜่ฎค่ฎพ็ฝฎใ€‚

ๅˆถไฝœๆ‰€็”จ็š„ไธŠๆธธๆไบคๅทๆœช่ฎฐๅฝ•ใ€‚

ๆ–‡ๆœฌๆŽจ็†

ๅฎŒๆ•ดไธ‹่ฝฝไป“ๅบ“ๅŽ๏ผŒๅœจๆ”ฏๆŒ compressed-tensors ็š„ vLLM 0.32.0 ็Žฏๅขƒ่ฟ่กŒใ€‚ๆจกๅž‹็›ฎๅฝ•ๅบ”ๅŒ…ๅซๆƒ้‡ใ€็ดขๅผ•ใ€้…็ฝฎๅ’Œ tokenizerใ€‚็คบไพ‹ไฝฟ็”จๆ–‡ๆœฌ่พ“ๅ…ฅใ€‚

import json
import os
from collections.abc import Mapping
from pathlib import Path

# ๅœจๅฏผๅ…ฅๆŽจ็†ๅบ“ไน‹ๅ‰ๅฏ็”จ็ฆป็บฟๆจกๅผ๏ผŒไธไธ‹่ฝฝไปปไฝ•ๆจกๅž‹ๆ–‡ไปถใ€‚
os.environ["HF_HUB_OFFLINE"] = "1"
os.environ["TRANSFORMERS_OFFLINE"] = "1"

MODEL_DIR = Path(".").resolve()  # ไปŽไธ‹่ฝฝๅŽ็š„ๅฎŒๆ•ดๆจกๅž‹็›ฎๅฝ•่ฟ่กŒ


def token_ids_from_template(encoded):
    # Transformers 5 ๅฏ่ƒฝ่ฟ”ๅ›ž BatchEncoding/UserDict๏ผŒ่€Œไธไธ€ๅฎšๆ˜ฏๆ™ฎ้€š dictใ€‚
    if isinstance(encoded, Mapping):
        if "input_ids" not in encoded:
            raise ValueError("Chat template ๆœช่ฟ”ๅ›ž input_ids")
        encoded = encoded["input_ids"]
    if hasattr(encoded, "tolist"):
        encoded = encoded.tolist()
    if (isinstance(encoded, (list, tuple)) and len(encoded) == 1
            and isinstance(encoded[0], (list, tuple))):
        encoded = encoded[0]
    if not isinstance(encoded, (list, tuple)) or not encoded:
        raise TypeError("Chat template ๅฟ…้กป่ฟ”ๅ›ž้ž็ฉบ token ID ๅบๅˆ—")
    if any(isinstance(token, bool) or not isinstance(token, int) or token < 0
           for token in encoded):
        raise TypeError("Token ID ๅฟ…้กปไธบ้ž่ดŸๆ•ดๆ•ฐ")
    return list(encoded)


def main():
    from vllm import LLM, SamplingParams

    if not MODEL_DIR.is_dir() or not (MODEL_DIR / "config.json").is_file():
        raise FileNotFoundError("่ฏทๅฐ† MODEL_DIR ๆ”นไธบๅฎŒๆ•ด็š„ๆœฌๅœฐๆจกๅž‹็›ฎๅฝ•")
    if not list(MODEL_DIR.glob("*.safetensors")):
        raise FileNotFoundError("ๆจกๅž‹ๆƒ้‡็ผบๅคฑ๏ผŒไธ่ƒฝไฝฟ็”จๆœฌๅœฐๅ ไฝ็›ฎๅฝ•")

    config = json.loads((MODEL_DIR / "config.json").read_text(encoding="utf-8"))
    if config.get("quantization_config", {}).get("quant_method") != "compressed-tensors":
        raise ValueError("่ฏฅ็คบไพ‹่ฆๆฑ‚ๆœฌๆจกๅž‹็š„ compressed-tensors checkpoint")
    generation_path = MODEL_DIR / "generation_config.json"
    generation = json.loads(generation_path.read_text(encoding="utf-8")) if generation_path.exists() else {}
    eos = generation.get("eos_token_id")
    if eos is None:
        eos = config.get("eos_token_id")
    if eos is None:
        eos = config.get("text_config", {}).get("eos_token_id")
    stop_ids = eos if isinstance(eos, list) else ([eos] if eos is not None else [])

    llm = LLM(
        model=str(MODEL_DIR),
        tokenizer=str(MODEL_DIR),
        dtype="float16",
        tensor_parallel_size=1,
        max_model_len=4096,
        gpu_memory_utilization=0.75,
        enforce_eager=True,
        max_num_seqs=1,
        enable_prefix_caching=False,
        limit_mm_per_prompt={"image": 0, "video": 0},
        generation_config="vllm",
        trust_remote_code=False,
        seed=42,
    )
    tokenizer = llm.get_tokenizer()
    messages = [{"role": "user", "content": "ๅฐๆ˜Žๆœ‰ 2 ไธช่‹นๆžœ๏ผŒๅˆๅพ—ๅˆฐ 3 ไธช๏ผŒ็Žฐๅœจไธ€ๅ…ฑๆœ‰ๅ‡ ไธช๏ผŸ\n่ฏทๅœจๆœ€ๅŽไธ€่กŒ็”จ #### ๆ•ฐๅญ— ็ป™ๅ‡บ็ญ”ๆกˆใ€‚"}]
    encoded = tokenizer.apply_chat_template(
        messages, tokenize=True, add_generation_prompt=True,
    )
    # ไธไผ  enable_thinking๏ผŒไฟ็•™ checkpoint ่Šๅคฉๆจกๆฟ็š„้ป˜่ฎค่กŒไธบใ€‚
    token_ids = token_ids_from_template(encoded)
    max_new_tokens = 1024
    if len(token_ids) + max_new_tokens > 4096:
        raise ValueError("ๆ็คบ้•ฟๅบฆๅŠ ็”Ÿๆˆ้ข„็ฎ—่ถ…่ฟ‡ 4096๏ผ›ๆœฌ็คบไพ‹ไธ่‡ชๅŠจๆˆชๆ–ญ่พ“ๅ…ฅ")
    sampling = SamplingParams(
        temperature=0.0,
        top_p=1.0,
        top_k=-1,
        n=1,
        max_tokens=max_new_tokens,
        seed=42,
        ignore_eos=False,
        stop_token_ids=stop_ids,
        repetition_penalty=generation.get("repetition_penalty", 1.0),
        min_tokens=generation.get("min_new_tokens") or 0,
        presence_penalty=0.0,
        frequency_penalty=0.0,
        skip_special_tokens=True,
    )
    outputs = llm.generate(
        [{"prompt_token_ids": token_ids}],
        sampling_params=sampling,
        use_tqdm=False,
    )
    print(tokenizer.decode(outputs[0].outputs[0].token_ids, skip_special_tokens=True))


if __name__ == "__main__":
    main()

้ชŒ่ฏ็ป“ๆžœ

ๅœจ RTX 4090 D ไธŠไฝฟ็”จ vLLM 0.32.0๏ผŒๅŠ ่ฝฝๆ—ฅๅฟ—่ฎฐๅฝ•็š„ๅ†…ๆ ธไธบ CUTLASS FP8ใ€‚ไธ‹่กจไธบ GSM8K ๆต‹่ฏ•้›†ๅ‰ 100 ้ข˜๏ผŒ่ดชๅฟƒ็”Ÿๆˆ๏ผŒๆฏ้ข˜ๆœ€ๅคš 1024 ไธชๆ–ฐ token๏ผŒๅ•่ฏทๆฑ‚้กบๅบๆ‰ง่กŒใ€‚ FP8 Block128 ไธบๅŒๆ‰นๅฏน็…งใ€‚

ๆจกๅž‹ ๆญฃ็กฎ/้ข˜ๆ•ฐ ๅ‡†็กฎ็އ ๅฏ่งฃๆž็އ ่งฆ้กถ็އ ไธฒ่กŒ token/s worker peak allocated GiB worker peak reserved GiB ๆƒ้‡ๆ–‡ไปถ GiB ๅŠ ่ฝฝๆ–‡ไปถๅˆ่ฎก GiB
FP16 71/100 71.00% 92.00% 7.00% 55.823 17.268 17.324 4.236 4.257
FP8 Dynamic 70/100 70.00% 97.00% 2.00% 47.499 17.113 17.121 3.311 3.330
FP8 Block128 72/100 72.00% 95.00% 4.00% 44.134 17.283 17.334 3.310 3.329

ๅค็ŽฐไธŽ่ฎธๅฏ

ไปฅไธ‹ๅ‘ฝไปคๅœจ้…ๅฅ—้‡ๅŒ–ไปฃ็ ้กน็›ฎไธญ่ฟ่กŒใ€‚

python run.py quantize --tool llmcompressor --method fp8 --stage full

้‡ๅŒ–ๅ‚ๆ•ฐ่ง config.json ๅ’Œ recipe.yaml๏ผŒๆ–‡ไปถๆ ก้ชŒๅ€ผ่ง SHA256SUMSใ€‚ๆจกๅž‹ๆฒฟ็”จๅŸบๅบง็š„ Apache-2.0 ่ฎธๅฏใ€‚

ไธ‹่ฝฝ

ไธŽไฝœ่€…็š„ ModelScope ไป“ๅบ“ๅŒๆญฅๅ‘ๅธƒ๏ผŒๆƒ้‡ใ€ๆ•ฐๆฎๅŠ่ฏ„ๆต‹่ฎฐๅฝ•ไฟๆŒไธ€่‡ดใ€‚

pip install -U huggingface_hub
hf download wkhaifor/Qwen3.5-2B-FP8-Dynamic-LLMCompressor --local-dir ./Qwen3.5-2B-FP8-Dynamic-LLMCompressor

ไธ‹่ฝฝๅŽ่ฟ›ๅ…ฅไป“ๅบ“็›ฎๅฝ•๏ผŒๅ†ๆŒ‰ไธŠ้ข็š„็คบไพ‹่ฟ่กŒใ€‚

Downloads last month
43
Safetensors
Model size
2B params
Tensor type
F16
ยท
F8_E4M3
ยท
Inference Providers NEW
This model isn't deployed by any Inference Provider. ๐Ÿ™‹ Ask for provider support

Model tree for wkhaifor/Qwen3.5-2B-FP8-Dynamic-LLMCompressor

Finetuned
Qwen/Qwen3.5-2B
Quantized
(321)
this model