新闻详情

新闻详情

首页 / 资讯中心 / 详情

使用 Accelerate 微调 (m)LUKE 进行 Token 分类任务:NER、POS 与 Chunking 实战指南

发布时间:2026/9/25 3:43:22来源:尧图网络
使用 Accelerate 微调 (m)LUKE 进行 Token 分类任务:NER、POS 与 Chunking 实战指南
推理引擎大模型【免费下载链接】FlexGenRunning large language models on a single GPU for throughput-oriented scenarios.项目地址https://gitcode.com/gh_mirrors/fl/FlexGen点击查看免费下载LUKELanguage Understanding with Knowledge-based Embeddings是一种融合了实体感知entity-aware能力的 Transformer 模型其设计目标是在命名实体识别NER、词性标注POS和短语抽取CHUNK等 Token 分类任务上取得更强的表现。本文基于 benchmark/third_party/transformers/examples/research_projects/luke/README.md 的官方示例结合仓库内的完整训练脚本与底层源码系统讲解如何在不使用 Trainer 的前提下借助 Accelerate 库微调 (m)LUKE 完成 Token 分类任务。读完本文你将掌握单机单卡、多卡分布式、CPU 与 TPU 环境下统一的微调命令理解 LUKE 实体序列的数据构造原理并能直接运行仓库中的 run_luke_ner_no_trainer.py 训练脚本。一、任务概述为什么用 LUKE 做 Token 分类传统 BERT 类模型将文本视为纯词元序列而 LUKE 在此基础上引入了一个实体序列entity sequence每一个被标记的实体跨度span都会被抽取为一个实体表示与词元序列并行输入模型。在微调阶段模型的任务变成对“所有可能出现的实体跨度”进行分类而不再是对单个词元进行分类。这一设计使得 NER、POS、CHUNKS 等任务可以被统一建模为**实体跨度分类entity span classification**问题。本文关联的示例脚本 run_luke_ner_no_trainer.py 支持三类任务ner命名实体识别如识别人名PER、地名LOC、组织ORG等pos词性标注Part-of-Speech taggingchunk短语抽取phrase extraction / chunking。脚本既可加载 Hugging Face Hub 上托管的公开数据集如 CoNLL2003也支持传入自己的 CSV/JSON 训练与验证文件只需要在数据预处理环节做少量适配例如调整列名映射逻辑见parse_args中对text_column_name、label_column_name的处理。该脚本核心特点是不依赖Trainer而是使用 Accelerate 库统一处理设备放置、混合精度与分布式并行因此同一份训练代码天然兼容 CPU、单 GPU、多 GPU单节点或多节点以及 TPU 环境。注意Accelerate 库当时仍处于 alpha 版本遇到问题可以向社区反馈运行时请确保datasets1.8.0脚本通过require_version做了显式校验。二、环境准备与安装训练脚本依赖datasets、torch、transformers以及accelerate。首先安装 Acceleratepip install githttps://github.com/huggingface/accelerate若datasets版本过低可按脚本 第 53 行 的提示安装 token 分类示例所需的依赖pip install -r examples/pytorch/token-classification/requirements.txt安装完成后建议先执行accelerate config交互式配置运行环境回答是否使用分布式、显存规模、混合精度等问题再执行accelerate test验证训练环境就绪最后用accelerate launch启动训练。三、直接运行脚本在 CoNLL2003 上微调 LUKE最简单的方式是直接运行脚本此时它会使用torch.distributed.launch/python之外的原生入口在单设备上完成训练。以下命令在 CoNLL2003 数据集上微调 LUKE-base 做 NERexport TASK_NAMEner python run_luke_ner_no_trainer.py \ --model_name_or_path studio-ousia/luke-base \ --dataset_name conll2003 \ --task_name $TASK_NAME \ --max_length 128 \ --per_device_train_batch_size 32 \ --learning_rate 2e-5 \ --num_train_epochs 3 \ --output_dir /tmp/$TASK_NAME/关键参数含义完整参数列表见脚本parse_args参数默认值说明--model_name_or_path必填预训练模型路径或 Hub 上的模型标识符如studio-ousia/luke-base、studio-ousia/luke-large多语言版本为studio-ousia/mluke-base等--dataset_nameNone通过datasets库加载的公开数据集名称--task_namener任务类型可选ner、pos、chunk--max_length128词元序列最大长度超长截断配合--pad_to_max_length时短序列补齐--max_entity_length32实体序列最大长度仅 (m)LUKE 使用超长截断--max_mention_length30单个实体跨度mention内的最大词元数仅 (m)LUKE 使用--per_device_train_batch_size8每个设备上的训练 batch size--per_device_eval_batch_size8每个设备上的验证 batch size--learning_rate5e-5初始学习率--weight_decay0.0权重衰减仅作用于非 bias/非 LayerNorm 参数--num_train_epochs3训练轮数若指定--max_train_steps则以其为准--max_train_stepsNone总训练步数指定后覆盖num_train_epochs--gradient_accumulation_steps1梯度累积步数--lr_scheduler_typelinear学习率调度器可选linear、cosine、cosine_with_restarts、polynomial、constant、constant_with_warmup--num_warmup_steps0学习率 warmup 步数--output_dirNone最终模型保存目录--seedNone随机种子保证可复现--label_all_tokensFalse将所有特殊 token 的标签置为 -100PyTorch 自动忽略--return_entity_level_metricsFalse是否返回实体级per-entity type指标而非仅总体指标--pad_to_max_lengthFalse是否将所有样本填充到max_length否则使用动态填充--train_file/--validation_fileNone自定义 CSV/JSON 训练/验证文件--text_column_name/--label_column_nameNone自定义文件中的文本列与标签列名--push_to_hub/--hub_model_id/--hub_tokenFalse/None/None是否将模型推送至 Hub 及仓库相关配置脚本在启动前还会做若干健全性检查sanity checks必须提供task_name或训练/验证文件自定义文件扩展名必须是csv或json启用--push_to_hub时必须同时指定--output_dir。四、在分布式、TPU 与混合精度环境下运行脚本支持在分布式环境单节点或多节点、TPU 以及混合精度FP16场景下运行。推荐流程是运行accelerate config并按提示回答问题生成配置文件运行accelerate test验证环境一切就绪使用accelerate launch启动训练export TASK_NAMEner accelerate launch run_ner_no_trainer.py \ --model_name_or_path studio-ousia/luke-base \ --dataset_name conll2003 \ --task_name $TASK_NAME \ --max_length 128 \ --per_device_train_batch_size 32 \ --learning_rate 2e-5 \ --num_train_epochs 3 \ --output_dir /tmp/$TASK_NAME/同一命令可无缝适用于以下所有环境纯 CPU 环境单 GPU 环境多 GPU 分布式训练单节点或多节点TPU 训练。这些能力来自Accelerator的统一抽象脚本中通过Accelerator(kwargs_handlers[handler])初始化加速器其中handler DistributedDataParallelKwargs(find_unused_parametersTrue)确保实体分类模型在 DDP 包装下不会因存在未使用参数而报错见 run_luke_ner_no_trainer.py 第 234-235 行。之后模型、优化器与两个 DataLoader 统一交给accelerator.prepare()处理设备放置accelerator.backward(loss)负责跨设备梯度同步。在训练流程内部脚本还做了如下工程化处理使用accelerator.is_local_main_process控制日志输出每台机器只打印一次使用accelerator.main_process_first()保证数据集预处理只在主进程执行一次使用accelerator.wait_for_everyone()在保存模型前同步所有进程每个 epoch 结束时打印seqeval计算的 precision / recall / F1 / accuracy若加--return_entity_level_metrics则打印各实体类型的细分指标训练与验证的进度条由tqdm渲染仅在主进程显示。五、数据加载与 LUKE 实体序列构造源码级解析脚本支持两种数据来源Hub 数据集load_dataset(args.dataset_name, args.dataset_config_name)如conll2003自定义文件CSV/JSON 文件经load_dataset(extension, data_filesdata_files)加载其中文本列默认取名为tokens的列否则取第一列标签列默认取名为{task_name}_tags的列例如ner_tags可通过--text_column_name/--label_column_name覆盖。数据构造的独特之处在于三个连续的map变换均在accelerator.main_process_first()中批量执行第一步添加句子边界。compute_sentence_boundaries_for_luke将每个样本的句子边界记录为[0, len(tokens)]用于后续截断时定位上下文结束位置。第二步枚举实体跨度并构造标签。compute_entity_spans_for_luke是理解 LUKE 微调的关键函数run_luke_ner_no_trainer.py 第 396-470 行先将每个词按子词subword长度统计若总子词长度超过max_length - 2预留 2 个特殊 token则从句子末尾向前截断把词序列重新拼接成带字符位置的文本记录每个词的字符级起止位置并建立“字符跨度 → 标签”的映射表枚举所有“可能的实体跨度”起始词 i 到结束词 j只要该跨度的子词总数不超过tokenizer.max_mention_length且实体总数未超过tokenizer.max_entity_length就加入候选集合若该跨度恰好命中已标注实体则取其标签否则标签置 0对应O标签即非实体输出entity_spans字符级跨度、text重建文本、labels_entity_spans每个跨度的标签与original_entity_spans词级跨度供后处理还原。第三步分词与标签对齐。tokenize_and_align_labels调用带entity_spans参数的 tokenizer生成entity_ids、entity_attention_mask、entity_token_type_ids、entity_position_ids等实体序列输入并按--pad_to_max_length决定是定长填充填充值分别为 -100、(-1,-1) 与 -1还是动态截断到max_entity_length。底层的实体序列生成逻辑位于 tokenization_luke.pyLukeTokenizer继承自RobertaTokenizer额外维护max_entity_length默认 32与max_mention_length默认 30两个参数当taskentity_span_classification时_encode_plus会要求entity_spans必须是「字符起止位置的元组列表」并据此为每个跨度分配[MASK]实体 token idtokenization_luke.py 第 745-755 行。tokenizer 在截断实体序列时同样遵循max_entity_length上限并在 padding 阶段将entity_position_ids补齐为max_mention_length长度的序列tokenization_luke.py 第 1244-1370 行。自定义数据集的适配建议若使用自有数据只需保证 CSV/JSON 文件包含“词元列表”与“标签列表”两列并可通过参数指定列名如需更复杂的预处理如按句拆分、清洗可在compute_entity_spans_for_luke的循环内自行扩展。六、动态填充与批处理DataCollatorForLukeTokenClassification数据预处理完成后脚本依据是否启用--pad_to_max_length选择两种 collator若已定长填充则直接使用transformers的default_data_collator否则使用仓库自带的DataCollatorForLukeTokenClassification定义于 luke_utils.py实现动态填充tokenizer.pad将每个 batch 填充到最长序列长度当使用 FP16 混合精度时传入pad_to_multiple_of8run_luke_ner_no_trainer.py 第 542-544 行使所有张量对齐到 8 的倍数从而在 NVIDIA 计算能力 ≥ 7.5Volta 及之后的硬件上启用 Tensor Cores。该 collator 还负责标签类张量的动态填充labels与ner_tags分别以 -100 与 -1 填充-100 会被 PyTorch 交叉熵损失自动忽略original_entity_spans以(-1, -1)元组填充供验证阶段还原真实跨度最终所有键entity_ids、ner_tags、original_entity_spans等统一转换为torch.int64张量。辅助函数padding_tensorluke_utils.py 第 12-30 行支持标量或元组两种填充值并遵循 tokenizer 的padding_side左/右方向填充is_punctuation用于在重建文本时判断是否需要在词前去掉空格如撇号、标点粘连场景。七、模型结构实体跨度分类头的工作原理脚本加载的是LukeForEntitySpanClassification定义于 modeling_luke.py 第 1656 行它由 LUKE 主干 分类头组成主干LukeModel同时接收词元序列与实体序列输出两者的隐藏状态分类头为nn.Linear(config.hidden_size * 3, config.num_labels)将三类向量拼接后投影到标签空间modeling_luke.py 第 1660-1667 行实体起点词元的隐藏状态start_states通过torch.gather按entity_start_positions抽取实体终点词元的隐藏状态end_states按entity_end_positions抽取实体序列中该跨度的隐藏状态entity_last_hidden_state 三者拼接后经 dropout 与线性层得到每个候选跨度的分类 logits。从源码可见 LUKE 的实体感知注意力机制modeling_luke.py 第 515-574 行当启用use_entity_aware_attention时注意力层会分别计算 word-to-wordw2w、word-to-entityw2e、entity-to-worde2w、entity-to-entitye2e四组 query/key 矩阵再将注意力分数合并使词元与实体在每一层 Transformer 中都能互相感知。这正是 LUKE 相比纯词元模型在 NER 任务上更具优势的底层原因。微调时的标签形状为(batch_size, entity_length)使用交叉熵损失nn.functional.cross_entropy对每个候选实体跨度进行分类modeling_luke.py 第 1768-1776 行若标签为三维则自动切换为多标签二分类损失。八、训练循环、指标评估与模型保存训练循环由脚本显式实现run_luke_ner_no_trainer.py 第 643-708 行训练阶段优化器将参数分为两组——含bias与LayerNorm.weight的参数不做权重衰减其余参数应用--weight_decay使用AdamW优化器与get_scheduler创建的 LR 调度器默认 linear。损失除以gradient_accumulation_steps后调用accelerator.backward按累积步数执行optimizer.step()与lr_scheduler.step()。每个 epoch 内_ batch.pop(original_entity_spans)将该键从训练 batch 中移除训练不需要跨度位置。验证阶段模型置为eval()并在torch.no_grad()下前向随后用get_luke_labels将输出还原为标签序列——对每个跨度的 logits 取 argmax 得到预测类别跳过类别 0O标签的预测再按置信度从高到低将跨度标签回填到词级序列上处理 B- 与 I- 前缀的连贯性与真实标签一并交给seqeval计算指标。保存与推送训练结束时accelerator.wait_for_everyone()同步各进程accelerator.unwrap_model(model)解包 DDP 包装后调用save_pretrained保存模型主进程额外保存 tokenizer若启用--push_to_hub则通过Repository在训练中每个 epoch 后与结束时将模型推送到 Hub。九、快速调试与实战建议小规模验证加--debug参数脚本会把每个 split 截取前 100 条样本适合快速验证脚本可运行性run_luke_ner_no_trainer.py 第 291-293 行。可复现性通过--seed设置随机种子set_seed会同步固定 torch / numpy / random 等模块的种子。实体级指标NER 场景建议加--return_entity_level_metrics以观察 PER / LOC / ORG 等各实体类别的 precision、recall、F1而不只是总体分数。显存优化在显存受限时减小--per_device_train_batch_size并增大--gradient_accumulation_steps等效总 batch size per_device_train_batch_size × num_processes × gradient_accumulation_steps脚本启动时会在日志中打印该值。多语言场景将--model_name_or_path替换为多语言版studio-ousia/mluke-*系列检查点即可对非英文语料微调。关闭实体感知注意力若在特殊场景下需要退化为纯词元行为可在LukeConfig中设置use_entity_aware_attentionFalse源码在 modeling_luke.py 第 518 行 读取该配置。十、关联源码与扩展阅读示例脚本主体run_luke_ner_no_trainer.py自定义 collator 与工具函数luke_utils.pyLUKE 模型实现含LukeForEntitySpanClassification、LukeForTokenClassification与实体感知注意力modeling_luke.pyLUKE tokenizer实体序列生成与 padding/截断逻辑tokenization_luke.pyLUKE 模型配置类num_labels、use_entity_aware_attention等configuration_luke.py本文所引用的全部脚本、工具函数与模型源码均位于当前仓库的benchmark/third_party/transformers/目录下可直接阅读源码深入理解每一步实现。若需将模型权重从原始 LUKE 仓库转换到 Transformers 格式可参考 convert_luke_original_pytorch_checkpoint_to_pytorch.py 与多语言版 convert_mluke_original_pytorch_checkpoint_to_pytorch.py。赞分享推理引擎大模型【免费下载链接】FlexGenRunning large language models on a single GPU for throughput-oriented scenarios.项目地址https://gitcode.com/gh_mirrors/fl/FlexGen点击查看免费下载相关推荐CANN/oam-tools HCCL测试工具HCCL Test HCCL Test provides HCCL communication performance and correctness test推理引擎大模型FlexGen 仓库中的 Transformers Token 分类微调实战NER/POS/CHUNKS 双脚本全解析FlexGen 仓库中的 Transformers Token 分类微调实战NER/POS/CHUNKS 双脚本全解析 导读 本文围绕 FlexGen 仓库中推理引擎大模型Nexa SDK实用指南一条命令本地跑AI模型NPU/GPU/CPU三种后端任选Nexa SDK实用指南一条命令本地跑AI模型NPU/GPU/CPU三种后端任选 想在设备上本地跑AI模型又不想折腾环境Nexa SDK 把模型下载、格人工智能大模型推理引擎本地部署多模态上一篇终极GPS追踪指南5分钟掌握Traccar开源系统的完整功能下一篇如何用React Native Elements打造令人惊艳的美食推荐系统界面完整设计指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

