File size: 2,142 Bytes
0695d0b |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
import torch
from transformers import AutoTokenizer, AutoModel, BitsAndBytesConfig
from PIL import Image
# ===================== 1. 基础配置 =====================
# 你的本地路径
local_model_path = "/home/nashen/deepseek-ocr/DeepSeek-OCR-master/DeepSeek-OCR-vllm/model/"
device = "cuda" if torch.cuda.is_available() else "cpu"
# ===================== 2. 正确的分层量化配置 (BitsAndBytesConfig) =====================
# 核心修改:不再使用字典,而是创建一个 Config 对象
# 逻辑:默认全部 4bit 量化,然后通过 skip_modules 保护视觉层
quantization_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4", # 推荐 nf4
bnb_4bit_use_double_quant=True, # 双重量化省显存
bnb_4bit_compute_dtype=torch.bfloat16,
# 【重点】这里实现你的“分层”逻辑
# 强制跳过视觉层(vision_model)和输出层(lm_head),保持 bf16 原生精度
llm_int8_skip_modules=[
"vision_model", # 视觉编码器
"lm_head", # 输出层
"embed_tokens", # 词嵌入
"output" # 部分架构的输出层
]
)
# ===================== 3. 加载模型 =====================
print(f"🚀 正在从本地加载模型: {local_model_path}")
try:
tokenizer = AutoTokenizer.from_pretrained(local_model_path, trust_remote_code=True)
model = AutoModel.from_pretrained(
local_model_path,
trust_remote_code=True,
# 核心修改:这里使用 quantization_config 参数,而不是 **kwargs 解包
quantization_config=quantization_config,
device_map="auto"
)
# 开启 KV Cache 优化
model.config.use_cache = True
model.eval()
print("\n✅ DeepSeek-OCR 本地模型加载成功!")
print("✅ 混合精度策略已应用:")
print(" - 视觉层/输出层:BF16 (原画质,不量化)")
print(" - 语言层:NF4 (显存压缩)")
# 测试一下显存占用
print(f"✅ 模型加载完毕。你可以尝试运行推理了。")
except Exception as e:
print(f"\n❌ 发生错误: {e}")
|