# Summary
`.pt` 是 **PyTorch 的标准文件格式**,用于保存模型、权重和张量数据。
# Cues
[[safetensor 文件]]
# Notes
## model.pt - 预训练模型权重文件 (5.4MB)
这是一个已经训练好的标准Transformer模型的所有权重,包含:
- Token embedding权重
- 每一层的attention权重 (W_q, W_k, W_v, W_o)
- 每一层的FFN权重 (W1, W2, W3)
- LayerNorm的权重
- 输出层权重
# 基本信息
| 特性 | 说明 |
|------|------|
| **全称** | PyTorch Tensor file |
| **底层格式** | Pickle + ZIP (Python序列化) |
| **用途** | 保存模型权重、完整模型、张量数据 |
| **读取方式** | `torch.load()` |
| **保存方式** | `torch.save()` |
# 在代码中的使用
```python
# 保存模型权重
torch.save(model.state_dict(), "model.pt")
# 加载模型权重
state_dict = torch.load("model.pt", map_location="cpu")
# 在我们的测试中:
state_dict = torch.load(FIXTURES_PATH / "ts_tests" / "model.pt", map_location="cpu")
```
# 文件内容结构
一个 `.pt` 文件通常包含:
```python
# model.pt 内部结构示例
{
"token_embeddings.weight": tensor([[0.1, -0.3, ...], ...]), # Token嵌入层权重
"layers.0.attn.q_proj.weight": tensor([[...], ...]), # 第0层Q投影权重
"layers.0.attn.k_proj.weight": tensor([[...], ...]), # 第0层K投影权重
"layers.0.attn.v_proj.weight": tensor([[...], ...]), # 第0层V投影权重
"layers.0.attn.output_proj.weight": tensor([[...], ...]), # 第0层输出投影权重
"layers.0.ln1.weight": tensor([1.2, 0.8, ...]), # 第0层LayerNorm权重
"layers.0.ffn.w1.weight": tensor([[...], ...]), # 第0层FFN权重
"layers.0.ffn.w2.weight": tensor([[...], ...]),
"layers.0.ffn.w3.weight": tensor([[...], ...]),
# ... 重复每一层的权重
"layers.1.attn.q_proj.weight": tensor([[...], ...]),
# ...
"output.weight": tensor([[...], ...]), # 输出层权重
}
```
# 与其他格式的对比
| 格式 | 框架 | 特点 |
|------|------|------|
| **`.pt` / `.pth`** | PyTorch | PyTorch原生,包含完整上下文 |
| **`.safetensors`** | Hugging Face | 更安全,跨框架兼容 |
| **`.ckpt`** | 通用 | Checkpoint格式,可能包含优化器状态 |
| **`.h5`** | TensorFlow/Keras | HDF5格式 |
| **`.onnx`** | ONNX | 跨框架标准格式 |
# 在CS336项目中的作用
```python
# 这个5.4MB的model.pt文件包含了:
state_dict = torch.load("model.pt")
print(state_dict.keys())
# 输出类似:
# dict_keys([
# 'token_embeddings.weight', # [10000, 64] - 词汇表到向量的映射
# 'layers.0.attn.q_proj.weight', # [64, 64] - 第0层注意力Q投影
# 'layers.0.attn.k_proj.weight', # [64, 64] - 第0层注意力K投影
# 'layers.0.attn.v_proj.weight', # [64, 64] - 第0层注意力V投影
# 'layers.0.attn.output_proj.weight', # [64, 64] - 第0层注意力输出投影
# 'layers.0.ln1.weight', # [64] - 第0层LayerNorm1
# 'layers.0.ln2.weight', # [64] - 第0层LayerNorm2
# 'layers.0.ffn.w1.weight', # [64, 128] - 第0层FFN第1层
# 'layers.0.ffn.w2.weight', # [128, 64] - 第0层FFN第2层
# 'layers.0.ffn.w3.weight', # [64, 128] - 第0层FFN门控层
# # ... 第1层、第2层的所有权重
# 'output.weight' # [64, 10000] - 输出到词汇表的映射
# ])
```
# 文件大小分析
5.4MB 对于这个模型来说是合理的:
- 词汇表大小:10,000
- 模型维度:64
- 层数:3层
- 主要权重:token_embeddings (10000×64) + layers + output (64×10000)
**总参数量**大约几百万个浮点数 × 4字节/浮点数 ≈ 几MB
所以 `.pt` 文件就是 **PyTorch模型权重的标准存储容器**,类似于其他语言中的序列化文件格式。