library_name: exllamav3
license: apache-2.0
license_link: https://huggingface.co/InternScience/Sage-A1.5
base_model: sam33339999/Sage-A1.5-Heretic-Abliterated-Uncensored
base_model_relation: quantized
pipeline_tag: image-text-to-text
tags:
- exl3
- quantized
- moe
- vision
- mtp
- qwen3_5_moe
- heretic
- abliterated
- uncensored
Sage-A1.5 Heretic Abliterated — EXL3 4.0 bpw
這個目錄是未審查 BF16 的 EXL3 量化,用 exllamav3 1.6.4 的 convert.py 產生。語言模型約 4 bpw,lm_head 6 bit,MTP 4 bpw,視覺塔保持 bf16。
模型關係:
InternScience/Sage-A1.5
└─ sam33339999/Sage-A1.5-Heretic-Abliterated-Uncensored
└─ 這個模型(EXL3 4.0 bpw)
| 階段 | 倉庫 | 是什麼 |
|---|---|---|
| 原始模型 | InternScience/Sage-A1.5 | 原版 BF16 |
| 未審查 BF16 | sam33339999/Sage-A1.5-Heretic-Abliterated-Uncensored | 以原版做 Heretic 消融後的 BF16,已推上 Hub。這個 EXL3 的直接上游 |
| 這個模型 | 本目錄 | 上一行的 EXL3 4.0 bpw |
base_model 只指向未審查 BF16。該倉庫自己的 base_model 已指向 InternScience/Sage-A1.5,Hub 的模型樹會顯示成「原始模型 → 未審查 BF16 → 這個量化」。
這不是 BF16 權重。原版或未審查 BF16 模型卡裡的 vLLM / SGLang 啟動指令不能拿來載入這個目錄。
量化設定
config.json 的 quantization_config:
| 欄位 | 值 |
|---|---|
quant_method |
exl3 |
version |
1.6.4 |
bits |
4.0(decoder;各層實測約 4.05 bpw) |
head_bits |
6 |
mtp_bits |
4 |
vision_bits |
無。視覺塔未量化,權重為 bf16 |
codebook |
mul1 |
out_scales |
auto |
calibration |
250 rows × 2048 cols,內建語料 |
沒有使用 --hq、per-tensor recipe、embedding 量化或 n-gram 表。
轉換指令:
python convert.py \
-i /content/sage-a1.5-stage \
-o /content/Sage-A1.5-Heretic-Abliterated-Uncensored-exl3-4.0bpw \
-w /mnt/local-scratch/exl3-work-sage-a1.5 \
-b 4 \
-vb 16 \
-mb 4 \
-d 0
--vision_bits 16 是必要的。Qwen3VLVisionModel 的預設是 6 bpw,省略 -vb 16 會把視覺塔量化。-vb 16 時視覺權重經 get_additional_compiled_tensors 以 bf16 原樣寫入,quantization_config 不會出現 vision_bits。
權重來源
Decoder、視覺塔、tokenizer 與 chat_template.jinja 都來自未審查 BF16 sam33339999/Sage-A1.5-Heretic-Abliterated-Uncensored,不是直接從原版 InternScience/Sage-A1.5 量化。model.visual.* 保持 bf16,與該未審查 checkpoint 逐 bit 相同(已核對 model.visual.blocks.0.attn.proj.weight 與 model.visual.patch_embed.proj.weight)。
未審查 BF16 的分片沒有 mtp.*(text_config.mtp_num_hidden_layers 是 1,index 裡沒有這些鍵)。量化前只從原版 InternScience/Sage-A1.5 補了 model-mtp.safetensors。架構對過才使用這些張量,沒有改寫或另造權重。輸出含 mtp.fc.trellis 與 mtp.layers.0 的 expert trellis,沒有形狀 [2048, 4096] 的 bf16 mtp.fc.weight。MTP 依轉換器預設不做 calibration。
preprocessor_config.json、processor_config.json、video_preprocessor_config.json 未審查 BF16 沒有附上,同樣從原版補上,讓 Qwen3_5MoeForConditionalGeneration 能註冊 vision。影像前處理是 Qwen2VLImageProcessorFast,patch 16、temporal 2、merge 2。
目錄約 19GB,三個 safetensors shard。
使用
需已安裝能載入這個架構的 exllamav3(本次為 1.6.4)。文字生成:
python examples/chat.py \
-m /content/Sage-A1.5-Heretic-Abliterated-Uncensored-exl3-4.0bpw \
-mode qwen35
開啟同一目錄裡的 MTP draft:
python examples/chat.py \
-m /content/Sage-A1.5-Heretic-Abliterated-Uncensored-exl3-4.0bpw \
-mtp \
-mode qwen35
-mode qwen35 是 examples/chat_templates.py 裡的 Qwen3.5 ChatML。模型自己的 chat_template.jinja 已原樣複製,程式載入時由 Tokenizer 使用。
程式載入:
from exllamav3 import Cache, Config, Generator, Model, Tokenizer
path = "/content/Sage-A1.5-Heretic-Abliterated-Uncensored-exl3-4.0bpw"
config = Config.from_directory(path) # components: text, vision, mtp
model = Model.from_config(config)
tokenizer = Tokenizer.from_config(config)
cache = Cache(model, max_num_tokens=2048) # 要在 load() 之前接上
model.load()
generator = Generator(model, cache, tokenizer)
print(generator.generate(prompt="The capital of France is", max_new_tokens=32, completion_only=True))
同一路徑連續兩次這樣載入都成功,短提示的補完非空。Cache 必須在 model.load() 之前建立,loader 才會一併配置 KV / recurrent state。