网站开发和软件开发工作,wordpress通过图片id获取路径,旅游网站建设方案预算,自己制作网站做外贸赚钱吗【Python】科研代码学习#xff1a;八 FineTune PretrainedModel [用 trainer#xff0c;用 script] LLM文本生成 自己整理的 HF 库的核心关系图用 trainer 来微调一个预训练模型用 script 来做训练任务使用 LLM 做生成任务可能犯的错误#xff0c;以及解决措施 自己整理的 … 【Python】科研代码学习八 FineTune PretrainedModel [用 trainer用 script] LLM文本生成 自己整理的 HF 库的核心关系图用 trainer 来微调一个预训练模型用 script 来做训练任务使用 LLM 做生成任务可能犯的错误以及解决措施  自己整理的 HF 库的核心关系图 
根据前面几期自己整理的核心库的使用/继承关系  
用 trainer 来微调一个预训练模型 
HF官网APIFT a PretrainedModel 今天讲讲FT训练相关的内容吧 这里就先不提用 keras 或者 native PyTorch 微调直接看一下用 trainer 微调的基本流程第一步加载数据集和数据集预处理 使用 datasets 进行加载 HF 数据集 
from datasets import load_datasetdataset  load_dataset(yelp_review_full)另外需要用 tokenizer 进行分词。自定义分词函数然后使用 dataset.map() 可以把数据集进行分词。 
from transformers import AutoTokenizertokenizer  AutoTokenizer.from_pretrained(google-bert/bert-base-cased)def tokenize_function(examples):return tokenizer(examples[text], paddingmax_length, truncationTrue)tokenized_datasets  dataset.map(tokenize_function, batchedTrue)也可以先选择其中一小部分的数据单独拿出来做测试或者其他任务 
small_train_dataset  tokenized_datasets[train].shuffle(seed42).select(range(1000))
small_eval_dataset  tokenized_datasets[test].shuffle(seed42).select(range(1000))第二步加载模型选择合适的 AutoModel 或者比如具体的 LlamaForCausalLM 等类。 使用 model.from_pretrained() 加载 
from transformers import AutoModelForSequenceClassificationmodel  AutoModelForSequenceClassification.from_pretrained(google-bert/bert-base-cased, num_labels5)第三步加载 / 创建训练参数 TrainingArguments 
from transformers import TrainingArgumentstraining_args  TrainingArguments(output_dirtest_trainer)第四步指定评估指标。trainer 在训练的时候不会去自动评估模型的性能/指标所以需要自己提供一个 ※ 这个 evaluate 之前漏了放后面学这里先摆一下 # TODO 
import numpy as np
import evaluatemetric  evaluate.load(accuracy)第五步使用 trainer 训练提供之前你创建好的 model模型args训练参数train_dataset训练集eval_dataset验证集compute_metrics评估方法 
trainer  Trainer(modelmodel,argstraining_args,train_datasetsmall_train_dataset,eval_datasetsmall_eval_dataset,compute_metricscompute_metrics,
)
trainer.train()完整代码请替换其中的必要参数来是配置自己的模型和任务 
from datasets import load_dataset
from transformers import (LlamaTokenizer,LlamaForCausalLM,TrainingArguments,Trainer,)
import numpy as np
import evaluatedef tokenize_function(examples):return tokenizer(examples[text], paddingmax_length, truncationTrue)metric  evaluate.load(accuracy)
def compute_metrics(eval_pred):logits, labels  eval_predpredictions  np.argmax(logits, axis-1)return metric.compute(predictionspredictions, referenceslabels)
Load dataset, tokenizer, model, training args
preprosess into tokenized dataset
split training dataset and eval datasetdataset  load_dataset(xxxxxxxxxxxxxxxxxxxx)tokenizer  LlamaTokenizer.from_pretrained(xxxxxxxxxxxxxxxxxxxxxxxxxx)
tokenized_datasets  dataset.map(tokenize_function, batchedTrue)small_train_dataset  tokenized_datasets[train].shuffle(seed42).select(range(1000))
small_eval_dataset  tokenized_datasets[test].shuffle(seed42).select(range(1000))model  LlamaForCausalLM.from_pretrained(xxxxxxxxxxxxxxx)training_args  TrainingArguments(output_dirxxxxxxxxxxxxxx)
define metrics
set trainer and train
trainer  Trainer(modelmodel,argstraining_args,train_datasetsmall_train_dataset,eval_datasetsmall_eval_dataset,compute_metricscompute_metrics,
)trainer.train()用 script 来做训练任务 
我们在很多项目中都会看到启动脚本是一个 .sh 文件一般里面可能会这么写 
python examples/pytorch/summarization/run_summarization.py \--model_name_or_path google-t5/t5-small \--do_train \--do_eval \--dataset_name cnn_dailymail \--dataset_config 3.0.0 \--source_prefix summarize:  \--output_dir /tmp/tst-summarization \--per_device_train_batch_size4 \--per_device_eval_batch_size4 \--overwrite_output_dir \--predict_with_generate或者最近看到的一个 
OUTPUT_DIR${1:-./alma-7b-dpo-ft}
pairs${2:-de-en,cs-en,is-en,zh-en,ru-en,en-de,en-cs,en-is,en-zh,en-ru}
export HF_DATASETS_CACHE.cache/huggingface_cache/datasets
export TRANSFORMERS_CACHE.cache/models/
# random port between 30000 and 50000
port$(( RANDOM % (50000 - 30000  1 )  30000 ))accelerate launch --main_process_port ${port} --config_file configs/deepspeed_train_config_bf16.yaml \run_cpo_llmmt.py \--model_name_or_path haoranxu/ALMA-13B-Pretrain \--tokenizer_name haoranxu/ALMA-13B-Pretrain \--peft_model_id  haoranxu/ALMA-13B-Pretrain-LoRA \--cpo_scorer kiwi_xcomet \--cpo_beta 0.1 \--use_peft \--use_fast_tokenizer False \--cpo_data_path  haoranxu/ALMA-R-Preference \--do_train \--language_pairs ${pairs} \--low_cpu_mem_usage \--bf16 \--learning_rate 1e-4 \--weight_decay 0.01 \--gradient_accumulation_steps 1 \--lr_scheduler_type inverse_sqrt \--warmup_ratio 0.01 \--ignore_pad_token_for_loss \--ignore_prompt_token_for_loss \--per_device_train_batch_size 2 \--evaluation_strategy no \--save_strategy steps \--save_total_limit 1 \--logging_strategy steps \--logging_steps 0.05 \--output_dir ${OUTPUT_DIR} \--num_train_epochs 1 \--predict_with_generate \--prediction_loss_only \--max_new_tokens 256 \--max_source_length 256 \--seed 42 \--overwrite_output_dir \--report_to none \--overwrite_cache 玛雅这么多 --xxx 看着头疼也不知道怎么搞出来这么多参数作为启动文件的。 这种就是通过 script 启动任务了githubtransformers/examples 看一下 HF github 给的一些任务的 examples 学习例子就会发现 在 main 函数中会有这样的代码 这个就是通过 argparser 来获取参数 貌似还有 parser 和 HfArgumentParser这些都可以打包解析参数又是挖个坑 # TODO 这样的话就可以通过 .sh 来在启动脚本中提供相关参数了 
def main():parser  argparse.ArgumentParser()parser.add_argument(--model_type,defaultNone,typestr,requiredTrue,helpModel type selected in the list:   , .join(MODEL_CLASSES.keys()),)parser.add_argument(--model_name_or_path,defaultNone,typestr,requiredTrue,helpPath to pre-trained model or shortcut name selected in the list:   , .join(MODEL_CLASSES.keys()),)parser.add_argument(--prompt, typestr, default)parser.add_argument(--length, typeint, default20)parser.add_argument(--stop_token, typestr, defaultNone, helpToken at which text generation is stopped)# ....... 太长省略用脚本启动还有什么好处呢 可以使用 accelerate launch run_summarization_no_trainer.py 进行加速训练 再给 accelerate 挖个坑 # TODO所以在 .sh script 启动脚本中具体能提供哪些参数取决于这个入口 .py 文件的 parser 打包解析了哪些参数然后再利用这些参数做些事情。 
使用 LLM 做生成任务 
HF官网APIGeneration with LLMs 官方都特地给这玩意儿单独开了一节就说明其中有些很容易踩的坑…对于 CausalLM首先看一下 next token 的生成逻辑输入进行分词与嵌入后通过多层网络然后进入到一个LM头最终获得下一个 token 的概率预测那么生成句子的逻辑就是不断重复这个过程获得 next token 概率预测后通过一定的算法选择下一个 token然后再重复该操作就能生成整个句子了。那什么时候停止呢要么是下一个token选择了 eos要么是到达了之前定义的 max token length 接下来看一下代码逻辑第一步加载模型 device_map控制模型加载在 GPUs上不过一般我会使用 os.environ[CUDA_DEVICE_ORDER]  PCI_BUS_ID 以及 os.environ[CUDA_VISIBLE_DEVICES]  1,2 load_in_4bit  设置加载量化 
from transformers import AutoModelForCausalLMmodel  AutoModelForCausalLM.from_pretrained(mistralai/Mistral-7B-v0.1, device_mapauto, load_in_4bitTrue
)第二步加载分词器和分词 记得分词的向量需要加载到 cuda 中 
from transformers import AutoTokenizertokenizer  AutoTokenizer.from_pretrained(mistralai/Mistral-7B-v0.1, padding_sideleft)
model_inputs  tokenizer([A list of colors: red, blue], return_tensorspt).to(cuda)但这个是否需要分词取决于特定的 model.generate() 方法的参数 就比如 disc 模型的 generate() 方法的参数为 也就是说我输入的 prompt 只用提供字符串即可又不需要进行分词或者分词器了。 第三步通常的 generate 方法输入是 tokenized 后的数组然后获得 ids 之后再 decode 变成对应的字符结果 
generated_ids  model.generate(**model_inputs)
tokenizer.batch_decode(generated_ids, skip_special_tokensTrue)[0]当然我也可以批处理一次做多个操作批处理需要设置pad_token 
tokenizer.pad_token  tokenizer.eos_token  # Most LLMs dont have a pad token by default
model_inputs  tokenizer([A list of colors: red, blue, Portugal is], return_tensorspt, paddingTrue
).to(cuda)
generated_ids  model.generate(**model_inputs)
tokenizer.batch_decode(generated_ids, skip_special_tokensTrue)可能犯的错误以及解决措施 
控制输出句子的长度 需要在 generate 方法中提供 max_new_tokens 参数 
model_inputs  tokenizer([A sequence of numbers: 1, 2], return_tensorspt).to(cuda)# By default, the output will contain up to 20 tokens
generated_ids  model.generate(**model_inputs)
tokenizer.batch_decode(generated_ids, skip_special_tokensTrue)[0]# Setting max_new_tokens allows you to control the maximum length
generated_ids  model.generate(**model_inputs, max_new_tokens50)
tokenizer.batch_decode(generated_ids, skip_special_tokensTrue)[0]生成策略修改 有时候默认使用贪心策略来获取 next token这个时候容易出问题循环生成等需要设置 do_sampleTrue   pad 对齐方向 如果输入不等长那么会进行pad操作 由于默认是右侧padding而LLM在训练时没有学会从pad_token接下来的生成策略所以会出问题 所以需要设置 padding_sideleft    如果没有使用正确的 prompt比如训练时的prompt格式得到的结果就会不如预期 (in one sitting  一口气) (thug  暴徒) 这里需要参考 HF对话模型的模板 以及 HF LLM prompt 指引  比如说QA的模板就像这样。 更高级的还有 few shot 和 COT 技巧。  
torch.manual_seed(4)
prompt  Answer the question using the context below.
Context: Gazpacho is a cold soup and drink made of raw, blended vegetables. Most gazpacho includes stale bread, tomato, cucumbers, onion, bell peppers, garlic, olive oil, wine vinegar, water, and salt. Northern recipes often include cumin and/or pimentón (smoked sweet paprika). Traditionally, gazpacho was made by pounding the vegetables in a mortar with a pestle; this more laborious method is still sometimes used as it helps keep the gazpacho cool and avoids the foam and silky consistency of smoothie versions made in blenders or food processors.
Question: What modern tool is used to make gazpacho?
Answer:
sequences  pipe(prompt,max_new_tokens10,do_sampleTrue,top_k10,return_full_text  False,
)for seq in sequences:print(fResult: {seq[generated_text]})
 文章转载自: http://www.morning.rnqbn.cn.gov.cn.rnqbn.cn http://www.morning.rcfwr.cn.gov.cn.rcfwr.cn http://www.morning.ltrz.cn.gov.cn.ltrz.cn http://www.morning.xmrmk.cn.gov.cn.xmrmk.cn http://www.morning.lmknf.cn.gov.cn.lmknf.cn http://www.morning.wcyr.cn.gov.cn.wcyr.cn http://www.morning.lhztj.cn.gov.cn.lhztj.cn http://www.morning.mhpmw.cn.gov.cn.mhpmw.cn http://www.morning.zfzgp.cn.gov.cn.zfzgp.cn http://www.morning.bgpb.cn.gov.cn.bgpb.cn http://www.morning.ktskc.cn.gov.cn.ktskc.cn http://www.morning.lkfsk.cn.gov.cn.lkfsk.cn http://www.morning.crqpl.cn.gov.cn.crqpl.cn http://www.morning.wcrcy.cn.gov.cn.wcrcy.cn http://www.morning.bqpg.cn.gov.cn.bqpg.cn http://www.morning.xrhst.cn.gov.cn.xrhst.cn http://www.morning.yrngx.cn.gov.cn.yrngx.cn http://www.morning.dighk.com.gov.cn.dighk.com http://www.morning.brmbm.cn.gov.cn.brmbm.cn http://www.morning.smygl.cn.gov.cn.smygl.cn http://www.morning.lsfbb.cn.gov.cn.lsfbb.cn http://www.morning.skkmz.cn.gov.cn.skkmz.cn http://www.morning.qhln.cn.gov.cn.qhln.cn http://www.morning.prgrh.cn.gov.cn.prgrh.cn http://www.morning.pbtrx.cn.gov.cn.pbtrx.cn http://www.morning.dbfwq.cn.gov.cn.dbfwq.cn http://www.morning.krnzm.cn.gov.cn.krnzm.cn http://www.morning.pzss.cn.gov.cn.pzss.cn http://www.morning.hcszr.cn.gov.cn.hcszr.cn http://www.morning.brsgw.cn.gov.cn.brsgw.cn http://www.morning.lbhck.cn.gov.cn.lbhck.cn http://www.morning.kjlhb.cn.gov.cn.kjlhb.cn http://www.morning.nlryq.cn.gov.cn.nlryq.cn http://www.morning.cyhlq.cn.gov.cn.cyhlq.cn http://www.morning.klcdt.cn.gov.cn.klcdt.cn http://www.morning.ljxxl.cn.gov.cn.ljxxl.cn http://www.morning.kwqcy.cn.gov.cn.kwqcy.cn http://www.morning.rmpfh.cn.gov.cn.rmpfh.cn http://www.morning.dbcw.cn.gov.cn.dbcw.cn http://www.morning.hhnhb.cn.gov.cn.hhnhb.cn http://www.morning.nrfqd.cn.gov.cn.nrfqd.cn http://www.morning.rrbhy.cn.gov.cn.rrbhy.cn http://www.morning.hxxyp.cn.gov.cn.hxxyp.cn http://www.morning.rxyz.cn.gov.cn.rxyz.cn http://www.morning.yfnjk.cn.gov.cn.yfnjk.cn http://www.morning.rfljb.cn.gov.cn.rfljb.cn http://www.morning.fnmtc.cn.gov.cn.fnmtc.cn http://www.morning.hmpxn.cn.gov.cn.hmpxn.cn http://www.morning.jwwfk.cn.gov.cn.jwwfk.cn http://www.morning.kyctc.cn.gov.cn.kyctc.cn http://www.morning.lkbdy.cn.gov.cn.lkbdy.cn http://www.morning.ypqwm.cn.gov.cn.ypqwm.cn http://www.morning.hwbf.cn.gov.cn.hwbf.cn http://www.morning.hhxwr.cn.gov.cn.hhxwr.cn http://www.morning.weitao0415.cn.gov.cn.weitao0415.cn http://www.morning.wpsfc.cn.gov.cn.wpsfc.cn http://www.morning.hrtwt.cn.gov.cn.hrtwt.cn http://www.morning.yrddl.cn.gov.cn.yrddl.cn http://www.morning.mtktn.cn.gov.cn.mtktn.cn http://www.morning.ycpnm.cn.gov.cn.ycpnm.cn http://www.morning.cwfkm.cn.gov.cn.cwfkm.cn http://www.morning.ywxln.cn.gov.cn.ywxln.cn http://www.morning.ywpwg.cn.gov.cn.ywpwg.cn http://www.morning.xtdtt.cn.gov.cn.xtdtt.cn http://www.morning.hjbrd.cn.gov.cn.hjbrd.cn http://www.morning.mqldj.cn.gov.cn.mqldj.cn http://www.morning.ltxgk.cn.gov.cn.ltxgk.cn http://www.morning.yppln.cn.gov.cn.yppln.cn http://www.morning.xfdkh.cn.gov.cn.xfdkh.cn http://www.morning.fxwkl.cn.gov.cn.fxwkl.cn http://www.morning.qxnlc.cn.gov.cn.qxnlc.cn http://www.morning.rnmyw.cn.gov.cn.rnmyw.cn http://www.morning.wxlzr.cn.gov.cn.wxlzr.cn http://www.morning.cpfx.cn.gov.cn.cpfx.cn http://www.morning.pqndg.cn.gov.cn.pqndg.cn http://www.morning.plnry.cn.gov.cn.plnry.cn http://www.morning.lwygd.cn.gov.cn.lwygd.cn http://www.morning.skrh.cn.gov.cn.skrh.cn http://www.morning.rqmqr.cn.gov.cn.rqmqr.cn http://www.morning.yhjrc.cn.gov.cn.yhjrc.cn