GLiNER2模型训练教程:10行代码微调自己的NER与分类模型
【免费下载链接】GLiNER2Unified Schema-Based Information Extraction项目地址: https://gitcode.com/gh_mirrors/gl/GLiNER2
本教程带你从零开始完成GLiNER2 模型训练:只需约 10 行 Python 代码,即可用你自己的数据微调一个NER(命名实体识别)与文本分类模型。GLiNER2 是一个基于 Schema 的统一信息抽取框架,支持实体抽取、情感分类、结构化数据和关系抽取,全程本地运行、隐私安全。
什么是 GLiNER2?为什么适合新手微调?
传统 NER 模型每加一个实体类型就要重新设计标签体系,而 GLiNER2 采用Schema 驱动的设计:推理时你直接告诉模型"我要找哪些实体",训练时只需准备简单的 JSONL 数据。
它有几个对新手特别友好的特点:
- 🎯一套模型多种任务:NER、文本分类、JSON 结构化抽取、关系抽取共用同一个模型
- 💻CPU 友好:推理不需要 GPU,普通笔记本就能跑
- 📦预训练模型丰富:可以直接加载公开检查点再微调,冷启动只需几百条数据
- 🛡️100% 本地处理:数据不出内网,适合隐私敏感场景
💡 想先看效果?可以先阅读 tutorial/2-ner.md 了解 NER 用法,再回来训练。
环境安装:一条命令完成配置
GLiNER2 要求Python 3.10+。训练功能需要安装带train扩展的版本:
pip install "gliner2[train]"安装完成后,核心入口是AutoExtractor(加载模型)和ExtractorTrainer(训练器),源码分别位于 gliner2/training/trainer.py 与 gliner2/training/data.py。
第一步:准备 NER 训练数据(JSONL 格式)
GLiNER2 训练数据是 JSONL 文件,每行一条input+output。NER 数据只需要一个entities字典:实体类型 → 文本中的实体提及列表。
{"input": "John works at Google in California.", "output": {"entities": {"person": ["John"], "company": ["Google"], "location": ["California"]}}} {"input": "Apple released iPhone 15.", "output": {"entities": {"company": ["Apple"], "product": ["iPhone 15"]}}}分类任务则用classifications字段,格式参考 tutorial/8-train_data.md 中的完整示例。
新手提示:
- 实体文本必须精确出现在
input原文中(区分大小写),否则校验会报错 - 建议同时标注 10%~20% 的验证集数据,用于监控训练效果
- 数据不足 500 条时,建议启用 LoRA(见下文进阶章节)
第二步:10 行代码启动 GLiNER2 微调
下面是最小的完整训练流程——加载预训练模型、配置超参数、开始训练:
from gliner2 import AutoExtractor from gliner2.training.trainer import ExtractorTrainer, TrainingConfig # 1. 加载预训练基座模型(span 架构) model = AutoExtractor.from_pretrained("fastino/gliner2-base-v1") # 2. 配置训练参数 config = TrainingConfig( output_dir="./ner_model", num_epochs=10, batch_size=8, encoder_lr=1e-5, task_lr=5e-4 ) # 3. 开始训练:直接传入 JSONL 文件 trainer = ExtractorTrainer(model, config) trainer.train(train_data="train.jsonl")训练器会在验证时自动保存检查点,最优模型保存在./ner_model/best目录(save_best=True时)。完整参数说明见 tutorial/9-training.md。
第三步:加载训练好的模型并测试
训练完成后,用两行代码加载并使用你的 NER 模型:
from gliner2 import AutoExtractor model = AutoExtractor.from_pretrained("./ner_model/best") result = model.extract_entities( "Tim Cook is the CEO of Apple in Cupertino.", ["person", "company", "location"] ) # {'entities': {'person': ['Tim Cook'], 'company': ['Apple'], 'location': ['Cupertino']}}分类微调怎么做?
分类任务的训练方式完全相同,区别只在数据格式。比如训练一个情感分类模型:
{"input": "This laptop has amazing performance!", "output": {"classifications": [{"task": "sentiment", "labels": ["positive", "negative", "neutral"], "true_label": "positive"}]}}推理时改用classify_text方法:
result = model.classify_text("Battery life is terrible.", {"sentiment": ["positive", "negative", "neutral"]}) # {'sentiment': 'negative'}甚至可以在一次训练中混合 NER + 分类 + 关系抽取(多任务训练),让一个模型同时学会所有技能,详见 tutorial/1-classification.md。
进阶:LoRA 高效微调与常见问题排查
显存不够?用 LoRA 只训练 1% 的参数
LoRA(低秩适配)冻结基座模型,只训练少量适配参数,显存占用降低 10~100 倍,且训练出的适配器文件仅 2~10 MB:
config = TrainingConfig( output_dir="./lora_output", num_epochs=10, use_lora=True, # 开启 LoRA lora_r=16, # 秩,常见 8/16/32 lora_alpha=32, # 缩放因子,通常取 2*r task_lr=5e-4 )更实用的玩法是一个基座模型 + 多个领域适配器(法律、医疗、金融各一个),毫秒级热切换,详见 tutorial/10-lora_adapters.md。
常见问题快速排查
| 症状 | 解决方案 |
|---|---|
| 显存溢出 (OOM) | 减小batch_size、开启fp16=True、加gradient_accumulation_steps或改用 LoRA |
| 模型不收敛 | 检查学习率(encoder 1e-5 / task 5e-4 起步),增加num_epochs,确认数据已校验 |
| 校验报错 | 最常见是实体文本与原文不匹配,用dataset.validate()定位具体行 |
| 训练速度慢 | 增大batch_size、启用fp16、降低评估频率eval_steps |
总结与延伸阅读
到这里,你已经掌握了 GLiNER2 模型训练的完整闭环:准备 JSONL 数据 → 10 行代码微调 → 加载测试 → LoRA 优化。几个建议帮你走得更远:
- 先用
max_train_samples=100跑通全流程,再上全量数据 - 生产训练务必开启
eval_strategy="steps"+save_best=True+ 早停 - 领域适配(如医疗 NER)建议降低
encoder_lr到5e-6防止过拟合
更多训练技巧可参考项目内置文档:
- 训练完整指南:tutorial/9-training.md
- 数据格式详解:tutorial/8-train_data.md
- LoRA 适配器实战:tutorial/10-lora_adapters.md
- 训练器源码:gliner2/training/trainer.py
【免费下载链接】GLiNER2Unified Schema-Based Information Extraction项目地址: https://gitcode.com/gh_mirrors/gl/GLiNER2
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考