大模型微调方法实现

本博文以Qwen模型为例,分别使用魔搭社区和LlamaFactory 两种方式实现微调。

⭐️ 魔搭社区

登录个人主页👉我的Notebook👉使用实例GPU环境

1. 根据如下方法准备环境:

## 准备环境

```
# 下载qwen和模型
git clone https://github.com/QwenLM/Qwen.git
git clone https://www.modelscope.cn/qwen/Qwen-1_8B-Chat.git

# 安装依赖
pip install -r requirements.txt

# 安装torch
下载地址:http://download.pytorch.org/whl/torch_stable.html
wget http://download.pytorch.org/whl/cu121/torch-2.1.1%2Bcu121-cp310-cp310-linux_x86_64.whl        # 云服务上输入该行代码,下载,完成后运行下一行代码
pip install torch-2.1.1+cu121-cp310-cp310-linux_x86_64.whl

# 安装deepspeed
pip install "peft<0.8.0" deepspeed

```

 2. 上传数据集,配置微调参数:

## 微调

# 准备训练数据:trans_data.json

```
cd Qwen

# 移动finetune_lora_single_gpu.sh到Qwen目录下,授予权限
cp finetune/finetune_lora_single_gpu.sh ./
chmod +x finetune_lora_single_gpu.sh              

# 修改微调配置
vim finetune_lora_single_gpu.sh           


# 微调,根据需要修改文件路径
./finetune_lora_single_gpu.sh -m /mnt/workspace/Qwen/Qwen-1_8B-Chat -d /mnt/workspace/data/trans_data.json

# 合并模型,模型合并文件qwen_lora_merge.py上传到Qwen文件夹里,然后修改微调模型路径
lora_model_path="/mnt/workspace/Qwen/output_qwen/checkpoint-30"

# 合并模型
python qwen_lora_merge.py 

```

在finetune_lora_single_gpu.sh文件中修改微调配置:例如训练轮次num_train_epochs,

批大小per_device_train_batch_size,保存间隔save_steps等。如下是各个参数释义:

-model_name_or_path $MODEL:指定要进行微调的预训练模型的名称或路径。
--data_path $DATA:指定用于微调的数据集的路径。
--bf16 False:表示不使用 bfloat16 数据类型。
--output_dir output_qwen:指定微调后模型的输出目录。
--num_train_epochs 5:设置训练的轮数为 5。
--per_device_train_batch_size 2:每个设备上的训练批次大小为 2。
--per_device_eval_batch_size 1:每个设备上的评估批次大小为 1。
--gradient_accumulation_steps 8:梯度累积的步数,有助于在内存有限的情况下使用较大的批次大小。
--evaluation_strategy "no":不进行评估策略。
--save_strategy "steps":按照步数进行模型保存策略。
--save_steps 20:每 20 步保存一次模型。
--save_total_limit 10:保存的模型总数限制为 10。
--learning_rate 3e-4:设置学习率为 3e-4。
--weight_decay 0.1:设置权重衰减为 0.1。
--adam_beta2 0.95:Adam 优化器的 beta2 参数设置为 0.95。
--warmup_ratio 0.01:学习率 warmup 的比例为 0.01。
--lr_scheduler_type "cosine":学习率调度器类型为余弦退火(cosine)。
--logging_steps 1:每一步都进行日志记录。
--report_to "none":不向任何地方报告。
--model_max_length 512:模型的最大长度为 512。
--lazy_preprocess True:使用懒加载预处理。
--gradient_checkpointing:启用梯度检查点,以减少内存使用。
--use_lora:使用低秩适应(LoRA)技术进行微调。

3. 测试

💥 交互式Demo

```
cd Qwen
python cli_demo.py -c Qwen-1_8B-Chat_merge

```

## 退出
:exit

💥Web Demo

```
pip install gradio
pip install mdtex2html
# 启动服务
python web_demo.py --cpu-only -c=Qwen-1_8B-Chat
# 查看web界面
http://127.0.0.1:8000/

```

4. 常见问题解决

1、ImportError: cannot import name 'packaging' from 'pkg_resources' 

```
解决方案:
pip uninstall setuptools
pip install setuptools==69.5.1 --no-cache-dir

```

2、ValueError: Your setup doesn't support bf16/gpu. You need torch>=1.10, using Ampere GPU with cuda>=11.0

```
解决方案:
需要修改finetune_lora_single_gpu.sh文件,最下面有说明
--bf16 True 修改为 --bf16 False 
或者
--bf16 True  修改为 --fp16 True

```

