Skip to content

Commit

Permalink
Update READEME.md and dora
Browse files Browse the repository at this point in the history
  • Loading branch information
mst272 committed Apr 29, 2024
1 parent 13b2e04 commit 8fc5f8f
Show file tree
Hide file tree
Showing 9 changed files with 45 additions and 210 deletions.
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
notebooks/** linguist-vendored
201 changes: 0 additions & 201 deletions LICENSE

This file was deleted.

6 changes: 4 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,11 @@ Tips: 图片完全由AI生成

### 已支持模型
- [Qwen](https://github.com/QwenLM/Qwen.git)
- [x] [QWEN Lora微调]
- [x] [QWEN Lora、Dora微调]

### 已支持tricks及原理讲解
所有相关的trciks及讲解都在llm_tricks文件夹下
- Dora
- [Dora代码讲解(llm_tricks/dora/READEME.md)](./llm_tricks/dora/READEME.md)

## 🤓Quick Start
不同的微调方法有不同的配置,但大体都是类似的。常规的参数在utils下的args.py。
Expand Down Expand Up @@ -52,4 +52,6 @@ LLM Dojo 期待你的加入!🪂
***

**愉快学习!** 📘

项目学习了优秀开源项目,感谢huggingface等国内小伙伴的开源项目
***
20 changes: 18 additions & 2 deletions llm_tricks/dora/READEME.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
# DoRA: Weight-Decomposed Low-Rank Adaptation

此为Dora微调方法的实现(目前huggingface也已集成dora,故使用可以直接使用huggingface,本模块可以作为详细的理论学习)
此为Dora微调方法的实现(目前**huggingface也已集成dora**,故使用可以直接使用huggingface如下,本模块可以作为详细的**理论学习**)⚽

huggingface中使用如下,基于lora的基础上,增加use_dora参数即可。本项目的训练框架也支持dora训练。
```python
from peft import LoraConfig

# Initialize DoRA configuration
config = (
config = LoraConfig(
use_dora=True, ...
)
```
Expand All @@ -17,12 +18,27 @@ config = (
Implementation of "DoRA: Weight-Decomposed Low-Rank Adaptation" (Liu et al, 2024) https://arxiv.org/pdf/2402.09353.pdf


## 😸技术博客链接

- [知乎:Dora原理及代码讲解](https://zhuanlan.zhihu.com/p/695269522)

## Tips:
Dora是基于Lora的变体,故也对Lora进行了简单的示例。


DoRA可以分两步描述,其中第一步是将预训练的权重矩阵分解为幅度向量(m)和方向矩阵(V)。第二步是将LoRA应用于方向矩阵V并单独训练幅度向量m。

## 如何使用


dora_example.py 中有详细完整的 LoRA及DoRA训练与验证,建立了一个小的模型从训练到验证等全部过程。

lora_and_dora.ipynb 用于自己调试及学习,可以在其中逐步运行以理解其原理。

运行以下代码可得到实验结果
```shell
python dora_example.py
```

## 实验结果如下:
运行 dora_example.py。超参数设置参考文件内。小模型具有局限性,具体dora和lora的实际效果对比还需要更多的实验。
Expand Down
1 change: 1 addition & 0 deletions llm_tricks/dora/lora_and_dora.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
"import torch.nn as nn\n",
"import torch\n",
"\n",
"# 构建LoraLayer\n",
"class LoRALayer(nn.Module):\n",
" def __init__(self, in_dim, out_dim, rank, alpha):\n",
" super().__init__()\n",
Expand Down
4 changes: 3 additions & 1 deletion main_train.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,9 @@ def load_model(model_kwargs):
model = prepare_model_for_kbit_training(model, use_gradient_checkpointing=train_args.gradient_checkpointing)

elif args.train_mode == 'lora':
# 找到所有linear层
# 是否使用dora
model_kwargs.update(use_dora=args.use_dora)

model = load_model(model_kwargs)
if hasattr(model, 'enable_input_require_grads'):
# 不加可能报错
Expand Down
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
accelerate==0.21.0
transformers==4.34
transformers
peft==0.4.0
bitsandbytes==0.39.0
loguru==0.7.0
Expand Down
8 changes: 6 additions & 2 deletions train_args/sft/lora/qwen_lora.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ class TrainArgument(TrainingArguments):
warmup_steps: int = field(default=100, metadata={"help": "Linear warmup over warmup_steps."})
optim: Union[OptimizerNames, str] = field(default='paged_adamw_32bit', metadata={"help": "The optimizer to use."})
seed: int = field(default=42, metadata={"help": "Random seed that will be set at the beginning of training."})
fp16: bool = field(default=True, metadata={"help": "Whether to use fp16 (mixed) precision instead of 32-bit"})
report_to: Optional[List[str]] = field(default='tensorboard', metadata={
"help": "The list of integrations to report the results and logs to."})
save_strategy: Union[IntervalStrategy, str] = field(default="steps",
Expand All @@ -34,4 +33,9 @@ class TrainArgument(TrainingArguments):
max_grad_norm: float = field(default=1.0, metadata={"help": "Max gradient norm."})
remove_unused_columns: Optional[bool] = field(default=False, metadata={
"help": "Remove columns not required by the model when using an nlp.Dataset."})
bf16: bool = True
bf16: bool = field(default=True, metadata={
"help": ("Whether to use bf16 (mixed) precision instead of 32-bit. Requires Ampere or higher NVIDIA"
" architecture or using CPU (use_cpu) or Ascend NPU. This is an experimental API and it may change."
)
})
fp16: bool = field(default=False, metadata={"help": "Whether to use fp16 (mixed) precision instead of 32-bit"})
12 changes: 11 additions & 1 deletion utils/args.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,11 @@ class TemplateName(Enum):
YI = 'Yi'


class TrainMode(Enum):
QLORA = 'qlora'
LORA = 'lora'


@dataclass
class CommonArgs:
"""
Expand All @@ -18,7 +23,12 @@ class CommonArgs:
train_data_path: Optional[str] = field(metadata={"help": "训练集路径"})
model_name_or_path: str = field(metadata={"help": "下载的所需模型路径"})
template_name: TemplateName = field(default=TemplateName.QWEN, metadata={"help": "sft时的数据格式"})
train_mode: str = field(default="qlora", metadata={"help": "选择采用的训练方式:[qlora, lora]"})

# 微调方法相关选择与配置
train_mode: TrainMode = field(default=TrainMode.LORA, metadata={"help": "选择采用的训练方式:[qlora, lora]"})
use_dora: bool = field(default=False, metadata={"help": "仅在train_mode==lora时可以使用。是否使用Dora(一个基于lora的变体) "
"目前只支持linear and Conv2D layers."})

task_type: str = field(default="sft", metadata={"help": "预训练任务:[pretrain, sft, dpo]"})

# lora相关配置
Expand Down

0 comments on commit 8fc5f8f

Please sign in to comment.