SiliconFlow硅基流动微调大模型

SiliconFlow硅基流动微调大模型

  • 注册地址见我的另一个博客

    https://blog.csdn.net/hbkybkzw/article/details/145558234

  • 使用到的数据集-弱智吧中文相关数据

    https://huggingface.co/datasets/hfl/ruozhiba_gpt4?row=98

    查看数据集前两条

    import pandas as pd
    import json
    
    file_path = "./ruozhiba_qa2449_gpt4t.json"
    with open(file_path,encoding='utf-8') as f:
        json_data = json.loads(f.read())
        
    json_data[:2]
    
    """输出"""
    [{'instruction': '鸡柳是鸡身上哪个部位啊?',
      'input': '',
      'output': '鸡柳并不是鸡身上的一个特定部位,它是指用鸡胸肉切成的细长条形的肉块。在中国餐饮中,鸡柳是非常常见的一种食材,经常被用来炒菜或是做成油炸小吃。鸡胸肉是鸡身上的肉质较为细嫩的部分,含脂肪少且蛋白质含量高,适合切成条状做成多种菜式。'},
     {'instruction': '樟脑丸是我吃过最难吃的硬糖有奇怪的味道怎么还有人买',
      'input': '',
      'output': '樟脑丸其实不是一种食品,而是一种常用的防虫、防霉的化学制品,主要用于衣柜、抽屉等闭合空间中,以驱除虫蛀和防止霉变。它的主要成分是樟脑,这种物质具有很强的挥发性和特殊的气味,是非常有效的天然防腐剂。之所以有人购买樟脑丸,是因为其防虫防霉的效果非常好,可以帮助保护衣物、纸张等不被虫蛀或霉变侵害。重要的是不要误食樟脑丸,因为它含有对人体有害的成分。'}]
    
  • 硅基流动的微调数据集要求

    https://docs.siliconflow.cn/cn/userguide/guides/fine-tune

    数据要求如下

    仅支持 .jsonl 文件,且需符合以下要求:

    1. 每行是一个独立的 JSON 对象;
    2. 每个对象必须包含键名为 messages 的数组,数组不能为空;
    3. messages 中每个元素必须包含 rolecontent 两个字段;
    4. role 只能是 systemuserassistant
    5. 如果有 system 角色消息,必须在数组首位;
    6. 第一条非 system 消息必须是 user 角色;
    7. userassistant 角色的消息应当交替、成对出现,不少于 1

    所以需要先对数据进行处理

    siliconflow_data = []
    for d in json_data:
        prompt_template = {"messages": [{"role": "user", "content": f"{d['instruction']}"}
                                    , {"role": "assistant", "content": f"{d['output']}"}
                                     ]}
        siliconflow_data.append(prompt_template)
    
    
    with open('./siliconflow_fine_tune_data.jsonl',mode='a',encoding='utf-8') as f:
        for d in json_data:
            prompt_template = {"messages": [{"role": "user", "content": f"{d['instruction']}"}
                                          , {"role": "assistant", "content": f"{d['output']}"}
                                         ]}
            json_line = json.dumps(prompt_template,ensure_ascii=False)
            f.write(json_line + '\n')
    

    存储后的数据是这样的

    image-20250309225410299


  • 开始微调

    https://cloud.siliconflow.cn/fine-tune

    image-20250309225633957

    image-20250309225825425

    等待微调完成

    image-20250309230019379

    注意下面的是最终模型

    复制模型的名称测试下连接

    from openai import OpenAI
    import openai
    import pandas as pd
    
    
    openai.api_key = "api_key" # 替换为自己的key
    openai.base_url = "https://api.siliconflow.cn/v1/"
    
    
    def get_completion(prompt: str, context: str = None, model: str = "gpt-3.5-turbo", timeout: int = 120):
        try:
            # 初始化OpenAI客户端
            client = OpenAI(
                api_key=openai.api_key,
                base_url=openai.base_url,
                timeout=timeout  # 设置超时时间
            )
    
            # 构建消息列表
            if context:
                messages = [
                    {'role': 'user', 'content': context},
                    {'role': 'user', 'content': prompt}
                ]
            else:
                messages = [{'role': 'user', 'content': prompt}]
    
            # 调用OpenAI接口,获取推理结果
            response = client.chat.completions.create(
                model=model,
                messages=messages,
                stream=False
            )
    
            # # 处理相应,提取推理内容和回答
            # chat_messages = response.choices[0].message
            # reasoning_content = chat_messages.reasoning_content if hasattr(chat_messages, 'reasoning_content') else ""
            # content = chat_messages.content
    
            # 处理相应,提取推理内容和回答
            chat_messages = response.choices[0].message
            content = chat_messages.content
            if hasattr(chat_messages, 'reasoning_content'):
                reasoning_content = chat_messages.reasoning_content
            elif "</think>" in content:
                reasoning_content = content[content.index("<think>\n")+len("<think>\n") : content.index("</think>\n\n")]
                content = content.split("</think>\n\n")[1]
            else:
                reasoning_content = ""
            
            return reasoning_content, content
    
        except Exception as e:
            logger.error(f"Failed to get completion: {e}")
            raise e
    
    
    result = get_completion("你好",model="ft:LoRA/Qwen/Qwen2.5-7B-Instruct:im9vyc22ho:fintuing-20250309:zvkepkjuxdoyrynrwslk-ckpt_step_276")
    print(result)
    
    
    """输出"""
    ('', '您好!很高兴通过这种方式与您交流。我是一个来自阿里云的AI助手,专门设计用来帮助回答问题和提供信息。有什么特定的问题或主题您想和我讨论吗?无论是科学问题、文化话题、日常常识,甚至娱乐新闻,我都可以尝试为您提供相关的资料和见解。试题或者什么特殊的查询,也请随时告诉我,我很乐意帮助解答。')
    
  • 对比一下微调前后的数据

    with open('./siliconflow_fine_tune_data.jsonl',mode='r',encoding='utf-8') as f:
        data_list = f.readlines()
        
    for data in data_list[:2]:
        print('--' * 20)
        temp_data = json.loads(data)
        raw_question = temp_data['messages'][0]['content']
        print(f'原始问题:{raw_question} \n')
        raw_answer = temp_data['messages'][1]['content']
        print(f'原始回答:{raw_answer} \n')
    
        no_sft_answer = get_completion(prompt=raw_question
                                      ,model='Qwen/Qwen2.5-7B-Instruct')
        print(f"未微调的模型回答:{no_sft_answer[1]} \n")
        
        sft_answer = get_completion(prompt=raw_question
                                   ,model="ft:LoRA/Qwen/Qwen2.5-7B-Instruct:im9vyc22ho:fintuing-20250309:zvkepkjuxdoyrynrwslk-ckpt_step_276")
        print(f"微调后的模型回答:{sft_answer[1]} \n")
    
        print('--' * 20)
    
    """输出如下:"""
    
    ----------------------------------------
    原始问题:鸡柳是鸡身上哪个部位啊? 
    
    原始回答:鸡柳并不是鸡身上的一个特定部位,它是指用鸡胸肉切成的细长条形的肉块。在中国餐饮中,鸡柳是非常常见的一种食材,经常被用来炒菜或是做成油炸小吃。鸡胸肉是鸡身上的肉质较为细嫩的部分,含脂肪少且蛋白质含量高,适合切成条状做成多种菜式。 
    
    未微调的模型回答:鸡柳并不是真的来自鸡的某一个具体部位,而是一种加工食品。鸡柳主要由鸡肉制成,通常是通过将鸡肉搅拌、搅拌后再成型,使其呈现出具有一定弹性和嚼劲的条状或片状。因此,鸡柳并不能具体对应到鸡身体上的某一特定部位。 
    
    微调后的模型回答:鸡柳,通常指的是鸡肉卷,这是一种将切碎的鸡肉混合、揉捏后制成的人造“肉类”产品。并不是直接来自鸡的某一部分,而是一种模拟肉类的加工食品。这种产品的原材料来源于鸡的去骨肉或鸡胸肉,经过加工和搅拌以模拟传统的肉块形状和口感。因此,鸡柳并不是来源于具体的鸡的某个身体部分,而是通过加工多种鸡肉制成的食品。 
    
    ----------------------------------------
    ----------------------------------------
    原始问题:樟脑丸是我吃过最难吃的硬糖有奇怪的味道怎么还有人买 
    
    原始回答:樟脑丸其实不是一种食品,而是一种常用的防虫、防霉的化学制品,主要用于衣柜、抽屉等闭合空间中,以驱除虫蛀和防止霉变。它的主要成分是樟脑,这种物质具有很强的挥发性和特殊的气味,是非常有效的天然防腐剂。之所以有人购买樟脑丸,是因为其防虫防霉的效果非常好,可以帮助保护衣物、纸张等不被虫蛀或霉变侵害。重要的是不要误食樟脑丸,因为它含有对人体有害的成分。 
    
    未微调的模型回答:樟脑丸实际上并不是硬糖,而是一种常用的防虫剂,常用于保存衣物,防止衣物生虫。由于其强烈的化学味道,不适合作为食品。樟脑丸含有苯甲酸甲酯等成分,对人体有害,不能食用。如果你误食或者吃到含有樟脑丸的味道,应该立即吐出来,并及时向家长或监护人报告。虽然樟脑丸味道独特,但是在正规的樟脑丸产品包装上通常会有明确的“外用、不可食用”的警示,由于其有毒性并不适合直接食用。即使是作为玩具使用,也不适合儿童接触,以免误食。
    
    可能你记错了物品,如果是某种糖果混淆了,正常的糖果应该有独特的甜味和香气,如果某一种糖果味道奇特到了让你难以接受的程度,也可能是特殊口味的糖果,或者是品质问题。人们购买食物时通常会考虑口味、包装、品牌等多个因素,如果某种产品存在品质问题或者不符合食品安全标准,是不会受到消费者喜欢的,因此如果你形容的是某种特定的糖果,它能销售也可能是符合一定消费群体的口味或特定市场的需求。但无论如何,任何非食品化学制品都不应该被误食。 
    
    微调后的模型回答:樟脑丸实际上是樟脑的一种丸状固化形式,常用作防虫剂,特别是用于驱虫老鼠或其他害虫。因为其主要成分是樟脑,所以其气味非常强烈且具有独特的凉味。许多人可能相信樟脑丸的味道异常难以接受,所以通常不会选择作为食品消费。然而,由于其有效的驱虫效果和一定的经济成本,人们仍然会购买和使用它。此外,某些极少数人出于特殊需要(如孤岛生存等)可能会尝试食用樟脑丸,但这并不意味着它是作为一种常规食品在市场上销售的。 
    
    ----------------------------------------