3、TypeError: isin() received an invalid combination of arguments - got 

```
解决方案:
pip install coqui-tts

```

若出现如下报错执行下方代码:

sed -i 's/\r$//' ./finetune_lora_single_gpu.sh

⭐️ LlamaFactory

使用阿里云PAI平台👉交互式建模(DSW)👉创建实例

1. 准备环境,下载模型:

## 下载模型 和 LlamaFactory
git clone https://www.modelscope.cn/qwen/Qwen-1_8B-Chat.git
git clone https://github.com/hiyouga/LLaMA-Factory.git

## 安装
wget http://download.pytorch.org/whl/cu121/torch-2.1.1%2Bcu121-cp310-cp310-linux_x86_64.whl
pip install torch-2.1.1+cu121-cp310-cp310-linux_x86_64.whl    

pip uninstall -y vllm
pip install llamafactory[metrics]==0.7.1
pip install accelerate==0.30.1

cd LLaMA-Factory

pip install -e.[torch,metrics]
pip install -r requirements.txt
pip install --no-deps -e .

2. 上传数据集,配置微调参数:

## 上传数据集  到LLaMA-Factory/data/目录,并修改同目录下的dataset_info.json,参照如下格式修改:

```
  "mydata": {
    "file_name": "trans_data.json",
    "formatting":"sharegpt",
    "columns": {
        "messages": "conversations",
        "tools":"id"
    },
    "tags": {
        "role_tag": "from",
        "content_tag": "value",
        "user_tag": "user",
        "assistant_tag": "assistant"
    }
  },

```

## 启动微调-web
pip install tf-keras

export GRADIO_SERVER_PORT=7860 GRADIO_ROOT_PATH=/${JUPYTER_NAME}/proxy/7860/
CUDA_VISIBLE_DEVICES=0 USE_MODELSCOPE_HUB=1 python src/webui.py

## 也可访问如下地址
# dsw-######       # 换成自己的
https://dsw-gateway-cn-shanghai.data.aliyun.com/dsw-######/proxy/7860/

访问网址即可展示如下微调界面:

修改相应参数,训练模型

3. 测试、导出模型

### 大模型微调方法及总结 大模型微调是一种通过特定数据集重新训练预训练模型的技术,旨在优化其性能以适应具体应用场景。以下是几种常见的大模型微调方法及其特点: #### 1. 指令微调 指令微调涉及使用示例来训练模型,使其能够更好地理解并遵循人类给出的任务指示[^2]。这种方法的关键在于构建高质量的指令-响应对数据集,这些数据应反映目标应用的具体需求。 #### 2. 参数高效微调 (PEFT, Parameter-Efficient Fine-Tuning) 参数高效微调技术专注于仅更新少量新增加或修改后的网络层中的参数,而不是调整整个模型的所有权重。此方式可以显著减少计算资源消耗以及存储开销,同时保持良好的泛化能力[^3]。 #### 3. LoRA (Low-Rank Adaptation of Large Language Models) LoRA 是一种具体的 PEFT 技术实现方案,在该框架下只允许低秩矩阵上的变化作为原始权重的一部分被学习到新任务上。它不仅降低了内存占用量还加快了收敛速度[^1]。 #### 4. PPO (Proximal Policy Optimization) 和其他强化学习方法 对于某些复杂场景比如对话系统或者游戏AI开发来说,则可能需要用到基于奖励机制的学习算法如PPO来进行进一步优化。这类方法通常会结合人类反馈信号指导模型改进行为模式。 #### 总结与最佳实践建议 当决定采用哪种类型的fine-tune策略时需考虑多个因素,例如可用算力大小、时间成本预算还有最终期望达到的效果指标等等。一般来说如果只是想让现有通用型LLM具备更贴近某一垂直行业的专业知识那么简单的全量finetune可能是最直接有效的方式;而对于那些希望控制开支又不想牺牲太多质量的企业而言则推荐尝试利用诸如LORA这样的轻量化解决方案。 ```python # 示例代码片段:如何加载已有的HuggingFace Transformers库中的模型并对其进行LoRA适配 from transformers import AutoModelForCausalLM, AutoTokenizer import peft model_name = "bigscience/bloom" tokenizer = AutoTokenizer.from_pretrained(model_name) base_model = AutoModelForCausalLM.from_pretrained(model_name) lora_config = peft.LoraConfig( r=8, lora_alpha=32, target_modules=["q_proj", "v_proj"], lora_dropout=0.05, bias="none", ) peft_model = peft.get_peft_model(base_model, lora_config) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值