(學術) ninfer 可支援的 去審查Qwen3.8-27B nvfp4:製作方法
-
"This repository/article is for academic and AI safety research purposes only. It demonstrates how model weights react to specific transformations. No model weights are hosted or redistributed here. Users are responsible for ensuring compliance with the original model's license when applying these techniques locally."
ninfer目前認可模型並不是uncensored
所以有很多不雅的事不能試(例如請模型創作正妹..................................................................................挖鼻孔照片....)我想應該很多大神早就做出來了,只是忘了分享,因此拋磚引玉一下
以下純學術討論(不提供模型下載)!!!!!!!!!!!! 但你可以用自己顯卡去實現自己的uncensored模型適用:手上有一份同架構(Qwen3.8-27B / 64 層 / vocab 248320)的去審查(abliterated / uncensored)權重,想在 NInfer 引擎上跑,且不想改引擎、不想換 binary、不想重學啟動參數。
本文只講四件事:製作方法、執行步驟、資料來源、為什麼「原本那套 NInfer 可以無痛接入」。
不講:效能數字、量化路徑對比、TP2 雙卡細則、其它引擎。
本流程 = 2026-09-22 實測跑通的可重現 SOP(uncensored 重轉 nvfp4 後與標準 artifact 同 runtime identity)。1. 為什麼無痛接入(先講結論)
「uncensored」不是新模型——它是同一個 base 的權重「值」改動(abliteration 只動
attn.o_proj/mlp.down_proj的 residual stream),不動 shape / vocab / tokenizer / layer 排程。因為 NInfer 的
convert.py/convert_nvfp4.py對權重是「餵進去的值重新量化」,uncensored 的 bf16 / nvfp4 權重直接餵就能產出一個.ninferartifact。產出後:項目 標準模型 uncensored 模型 NInfer binary ninfer-serve同一支 啟動參數 --spec dflash2 --draft-tokens 8 ...完全相同 runtime identity qwen3.8-27b/nvfp4qwen3.8-27b/nvfp4(v2 重轉後相同)唯一差別 artifact 檔 只換 artifact 檔 + model-id 換句話說:原本跑標準模型的那套 NInfer 環境、那支 binary、那套啟動參數,把 artifact 路徑指到 uncensored、model-id 改一下,就能直接跑。 不用重裝、不用改引擎、不用重學參數。
2. 製作方法(產出
.ninferartifact)2.1 準備三份料
料 用途 格式要求 uncensored base 權重 模型主體 safetensors(bf16 可直餵 groupwise-int 路) DFlash2 配重 投機解碼 draft head safetensors( model.safetensors單檔 + 含dflash_config的config.json;GGUF 不行)官方 frontend 6 檔 tokenizer / chat template 等 用官方的,不是 uncensored repo 的(見 §2.3) 2.2 下載 uncensored 權重(用
snapshot_download,別用hf download)python3 -c " import os; os.environ['HF_XET_HIGH_PERFORMANCE']='1' from huggingface_hub import snapshot_download snapshot_download( 'JonathanColetti/Qwen3.8-27B-Uncensored', allow_patterns=['model-[0-9]*.safetensors','model-mtp.safetensors', 'model.safetensors.index.json','config.json'], local_dir='$HOME/.llama/<EXP>/uncensored', max_workers=16)"
️ 坑:hf downloadCLI 會把多個--include誤解成正位元字面檔名,12 個大 shard 一個都不下、只抓小檔。一律改用snapshot_download(allow_patterns=)。2.3 用「官方」frontend 6 檔,不用 uncensored repo 的
uncensored repo 是 transformers re-save,
tokenizer.json的 byte-ordering 跟官方不同 → 直接餵會被 converter 的 SHA256 gate 擋。vocab 已驗證與官方相同,所以語意零損失,直接用官方檔:# 官方 6 檔 @ base revision 1d4bf0f2ff6012fd82039f2fa52739d0dd7c60c0 BASE="https://huggingface.co/Qwen/Qwen3.8-27B/resolve/1d4bf0f2ff6012fd82039f2fa52739d0dd7c60c0" for f in tokenizer.json tokenizer_config.json chat_template.jinja \ generation_config.json preprocessor_config.json video_preprocessor_config.json; do curl -sL "$BASE/$f" -o <UNC_DIR>/$f done # 驗證:sha256sum 六檔應全等於 convert.py 的 OFFICIAL_RESOURCE_SHA2562.4 轉換(模組模式,別直接跑 script)
cd <NINFER_SRC_ROOT> export PYTHONPATH=<NINFER_SRC_ROOT> export CUDA_VISIBLE_DEVICES=<idle GPU> python3 -m tools.convert.qwen3_8_27b.convert \ --model <UNC_DIR> \ --dflash2-model <DF2_DIR> \ --out <OUT>.ninfer \ --device cuda
️ 坑:不能用 python3 tools/.../convert.py直接跑——會ImportError: attempted relative import with no known parent package(converter 內部用from . import dflash2_recipe)。必須python3 -m模組模式、從 source root 執行。兩條量化路(擇一):
convert.py(groupwise-int 路):直接餵 bf16,記憶體內重新量化。簡單快速。convert_nvfp4.py(nvfp4 路):吃一個預先量化好的 vLLM compressed-tensors NVFP4 checkpoint(--quantized-model),不在記憶體重量化。→ 要讓 uncensored 與標準 artifact 同 runtime identity(nvfp4)、真正「無痛同速」,走這條。
3. 執行步驟(上線,無痛接入)
# ~/.config/systemd/user/ninfer-dryrun.service [Service] Environment=CUDA_VISIBLE_DEVICES=<idle GPU> ExecStart=<NINFER_BINARY> <UNCERTAINSED_ARTIFACT> \ --host 127.0.0.1 --port <獨立port> --device 0 \ --max-context 262144 --kv-dtype nvfp4 --kv-capacity 334000 --max-concurrency 3 \ --prefill-chunk 1024 --pending-timeout-ms 600000 \ --spec dflash2 --draft-tokens 8 --lm-head-draft \ --model-id qwen38-uncensored \ --vision --media-cache-mib 256 --media-live-mib 512 --host-state-slots 8 --host-kv-mib 8192systemctl --user daemon-reload && systemctl --user start ninfer-dryrun # ~8s 後 curl -s http://127.0.0.1:<port>/health # 應 {"status":"ok"} # 測試完:systemctl --user stop ninfer-dryrun && rm unit && daemon-reload3.1 dry-run 驗證項(三項全過才算數)
engine ready(runtime identity 應為qwen3.8-27b/nvfp4)+CUDA graphs ready- 發一個正常 prompt,確認輸出正確
- 去審查行為驗證:拿「base 會拒、uncensored 不該拒的有害請求」餵兩端(base 主腦 + uncensored),比對拒率 delta——base 高拒 + uncensored 低拒 + delta 大 → 去審查真生效。(不是找「只有 uncensored 能答的題」,那是能力差異不是去審查。)
3.2 上線
4. 資料來源
來源 說明 JonathanColetti/Qwen3.8-27B-Uncensored uncensored base 權重(bf16,12 shard) z-lab/Qwen3.8-27B-DFlash2 DFlash2 投機解碼配重(safetensors + config) Qwen/Qwen3.8-27B @ 1d4bf0f2ff6012fd82039f2fa52739d0dd7c60c0官方 frontend 6 檔(tokenizer / chat_template 等,SHA256 gate 基準) NInfer tools/convert/qwen3_8_27b/convert.pygroupwise-int 轉換路( OFFICIAL_RESOURCE_SHA256、check_members、validate_base_compatibility)NInfer tools/convert/qwen3_8_27b/convert_nvfp4.pynvfp4 轉換路(吃 vLLM compressed-tensors NVFP4 checkpoint; recipe_nvfp4.py格式合約)本地 SOP ninfer-uncensored-qwen38-convert-20260921.md(完整實測 + 踩坑)、ninfer-uncensored-vs-standard-perf-20260921.md§5.5(TP2 狀態)
本檔為 LCZ 貼文規格(2~3 欄 pipe table、阿拉伯數字章節、code fence 標語言、資料來源連結)。貼上 lcz 前寬表已控制在 3 欄內。