AI 大模型文件里到底装了什么671B 参数、几十 GB 的文件拆开给你看适合对 AI 大模型好奇、想知道模型文件内部结构的开发者。本文用 Python 实际加载和分析模型文件展示参数、权重、配置的结构。背景模型文件是个黑盒下载一个开源大模型如 DeepSeek-V3、Qwen2.5你会得到一堆文件model-00001-of-00006.safetensors model-00002-of-00006.safetensors ... config.json tokenizer.json这些文件里到底装了什么671B 参数是什么意思为什么一个模型要几十 GB今天拆开看。模型文件的组成一个完整的模型包含 4 类文件文件作用大小占比模型权重.safetensors/.bin神经网络的所有参数95%配置文件config.json模型架构参数 0.01%词表文件tokenizer.jsonToken 和 ID 的映射 1%其他文件许可证、README 等 0.01%1. 配置文件config.jsonimportjsonwithopen(config.json)asf:configjson.load(f)# DeepSeek-V3 的配置示例print(json.dumps(config,indent2))输出示例{model_type:deepseek_v3,hidden_size:7168,num_hidden_layers:61,num_attention_heads:128,num_key_value_heads:128,intermediate_size:18432,vocab_size:129280,max_position_embeddings:163840,rms_norm_eps:1e-6,rope_theta:10000.0}关键参数解读参数含义DeepSeek-V3 值hidden_size每个 token 的向量维度7168num_hidden_layersTransformer 层数61num_attention_heads注意力头数128intermediate_sizeFFN 中间层维度18432vocab_size词表大小129280max_position_embeddings最大上下文长度163840参数量估算# 简化估算公式defestimate_params(config):hconfig[hidden_size]# 7168Lconfig[num_hidden_layers]# 61Vconfig[vocab_size]# 129280Iconfig[intermediate_size]# 18432# 每层参数 ≈ 4 * h^2 2 * h * IAttention FFNparams_per_layer4*h**22*h*I# 总参数 ≈ 层数 * 每层 embedding outputtotalL*params_per_layer2*V*hreturntotal paramsestimate_params(config)print(f估算参数量:{params/1e9:.1f}B)# 约 671B2. 模型权重safetensors 文件fromsafetensorsimportsafe_open# 加载第一个权重文件withsafe_open(model-00001-of-00006.safetensors,frameworknumpy)asf:# 列出所有参数名keysf.keys()print(f参数数量:{len(keys)})# 查看前 10 个参数名forkeyinlist(keys)[:10]:tensorf.get_tensor(key)print(f{key}: shape{tensor.shape}, dtype{tensor.dtype})输出示例参数数量: 3256 model.embed_tokens.weight: shape(129280, 7168), dtypefloat16 model.layers.0.self_attn.q_proj.weight: shape(7168, 7168), dtypefloat16 model.layers.0.self_attn.k_proj.weight: shape(7168, 7168), dtypefloat16 model.layers.0.self_attn.v_proj.weight: shape(7168, 7168), dtypefloat16 model.layers.0.self_attn.o_proj.weight: shape(7168, 7168), dtypefloat16 model.layers.0.mlp.gate_proj.weight: shape(18432, 7168), dtypefloat16 model.layers.0.mlp.up_proj.weight: shape(18432, 7168), dtypefloat16 model.layers.0.mlp.down_proj.weight: shape(7168, 18432), dtypefloat16 model.layers.0.input_layernorm.weight: shape(7168,), dtypefloat32 model.layers.0.post_attention_layernorm.weight: shape(7168,), dtypefloat32参数命名规则model.layers.{层号}.{模块}.{参数类型}模块含义参数形状self_attn.q_projQuery 投影(hidden_size, hidden_size)self_attn.k_projKey 投影(hidden_size, hidden_size)self_attn.v_projValue 投影(hidden_size, hidden_size)self_attn.o_projOutput 投影(hidden_size, hidden_size)mlp.gate_projFFN 门控(intermediate_size, hidden_size)mlp.up_projFFN 上投影(intermediate_size, hidden_size)mlp.down_projFFN 下投影(hidden_size, intermediate_size)input_layernorm输入归一化(hidden_size,)3. 为什么模型这么大defcalculate_model_size(config):计算模型存储大小hconfig[hidden_size]Lconfig[num_hidden_layers]Vconfig[vocab_size]Iconfig[intermediate_size]# 每层参数数量attn_params4*h*h# Q, K, V, Offn_params3*h*I# gate, up, downnorm_params2*h# 2 个 LayerNormlayer_paramsattn_paramsffn_paramsnorm_params# 总参数total_paramsL*layer_paramsV*h# 层 embedding# FP16 存储2 字节/参数size_fp16total_params*2/(1024**3)# GB# INT4 量化存储0.5 字节/参数size_int4total_params*0.5/(1024**3)# GBprint(f总参数:{total_params/1e9:.1f}B)print(fFP16 存储:{size_fp16:.1f}GB)print(fINT4 量化:{size_int4:.1f}GB)returntotal_params# DeepSeek-V3config{hidden_size:7168,num_hidden_layers:61,vocab_size:129280,intermediate_size:18432}calculate_model_size(config)# 输出:# 总参数: 671.0B# FP16 存储: 1243.1 GB# INT4 量化: 310.8 GB所以 DeepSeek-V3 全精度需要 1.2TB 存储INT4 量化后需要约 311GB。4. 词表文件tokenizer.jsonwithopen(tokenizer.json)asf:tokenizer_datajson.load(f)# 词表大小vocabtokenizer_data.get(model,{}).get(vocab,{})print(f词表大小:{len(vocab)})# 查看一些 tokensample_tokenslist(vocab.items())[:20]fortoken,token_idinsample_tokens:print(f {token} → ID{token_id})输出示例词表大小: 129280 ! → ID 0 → ID 1 # → ID 2 $ → ID 3 我 → ID 452 是 → ID 374 Python → ID 15339词表的作用把文本拆成 tokenID模型处理的是 ID 序列输出的也是 ID 序列再通过词表转回文本。5. 模型加载过程fromtransformersimportAutoModelForCausalLM,AutoTokenizerimporttorch# 加载 tokenizer词表tokenizerAutoTokenizer.from_pretrained(./model_dir)# 加载模型权重modelAutoModelForCausalLM.from_pretrained(./model_dir,torch_dtypetorch.float16,# 用 FP16 节省显存device_mapauto# 自动分配到 GPU)# 查看模型结构print(model)# 输出# DeepSeekForCausalLM(# (model): DeepSeekModel(# (embed_tokens): Embedding(129280, 7168)# (layers): ModuleList(# (0): DeepSeekDecoderLayer(...)# (1): DeepSeekDecoderLayer(...)# ...# )# (norm): RMSNorm()# )# (lm_head): Linear(7168, 129280, biasFalse)# )6. 量化是怎么回事量化就是用更少的比特数存储每个参数减小模型体积和显存需求。精度每个参数占空间671B 模型大小质量损失FP324 字节2.5 TB无FP162 字节1.2 TB极小INT81 字节620 GB小INT40.5 字节311 GB中等INT20.25 字节155 GB较大# 量化示例使用 bitsandbytesfromtransformersimportBitsAndBytesConfig quant_configBitsAndBytesConfig(load_in_4bitTrue,bnb_4bit_compute_dtypetorch.float16)modelAutoModelForCausalLM.from_pretrained(./model_dir,quantization_configquant_config,device_mapauto)# 查看显存占用print(f显存占用:{model.get_memory_footprint()/1e9:.1f}GB)踩坑记录坑 1safetensors 和 .bin 格式混淆症状下载的模型既有 .safetensors 又有 .bin不知道用哪个。原因旧版用 PyTorch 的 .bin 格式新版用 safetensors更安全。解决优先用 .safetensors它是 safetensors 库的格式加载更安全不会执行恶意代码。坑 2模型文件不完整症状加载时报 “unexpected key” 或 “missing key”。原因下载中断文件不完整。解决检查文件 hash或者重新下载。坑 3显存不够加载整个模型症状加载 70B 模型时报 CUDA out of memory。解决用量化INT4/INT8用device_mapauto自动分层到 CPU 和 GPU用 llama.cpp 等 CPU 推理工具坑 4不同框架的权重格式不通用症状HuggingFace 格式的模型在 llama.cpp 里用不了。原因不同框架的权重命名和排列方式不同。解决用转换工具如convert-hf-to-gguf.py转换格式。坑 5config.json 里的参数和实际权重不匹配症状config 写了 32 层但权重文件只有 30 层的参数。原因模型经过剪枝或微调后 config 没更新。解决以实际权重文件为准config 只是参考。总结3 条核心经验模型 配置 权重 词表。配置定义架构权重存储知识词表做文本↔ID 转换。模型大小 参数量 × 精度。671B 参数在 FP16 下需要 1.2TBINT4 量化后只需 311GB。量化是让大模型能在消费级硬件上跑的关键。safetensors 是目前最好的权重格式。比 .bin 更安全、加载更快优先使用。你对大模型内部结构有什么疑问评论区交流。
AI 大模型文件里到底装了什么:671B 参数、几十 GB 的文件,拆开给你看
AI 大模型文件里到底装了什么671B 参数、几十 GB 的文件拆开给你看适合对 AI 大模型好奇、想知道模型文件内部结构的开发者。本文用 Python 实际加载和分析模型文件展示参数、权重、配置的结构。背景模型文件是个黑盒下载一个开源大模型如 DeepSeek-V3、Qwen2.5你会得到一堆文件model-00001-of-00006.safetensors model-00002-of-00006.safetensors ... config.json tokenizer.json这些文件里到底装了什么671B 参数是什么意思为什么一个模型要几十 GB今天拆开看。模型文件的组成一个完整的模型包含 4 类文件文件作用大小占比模型权重.safetensors/.bin神经网络的所有参数95%配置文件config.json模型架构参数 0.01%词表文件tokenizer.jsonToken 和 ID 的映射 1%其他文件许可证、README 等 0.01%1. 配置文件config.jsonimportjsonwithopen(config.json)asf:configjson.load(f)# DeepSeek-V3 的配置示例print(json.dumps(config,indent2))输出示例{model_type:deepseek_v3,hidden_size:7168,num_hidden_layers:61,num_attention_heads:128,num_key_value_heads:128,intermediate_size:18432,vocab_size:129280,max_position_embeddings:163840,rms_norm_eps:1e-6,rope_theta:10000.0}关键参数解读参数含义DeepSeek-V3 值hidden_size每个 token 的向量维度7168num_hidden_layersTransformer 层数61num_attention_heads注意力头数128intermediate_sizeFFN 中间层维度18432vocab_size词表大小129280max_position_embeddings最大上下文长度163840参数量估算# 简化估算公式defestimate_params(config):hconfig[hidden_size]# 7168Lconfig[num_hidden_layers]# 61Vconfig[vocab_size]# 129280Iconfig[intermediate_size]# 18432# 每层参数 ≈ 4 * h^2 2 * h * IAttention FFNparams_per_layer4*h**22*h*I# 总参数 ≈ 层数 * 每层 embedding outputtotalL*params_per_layer2*V*hreturntotal paramsestimate_params(config)print(f估算参数量:{params/1e9:.1f}B)# 约 671B2. 模型权重safetensors 文件fromsafetensorsimportsafe_open# 加载第一个权重文件withsafe_open(model-00001-of-00006.safetensors,frameworknumpy)asf:# 列出所有参数名keysf.keys()print(f参数数量:{len(keys)})# 查看前 10 个参数名forkeyinlist(keys)[:10]:tensorf.get_tensor(key)print(f{key}: shape{tensor.shape}, dtype{tensor.dtype})输出示例参数数量: 3256 model.embed_tokens.weight: shape(129280, 7168), dtypefloat16 model.layers.0.self_attn.q_proj.weight: shape(7168, 7168), dtypefloat16 model.layers.0.self_attn.k_proj.weight: shape(7168, 7168), dtypefloat16 model.layers.0.self_attn.v_proj.weight: shape(7168, 7168), dtypefloat16 model.layers.0.self_attn.o_proj.weight: shape(7168, 7168), dtypefloat16 model.layers.0.mlp.gate_proj.weight: shape(18432, 7168), dtypefloat16 model.layers.0.mlp.up_proj.weight: shape(18432, 7168), dtypefloat16 model.layers.0.mlp.down_proj.weight: shape(7168, 18432), dtypefloat16 model.layers.0.input_layernorm.weight: shape(7168,), dtypefloat32 model.layers.0.post_attention_layernorm.weight: shape(7168,), dtypefloat32参数命名规则model.layers.{层号}.{模块}.{参数类型}模块含义参数形状self_attn.q_projQuery 投影(hidden_size, hidden_size)self_attn.k_projKey 投影(hidden_size, hidden_size)self_attn.v_projValue 投影(hidden_size, hidden_size)self_attn.o_projOutput 投影(hidden_size, hidden_size)mlp.gate_projFFN 门控(intermediate_size, hidden_size)mlp.up_projFFN 上投影(intermediate_size, hidden_size)mlp.down_projFFN 下投影(hidden_size, intermediate_size)input_layernorm输入归一化(hidden_size,)3. 为什么模型这么大defcalculate_model_size(config):计算模型存储大小hconfig[hidden_size]Lconfig[num_hidden_layers]Vconfig[vocab_size]Iconfig[intermediate_size]# 每层参数数量attn_params4*h*h# Q, K, V, Offn_params3*h*I# gate, up, downnorm_params2*h# 2 个 LayerNormlayer_paramsattn_paramsffn_paramsnorm_params# 总参数total_paramsL*layer_paramsV*h# 层 embedding# FP16 存储2 字节/参数size_fp16total_params*2/(1024**3)# GB# INT4 量化存储0.5 字节/参数size_int4total_params*0.5/(1024**3)# GBprint(f总参数:{total_params/1e9:.1f}B)print(fFP16 存储:{size_fp16:.1f}GB)print(fINT4 量化:{size_int4:.1f}GB)returntotal_params# DeepSeek-V3config{hidden_size:7168,num_hidden_layers:61,vocab_size:129280,intermediate_size:18432}calculate_model_size(config)# 输出:# 总参数: 671.0B# FP16 存储: 1243.1 GB# INT4 量化: 310.8 GB所以 DeepSeek-V3 全精度需要 1.2TB 存储INT4 量化后需要约 311GB。4. 词表文件tokenizer.jsonwithopen(tokenizer.json)asf:tokenizer_datajson.load(f)# 词表大小vocabtokenizer_data.get(model,{}).get(vocab,{})print(f词表大小:{len(vocab)})# 查看一些 tokensample_tokenslist(vocab.items())[:20]fortoken,token_idinsample_tokens:print(f {token} → ID{token_id})输出示例词表大小: 129280 ! → ID 0 → ID 1 # → ID 2 $ → ID 3 我 → ID 452 是 → ID 374 Python → ID 15339词表的作用把文本拆成 tokenID模型处理的是 ID 序列输出的也是 ID 序列再通过词表转回文本。5. 模型加载过程fromtransformersimportAutoModelForCausalLM,AutoTokenizerimporttorch# 加载 tokenizer词表tokenizerAutoTokenizer.from_pretrained(./model_dir)# 加载模型权重modelAutoModelForCausalLM.from_pretrained(./model_dir,torch_dtypetorch.float16,# 用 FP16 节省显存device_mapauto# 自动分配到 GPU)# 查看模型结构print(model)# 输出# DeepSeekForCausalLM(# (model): DeepSeekModel(# (embed_tokens): Embedding(129280, 7168)# (layers): ModuleList(# (0): DeepSeekDecoderLayer(...)# (1): DeepSeekDecoderLayer(...)# ...# )# (norm): RMSNorm()# )# (lm_head): Linear(7168, 129280, biasFalse)# )6. 量化是怎么回事量化就是用更少的比特数存储每个参数减小模型体积和显存需求。精度每个参数占空间671B 模型大小质量损失FP324 字节2.5 TB无FP162 字节1.2 TB极小INT81 字节620 GB小INT40.5 字节311 GB中等INT20.25 字节155 GB较大# 量化示例使用 bitsandbytesfromtransformersimportBitsAndBytesConfig quant_configBitsAndBytesConfig(load_in_4bitTrue,bnb_4bit_compute_dtypetorch.float16)modelAutoModelForCausalLM.from_pretrained(./model_dir,quantization_configquant_config,device_mapauto)# 查看显存占用print(f显存占用:{model.get_memory_footprint()/1e9:.1f}GB)踩坑记录坑 1safetensors 和 .bin 格式混淆症状下载的模型既有 .safetensors 又有 .bin不知道用哪个。原因旧版用 PyTorch 的 .bin 格式新版用 safetensors更安全。解决优先用 .safetensors它是 safetensors 库的格式加载更安全不会执行恶意代码。坑 2模型文件不完整症状加载时报 “unexpected key” 或 “missing key”。原因下载中断文件不完整。解决检查文件 hash或者重新下载。坑 3显存不够加载整个模型症状加载 70B 模型时报 CUDA out of memory。解决用量化INT4/INT8用device_mapauto自动分层到 CPU 和 GPU用 llama.cpp 等 CPU 推理工具坑 4不同框架的权重格式不通用症状HuggingFace 格式的模型在 llama.cpp 里用不了。原因不同框架的权重命名和排列方式不同。解决用转换工具如convert-hf-to-gguf.py转换格式。坑 5config.json 里的参数和实际权重不匹配症状config 写了 32 层但权重文件只有 30 层的参数。原因模型经过剪枝或微调后 config 没更新。解决以实际权重文件为准config 只是参考。总结3 条核心经验模型 配置 权重 词表。配置定义架构权重存储知识词表做文本↔ID 转换。模型大小 参数量 × 精度。671B 参数在 FP16 下需要 1.2TBINT4 量化后只需 311GB。量化是让大模型能在消费级硬件上跑的关键。safetensors 是目前最好的权重格式。比 .bin 更安全、加载更快优先使用。你对大模型内部结构有什么疑问评论区交流。