技巧杂记
如果碰到服务器无法访问外网情况,可设置环境变量
在文件开始写入这两行代码,代表访问HG的镜像社区
import os os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'或者在终端输入
export USE_MODELSCOPE_HUB=1或者export HF_ENDPOINT=https://hf-mirror.com
peft是一个微调开源库,导入peft名下的LoraConfig与get_peft_model,可以快速完成微调
LoraConfig
self.loraconfig = LoraConfig( r=config["lora"]["r"], target_modules=config["lora"]["target_modules"], bias=config["lora"]["bias"], lora_alpha=config["lora"]["lora_alpha"], lora_dropout=config["lora"]["lora_dropout"], )r:秩,直接决定微调的参数量lora_alpha:一般为2r或者rlora_dropout:随机将低秩矩阵参数置0target_modules:对哪几个层进行微调
get_peft_model
传入加载好的模型和配置好的lora参数,可以得到一个配置好的模型
.print_trainable_parameters()可以查看能微调多少参数self.peft_model = get_peft_model(self.model,self.loraconfig) self.peft_model.print_trainable_parameters()
导入transformers,可以快速加载模型,提词器,以及量化配置
AutoModelForCausalLM加载预训练模型的工具
device_map:使用什么设备加载模型参数quantization_config:量化配置trust_remote_code:是否信任远程代码
self.model = AutoModelForCausalLM.from_pretrained( config["model"]["model_path"], device_map=config["model"]["device_map"], trust_remote_code=config["model"]["trust_remote_code"], quantization_config=quan_configs, )
AutoTokenizer自动化分词器加载工具,将文本转换为模型可理解的数字形式,指定了模型路径会自动下载匹配的分词器
self.tokenizer = AutoTokenizer.from_pretrained( config["model"]["model_path"], trust_remote_code=config["tokenizer"]["trust_remote_code"], )用分词器处理文本
max_length:能接受的文本最大长度,超过这个长度则截断return_tensors:可为pt,最后返回的就是张量``truncation`:采取何种截断方式
tokenized = self.tokenizer( combined_texts, truncation=True, max_length=config["tokenizer"]["max_length"], padding=False, return_tensors=None # 返回Python列表而不是张量 )
.tokenizer.encode:将原始文本(字符串)转换为模型可理解的 Token ID 序列text:输入文本add_special_tokens:是否添加特殊tokenmax_length:截断truncation:是否启用截断rerturn_tensors:返回格式(如pt)turn_tokens = self.tokenizer.encode( self.tokenizer.apply_chat_template([turn], tokenize=False), add_special_tokens=False )
.apply_chat_template:将多轮对话历史转换为模型所需的标准化格式tokenize:是否返回token IDs,为true则返回模型能理解的数字return_tensors:返回张量格式,"pt"(PyTorch),"np"(NumPy)max_length:最大token长度truncation:超长是否截断padding:填充方式,"longest"、True、Falsereturn_dict:是否返回字典格式
tokenized = self.tokenizer.apply_chat_template( conversation, tokenize=True, max_length=config["tokenizer"]["max_length"], truncation=config["tokenizer"]["truncation"], return_tensors=None, return_dict=True )
BitsAndBytesConfig模型量化的工具,最后要作为参数传入给
load_modelload_in_8bit:最后以8bit整数保存模型参数load_in_4bit:最后以4bit整数保存模型torch_dtype:模型训练的过程的中使用的参数类型
quan_configs = BitsAndBytesConfig( load_in_8bit=config["model"]["load_in_8bit"], torch_dtype=config["model"]["torch_dtype"] )
Trainer训练执行引擎
model:待训练的模型,微调的话则需要传入peft_modeltokenizer:分词器args:TrainingArguments实例train_dataset:训练集eval_dataset:测试集data_collator:数据整理器callbacks:回调函数,用于早停trainer = Trainer( model=model, tokenizer=self.tokenizer, args=training_args, train_dataset=train_dataset, eval_dataset=eval_dataset, data_collator=data_collator, callbacks=[EarlyStoppingCallback(config["training"]["patience"])] )
TrainingArguments控制训练过程的超参数和基础设施配置
output_dir:输出目录learning_rate:初始学习率num_train_epochs:训练轮次weight_decay:权重衰减,L2正则化per_device_train_batch_size:训练的时候每个设备处理的批次大小,占用显存per_device_eval_batch_size:推理的时候每个设备处理的批次大小,不占用显存eval_strategy:模型评估策略save_strategy:模型保存策略eval_steps:每N步评估一次save_steps:每N步保存一次logging_steps:每N步记录日志logging_dir:TensorBoard日志目录report_to:日志上报平台fp16:是否启用混合精度训练gradient_accumulation_steps:梯度累积步数,用时间换空间策略gradient_checkpointing:是否开启梯度检查点,开启的话可以节省显存,因为正向传播的时候系统不会暂存中间值,而是重新计算max_grad_norm:梯度裁剪,防止梯度爆炸load_best_model_at_end:最佳模型自动保存- 启用自动保存后,保存模型的步数要是评估步数的倍数,要保证每次评估之后都能保存,而不是评估到一半保存
lr_scheduler_type:学习率调度器cosine:余弦退火linear:线性衰减
metric_for_best_model:
training_args = TrainingArguments( output_dir=config["model"]["output_path"], learning_rate=config["training"]["learning_rate"], num_train_epochs=config["training"]["num_epochs"], weight_decay=config["training"]["weight_decay"], per_device_train_batch_size=config["training"]["per_device_train_batch_size"], per_device_eval_batch_size=config["training"]["per_device_eval_batch_size"], eval_strategy=config["training"]["eval_strategy"], save_strategy=config["training"]["save_strategy"], eval_steps=config["training"]["eval_steps"], save_steps=config["training"]["save_steps"], logging_steps=config["training"]["logging_steps"], logging_dir=config["training"]["logging_dir"], report_to=config["training"]["report_to"], load_best_model_at_end=config["training"]["load_best_model_at_end"], fp16=config["training"]["fp16"], gradient_accumulation_steps=config["training"]["gradient_accumulation_steps"], dataloader_num_workers=4, # 增加数据加载器的工作进程 )
datasets.Dataset是 Hugging Facedatasets库中的核心类,用于高效处理大规模数据集.from_dict():用于快速构建数据集,返回的是字典.map():对数据集中的每一行或批次应用自定义函数function:函数名batched:是否批次处理batch_size:每批次的样本数num_proc:使用的进程数
.save_to_disk:存储Dataset格式的数据集
load_dataset:是datasets中一个加载数据集的方法split:用于指定加载数据集的哪个子集,可以指定加载百分之多少,使用切片语法streaming:是否启用流式加载,避免OOM,不会一次性把数据集读入内存,仅受磁盘空间限制self.dataset = load_dataset("BelleGroup/multiturn_chat_0.8M", split="train[:70%]",streaming=true)
DataCollatorForSeq2Seq:用于动态批处理输入数据,并自动处理填充、注意力掩码和标签对齐tokenizer:分词器model:模型,可用于自动推断解码器结构padding:填充策略max_length:文本最长的长度pad_to_multiple_of:将长度填充到该值的倍数label_pad_token_id:标签序列的填充 Token IDreturn_tensors:返回的张量格式data_collator = DataCollatorForSeq2Seq( tokenizer=self.tokenizer, pad_to_multiple_of=config["dataloader"]["pad_to_multiple_of"], return_tensors=config["dataloader"]["return_tensors"], padding=config["dataloader"]["padding"], label_pad_token_id=config["dataloader"]["label_pad_token_id"] )
