大人,时代变了! 赶快用DeepSeek把自有业务的本地AI“模型”训练起来!

1 大人,时代变了! 赶快把自有业务的本地AI“模型”训练起来!

1.1 背景

  目前AI已经大行其道,chatGPTDeepSeek等如雨后春笋般涌现出来,笔者做为一个守旧派顽固派,一直认为AI只是雕虫小技,根本没有办法和人写的代码相提并论,在chatGPT已经大火几年之后仍然一直无动于衷,只是在最近才慢慢使用了豆包查点资料,然后再接触KimiDeepSeek等AI工具和模型。

  使用AI的对话问答模式,相对原来的搜索引擎,得到的结果更精练, 不会像百度、必应之类的搜索引擎,搜索到结果后还要逐页去人工筛选,AI的回答就是干干净净你要的东西,这比搜索引擎效率高太多了!
  提要求让AI生成些小的代码片段,如:“给我写一个vbs获取文件扩展名的函数”,生成的代码质量也非常不错,直接拿来就能用,连测试代码也一并写好

总结一句话大人,时代变了,现在投降是代价最小的时候!

问题来了:目前这些AI工具,都是基于通用模型, 如果用来做一些其他业务场景的事,效果就不会太好,此时就需要训练自己的本地模型了

注意:在训练自己的本地模型前,请首先有一个概念,如果没有充足的硬件资源,请不要尝试在本地部署DeepSeek-R1模型,该模型至少需要60G的显存,GPU也是NVidia H100规格的,且是多卡分布式

使用线上+线下协作的方式,可能是普通人训练自己业务场景的最优选择

1.2 准备工作

  1. 注册硅基流动账号硅基流动注册
    在这里插入图片描述

  2. 下载CherryStudio下载CherryStudio
    注:目前常用的AI客户端只有CherryStudio工具的知识库支持训练本地素材

1.3 训练本地知识库

  比如:作者偶尔会写点EverEdit的宏脚本(js语法),由于EverEdit有自己的API,所以AI必须先学习EverEdit的API。

1.3.1 在CherryStudio中配置密钥

  配置密钥是为了能够让CherryStudio使用AI供应商(这里是硅基流动)的模型

  1. 步骤1:在siliconflow网站登录后,拷贝自己的密钥,如下图所示:
    在这里插入图片描述

  2. 步骤2:在CherryStudio中配置密钥,如下图所示:
    在这里插入图片描述

1.3.2 在CherryStudio中训练本地知识库

  训练本地知识库的目的:将自有业务知识消化成知识库,结合在线AI(如:DeepSeek),以解答自有业务领域的问题,而避免投入大量硬件训练完整的专有本地模型。
  比如:我偶尔要写EverEdit宏脚本,因此我要训练关于EverEdit的API的本地知识库。

  1. CherryStudio中新建本地知识库,如下图所示:
    在这里插入图片描述

  2. 将自有业务相关的文档丢到知识库中进行消化(近似动作),如下图所示:
    在这里插入图片描述

  消化完成后,会出现绿色的“√”符号

1.3.3 在CherryStudio中使用本地知识库(自有业务)和DeepSeek在线模型生成自有业务相关代码或答案

  1. 打开知识库开关,并选择本地知识库,如下图所示:
    CherryStudio的导航栏选择“助手”按钮,切换到助手模式
    在这里插入图片描述

