当前位置: 首页 > news >正文

做网站有哪些注意事项海尔电商网站建设方案

做网站有哪些注意事项,海尔电商网站建设方案,珠海做网站,韦博在上面做课件的网站叫什么目录 写在前面 一、LoRA算法原理 1.设计思想 2.具体实现 二、peft库 三、完整的训练代码 四、总结 写在前面 现在有很多开源的大模型#xff0c;他们一般都是通用的#xff0c;这就意味着这些开源大模型在特定任务上可能力不从心。为了适应我们的下游任务#xff0c;…目录 写在前面 一、LoRA算法原理 1.设计思想 2.具体实现 二、peft库 三、完整的训练代码 四、总结 写在前面 现在有很多开源的大模型他们一般都是通用的这就意味着这些开源大模型在特定任务上可能力不从心。为了适应我们的下游任务就需要对预训练模型进行微调。 全参数微调有两个问题在新的数据集上训练会破坏大模型原来的能力使其泛化能力急剧下降而且现在的模型参数动辄几十亿上百亿要执行全参数微调的话他贵啊 于是LoRA出现了 LoRALow-Rank Adaptation)是微软提出的一种参数有效的微调方法可以降低微调占用的显存以及更轻量化的迁移。同时解决了上述两个问题那它凭什么这么厉害往下看吧。 一、LoRA算法原理 1.设计思想 论文地址https://arxiv.org/pdf/2106.09685 模型是过参数化的它们有更小的内在维度模型主要依赖于这个低的内在维度low intrinsic dimension去做任务适配。假设模型在适配任务时参数的改变量是低秩的由此引出低秩自适应方法lora通过低秩分解来模拟参数的改变量从而以极小的参数量来实现大模型的间接训练。 上面那段话也许有点难以理解。简单来讲LoRA是大模型的低秩适配器或者就简单的理解为适配器在图像生成中可以将lora理解为某种图像风格比如SD社区中的各种漂亮妹子的lora可插拔式应用甚至组合式应用实现风格的融合的适配器在NLP中可以将其理解为某个任务的适配器比如基于通用大模型训练的各个领域的专家大模型。 2.具体实现 LoRA的实现方式是在基础模型的线性变换模块全连接、Embedding、卷积旁边增加一个旁路这个旁路是由两个小矩阵做内积得来的两个小矩阵的中间维度就是秩 通过低秩分解先降维再升维来模拟参数的更新量。 下面是LoRA的公式 上面公式中x是这一层的输入h是这一层的输出是基础模型的权重参数A和B是两个小矩阵A的输入和B的输出形状跟一样A的输出和B的输入一样称为秩秩一般很小微调的所有“新知识”都保存在A和B里面是一个缩放系数这个数越大LoRA权重的影响就越大。 下面就是经典的LoRA运算流程图 我们以ChatGLM的attention模块的query_key_value是一个linear(4096, 12288)为例描述一下流程其中输入4096、输出12288LoRA的秩是8 初始化时lora_A采用高斯分布初始化lora_B初始化为全0保证训练开始时旁路为0矩阵         训练时原模型固定只训练降维矩阵A和升维矩阵B 推理时需要做参数合并就是将AB的内积一个与基础模型形状一样的低秩矩阵加到原参数上这样不引入额外的推理延迟。对于上图的例子lora_A与lora_B做内积得到4096x1228的参数矩阵然后与基础模型W相加就可以了。 我们来算算需要训练多少参数如果是全参数需要训练4096*1228850331648个参数LoRA需要训练4096*88*12288131072参数可是数量级的减少啊。 二、peft库 Pytorch中peft库实现了LoRA算法而且使用非常方便我们以ChatGLM代码为例看一下LoRA对ChatGLM模型做了什么直接上代码 from peft import LoraConfig, TaskType, get_peft_model from transformers import AutoModel, HfArgumentParser, TrainingArgumentsfrom finetune import CastOutputToFloat, FinetuneArgumentsdef count_params(model):for name, param in model.named_parameters():print(name, param.shape)def make_peft_model():# 初始化原模型model AutoModel.from_pretrained(THUDM/chatglm-6b, load_in_8bitFalse, trust_remote_codeTrue, device_mapauto, local_files_onlyTrue).float()# 给原模型施加LoRApeft_config LoraConfig(task_typeTaskType.CAUSAL_LM,inference_modeTrue,r8,lora_alpha32,lora_dropout0.1,target_modules[query_key_value],)model get_peft_model(model, peft_config).float()count_params(model)if __name__ __main__:make_peft_model() 输出如下        base_model.model.transformer.word_embeddings.weight torch.Size([130528, 4096]) base_model.model.transformer.layers.0.input_layernorm.weight torch.Size([4096]) base_model.model.transformer.layers.0.input_layernorm.bias torch.Size([4096])base_model.model.transformer.layers.0.attention.query_key_value.base_layer.weight torch.Size([12288, 4096])base_model.model.transformer.layers.0.attention.query_key_value.base_layer.bias torch.Size([12288])base_model.model.transformer.layers.0.attention.query_key_value.lora_A.default.weight torch.Size([8, 4096]) base_model.model.transformer.layers.0.attention.query_key_value.lora_B.default.weight torch.Size([12288, 8]) base_model.model.transformer.layers.0.attention.dense.weight torch.Size([4096, 4096]) base_model.model.transformer.layers.0.attention.dense.bias torch.Size([4096]) base_model.model.transformer.layers.0.post_attention_layernorm.weight torch.Size([4096]) base_model.model.transformer.layers.0.post_attention_layernorm.bias torch.Size([4096]) base_model.model.transformer.layers.0.mlp.dense_h_to_4h.weight torch.Size([16384, 4096]) base_model.model.transformer.layers.0.mlp.dense_h_to_4h.bias torch.Size([16384]) base_model.model.transformer.layers.0.mlp.dense_4h_to_h.weight torch.Size([4096, 16384]) base_model.model.transformer.layers.0.mlp.dense_4h_to_h.bias torch.Size([4096]) base_model.model.transformer.layers.1.input_layernorm.weight torch.Size([4096]) base_model.model.transformer.layers.1.input_layernorm.bias torch.Size([4096]) ...... 可以看到模型中被添加了LoRA模块红色部分是根据全连接“query_key_value”生成的。因为query_key_value层输入是4096输出是12288而配置中LoRA的秩是8所以两个LoRA块是(8,4096)和(12288, 8) 代码也很好理解get_peft_model方法将原模型参数冻结并且根据配置向模型中添加LoRA模块。 解释一下配置LoraConfig下面是这个对象的主要参数 1.task_type SEQ_CLS序列分类Sequence Classification任务。这种任务涉及对输入序列整体进行分类例如情感分析、文本分类等。 SEQ_2_SEQ_LM序列到序列语言建模Sequence-to-Sequence Language Modeling任务。这种任务能够将一个输入序列映射到另一个输出序列例如机器翻译、文本摘要等。 CAUSAL_LM因果语言建模Causal Language Modeling任务。这种任务涉及训练一个模型使其能够预测给定先前上下文的下一个标记例如自动补全、语言生成等。 TOKEN_CLS标记分类Token Classification任务。这种任务涉及对输入序列中的每个标记进行分类例如命名实体识别、词性标注等。 QUESTION_ANS问答Question Answering任务。这种任务涉及根据给定的问题和相关的上下文文本来预测答案。输入是Prompt问题。 FEATURE_EXTRACTION特征提取Feature Extraction任务。这种任务涉及从文本或序列中提取有用的特征以供其他任务或模型使用。 2.rLoRA秩的维度这数越大微调带来的“影响”越强但是需要训练的参数量会增加。 3.lora_alphaLoRA在前向传播的过程中引入一个额外的扩展系数scaling coefficient用于将LoRA权重应用于预训练权重。这个数越大LoRA权重的影响就越大。 4.target_modules要施加LoRA的模块名称需要注意的是参数是字符串数组模块类型必须是torch.nn.Linear, torch.nn.Embedding, torch.nn.Conv2d, transformers.pytorch_utils.Conv1D中的一个。比如这个例子中还可以填写word_embeddings和dense。 三、完整的训练代码 现在给出一个完整的基于LoRA的ChatGLM训练代码peft库在原模型基础上添加LoRA非常方便对代码的侵入也很小。下面的代码我添加了注释流程还是很清楚的 from transformers.integrations import TensorBoardCallback from torch.utils.tensorboard import SummaryWriter from transformers import TrainingArguments from transformers import Trainer, HfArgumentParser from transformers import AutoTokenizer, AutoModel import torch import torch.nn as nn from peft import get_peft_model, LoraConfig, TaskType from dataclasses import dataclass, field import datasets import ostokenizer AutoTokenizer.from_pretrained(THUDM/chatglm-6b, trust_remote_codeTrue)dataclass class FinetuneArguments:dataset_path: str field(defaultdata/alpaca)model_path: str field(defaultoutput)lora_rank: int field(default8)class CastOutputToFloat(nn.Sequential):def forward(self, x):return super().forward(x).to(torch.float32)def data_collator(features: list) - dict:len_ids [len(feature[input_ids]) for feature in features]longest max(len_ids)input_ids []labels_list []for ids_l, feature in sorted(zip(len_ids, features), keylambda x: -x[0]):ids feature[input_ids]seq_len feature[seq_len]labels ([-100] * (seq_len - 1) ids[(seq_len - 1) :] [-100] * (longest - ids_l))ids ids [tokenizer.pad_token_id] * (longest - ids_l)_ids torch.LongTensor(ids)labels_list.append(torch.LongTensor(labels))input_ids.append(_ids)input_ids torch.stack(input_ids)labels torch.stack(labels_list)return {input_ids: input_ids,labels: labels,}class ModifiedTrainer(Trainer):def compute_loss(self, model, inputs, return_outputsFalse):return model(input_idsinputs[input_ids],labelsinputs[labels],).lossdef save_model(self, output_dirNone, _internal_callFalse):self.model.save_pretrained(output_dir)def main():writer SummaryWriter()# 组织训练参数finetune_args, training_args HfArgumentParser((FinetuneArguments, TrainingArguments)).parse_args_into_dataclasses()# init modelmodel AutoModel.from_pretrained(THUDM/chatglm-6b, load_in_8bitFalse, trust_remote_codeTrue, device_mapauto, local_files_onlyTrue).float()model.gradient_checkpointing_enable()model.enable_input_require_grads()# 模型是可以并行化的。model.is_parallelizable True# 启用模型的并行化。model.model_parallel True# 将模型的 lm_head语言模型头的输出转换为浮点数类型。model.lm_head CastOutputToFloat(model.lm_head)# 禁用模型配置中的缓存用于禁止缓存中间结果,可以减少显存占用但是训练时间会变长model.config.use_cache (False # silence the warnings. Please re-enable for inference!)# LoRA配置peft_config LoraConfig(task_typeTaskType.CAUSAL_LM,inference_modeFalse,rfinetune_args.lora_rank,lora_alpha32,lora_dropout0.1,)# 对模型使用LoRAmodel get_peft_model(model, peft_config).float()# 使用alpaca数据集dataset datasets.load_from_disk(finetune_args.dataset_path)print(f\n{len(dataset)}\n)# for d in dataset.iter(batch_size1):# print(d:, d)# start traintrainer ModifiedTrainer(modelmodel,train_datasetdataset,argstraining_args,callbacks[TensorBoardCallback(writer)],data_collatordata_collator,)trainer.train()writer.close()# 存训练后的参数model.save_pretrained(training_args.output_dir)if __name__ __main__:main()训练之后模型文件会保存在output_dir目录中。到这里我们发现一个问题毕竟LoRA在原模型的基础上加了分支这会带来推理效率的降低其实我们调用merge_and_unload方法就能将LoRA的分支模块合并到基础模型推理代码如下 from peft import LoraConfig, TaskType, get_peft_model from transformers import AutoModel, AutoModelForSeq2SeqLM import torch from transformers import AutoTokenizer# 加载基础模型 model AutoModel.from_pretrained(THUDM/chatglm-6b, trust_remote_codeTrue, device_mapauto) tokenizer AutoTokenizer.from_pretrained(THUDM/chatglm-6b, trust_remote_codeTrue)# 配置LoRA peft_config LoraConfig(task_typeTaskType.CAUSAL_LM, inference_modeTrue,target_modules[query_key_value],r8, lora_alpha32, lora_dropout0.1 ) # 对模型使用LoRA model get_peft_model(model, peft_config).half() # 加载LoRA参数 model.load_state_dict(torch.load(output/checkpoint-1000/adapter_model.bin, map_locationtorch.device(cuda)), strictFalse) # 将LoRA的分支模块合并到基础模型 model.merge_and_unload()while True:prompt input(Prompt: )inputs tokenizer(prompt, return_tensorspt)model.params_dtype torch.float32response model.generate(input_idsinputs[input_ids],max_lengthinputs[input_ids].shape[-1] 128)response response[0, inputs[input_ids].shape[-1]:]print(responseL, response)for r in response:print(r, :, tokenizer.decode([r], skip_special_tokensFalse))print(Response:, tokenizer.decode(response, skip_special_tokensTrue))四、总结 1.LoRA的实现方式是在原模型的线性变换模块全连接、Embedding、卷积旁边增加一个旁路通过低秩分解先降维再升维来模拟参数的更新量。 2.LoRA模块由两个小矩阵组成这两个矩阵内积的输入输出形状与原模型一致大模型需要的“新知识”就存在这个模块中 3.秩可以很小有实验表明就算秩1效果也不是很差 4.尽量多的对模型中的线性变换模块使用秩很小LoRA而不是对一个模块使用秩很大的LoRA 5.推理时需要做参数合并就是将AB的内积加到原参数上从而不引入额外的推理延迟 5.LoRA智能一定程度提升模型在某个领域的能力并不能使模型发生根本性的能力提升。 LoRA就介绍到这里关注不迷路(#^.^#) 关注订阅号了解更多精品文章 交流探讨、商务合作请加微信
http://www.w-s-a.com/news/769300/

