耶耶耶耶耶 发表于 2025-3-10 05:58:29

解锁 DeepSeek R1 微调练习新姿势,LLaMA - Factory、LoRA 与 FastAPI 带你

https://i-blog.csdnimg.cn/direct/b3e3cb12052d47f2ac48c3d240572a2f.png


PyTorch2.1.2Python3.10(ubuntu22.04)Cuda11.8GPURTX 4090(24GB) * 1CPU16 vCPU Intel® Xeon® Gold 6430内存120GB体系盘30 GB数据盘免费:50GB计费方式按量计费 一、模子微淘

1. 搭建练习环境



[*]在云平台上租用一个实例(如 AutoDL,官网:https://www.autodl.com/market/list)
https://i-blog.csdnimg.cn/direct/cfdff9dbea924d649c7399a7b45fbdd3.png
https://i-blog.csdnimg.cn/direct/ddd460079bbd49f3bd82eea948ea77b0.png


[*]云平台一样平常会设置好常用的深度学习环境,如 anaconda, cuda等等
2. SSH 连接

ssh -p 36131 root@connect.bjb1.seetacloud.com
S1U6UAFHzaLX
https://i-blog.csdnimg.cn/direct/7ac1dcc3ef034804b848f776355b0967.png
https://i-blog.csdnimg.cn/direct/4557e98829214e14814fda8623fe44b1.png


[*]利用 MobaXterm SSH 连接到你租用的服务器,参考文档:
[*]连接后打开个人数据盘文件夹 /root/autodl-tmp
cd /root/autodl-tmp
3. LLaMA-Factory 安装摆设

LLaMA-Factory 的 Github地址:https://github.com/hiyouga/LLaMA-Factory


[*]克隆堆栈
git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
https://i-blog.csdnimg.cn/direct/3fe55f85b7724fc2be396c130f3e9ece.png
假如下载慢,开启学术加速
source /etc/network_turbo


[*]切换到项目目录
cd LLaMA-Factory


[*]修改设置,将 conda 虚拟环境安装到数据盘(这一步也可不做)
mkdir -p /root/autodl-tmp/conda/pkgs
conda config --add pkgs_dirs /root/autodl-tmp/conda/pkgs
mkdir -p /root/autodl-tmp/conda/envs
conda config --add envs_dirs /root/autodl-tmp/conda/envs


[*]创建 conda 虚拟环境(肯定要 3.10 的 python 版本,否则和 LLaMA-Factory 不兼容)
conda create -n llama-factory python=3.10
选择 y,,等待安装依赖完成


[*]初始化conda
conda init
新打开一个新窗口


[*]激活虚拟环境
conda activate llama-factory


[*]在虚拟环境中安装 LLaMA Factory 相关依靠
cd /root/autodl-tmp
/LLaMA-Factory/pip install -e "."   留意:如报错 bash: pip: command not found ,先实验 conda install pip 即可
https://i-blog.csdnimg.cn/direct/3c58010c8c68486f943430f181d030ac.png


[*]查验是否安装成功
llamafactory-cli version
https://i-blog.csdnimg.cn/direct/3778ba35b9a84f4a98738c7483ebc999.png
4. 启动可视化微调界面

启动 LLama-Factory 的可视化微调界面 (由 Gradio 驱动)
llamafactory-cli webui
5. 设置端口转发

https://i-blog.csdnimg.cn/direct/0792426b452b4c37b61ef7d792197d9d.png
https://i-blog.csdnimg.cn/direct/7512676861b04349a9fe0d9c3998e3f0.png
访问:http://localhost:7860/
https://i-blog.csdnimg.cn/direct/f693221cd9fe468c9f0883d90eae3d6c.png
6. 下载基座模子

从 HuggingFace 上下载基座模子
HuggingFace 是一个会合管理和共享预练习模子的平台 https://huggingface.co;
从 HuggingFace 上下载模子有多种不同的方式,可以参考:如何快速下载huggingface模子——全方法总结


[*]创建文件夹统一存放所有基座模子
cd autodl-tmp/
mkdir Hugging-Face


[*]修改 HuggingFace 的镜像源
export HF_ENDPOINT=https://hf-mirror.com


[*]修改模子下载的默认位置
export HF_HOME=/root/autodl-tmp/Hugging-Face


[*]留意:这种设置方式只在当前 shell 会话中有效,假如你希望这个环境变量在每次启动终端时都生效,可以将其添加到你的用户设置文件中(修改 ~/.bashrc 或 ~/.zshrc)
[*]查抄环境变量是否生效
echo $HF_ENDPOINT
echo $HF_HOME


[*]安装 HuggingFace 官方下载工具
pip install -U huggingface_hub
https://i-blog.csdnimg.cn/direct/9a6e04b4b75b40d0bfbd391e300ec60b.png


[*]实验下载命令
huggingface-cli download --resume-download deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B
https://i-blog.csdnimg.cn/direct/afcd2b9c03c54e3dbdd69a5993e06722.png
https://i-blog.csdnimg.cn/direct/8a4a06fe1d604ed09c34da7aac51e1ee.png
https://i-blog.csdnimg.cn/direct/3c78ae983d6e4a63afefc41fa32896ea.png


[*]假如直接本机下载了模子压缩包,如何放到你的服务器上?——在 AutoDL 上打开 JupyterLab 直接上传,或者下载软件通过 SFTP 协议传送
7. 加载模子测试

可视化页面上加载模子测试,查验是否加载成功


[*]留意:这里的路径是模子文件夹内部的模子特定快照的唯一哈希值,而不是整个模子文件夹
/root/autodl-tmp/Hugging-Face/hub/models--deepseek-ai--DeepSeek-R1-Distill-Qwen-1.5B/snapshots/ad9f0ae0864d7fbcd1cd905e3c6c5b069cc8b562
8. 练习的数据集预备

预备用于练习的数据集,添加到指定位置


[*]README_zh 中详细先容了如何设置和描述你的自定义数据集
[*]按照格式预备用于微调的数据集 magic_conch.json,数据示例:
[
{
    "instruction": "请问你是谁",
    "input": "",
    "output": "您好,我是蟹堡王的神奇海螺,很高兴为您服务!我可以回答关于蟹堡王和汉堡制作的任何问题,您有什么需要帮助的吗?"
},
{
    "instruction": "怎么修复这个报错",
    "input": "我正在使用蟹堡王全自动智能汉堡制作机,报错信息是:汉堡食谱为空",
    "output": "根据您提供的错误信息,'汉堡食谱为空' 可能是因为系统没有加载正确的食谱文件或食谱文件被删除。您可以尝试以下步骤:\n1. 检查食谱文件是否存在,并确保文件路径正确。\n2. 重新加载或更新食谱文件。\n3. 如果问题依然存在,尝试重启机器并检查是否有软件更新。\n希望这些步骤能帮助您修复问题。如果仍有困难,请与蟹堡王技术支持联系。"
}
]


[*]修改 dataset_info.json 文件,添加如下设置:
"magic_conch": {
"file_name": "magic_conch.json"
},


[*]将数据集 magic_conch.json 放到 LLama-Factory 的 data 目录 下
https://i-blog.csdnimg.cn/direct/2a5e270939984655b312a71c43d4c731.png
加载模子
https://i-blog.csdnimg.cn/direct/4572074938ca4c62888284dd32e14f9c.png
你是谁?

https://i-blog.csdnimg.cn/direct/68b18aa2c5c442b0a04d3587f4a6ef91.png
9. 开始微调

在页面上进行微调的相关设置,开始微调
https://i-blog.csdnimg.cn/direct/663509161a224d7fa5ed43445090d28b.png
填写完练习参数后,点击【开始】进行模子练习


[*] 选择微调算法 Lora
[*] 添加数据集 magic_conch
[*] 修改其他练习相关参数,如学习率、练习轮数、截断长度、验证集比例等

[*]学习率(Learning Rate):决定了模子每次更新时权重改变的幅度。过大可能会错过最优解;过小会学得很慢或陷入局部最优解
[*]练习轮数(Epochs):太少模子会欠拟合(没学好),太大会过拟合(学过头了)
[*]最大梯度范数(Max Gradient Norm):当梯度的值超过这个范围时会被截断,防止梯度爆炸征象
[*]最大样本数(Max Samples):每轮练习中最多利用的样本数
[*]计算类型(Computation Type):在练习时利用的数据类型,常见的有 float32 和 float16。在性能和精度之间找均衡
[*]截断长度(Truncation Length):处置惩罚长文本时假如太长超过这个阈值的部门会被截断掉,避免内存溢出
[*]批处置惩罚大小(Batch Size):由于内存限制,每轮练习我们要将练习集数据分批次送进去,这个批次大小就是 Batch Size
[*]梯度累积(Gradient Accumulation):默认情况下模子会在每个 batch 处置惩罚完后进行一次更新一个参数,但你可以通过设置这个梯度累计,让他直到处置惩罚完多个小批次的数据后才进行一次更新
[*]验证集比例(Validation Set Proportion):数据集分为练习集和验证集两个部门,练习集用来学习练习,验证集用来验证学习效果如何
[*]学习率调治器(Learning Rate Scheduler):在练习的过程中帮你自动调解优化学习率

[*] 页面上点击启动练习,或复制命令到终端启动练习

[*] 实践中推荐用 nohup 命令将练习使命放到背景实验,如许纵然关闭终端使命也会继承运行。同时将日志重定向到文件中保存下来
第一种方式:
https://i-blog.csdnimg.cn/direct/969a966c5e4746cea1d60c4845c405a3.png
https://i-blog.csdnimg.cn/direct/b3e3cb12052d47f2ac48c3d240572a2f.png
第二种方式:
nohup llamafactory-cli train \    --stage sft \    --do_train True \    --model_name_or_path /root/autodl-tmp/Hugging-Face/hub/models--deepseek-ai--DeepSeek-R1-Distill-Qwen-1.5B/snapshots/ad9f0ae0864d7fbcd1cd905e3c6c5b069cc8b562
\    --preprocessing_num_workers 16 \    --finetuning_type lora \    --template deepseek3 \    --flash_attn auto \    --dataset_dir data \    --dataset magic_conch \    --cutoff_len 2048 \    --learning_rate 0.002 \    --num_train_epochs 30.0 \    --max_samples 1000 \    --per_device_train_batch_size 2 \    --gradient_accumulation_steps 8 \    --lr_scheduler_type cosine \    --max_grad_norm 1.0 \    --logging_steps 5 \    --save_steps 100 \    --warmup_steps 0 \    --packing False \    --report_to none \    --output_dir saves/DeepSeek-R1-1.5B-Distill/lora/train_2025-03-01-15-21-34 \    --bf16 True \    --plot_loss True \    --trust_remote_code True \    --ddp_timeout 180000000 \    --include_num_input_tokens_seen True \    --optim adamw_torch \    --lora_rank 8 \    --lora_alpha 16 \    --lora_dropout 0 \    --lora_target all \    --val_size 0.2 \    --eval_strategy steps \    --eval_steps 100 \    --per_device_eval_batch_size 2
[*] 在练习过程中留意观察丧失曲线,尽可能将丧失降到最低

[*]如丧失降低太慢,尝试增大学习率
[*]如练习结束丧失还呈下降趋势,增大练习轮数确保拟合

10. 评估微调效果

微调结束,评估微调效果


[*] 观察丧失曲线的变革;观察最终丧失
[*] 在交互页面上通过预测/对话等方式测试微调好的效果
[*] 查抄点:保存的是模子在练习过程中的一个中间状态,包罗了模子权重、练习过程中利用的设置(如学习率、批次大小)等信息,对LoRA来说,查抄点包罗了练习得到的 B 和 A 这两个低秩矩阵的权重
[*] 若微调效果不理想,你可以:

[*] 利用更强的预练习模子
[*] 增加数据量
[*] 优化数据质量(数据洗濯、数据增强等,可学习相关论文如何实现)
[*] 调解练习参数,如学习率、练习轮数、优化器、批次大小等等

[*]练习完成
https://i-blog.csdnimg.cn/direct/54621725c00a46848a81fd68e6969887.png
选择点路径-点击卸载模子
https://i-blog.csdnimg.cn/direct/3ab6000ff8064ef4852d41c8a28b018a.png
点击加载模子
https://i-blog.csdnimg.cn/direct/69f6beca33864a8d8b5db889ef3921f2.png
输入问题,测试微调后,答案是否不一样。
你是谁?

https://i-blog.csdnimg.cn/direct/01e2ede4ba89416eabb2a2868ec636ca.png


11. 导出合并后的模子



[*]为什么要合并:由于 LoRA 只是通过低秩矩阵调解原始模子的部门权重,而不直接修改原模子的权重。合并步调将 LoRA 权重与原始模子权重融合生成一个完备的模子
[*]先创建目录,用于存放导出后的模子
cd /root/autodl-tmp
/ mkdir -p Models/deepseek-r1-1.5b-merged https://i-blog.csdnimg.cn/direct/9da6357493a447ec98aa9e6ab1e24812.png


[*] 在页面上设置导出路径,导出即可
/root/autodl-tmp/Models/deepseek-r1-1.5b-merged
https://i-blog.csdnimg.cn/direct/e34d6c52332047ba93324adae922580d.png
https://i-blog.csdnimg.cn/direct/ffe21f3b50cb4b5db3496bae7473fd4b.png
https://i-blog.csdnimg.cn/direct/04a1fbe8e1cc4a76952f50f82cb11082.png
二 、模子摆设和暴露接口

2.1. 创建conda环境

创建新的 conda 虚拟环境用于摆设模子


[*]创建环境
conda create -n fastApi python=3.10


[*]激活环境
conda activate fastApi


[*]在该环境中下载摆设模子需要的依靠
conda install -c conda-forge fastapi uvicorn transformers pytorch

上面命令如果不好是的话:执行下面命令,如果上面命令好使,下面3条命令跳过
conda install -c conda-forge fastapi uvicorn
pip install transformers
pip installtorch
继承实验命令:
pip install safetensors sentencepiece protobuf
2.2. FastAPI 摆设模子

通过 FastAPI 摆设模子并暴露 HTTP 接口


[*]创建 App 文件夹
cd /root/autodl-tmp
/ mkdir App

[*]创建 main.py 文件,作为启动应用的入口
cd App
touch main.py


[*]修改 main.py 文件并保存
from fastapi import FastAPIfrom transformers import AutoModelForCausalLM, AutoTokenizerimport torchapp = FastAPI()# 模子路径model_path = "/root/autodl-tmp/Models/deepseek-r1-1.5b-merged
"# 加载 tokenizer (分词器)tokenizer = AutoTokenizer.from_pretrained(model_path)# 加载模子并移动到可用设备(GPU/CPU)device = "cuda" if torch.cuda.is_available() else "cpu"model = AutoModelForCausalLM.from_pretrained(model_path).to(device)@app.get("/generate")async def generate_text(prompt: str):    # 利用 tokenizer 编码输入的 prompt    inputs = tokenizer(prompt, return_tensors="pt").to(device)      # 利用模子生成文本    outputs = model.generate(inputs["input_ids"], max_length=150)      # 解码生成的输出    generated_text = tokenizer.decode(outputs, skip_special_tokens=True)      return {"generated_text": generated_text}

[*]进入包罗 main.py 文件的目录,然后运行以下命令来启动 FastAPI 应用
uvicorn main:app --reload --host 0.0.0.0
- `main` 是 Python 文件名(要注意不包含 `.py` 扩展名)
- `app` 是 FastAPI 实例的变量名(代码中 `app = FastAPI()`)
- `--reload` 使代码更改后可以自动重载,适用于开发环境
- `host 0.0.0.0`:将 FastAPI 应用绑定到所有可用的网络接口,这样我们的本机就可以通过内网穿透访问该服务


[*]设置端口转发,使得本机可以访问该服务
[*]浏览器输入以下 url,测试服务是否启动成功
https://i-blog.csdnimg.cn/direct/cc6fc944b55a4f398583399897089913.png
http://localhost:8000/docs
https://i-blog.csdnimg.cn/direct/d62d299f922944e0816892c11aec282c.png


[*]或者你也可以通过 postMan 来测试GET请求
http://localhost:8000/generate?prompt=你是谁?


https://i-blog.csdnimg.cn/direct/2ce91cabe5e449649838c11e5ebe3398.png
三、web后端调用API

3.1. pom.xml 导入依靠

<dependency>
    <groupId>org.apache.httpcomponents.client5</groupId>
    <artifactId>httpclient5</artifactId>
    <version>5.2.1</version>
</dependency>
3.2. 实现对话功能

自定义方法发送并处置惩罚 HTTP 请求,实现对话功能
@Service
public class ChatServiceImpl implements ChatService {
      
    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private AiServiceConfig aiServiceConfig;

    @Override
    public String callAiForOneReply(String prompt) {
      // 获取基础URL http://localhost:8000
      String baseUrl = aiServiceConfig.getBaseUrl();
      // 构建完整的请求URL http://localhost:8000/generate?prompt=XXX
      String url = String.format("%s/generate?prompt=%s", baseUrl, prompt);
      // 发送GET请求并获取响应
      GenerateResponse response = restTemplate.getForObject(url, GenerateResponse.class);
      // 从响应中取出 generated_text 字段值返回
      return response != null ? response.getGenerated_text() : "";
    }
}
3.3. 测试对话效果

本机启动 Demo 前后端工程,测试对话效果
软件版本nodejsv18.15.0jdk17 3.4 启动前端工程



[*]前端项目地址:
https://github.com/huangyf2013320506/magic_conch_frontend.git


[*]实验:
npm install
npm run dev
3.5. 启动后端工程



[*]后端项目地址:
https://github.com/huangyf2013320506/magic_conch_backend.git


[*]实验:
mvn clean install


[*] 在 MagicConchBackendApplication.java 类中启动
https://i-blog.csdnimg.cn/direct/4f5bbf17e5d5489b83ad90ec655e9df5.png
3.6. 效果体验

https://i-blog.csdnimg.cn/direct/3e26ccfe003f45999f8005e90b7480ba.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 解锁 DeepSeek R1 微调练习新姿势,LLaMA - Factory、LoRA 与 FastAPI 带你