### 流动微调的技术原理与实现方式 流动微调是一种于现有模型参数调整的方法,其目标是在特定领域或任务上优化模型性能的同时保持原有能力。这种方法结合了迁移学习和微调技术的特点,在调整过程中不仅关注权重的变化,还注重如何高效利用已有资源并减少计算开销。 #### 1. 技术背景 流动微调可以被看作一种更精细的微调形式,它通过动态更新模型中的某些层或者模块来适应新数据集的需求。相比于传统的全量微调(Fine-tuning),这种技术仅修改少量参数,从而降低了过拟合的风险以及训练成本[^1]。 #### 2. 原理概述 该方法的核心在于识别哪些部分需要改变以及怎样变化最为有效。具体来说: - **局部敏感性分析**:通过对神经网络各层输出进行梯度计算,找出那些对于目标任务贡献较大的区域作为重点调节对象; - **低秩分解策略**:采用矩阵分解的方式降低维度复杂度,使得即使面对高维输入也能快速找到最优解路径; - **增量学习框架构建**:引入额外的记忆单元存储历史经验,并将其融入当前迭代过程之中,确保旧知识不会因新的训练样本而丢失。 #### 3. 实现步骤说明 以下是使用Python模拟的一个简化版流程示例: ```python class SilicaFlowTuner: def __init__(self, model, target_layers=None): """ Initialize the tuner with a pre-trained model and specify which layers to tune. :param model: Pretrained neural network instance :param target_layers: List of layer names or indices intended for adjustment """ self.model = model if not target_layers: # Default behavior could involve selecting last few fully connected layers etc. pass def apply_silica_flow_tune(self, dataset): """ Perform silica flow tuning on specified parts of the given model using provided data. :param dataset: Training samples used during this phase """ tuned_weights = {} for name, param in self.model.named_parameters(): if any(layer_name in name for layer_name in self.target_layers): updated_param_value = perform_local_optimization(param, dataset) tuned_weights[name] = updated_param_value update_model_with_new_params(self.model, tuned_weights) def perform_local_optimization(current_weight, training_data): """Optimize individual weights based upon local sensitivity.""" optimized_result = current_weight.clone() optimizer = torch.optim.Adam([optimized_result], lr=0.001) for epoch in range(num_epochs): loss = compute_loss(training_data, optimized_result) loss.backward() optimizer.step() optimizer.zero_grad() return optimized_result.detach().cpu().numpy() ``` 上述代码片段展示了如何定义一个类`SilicaFlowTuner`用于执行流动微调操作。其中包含了初始化函数设置待调整的目标图层列表;还有实际施加此算法至指定组件上的逻辑描述[^3]。 #### 4. 结论 综上所述,流动微调提供了一种灵活且高效的手段去改善深度学习模型的表现力而不破坏原有的泛化特性。这尤其适用于当面临有限标注资料或是希望维持跨多个子域一致性的场景下非常有用[^4]。 ---
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值