相关文章:

  • 网站建设人员培训企业网站开发模型图
  • 自己开发一个网站应该怎么做国外设计网站 绿色的
  • 南昌外贸网站设计推广任务发布平台app
  • 建立网站成本书店网站建设可行性分析
  • 高端网站设计官网乌海学校网站建设
  • 哪些网站适合新手编程做项目优秀网页设计赏析
  • 永州网站seo德阳网站建设优化
  • 网站建设高端网站本地建设网站软件下载
  • 网站后台账号密码破解杭州酒店网站设计公司推荐
  • 和县网站开发秦皇岛建设工程信息网站
  • 国外网站用什么dns好建一个下载网站要什么cms系统
  • 礼品工艺品网站建设手机做网站哪家好
  • 泉州网站建设方案维护怎样选择网站建设
  • 江苏建站速度忿先进的网站建设
  • 广州天河建站公司com域名注册多少钱
  • 成都网站建设推广好vs2013如何做网站
  • 茶叶网站建设模板企业网站备案要多少钱
  • 怎么查网站找谁做的win主机伪静态规则 wordpress
  • 轻云服务器菁英版 多个网站北京it外包服务商
  • 售后服务 网站建设阳江seo优化
  • 网站建设后怎么赚钱wordpress调用导航栏
  • 特产网站设计六色网站
  • 服务器网站备案做网站公司如何赚钱
  • 怎样进行站点优化荣成市有做网站的吗
  • 合肥建设工会网站芜湖做网站建设公司
  • 玉林市住房和城乡建设局网站网站开发百灵鸟
  • 网站怎么做双机房切换建设部网站2015年第158号
  • 郑州服务设计公司网站色块的网站
  • 网站设计所用到的技术做网站添加mp3
  • 凡科做的微网站怎样连接公众号seo李守洪排名大师