zhan1206
Feat: Add actual training (100 steps) + documentation (tutorial + API)
b12f6c3
|
Raw
History Blame
13.1 kB
# Fusion-LLM API 文档
## 模型 API
### FusionMini
`FusionMini` 是 Fusion-LLM 的迷你模型实现。
#### 类定义
```python
class FusionMini(nn.Module):
"""
Fusion-LLM 迷你模型
Args:
config (FusionMiniConfig): 模型配置
"""
```
#### 方法
##### `__init__(config)`
初始化 FusionMini 模型。
**参数**
- `config` (FusionMiniConfig): 模型配置对象
**示例**
```python
from models.fusion_mini import FusionMini, FusionMiniConfig
config = FusionMiniConfig(
vocab_size=1000,
hidden_size=128,
num_hidden_layers=2,
)
model = FusionMini(config)
```
##### `forward(input_ids, attention_mask=None, labels=None, past_key_values=None, use_cache=False, return_dict=True)`
模型前向传播。
**参数**
- `input_ids` (torch.Tensor): 输入 token IDs,形状为 `(batch_size, sequence_length)`
- `attention_mask` (torch.Tensor, optional): 注意力掩码,形状为 `(batch_size, sequence_length)`
- `labels` (torch.Tensor, optional): 标签,形状为 `(batch_size, sequence_length)`
- `past_key_values` (tuple, optional): 过去的键值缓存
- `use_cache` (bool): 是否使用 KV 缓存
- `return_dict` (bool): 是否返回字典格式
**返回**
- 如果 `return_dict=True`:返回字典,包含:
- `loss` (torch.Tensor): 损失值(如果提供了 labels)
- `logits` (torch.Tensor): 逻辑值,形状为 `(batch_size, sequence_length, vocab_size)`
- `past_key_values` (tuple): 更新的键值缓存(如果 `use_cache=True`
- 如果 `return_dict=False`:返回元组
**示例**
```python
# 训练模式
outputs = model(
input_ids=input_ids,
labels=labels,
return_dict=True,
)
loss = outputs["loss"]
logits = outputs["logits"]
# 推理模式(使用 KV 缓存)
outputs = model(
input_ids=input_ids,
use_cache=True,
return_dict=True,
)
logits = outputs["logits"]
past_key_values = outputs["past_key_values"]
```
##### `generate(input_ids, max_length=50, temperature=1.0, top_k=50, top_p=0.95)`
生成文本(简易接口)。
**参数**
- `input_ids` (torch.Tensor): 输入 token IDs
- `max_length` (int): 最大生成长度
- `temperature` (float): 温度参数
- `top_k` (int): Top-K 采样参数
- `top_p` (float): Top-P 采样参数
**返回**
- `torch.Tensor`: 生成的 token IDs
**示例**
```python
generated = model.generate(
input_ids=input_ids,
max_length=50,
temperature=0.8,
)
```
##### `save_pretrained(save_directory)`
保存模型和配置。
**参数**
- `save_directory` (str): 保存目录
**示例**
```python
model.save_pretrained("output/my_model")
```
##### `from_pretrained(pretrained_model_name_or_path)`
从预训练路径加载模型。
**参数**
- `pretrained_model_name_or_path` (str): 预训练模型路径
**返回**
- `FusionMini`: 加载的模型
**示例**
```python
model = FusionMini.from_pretrained("output/my_model")
```
---
### FusionMiniConfig
`FusionMiniConfig` 是 FusionMini 模型的配置类。
#### 类定义
```python
class FusionMiniConfig(PretrainedConfig):
"""
FusionMini 模型配置
Args:
vocab_size (int): 词汇表大小
hidden_size (int): 隐藏层大小
num_hidden_layers (int): 隐藏层数量
num_attention_heads (int): 注意力头数量
intermediate_size (int): 中间层大小
max_position_embeddings (int): 最大位置编码
num_key_value_heads (int, optional): KV 头数量(用于 GQA)
window_size (int, optional): SBLA 窗口大小
...
"""
```
#### 属性
| 属性 | 类型 | 默认值 | 描述 |
|------|------|--------|------|
| `vocab_size` | int | 50257 | 词汇表大小 |
| `hidden_size` | int | 768 | 隐藏层大小 |
| `num_hidden_layers` | int | 12 | 隐藏层数量 |
| `num_attention_heads` | int | 12 | 注意力头数量 |
| `intermediate_size` | int | 3072 | 中间层大小 |
| `max_position_embeddings` | int | 1024 | 最大位置编码 |
| `num_key_value_heads` | int | None | KV 头数量(GQA) |
| `window_size` | int | 16 | SBLA 窗口大小 |
#### 方法
##### `__init__(**kwargs)`
初始化配置。
**示例**:
```python
config = FusionMiniConfig(
vocab_size=1000,
hidden_size=128,
num_hidden_layers=2,
num_attention_heads=2,
)
```
---
## 注意力 API
### SBLAttention
`SBLAttention` 是 SBLA(Sliding Block Latent Attention)注意力实现。
#### 类定义
```python
class SBLAttention(nn.Module):
"""
SBLA 注意力层
Args:
hidden_size (int): 隐藏层大小
num_heads (int): 注意力头数量
window_size (int): 窗口大小
num_key_value_heads (int, optional): KV 头数量(用于 GQA)
"""
```
#### 方法
##### `__init__(hidden_size, num_heads, window_size, num_key_value_heads=None)`
初始化 SBLA 注意力层。
##### `forward(hidden_states, attention_mask=None, past_key_value=None, use_cache=False, output_attentions=False)`
前向传播。
**参数**:
- `hidden_states` (torch.Tensor): 隐藏状态,形状为 `(batch_size, sequence_length, hidden_size)`
- `attention_mask` (torch.Tensor, optional): 注意力掩码
- `past_key_value` (tuple, optional): 过去的键值缓存
- `use_cache` (bool): 是否使用 KV 缓存
- `output_attentions` (bool): 是否输出注意力权重
**返回**:
- `tuple`: (output, past_key_value, attentions)
**示例**:
```python
from models.sbla_attention import SBLAttention
attention = SBLAttention(
hidden_size=128,
num_heads=2,
window_size=16,
)
hidden_states = torch.randn(1, 32, 128)
output, past_key_value, _ = attention(hidden_states)
print(output.shape) # torch.Size([1, 32, 128])
```
---
## Thinking Dial API
### ThinkingDialProcessor
`ThinkingDialProcessor` 是 Thinking Dial(动态推理强度控制)处理器。
#### 类定义
```python
class ThinkingDialProcessor:
"""
Thinking Dial 处理器
用于处理 think token,动态控制推理强度。
"""
```
#### 方法
##### `process(text)`
处理文本,注入 think token。
**参数**:
- `text` (str): 输入文本(可能包含 `<|think_depth_N|>`)
**返回**:
- `str`: 处理后的文本
**示例**:
```python
from models.thinking_dial import ThinkingDialProcessor
processor = ThinkingDialProcessor()
text = "<|think_depth_2|> 这是一个需要深入思考的问题。"
processed_text = processor.process(text)
print(processed_text) # 处理后的文本
```
##### `get_think_depth(text)`
获取 think token 的深度。
**参数**:
- `text` (str): 输入文本
**返回**:
- `int`: think 深度(0-3)
**示例**:
```python
depth = processor.get_think_depth(text)
print(depth) # 2
```
---
## 量化 API
### DyQuant
`DyQuant` 是动态混合精度量化器(4/8/16-bit)。
#### 类定义
```python
class DyQuant:
"""
动态混合精度量化器
支持 4-bit、8-bit、16-bit 量化。
"""
```
#### 方法
##### `quantize(model, bits=8)`
量化模型。
**参数**:
- `model` (nn.Module): 要量化的模型
- `bits` (int): 量化位数(4/8/16)
**返回**:
- `nn.Module`: 量化后的模型
**示例**:
```python
from inference.dyquant import DyQuant
quantizer = DyQuant()
quantized_model = quantizer.quantize(model, bits=8)
```
##### `save(model, path)`
保存量化模型。
**参数**:
- `model` (nn.Module): 量化模型
- `path` (str): 保存路径
**示例**:
```python
quantizer.save(quantized_model, "output/quantized_model")
```
##### `load(path)`
加载量化模型。
**参数**:
- `path` (str): 模型路径
**返回**:
- `nn.Module`: 加载的量化模型
**示例**:
```python
loaded_model = quantizer.load("output/quantized_model")
```
---
## 训练 API
### FullFinetuner
`FullFinetuner` 是全量微调器。
#### 类定义
```python
class FullFinetuner:
"""
全量微调器
用于全量微调 Fusion-LLM 模型。
"""
```
#### 方法
##### `train(model, train_dataset, eval_dataset=None, num_epochs=3, batch_size=4)`
训练模型。
**参数**:
- `model` (nn.Module): 要训练的模型
- `train_dataset` (Dataset): 训练数据集
- `eval_dataset` (Dataset, optional): 评估数据集
- `num_epochs` (int): 训练轮数
- `batch_size` (int): 批次大小
**示例**:
```python
from train.full_finetune import FullFinetuner
finetuner = FullFinetuner()
finetuner.train(
model=model,
train_dataset=train_dataset,
eval_dataset=eval_dataset,
num_epochs=3,
batch_size=4,
)
```
---
## 评估 API
### ModelEvaluator
`ModelEvaluator` 是模型评估器。
#### 类定义
```python
class ModelEvaluator:
"""
模型评估器
用于评估模型性能(Perplexity、Loss、Accuracy 等)。
"""
```
#### 方法
##### `evaluate(model, eval_data, metrics=["perplexity", "loss", "accuracy"])`
评估模型。
**参数**:
- `model` (nn.Module): 要评估的模型
- `eval_data` (Dataset): 评估数据集
- `metrics` (List[str]): 评估指标列表
**返回**:
- `EvaluationMetrics`: 评估结果
**示例**:
```python
from evaluation.metrics import ModelEvaluator
evaluator = ModelEvaluator()
metrics = evaluator.evaluate(
model=model,
eval_data=eval_dataset,
metrics=["perplexity", "loss", "accuracy"],
)
print(f"Perplexity: {metrics.perplexity:.2f}")
print(f"Loss: {metrics.loss:.4f}")
print(f"Accuracy: {metrics.accuracy:.4f}")
```
---
## 部署 API
### OllamaDeployer
`OllamaDeployer` 是 Ollama 部署器。
#### 类定义
```python
class OllamaDeployer:
"""
Ollama 部署器
用于将 Fusion-LLM 模型部署到 Ollama。
"""
```
#### 方法
##### `deploy(model_path, output_path)`
部署模型到 Ollama。
**参数**:
- `model_path` (str): 模型路径
- `output_path` (str): 输出路径
**示例**:
```python
from inference.ollama_deploy_v2 import OllamaDeployer
deployer = OllamaDeployer()
deployer.deploy(
model_path="output/real_model",
output_path="output/ollama_model",
)
```
---
## 数据集 API
### TextDataset
`TextDataset` 是文本数据集。
#### 类定义
```python
class TextDataset(Dataset):
"""
文本数据集
用于加载文本数据并进行编码。
"""
```
#### 方法
##### `__init__(tokenizer, file_path, block_size=128)`
初始化数据集。
**参数**:
- `tokenizer`: Tokenizer
- `file_path` (str): 文件路径
- `block_size` (int): 块大小
**示例**:
```python
from torch.utils.data import Dataset
class TextDataset(Dataset):
def __init__(self, tokenizer, file_path, block_size=128):
# ...
pass
```
---
## 完整示例
### 训练完整流程
```python
import torch
from models.fusion_mini import FusionMini, FusionMiniConfig
from train.full_finetune import FullFinetuner
from evaluation.metrics import ModelEvaluator
# 1. 创建模型
config = FusionMiniConfig(
vocab_size=1000,
hidden_size=128,
num_hidden_layers=2,
)
model = FusionMini(config)
# 2. 创建训练器
finetuner = FullFinetuner()
# 3. 训练
finetuner.train(
model=model,
train_dataset=train_dataset,
eval_dataset=eval_dataset,
num_epochs=3,
batch_size=4,
)
# 4. 评估
evaluator = ModelEvaluator()
metrics = evaluator.evaluate(
model=model,
eval_data=eval_dataset,
)
print(f"Perplexity: {metrics.perplexity:.2f}")
print(f"Loss: {metrics.loss:.4f}")
```
### 推理完整流程
```python
import torch
from models.fusion_mini import FusionMini
# 1. 加载模型
model = FusionMini.from_pretrained("output/real_model")
model.eval()
# 2. 创建输入
input_ids = torch.tensor([[1, 2, 3, 4, 5]])
# 3. 推理
with torch.no_grad():
outputs = model(
input_ids=input_ids,
return_dict=True,
)
logits = outputs["logits"]
print(f"Logits shape: {logits.shape}")
# 4. 生成
generated = model.generate(
input_ids=input_ids,
max_length=50,
)
print(f"Generated: {generated}")
```
---
## 常见问题
### 1. 如何自定义模型配置?
使用 `FusionMiniConfig`:
```python
config = FusionMiniConfig(
vocab_size=2000, # 更大的词汇表
hidden_size=256, # 更大的隐藏层
num_hidden_layers=4, # 更深的模型
num_attention_heads=4, # 更多的注意力头
)
```
### 2. 如何使用 GQA?
在配置中设置 `num_key_value_heads`:
```python
config = FusionMiniConfig(
num_attention_heads=8, # 8 个查询头
num_key_value_heads=2, # 2 个 KV 头(GQA)
)
```
### 3. 如何启用 KV 缓存?
在推理时使用 `use_cache=True`:
```python
outputs = model(
input_ids=input_ids,
use_cache=True,
return_dict=True,
)
past_key_values = outputs["past_key_values"]
```
### 4. 如何量化模型?
使用 `DyQuant`:
```python
from inference.dyquant import DyQuant
quantizer = DyQuant()
quantized_model = quantizer.quantize(model, bits=8)
```
---
## 许可证
Fusion-LLM API 文档采用 Apache 2.0 许可证。