Spaces:
Running
Running
| # Fusion-LLM 使用教程 | |
| ## 简介 | |
| Fusion-LLM 是一个开源大语言模型项目,采用 Apache 2.0 许可证,核心理念为用户主权、纯本地训练推理。 | |
| ### 核心特性 | |
| - **SBLA 注意力**:滑动分块潜注意力(Sliding Block Latent Attention) | |
| - **Thinking Dial**:动态推理强度控制 | |
| - **纯本地**:无需云端,完全本地训练和推理 | |
| - **用户主权**:数据完全由用户控制 | |
| --- | |
| ## 安装 | |
| ### 环境要求 | |
| - Python 3.8+ | |
| - PyTorch 2.0+ | |
| - CUDA 11.7+ (可选,用于 GPU 加速) | |
| ### 安装步骤 | |
| #### 1. 克隆仓库 | |
| ```bash | |
| git clone https://github.com/zhan1206/fusion-llm.git | |
| cd fusion-llm | |
| ``` | |
| #### 2. 安装依赖 | |
| ```bash | |
| pip install -r requirements.txt | |
| ``` | |
| #### 3. 验证安装 | |
| ```bash | |
| python tests/test_tiny.py | |
| ``` | |
| 如果看到 `[PASS] 测试通过`,说明安装成功! | |
| --- | |
| ## 快速开始 | |
| ### 1. 最小训练测试(验证安装) | |
| 运行最小训练测试(1-2 步,快速验证训练功能): | |
| ```bash | |
| python train/test_train_mini.py | |
| ``` | |
| 预期输出: | |
| ``` | |
| [TRAIN] 开始最小训练(1-2 步)... | |
| [5] 训练 2 步... | |
| Step 1: Loss = 4.5879 | |
| Step 2: Loss = 4.5768 | |
| 训练完成 | |
| [6] 验证损失下降... | |
| [PASS] Loss 下降: 4.5879 -> 4.5768 | |
| 训练有效! | |
| [PASS] 训练测试通过 | |
| ``` | |
| ### 2. 小训练测试(10 步) | |
| 运行小训练测试(10 步,验证损失持续下降): | |
| ```bash | |
| python train/train_10steps.py | |
| ``` | |
| 预期输出: | |
| ``` | |
| [TRAIN] 开始小训练(10 步)... | |
| [5] 训练 10 步... | |
| Step 1: Loss = 6.9452 | |
| Step 2: Loss = 6.8520 | |
| ... | |
| Step 10: Loss = 6.3993 | |
| 训练完成 | |
| [6] 验证损失下降... | |
| [PASS] Loss 持续下降 | |
| 训练有效! | |
| [PASS] 训练测试通过 | |
| ``` | |
| ### 3. 实际模型训练(100 步) | |
| 运行实际模型训练(100 步,生成模型权重): | |
| ```bash | |
| python train/train_real.py | |
| ``` | |
| 预期输出: | |
| ``` | |
| [TRAIN] 开始实际模型训练(100 步)... | |
| [6] 训练 100 步... | |
| Step 10: Loss = 3.5885 (Avg: 4.0321) | |
| ... | |
| Step 100: Loss = 1.7501 (Avg: 1.9562) | |
| 训练完成 | |
| [7] 验证损失下降... | |
| [PASS] Loss 持续下降 | |
| 训练有效! | |
| [8] 保存模型... | |
| 模型保存路径: output/real_model | |
| 模型保存成功 | |
| [PASS] 训练测试通过 | |
| ``` | |
| 训练完成后,模型权重将保存到 `output/real_model/` 目录。 | |
| --- | |
| ## 模型推理 | |
| ### 1. 基本推理测试 | |
| 运行基本推理测试: | |
| ```bash | |
| python tests/test_inference_basic.py | |
| ``` | |
| ### 2. 使用训练好的模型进行推理 | |
| ```python | |
| import torch | |
| from models.fusion_mini import FusionMini, FusionMiniConfig | |
| # 加载模型 | |
| model = FusionMini.from_pretrained("output/real_model") | |
| model.eval() | |
| # 创建输入 | |
| input_ids = torch.tensor([[1, 2, 3, 4, 5]]) | |
| # 推理 | |
| with torch.no_grad(): | |
| outputs = model( | |
| input_ids=input_ids, | |
| return_dict=True, | |
| ) | |
| logits = outputs["logits"] | |
| print(f"Logits shape: {logits.shape}") | |
| ``` | |
| --- | |
| ## 高级功能 | |
| ### 1. Thinking Dial(动态推理强度控制) | |
| Thinking Dial 允许动态控制模型的推理强度。 | |
| ```python | |
| from models.thinking_dial import ThinkingDialProcessor | |
| # 创建处理器 | |
| processor = ThinkingDialProcessor() | |
| # 注入 think token | |
| text = "<|think_depth_2|> 这是一个需要深入思考的问题。" | |
| processed_text = processor.process(text) | |
| print(processed_text) | |
| ``` | |
| ### 2. SBLA 注意力 | |
| SBLA(Sliding Block Latent Attention)是 Fusion-LLM 的核心注意力机制。 | |
| ```python | |
| from models.sbla_attention import SBLAttention | |
| # 创建 SBLA 注意力层 | |
| attention = SBLAttention( | |
| hidden_size=128, | |
| num_heads=2, | |
| window_size=16, | |
| ) | |
| # 前向传播 | |
| hidden_states = torch.randn(1, 32, 128) | |
| output = attention(hidden_states) | |
| print(f"Output shape: {output.shape}") | |
| ``` | |
| ### 3. 动态量化(DyQuant) | |
| DyQuant(Dynamic Quantization)提供动态混合精度量化(4/8/16-bit)。 | |
| ```python | |
| from inference.dyquant import DyQuant | |
| # 创建量化器 | |
| quantizer = DyQuant() | |
| # 量化模型 | |
| quantized_model = quantizer.quantize(model, bits=8) | |
| # 保存量化模型 | |
| quantizer.save(quantized_model, "output/quantized_model") | |
| ``` | |
| --- | |
| ## 训练配置 | |
| ### 1. 使用配置文件 | |
| 创建配置文件 `configs/my_config.json`: | |
| ```json | |
| { | |
| "vocab_size": 1000, | |
| "hidden_size": 128, | |
| "num_hidden_layers": 2, | |
| "num_attention_heads": 2, | |
| "intermediate_size": 256, | |
| "max_position_embeddings": 64 | |
| } | |
| ``` | |
| 使用配置文件训练: | |
| ```bash | |
| python train/full_finetune.py --config configs/my_config.json | |
| ``` | |
| ### 2. LoRA 微调 | |
| 使用 LoRA 进行参数高效微调: | |
| ```bash | |
| python train/lora_finetune.py \ | |
| --model_name_or_path output/real_model \ | |
| --lora_r 8 \ | |
| --lora_alpha 16 \ | |
| --train_epochs 3 | |
| ``` | |
| --- | |
| ## 评估与指标 | |
| ### 1. 使用评估指标 | |
| ```python | |
| from evaluation.metrics import EvaluationMetrics, 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}") | |
| ``` | |
| ### 2. 生成模型卡片 | |
| ```bash | |
| python evaluation/model_card.py \ | |
| --model_path output/real_model \ | |
| --output_path output/model_card.json | |
| ``` | |
| --- | |
| ## 部署 | |
| ### 1. Ollama 部署 | |
| 使用 Ollama 部署模型: | |
| ```bash | |
| python inference/ollama_deploy_v2.py \ | |
| --model_path output/real_model \ | |
| --output_path output/ollama_model | |
| ``` | |
| ### 2. 量化部署 | |
| 使用动态量化减小模型大小: | |
| ```bash | |
| python inference/dyquant.py \ | |
| --model_path output/real_model \ | |
| --bits 8 \ | |
| --output_path output/quantized_model | |
| ``` | |
| --- | |
| ## 常见问题 | |
| ### 1. 训练时 Loss 不下降? | |
| **可能原因**: | |
| - 学习率太大或太小 | |
| - 数据量太少 | |
| - 模型太小 | |
| **解决方案**: | |
| - 调整学习率(尝试 1e-4 到 5e-4) | |
| - 增加训练数据量 | |
| - 增大模型配置(hidden_size、num_layers) | |
| ### 2. 推理时出现 NaN? | |
| **可能原因**: | |
| - 注意力掩码错误 | |
| - 梯度爆炸 | |
| **解决方案**: | |
| - 检查注意力掩码格式 | |
| - 使用梯度裁剪(`torch.nn.utils.clip_grad_norm_`) | |
| ### 3. 训练速度太慢? | |
| **可能原因**: | |
| - SBLA 注意力计算量大 | |
| - 没有使用 GPU | |
| **解决方案**: | |
| - 使用更小的配置(hidden_size=32, num_layers=1) | |
| - 使用 GPU 训练 | |
| - 启用混合精度训练(FP16/BF16) | |
| --- | |
| ## 贡献 | |
| 欢迎贡献!请查看 `CONTRIBUTING.md` 了解详情。 | |
| --- | |
| ## 许可证 | |
| Fusion-LLM 采用 Apache 2.0 许可证。查看 `LICENSE` 文件了解详情。 | |