LLM·minimind-预训练
文章目录预训练初始化模型和分词器初始化配置文件 AutoConfig从配置文件初始化 AutoModel加载 AutoTokenizer预训练数据集加载数据集DataDictDataset数据预处理数据预先处理函数1.数据集编码为tokens2.数据集分块获得特定长度的input_ids和labels训练器TrainingArgumentsTrainer所有的代码都基于transformers库。预训练初始化模型和分词器初始化配置文件 AutoConfig类似transformers中的AutoModel一样都需要先下载配置文件model.info然后读取该文件夹获得配置信息from transformersimportAutoConfig,AutoModelForCausalLM model_path../model/Qwen2.5-1.5BconfigAutoConfig.from_pretrained(model_path)config配置信息包含模型的架构Qwen2Config{architectures:[Qwen2ForCausalLM],attention_dropout:0.0,从配置文件初始化 AutoModelAutoModelForCausalLM.from_config这一步构造初始化需要很长的时间可能涉及与远程仓库中的定义进行对齐甚至下载远程仓库的代码没有科学上网会卡死modelAutoModelForCausalLM.from_config(config,trust_remote_codeFalse)model.to(cuda)model的具体架构modelQwen2ForCausalLM((model):Qwen2Model((embed_tokens):Embedding(151936,1536)(layers):ModuleList((0-27):28xQwen2DecoderLayer((self_attn):Qwen2SdpaAttention((q_proj):Linear(in_features1536,out_features1536,biasTrue)(k_proj):Linear(in_features1536,out_features256,biasTrue)(v_proj):Linear(in_features1536,out_features256,biasTrue)(o_proj):Linear(in_features1536,out_features1536,biasFalse)(rotary_emb):Qwen2RotaryEmbedding()加载 AutoTokenizerfrom transformersimportAutoTokenizertokenizerAutoTokenizer.from_pretrained(model_path)tokenizer预训练数据集数据集格式必须是token化的序列最大长度必须一致。构造出labels该labels与input_ids一致模型会处理移位。加载数据集参考文献path表示数据集的名称monkey-gen如果只有当前参数则会自动下载到缓存数据集的格式例如jsoncsv等data_dir数据集所在的本地目录data_file数据集本身例如xxx.jsonl.datasetload_dataset(csv,data_files./ChnSentiCorp_htl_all.csv,splittrain)datasetload_dataset(json,data_files./cmrc2018_trial.json,fielddata)DataDict类型为Dict[str,Dataset]把他当成一个字典来理解用于获得train或者test字段的Dataset。不支持直接索引DatasetDict({train:Dataset({features:[input_ids,attention_mask],num_rows:100001})})Dataset数组和字典的混合体。可以理解为List[Dict]或者Dict[List]的形式支持下标索引和键值对索引。Dataset({features:[input_ids,attention_mask,labels],num_rows:1370})数据预处理我们期望的预训练格式如下首先是将原始文本str转换为input_ids:List[int]数据预先处理函数输入参数batchedTrue时为examples类型为Dict[str,List[Any]]examples{text:[今天天气不错。,我在学预训练语言模型。,DeepSpeed 加速训练。]}返回参数batchedTrue时返回类型为Dict[str,List[Any]]注意tokenizer处理batch时会返回字典Dict[str,List[Any]]。{input_ids:[[...,...],[...,...],[...,...]],attention_mask:[[...,...],[...,...],[...,...]],# 其他字段如 token_type_ids 等}1.数据集编码为tokensdeftokenize_function(examples:Dict[str,List[Any]]# 列名 对应一个列表/值):returntokenizer([textfortext in examples[text]])examples的数据类型examples的类型为Dict[str,List]例如‘text’:[1,2,3]tokenized_dsds.map(tokenize_function,batchedTrue,# 打包为列名值/列表text:[文本1,文本2,...]num_proc10,remove_columnscolumn_names,load_from_cache_fileTrue)输出结果将删除当前列并且返回input_idsattention_mask组成的字典。DatasetDict({train:Dataset({features:[input_ids,attention_mask],num_rows:5001})})2.数据集分块获得特定长度的input_ids和labelsdefgroup_texts(examples:Dict[str,List[str]]):# 拼接所有可迭代对象 concat_examples:Dict[str:List]{k:list(chain(*examples[k]))# iter-listfork in examples.keys()# List[tensor]}# 计算总长度 seqmask total_lengthlen(concat_examples[list(examples.keys())[0]])num_blocktotal_length// block_sizeresult{#list-list[tensor]k:[concat_examples[k][i*block_size:(i1)*block_size]fori inrange(num_block)]fork in concat_examples.keys()}result[labels]result[input_ids].copy()returnresultlm_dstokenized_ds.map(group_texts,batchedTrue,num_proc10,load_from_cache_fileTrue,batch_size1000,)chain合并迭代器拼接两个迭代器返回一个更长的迭代器可以通过list转换为数组。from itertoolsimportchainblock_size2048# 首位拼接 可迭代对象-返回长迭代器list(chain([1,2],[3,4]))#[1,2,3,4]list(chain(*[[1,2],[3,4]]))#[1,2,3,4]训练器训练器包括优化器模型本身分词器等等数据集加粗样式。TrainingArguments规定了一些重要的超参数包括训练参数epoch数梯度累积更新数评估参数等等from transformersimportTrainingArgumentstraining_argsTrainingArguments(output_diroutput/,per_device_train_batch_size1,gradient_accumulation_steps4,logging_steps4,num_train_epochs1,save_steps500,learning_rate1e-4,save_on_each_nodeTrue,gradient_checkpointingTrue,)Trainer数据集使用default_data_collator进行封装为batchIterableWrapper(train_dataset)支持将训练集包裹为可迭代对象可以直接传入Dataset类型。from transformersimportTrainer,default_data_collator from torchdata.datapipes.iterimportIterableWrapper# 训练器 trainerTrainer(modelmodel,argstraining_args,#Dataset传入也可以,本身就是mmap,不会节省太多内存train_datasetIterableWrapper(train_dataset),# 将Dataset类型包裹为迭代器 eval_datasetNone,#tokenizertokenizer,# 默认为 MLM 的 collator使用 CLM 的 collater#CLM因果语言建模,输入和输出标签一致,不会随机掩码data_collatordefault_data_collator,# MLM掩码语言建模,完型填空,不会随机掩码;)
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2445587.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!