为什么用 hf download 下载的模型比 AutoModelForCausalLM.from_pretrained 加载的大很多?

使用 hf download 直接下载模型文件,与通过 AutoModelForCausalLM.from_pretrained 加载模型时的文件大小存在差异,主要源于以下几个核心原因:

1. 下载内容的完整性不同

  • hf download 的行为
    直接下载模型仓库中的所有原始文件,包括:

    • 完整的模型权重文件(如 .bin.safetensors,可能包含未压缩的参数);
    • 配置文件(config.jsontokenizer_config.json 等);
    • 词汇表文件(vocab.txt 等);
    • 可能存在的冗余文件(如训练日志、示例代码、多语言子模型等)。
      此外,部分模型仓库会包含不同精度/格式的权重文件(如 FP32、FP16、INT8 等),hf download 可能会将这些文件全部下载,导致总大小显著增加。
  • AutoModelForCausalLM.from_pretrained 的行为
    加载时会根据配置自动筛选并加载必要的文件

    • 仅加载与当前运行环境兼容的权重文件(如默认选择 FP16 或 INT8 而非完整的 FP32 权重,若模型支持动态精度);
    • 自动忽略冗余文件(如训练相关的日志、未使用的子模型文件);
    • 部分模型采用 transformers 库支持的优化格式(如 transformers 4.20+ 支持的 safetensors 或量化格式),加载时会优先选择更紧凑的版本。

2. 模型加载时的动态处理

  • from_pretrained 方法在加载模型时,会对权重文件进行动态处理和优化
    • 自动转换格式:将原始权重转换为适合当前框架(如 PyTorch)的张量格式,可能去除存储时的冗余元数据;
    • 量化或精度转换:若指定 load_in_8bitload_in_4bit 等参数,会实时将模型量化为更小的精度,减少内存占用(但磁盘下载的原始文件可能仍是高精度);
    • 合并分片文件:部分大模型的权重会拆分为多个 .bin 文件(如 pytorch_model-00001-of-00010.bin),from_pretrained 会在加载时自动合并为统一的模型结构,而 hf download 会保留所有分片文件,总大小看起来更大(但实际权重总量一致,只是存储形式不同)。

3. 缓存机制的差异

  • from_pretrained 会将下载的文件缓存到本地(默认路径:~/.cache/huggingface/hub),但缓存的是处理后的必要文件(如合并后的权重、适配当前版本的配置),可能比原始仓库的完整文件更小;
  • hf download 通常直接下载原始仓库的所有文件,不经过筛选或处理,因此缓存的文件更完整,体积更大。

总结

hf download 下载的是模型仓库的完整原始文件集(包含所有格式、分片和冗余内容),而 AutoModelForCausalLM.from_pretrained 仅加载必要的、经过优化处理的文件(如适配精度、合并分片),因此前者的文件总大小会显著大于后者。

如果需要控制下载大小,可以在 from_pretrained 中指定精度参数(如 torch_dtype=torch.float16),或通过 hf download 手动筛选所需文件(如仅下载特定分片和配置文件)。

