1 AutoDL安装transformers模型踩坑记录1镜像未生效设置了镜像地址但顺序不对必须在导入 transformers 之前设置导致程序一直强行访问 huggingface.co官方地址 → 网络报错2环境残留 / 客户端关闭多次失败请求把网络连接搞崩 → 报 client has been closed必须重启 Jupyter内核才能重置3 transformers 高版本 BUG使用新版 transformers 存在内部作用域缺陷明明安装并导入了 torch库内部代码却找不到 torch 持续报 NameError: name ‘torch’ is not defined新版库兼容性差必须使用稳定版才能正常运行降低transformers版本解决方案第一步安装稳定版依赖!pip install transformers4.35.2 -i https://pypi.tuna.tsinghua.edu.cn/simple第二步重启 Jupyter 内核第三步运行模型代码importos os.environ[HF_ENDPOINT]https://hf-mirror.comimporttorchfromtransformersimportpipeline pipepipeline(text-classification,modeluer/roberta-base-finetuned-dianping-chinese,device-1,frameworkpt)2 Pipeline数据预处理、模型调用、结果后处理三部分组成的流水线使我们能够直接输入文本得到最终的答案pipepipeline(text-classification,modeluer/roberta-base-finetuned-dianping-chinese,devicecuda)pipeline背后实现1.通过from_pretrained方法加载模型、分词器2.将input输入分词器得到token id3.将token id输入模型得到输出logits4.将logits输入激活函数根据模型config中的对应关系输出结果3 Tokenizer分词 - 构建词典 - 数据转换词转换成token id - batch长度填充与截断fromtransformersimportAutoTokenizer# 加载分词器tokenizerAutoTokenizer.from_pretrained(uer/roberta-base-finetuned-dianping-chinese)# 将分词器保存到本地tokenizer.save_pretrained(./roberta_tokenizer)sen这是一个测试文本# 句子分词tokenstokenizer.tokenize(sen)# 词转换为ididstokenizer.convert_tokens_to_ids(tokens)# id 转换为词tokenstokenizer.convert_ids_to_tokens(ids)# 快捷方式直接编码idstokenizer.encode(sen,add_special_tokensTrue)# 直接解码将id转换为字符串str_sentokenizer.decode(ids,skip_special_tokensFalse)# 填充idstokenizer.encode(sen,paddingmax_length,max_length15)# 截断idstokenizer.encode(sen,max_length5,truncationTrue)# 直接调用输出attention_mask、input_ids、token_type_idsinputstokenizer(sen,paddingmax_length,max_length15)# return_offsets_mapping从 token 结果还原到原文位置例如抽取式问答QA、命名实体识别NER4 Model句子输入后会在句首添加用来表示整句语义的特殊 token——CLSpooler_output就是CLS token 向量经过线性层 激活函数一般为Tanh 得到的代表整句语义的向量专门用来做句子级任务BERT 系编码器 - only、双向 Transformer、预训练任务是MLM掩码语言模型 NSP下一句预测的模型会在开头加CLS TokenBERTRoBERTaDistilBERTElectraALBERTRBT3 / RBT6哈工大中文精简 BERTUER/RoBERTa 系列Ernie百度DeBERTa# 基础编码器模型裸模型,没有加任何model_head# 输出整句向量pooler_output(batch * hidden_size) 最后一层隐状态的token 向量last_hidden_statebatch * seq_len * hidden_sizesen弱小的我也有大梦想tokenizerAutoTokenizer.from_pretrained(hfl/rbt3)inputstokenizer(sen,return_tensorspt)outputmodel(**inputs)# 添加model_head# 本质为先调用基础模型,再添加了一个线性层输入句子的pooler_output,输出若干个分类分数num_labelsfromtransformersimportAutoModelForSequenceClassification clz_modelAutoModelForSequenceClassification.from_pretrained(hfl/rbt3)5 DatasetsDatasets 相比自定义 torch Dataset提供了开箱即用的分词、批处理、多进程、缓存、切分、过滤等完整工具链代码更少、速度更快、内存更省、与 Hugging Face 生态完全无缝。# 加载数据集fromdatasetsimportload_dataset datasetsload_dataset(madao33/new-title-chinese)# DatasetDict# 加载数据集某项任务boolq_datasetload_dataset(super_glue,boolq)# DatasetDict# 按照数据集划分可以指定数据的比例或者范围加载数据集# Dataset({features:[title,content],num_rows:5850})datasetload_dataset(madao33/new-title-chinese,splittrain)# 查看数据集DatasetDictdatasets[train][0]# 查看原始数据集列名datasets[train].column_names# 数据集划分# DatasetDict(num_rows: train - 90%, test - 10%)dataset.train_test_split(test_size0.1)# 分层抽样保证训练集 / 测试集 两边的标签比例完全一样例如正面、中性、负面 标签dataset.train_test_split(test_size0.1,stratify_by_columnlabel)# 数据选取与过滤datasets[train].select([0,1])filter_datasetdatasets[train].filter(lambdaexample:中国inexample[title])# 数据映射defadd_prefix(example):example[title]Prefix: example[title]returnexample prefix_datasetdatasets.map(add_prefix)defpreprocess_function(example,tokenizertokenizer):model_inputstokenizer(example[content],max_length512,truncationTrue)labelstokenizer(example[title],max_length32,truncationTrue)# label就是title编码的结果model_inputs[labels]labels[input_ids]returnmodel_inputs# 并行处理、批量处理、移除dataset原数据列processed_datasetsdatasets.map(preprocess_function,num_proc4,batchedTrue,remove_columnsdatasets[train].column_names)# 保存数据processed_datasets.save_to_disk(./processed_data)# 加载数据processed_datasetsload_from_disk(./processed_data)#加载本地数据集文件/文件夹,data_files可以传入文件名称或者数组datasetload_dataset(csv,data_files./ChnSentiCorp_htl_all.csv,splittrain)datasetDataset.from_csv(./ChnSentiCorp_htl_all.csv)datasetDataset.from_pandas(data)datasetDataset.from_list(data)6 Evalautemetric 算模型准不准分数comparison 比较两个模型差是否显著measurement 测文本 / 模型属性# 查看evalaute支持的评估函数evaluate.list_evaluation_modules(with_detailsTrue)# 加载评估模型accuracyevaluate.load(accuracy)# 评估模型计算resultsaccuracy.compute(references[0,1,2,0,1,2],predictions[0,1,1,2,1,0])# 迭代计算accuracyevaluate.load(accuracy)forrefs,predsinzip([[0,1],[0,1]],[[1,0],[0,1]]):accuracy.add_batch(referencesrefs,predictionspreds)accuracy.compute()# 多个评估指标计算clf_metricsevaluate.combine([accuracy,f1,recall,precision])# 评估结果可视化fromevaluate.visualizationimportradar_plot plotradar_plot(datadata,model_namesmodel_names)7 TrainerfromtransformersimportTrainer,TrainingArguments train_argsTrainingArguments(output_dir./checkpoints,# 模型输出文件夹per_device_train_batch_size64,# 训练时的batch_sizeper_device_eval_batch_size128,# 验证时的batch_sizelogging_steps10,# log 打印的频率evaluation_strategyepoch,# 评估策略save_strategyepoch,# 保存策略save_total_limit3,# 最大保存数learning_rate2e-5,# 学习率weight_decay0.01,# weight_decaymetric_for_best_modelf1,# 设定评估指标load_best_model_at_endTrue)# 训练完成后加载最优模型trainerTrainer(modelmodel,argstrain_args,train_datasettokenized_datasets[train],eval_datasettokenized_datasets[test],data_collatorDataCollatorWithPadding(tokenizertokenizer),compute_metricseval_metric)# 开始训练trainer.train()参考【手把手带你实战HuggingFace Transformers-入门篇】