在界面的底部聊天窗口中选择本地知识库
在这里插入图片描述

  1. 提出问题并解答,如下图所示

    1. 用户提出问题让AI解答
      在这里插入图片描述

    2. 出现问题,让AI修正
      在这里插入图片描述

    3. 还有问题,继续让AI修正
      在这里插入图片描述

    注:后面还有很多让AI修正的步骤,这里不一一列举。
    4. 最终AI生成的代码

    // 获取当前文档对象
    var doc = App.ActiveDoc;
    
    // 获取文档内容
    var text = doc.Text;
    
    // 获取用户输入的分隔符,默认使用“,”
    var delimiter = App.ShowInputBox("请输入分隔符(默认按','分隔):", "分隔符输入");
    if (!delimiter) {
        delimiter = ",";
    }
    
    // 获取制表符宽度
    var tabWidth = doc.TabStop;
    
    // 按换行符拆分文档内容
    var lines = text.split("\n");
    var columns = [];
    for (var i = 0; i < lines.length; i++) {
        columns.push(lines[i].split(delimiter));
    }
    
    // 计算字符串的显示宽度(中文字符占2,中文符号“和”占1,英文字符占1,Tab键按制表符宽度计算)
    function getDisplayWidth(str) {
        var width = 0;
        for (var i = 0; i < str.length; i++) {
            var char = str.charAt(i); // 使用 str.charAt(i) 获取字符
            if (char === "\t") {
                // 计算 Tab 宽度,对齐到下一个制表符位置 [^1]
                width += tabWidth - (width % tabWidth);
            } else if (char === "“" || char === "”") {
                width += 1; // 中文符号“和”占1个宽度
            } else {
                var charCode = str.charCodeAt(i);
                if (charCode >= 0 && charCode <= 127) {
                    width += 1; // 英文字符或半角字符
                } else {
                    width += 2; // 中文字符或全角字符
                }
            }
        }
        return width;
    }
    
    // 计算每列的最大显示宽度
    var maxWidths = [];
    for (var i = 0; i < columns.length; i++) {
        for (var j = 0; j < columns[i].length; j++) {
            var width = getDisplayWidth(columns[i][j]);
            if (!maxWidths[j] || width > maxWidths[j]) {
                maxWidths[j] = width;
            }
        }
    }
    
    // 生成对齐后的文本(在分隔符后面多填充1个空格)
    var alignedText = "";
    for (var i = 0; i < columns.length; i++) {
        for (var j = 0; j < columns[i].length; j++) {
            var cell = columns[i][j];
            // 添加单元格内容
            alignedText += cell;
            // 在分隔符后面填充空格(多填充1个空格)
            if (j < columns[i].length - 1) {
                var cellWidth = getDisplayWidth(cell);
                var padding = "";
                for (var k = 0; k < maxWidths[j] - cellWidth; k++) {
                    padding += " ";
                }
                alignedText += delimiter + " " + padding; // 分隔符后多填充1个空格
            }
        }
        if (i < columns.length - 1) {
            alignedText += "\n";
        }
    }
    
    // 将对齐后的内容写回文档
    doc.Text = alignedText;
    
    
    1. 脚本执行后的效果
      对齐前:
      在这里插入图片描述

    脚本执行列对齐后:
    在这里插入图片描述

    哇!是不是很整齐!这都是AI自己写的脚本哦!


作者声明:本文用于记录和分享作者的学习心得,可能有部分文字或示例来源自豆包AI,由于本人水平有限,难免存在表达错误,欢迎留言交流和指教!
Copyright © 2022~2025 All rights reserved.