--------------------------------------------------------------------------- ValueError Traceback (most recent call last) Cell In[2], line 9 2 model_name = "qwen/Qwen3-8B" 4 tokenizer = AutoTokenizer.from_pretrained( 5 model_name, 6 trust_remote_code=True, 7 use_fast=False 8 ) ----> 9 model = AutoModelForCausalLM.from_pretrained( 10 # attn_implementation="flash_attention_2", # 可选:加速注意力计算 11 model_name, 12 device_map="auto", 13 trust_remote_code=True 14 ) File e:\Python311\python11\Lib\site-packages\modelscope\utils\hf_util\patcher.py:285, in _patch_pretrained_class.<locals>.get_wrapped_class.<locals>.ClassWrapper.from_pretrained(cls, pretrained_model_name_or_path, *model_args, **kwargs) 281 with file_pattern_context(kwargs, module_class, cls): 282 model_dir = get_model_dir(pretrained_model_name_or_path, 283 **kwargs) --> 285 module_obj = module_class.from_pretrained( 286 model_dir, *model_args, **kwargs) 288 if module_class.__name__.startswith('AutoModel'): 289 module_obj.model_dir = model_dir File e:\Python311\python11\Lib\site-packages\transformers\models\auto\auto_factory.py:604, in _BaseAutoModelClass.from_pretrained(cls, pretrained_model_name_or_path, *model_args, **kwargs) 602 if model_class.config_class == config.sub_configs.get("text_config", None): 603 config = config.get_text_config() --> 604 return model_class.from_pretrained( 605 pretrained_model_name_or_path, *model_args, config=config, **hub_kwargs, **kwargs 606 ) 607 raise ValueError( 608 f"Unrecognized configuration class {config.__class__} for this kind of AutoModel: {cls.__name__}.\n" 609 f"Model type should be one of {', '.join(c.__name__ for c in cls._model_mapping)}." 610 ) File e:\Python311\python11\Lib\site-packages\transformers\modeling_utils.py:277, in restore_default_dtype.<locals>._wrapper(*args, **kwargs) 275 old_dtype = torch.get_default_dtype() 276 try: --> 277 return func(*args, **kwargs) 278 finally: 279 torch.set_default_dtype(old_dtype) File e:\Python311\python11\Lib\site-packages\transformers\modeling_utils.py:5140, in PreTrainedModel.from_pretrained(cls, pretrained_model_name_or_path, config, cache_dir, ignore_mismatched_sizes, force_download, local_files_only, token, revision, use_safetensors, weights_only, *model_args, **kwargs) 5137 device_map_kwargs["offload_buffers"] = True 5139 if not is_fsdp_enabled() and not is_deepspeed_zero3_enabled(): -> 5140 dispatch_model(model, **device_map_kwargs) 5142 if hf_quantizer is not None: 5143 model.hf_quantizer = hf_quantizer File e:\Python311\python11\Lib\site-packages\accelerate\big_modeling.py:504, in dispatch_model(model, device_map, main_device, state_dict, offload_dir, offload_index, offload_buffers, skip_keys, preload_module_classes, force_hooks) 502 model.to(device) 503 else: --> 504 raise ValueError( 505 "You are trying to offload the whole model to the disk. Please use the `disk_offload` function instead." 506 ) 507 # Convert OrderedDict back to dict for easier usage 508 model.hf_device_map = dict(device_map) ValueError: You are trying to offload the whole model to the disk. Please use the `disk_offload` function instead. # 1. 加载 tokenizer 和 model model_name = "qwen/Qwen3-8B" tokenizer = AutoTokenizer.from_pretrained( model_name, trust_remote_code=True, use_fast=False ) model = AutoModelForCausalLM.from_pretrained( # attn_implementation="flash_attention_2", # 可选:加速注意力计算 model_name, device_map="auto", trust_remote_code=True )
11-25
from transformers import AutoTokenizer, AutoModelForCausalLM, TrainingArguments, Trainer from peft import LoraConfig, get_peft_model import torch from datasets import load_dataset # 新增:用于加载JSONL文件 # 1. 加载 tokenizer 和 model(不变) model_name = "Qwen/Qwen3-8B" tokenizer = AutoTokenizer.from_pretrained(model_name, use_fast=False) model = AutoModelForCausalLM.from_pretrained( model_name, torch_dtype=torch.bfloat16, device_map="auto" ) # 2. 配置 LoRA(不变) lora_config = LoraConfig( r=8, lora_alpha=32, target_modules=["q_proj", "v_proj"], # Qwen 注意力层中的关键投影 lora_dropout=0.1, bias="none", task_type="CAUSAL_LM" ) model = get_peft_model(model, lora_config) # 3. 从JSONL文件加载数据集(修改部分) dataset = load_dataset("json", data_files="train_data.jsonl")["train"] # 加载JSONL文件 # Tokenize 数据(适配新格式,修改部分) def tokenize_function(examples): prompts = [] responses = [] for msg_list in examples["message"]: # 拼接对话历史(用户消息在前,助手消息在后) prompt = "" response = "" for msg in msg_list: if msg["role"] == "user": prompt += f"用户: {msg['content']}\n" # 累加用户消息 else: response = msg["content"] # 最后一条助手消息作为目标输出 # 构建最终提示(用户消息 + 助手回复前缀) prompts.append(prompt + "助手:") responses.append(response) # 处理输入和标签 model_inputs = tokenizer(prompts, max_length=512, truncation=True, padding=True) labels = tokenizer(responses, max_length=128, truncation=True, padding=True)["input_ids"] # 掩盖输入部分的标签(仅计算助手回复的loss) model_inputs["labels"] = [ [-100] * (len(input_ids) - len(label)) + label for input_ids, label in zip(model_inputs["input_ids"], labels) ] return model_inputs tokenized_dataset = dataset.map(tokenize_function, batched=True) # 4. 训练配置(不变) training_args = TrainingArguments( output_dir="./qwen3-lora-checkpoints", per_device_train_batch_size=1, gradient_accumulation_steps=8, learning_rate=2e-4, num_train_epochs=3, save_steps=100, logging_steps=10, optim="adamw_torch", fp16=True, warmup_steps=50, save_total_limit=2, report_to="none" ) trainer = Trainer( model=model, args=training_args, train_dataset=tokenized_dataset, tokenizer=tokenizer ) trainer.train() 加载模型速度太慢
最新发布
11-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值