macOS上PyG报错symbol not found?PyTorch版本匹配排查指南 2026/9/25 4:18:59

macOS上PyG报错symbol not found?PyTorch版本匹配排查指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
深入Linux USB协议栈:从URB机制到驱动调试的完整指南 2026/9/25 4:18:53

深入Linux USB协议栈:从URB机制到驱动调试的完整指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Struts2登录注册与用户信息管理系统:从SSH架构到漏洞避坑实战 2026/9/25 4:18:53

Struts2登录注册与用户信息管理系统:从SSH架构到漏洞避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
STM32CubeMX与Keil5联合开发环境搭建全攻略:从零安装到点灯 2026/9/25 4:18:53

STM32CubeMX与Keil5联合开发环境搭建全攻略:从零安装到点灯

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
从零手写C语言FFT:原理、实现与误差分析 2026/9/25 4:18:53

从零手写C语言FFT:原理、实现与误差分析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Nunjucks 快速上手指南:从 Node.js 到浏览器的安装、配置与渲染实践 2026/9/25 4:18:47

Nunjucks 快速上手指南:从 Node.js 到浏览器的安装、配置与渲染实践

模板引擎 【免费下载链接】nunjucks A powerful templating engine with inheritance, asynchronous control, and more (jinja2 inspired) 项目地址: https://gitcode.com/gh_mirrors/nu/nunjucks 点击查看 免费下载 本指南围绕 docs/fr/getting-started.md 的核心…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