代码优化微调

本文通过重构代码,改进了前端热门搜索功能。具体包括:调整内部方法的位置、使用解构语法简化属性访问,并将if语句替换为switch语句以提高代码的可读性和效率。

前面我们实现了热门搜索最基本的功能,下面我们来将代码微调优化一下。

首先,我们打开 src/common/header/store 下的 actionCreators.js 如下。

import * as actionTypes from './actionTypes';
import axios from 'axios';
import { fromJS } from 'immutable';
import '../../../mockdata.js';

export const searchFocus = () => ({
    type: actionTypes.SEARCH_FOCUS
});

export const searchBlur = () => ({
    type: actionTypes.SEARCH_BLUR
});

const changeList = (data) => ({
  type: actionTypes.CHANGE_LIST,
  data: fromJS(data)
})

export const getList = () => {
  return (dispatch) => {
    axios.get('/api/headerList.json').then( (res) => {
      const data = res.data;
      if( data.success ) {
        dispatch( changeList( data.data ) )
      }
    }).catch( () => {
      console.log("error");
    })
  }
}

一、有的方法,不需要被导出,比如 changeList 方法。这种方法,我们最后要么放顶部要么放底部。我们这儿把它放顶部。

再看一下 src/common/header 下的 index.js 里面有的函数或者变量 的调用方法是 this.props.XXX .那么我们可以用解构语法让它们的调用更方便。如下。

class Header extends Component {
  render() {
    let { focused, handleFocus, handleBlur } = this.props;
    return (
...)
}}

二、使用解构语法把this.props 中变量解构

然后,我们看一看 src/common/header/store 下的reducer.js,如下。

import { SEARCH_FOCUS, SEARCH_BLUR, CHANGE_LIST } from './actionTypes';
import { fromJS } from 'immutable';

const defaultState = fromJS({
    focused: false,
    list: []
});

export default (state = defaultState, action) => {
    if (action.type === SEARCH_FOCUS) {
        return state.set("focused", true);
    }
    if (action.type === SEARCH_BLUR) {
        return state.set("focused", false);
    }
    if (action.type === CHANGE_LIST) {
      return state.set("list", action.data);
    }
    return state;
}

里面大量使用了if 语法,这里我们可以把它改为switch 语句。如下。

import { SEARCH_FOCUS, SEARCH_BLUR, CHANGE_LIST } from './actionTypes';
import { fromJS } from 'immutable';

const defaultState = fromJS({
    focused: false,
    list: []
});

export default (state = defaultState, action) => {
    switch (action.type) {
        case SEARCH_FOCUS :
            return state.set("focused", true);
        case SEARCH_BLUR:
            return state.set("focused", false);
        case CHANGE_LIST:
            return state.set("list", action.data);
        default:
            return state;
    }
}

三、大量if 语句,改为switch 语法

 

 

### 百川大模型微调的实现方法 百川大模型作为当前主流的大规模语言模型之一,其微调可以通过多种方式实现。基于提供的参考资料以及常见的实践方案,以下是通过代码实现对百川模型进行微调的具体方法。 #### 方法概述 为了实现百川模型的微调,通常采用参数高效微调策略(如LoRA或QLoRA),这能够显著减少计算资源的需求并提高效率[^2]。以下是一个典型的流程: 1. **准备数据集** 数据集应包含用于训练的任务特定样本,例如问答、翻译或其他自然语言处理任务的数据。推荐使用JSON格式存储数据,其中每条记录包括`instruction`(指令)、`input`(输入)和`output`(输出)字段。 2. **加载预训练模型** 使用Hugging Face Transformers库加载百川模型及其对应的分词器。 3. **应用LoRA微调** 利用PEFT库中的LoRA模块来设置低秩分解矩阵,从而仅更新少量新增加的参数。 4. **配置训练超参数** 设置批量大小、学习率、最大序列长度等关键参数。 5. **启动训练过程** 定义优化器与调度程序,并执行实际的梯度下降迭代操作。 6. **保存与验证模型** 训练结束后保存最佳版本的模型权重,并对其进行测试以确认效果改进情况。 --- #### 示例代码 下面是针对上述步骤的一个具体Python脚本实例: ```python from transformers import AutoTokenizer, AutoModelForCausalLM, TrainingArguments, Trainer import torch from peft import LoraConfig, get_peft_model, prepare_model_for_int8_training # 加载基础模型和分词器 model_name_or_path = "baichuan/your-model-path" tokenizer = AutoTokenizer.from_pretrained(model_name_or_path) model = AutoModelForCausalLM.from_pretrained( model_name_or_path, load_in_8bit=True, device_map="auto", ) # 配置LoRA适配层 lora_config = LoraConfig( r=16, # 秩数 lora_alpha=32, target_modules=["q_proj", "v_proj"], # 调整目标模块列表 lora_dropout=0.05, bias="none", task_type="CAUSAL_LM", ) model = prepare_model_for_int8_training(model) model = get_peft_model(model, lora_config) # 打印可训练参数数量 print(f"Trainable parameters: {model.print_trainable_parameters()}") # 准备数据集 (假设已转换成Dataset对象形式) def preprocess_function(examples): inputs = [ f"{example['instruction']} {example['input']}" for example in examples["data"] ] outputs = [f"{example['output']}" for example in examples["data"]] tokenized_inputs = tokenizer(inputs, truncation=True, padding=True, max_length=512) tokenized_outputs = tokenizer(outputs, truncation=True, padding=True, max_length=512) labels = [[token_id if token_id != tokenizer.pad_token_id else -100 for token_id in seq] for seq in tokenized_outputs.input_ids] return {"input_ids": tokenized_inputs["input_ids"], "attention_mask": tokenized_inputs["attention_mask"], "labels": labels} train_dataset = ... # 替换为您的训练数据集 eval_dataset = ... # 可选:替换为您的评估数据集 # 设定训练参数 training_args = TrainingArguments( output_dir="./results", num_train_epochs=3, per_device_train_batch_size=4, gradient_accumulation_steps=4, learning_rate=1e-4, logging_dir="./logs", save_strategy="epoch", evaluation_strategy="no", # 或者设为 'steps'/'epoch' ) trainer = Trainer( model=model, args=training_args, train_dataset=train_dataset, eval_dataset=None, # 如果有则传入eval_dataset data_collator=lambda data: { "input_ids": torch.stack([item[0] for item in data]), "attention_mask": torch.stack([item[1] for item in data]), "labels": torch.stack([item[2] for item in data]) }, ) # 开始训练 trainer.train() # 保存最终模型 model.save_pretrained("./fine_tuned_baichuan") ``` 此代码片段展示了如何利用Transformers框架配合PEFT库完成百川模型的LoRA微调工作流[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值