<think>好的,用户想了解如何微调本地部署的DeepSeek模型。首先,我需要确定用户对DeepSeek模型的了解程度。DeepSeek是一家中国的人工智能公司,他们开发了一系列大语言模型,可能类似于Llama或者GPT的结构。用户提到“本地部署”,说明他们可能希望在自有服务器或计算机上运行和调整模型,而不是使用云端服务。这可能涉及资源限制,比如GPU的可用性。 接下来,用户需要的是微调(fine-tuning)的步骤。微调通常指在预训练模型础上,使用特定领域的数据进行进一步训练,使模型适应特定任务。我需要考虑DeepSeek模型是否开源,是否有相关的文档支持。如果模型是开源的,可能需要查看官方提供的微调指南;如果不是,可能需要通过API或其他方式,但用户提到本地部署,所以假设模型权重可用。 然后,我需要列出微调的一般步骤:环境准备、数据准备、配置参数、训练、评估和部署。每个步骤中要详细说明可能的注意事项,比如硬件要求(GPU显存)、数据处理格式(JSON、CSV)、框架选择(PyTorch、DeepSpeed)、参数设置(学习率、批次大小)等。 用户可能遇到的常见问题包括显存不足、数据格式不正确、过拟合等,需要给出解决方案,比如使用量化、梯度累积,或者数据增强。另外,可能需要推荐一些工具和库,如Hugging Face的Transformers,Accelerate库,或者DeepSeek自家提供的工具。 还要考虑用户的应用场景,比如是否是特定领域的任务(客服、医疗、金融),这会影响数据准备和模型调整的方向。最后,确保语言通俗易懂,避免过多技术术语,但保持专业性,让不同技术背景的用户都能理解。</think>以下是关于本地部署的DeepSeek模型进行微调的详细介绍: ### 一、础概念 1. **DeepSeek模型**:中国深度求索公司开发的大语言模型系列,包含不同参数规模版本(如7B/67B等) 2. **微调(Fine-tuning)**:在预训练模型础上,使用领域特定数据进行二次训练,使模型适应特定任务 3. **本地部署**:在自有服务器/工作站运行模型,相比云端服务具有更好的数据隐私性和定制自由度 ### 二、准备工作 1. **硬件要求**: - GPU:建议NVIDIA显存 ≥ 24GB(如3090/A10等) - 内存:建议 ≥ 64GB - 存储:至少保留2倍模型大小的磁盘空间 2. **软件环境**: ```bash Python 3.8+ PyTorch 2.0+ CUDA 11.7+ deepspeed # 分布式训练 transformers # Hugging Face库 ``` 3. **模型获取**: - 从官方渠道获取模型权重(.bin或.safetensors格式) - 下载对应的tokenizer配置文件(tokenizer.json/config.json) ### 三、微调流程 1. **数据准备**: - 格式要求:建议使用JSON格式,每条数据包含"instruction"/"input"/"output"字段 - 数据量:建议 ≥ 1,000条高质量样本 - 示例结构: ```json { "instruction": "生成广告文案", "input": "产品:智能手表,卖点:心率监测", "output": "XX智能手表,24小时精准心率监测..." } ``` 2. **参数配置**(以QLoRA微调为例): ```python from transformers import TrainingArguments training_args = TrainingArguments( output_dir="./output", per_device_train_batch_size=4, gradient_accumulation_steps=8, learning_rate=2e-5, num_train_epochs=3, fp16=True, logging_steps=50, optim="paged_adamw_8bit", lr_scheduler_type="cosine", ) ``` 3. **启动训练**: ```python from trl import SFTTrainer trainer = SFTTrainer( model=model, train_dataset=dataset, peft_config=lora_config, args=training_args, tokenizer=tokenizer, dataset_text_field="text" ) trainer.train() ``` ### 四、实用技巧 1. **显存优化**: - 使用4bit量化:`bitsandbytes`库 - 梯度检查点:`gradient_checkpointing=True` - 使用DeepSpeed Zero-3 2. **效果提升**: - 混合不同任务类型数据 - 添加5%通用指令数据防止知识遗忘 - 设置`max_seq_length=2048`充分利用上下文 3. **常见问题处理**: - **OOM错误**:减小`per_device_batch_size`,增加`gradient_accumulation_steps` - **过拟合**:添加dropout(0.1-0.3),提前停止训练 - **训练震荡**:降低学习率,尝试`adamw`优化器 ### 五、部署应用 1. **模型导出**: ```python merged_model = model.merge_and_unload() merged_model.save_pretrained("./fine_tuned_model") ``` 2. **推理部署**: ```python from transformers import AutoModelForCausalLM, AutoTokenizer model = AutoModelForCausalLM.from_pretrained("./fine_tuned_model") tokenizer = AutoTokenizer.from_pretrained("./fine_tuned_model") inputs = tokenizer("请生成关于5G手机的文案:", return_tensors="pt") outputs = model.generate(**inputs, max_new_tokens=200) print(tokenizer.decode(outputs[0])) ``` ### 六、注意事项 1. 法律合规:确保训练数据不包含敏感信息 2. 版本对齐:检查transformers库版本与模型发布时间的兼容性 3. 资源监控:使用`nvitop`监控GPU显存使用情况 建议参考DeepSeek官方文档(https://github.com/deepseek-ai)获取最新微调指南和示例代码。实际微调效果会受数据质量、超参数设置等因素显著影响,建议从小规模实验开始逐步调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值