bert4keras
bert4keras 是一个专为 Keras 用户打造的轻量级 Transformer 模型库,旨在用清晰、简洁的代码实现 BERT、RoBERTa、ALBERT、T5、GPT 等主流预训练模型的加载与应用。它解决了开发者在 Keras 框架下灵活定制和微调复杂 Transformer 架构时面临的代码冗余与环境兼容难题,让结合前沿 NLP 技术与经典深度学习框架变得更加顺畅。
该项目非常适合需要快速验证想法的 AI 研究人员、希望深入理解模型内部机制的开发者,以及需要在生产环境中进行模型微调的工程团队。无论是从零开始预训练,还是基于现有权重进行下游任务适配,bert4keras 都提供了丰富的示例代码和完善的文档支持。
其独特亮点在于极高的灵活性与广泛的兼容性:不仅支持 Google 原版及多个中文社区优化版的模型权重,还完美适配 TensorFlow 1.x 与 2.x 环境(包括 tf.keras)。此外,项目持续更新,近期优化了显存占用并提升了在高性能显卡上的训练速度,同时支持 TPU 和多 GPU 分布式训练,是连接学术研究与工程落地的实用桥梁。
使用场景
某金融科技公司算法团队需要在 TensorFlow 1.x 环境下,快速将哈工大版的 RoBERTa 模型迁移至内部 Keras 架构中,以构建高精度的中文舆情情感分析系统。
没有 bert4keras 时
- 代码耦合严重:官方原生实现多基于 PyTorch 或复杂的 TF Estimator,强行嵌入现有 Keras 项目需重写大量底层算子,维护成本极高。
- 权重加载繁琐:不同来源(如 brightmart、哈工大)的预训练权重格式不一,手动编写转换脚本极易出错,且难以兼容 Google 原版 BERT 结构。
- 定制开发困难:若需修改 Attention Mask 机制或调整 Seq2Seq 结构,往往需要深入源码修改核心逻辑,缺乏清晰的扩展接口。
- 环境适配痛苦:在 TensorFlow 1.14 与 Keras 2.3.1 的特定组合下,常遇到版本冲突导致的显存溢出或算子不兼容问题。
使用 bert4keras 后
- 无缝集成架构:bert4keras 提供清爽的 Keras 原生实现,仅需几行代码即可加载哈工大 RoBERTa 权重并嵌入现有流水线,无需重构底层。
- 统一权重支持:内置对 Google BERT、哈工大 RoBERTa、NEZHA 等十余种主流模型权重的直接加载支持,自动处理格式差异,消除转换痛点。
- 灵活定制模型:通过清晰的代码结构,开发人员可轻松修改 Attention Mask 或添加自定义层,快速实现针对金融文本的特殊序列建模需求。
- 性能与稳定兼得:针对低精度运算和显存占用进行了专门优化(如合并 Mask 算子),在 A100 等显卡上训练速度显著提升且运行稳定。
bert4keras 通过极简的代码设计打通了预训练模型与 Keras 生态的壁垒,让复杂模型的微调与定制变得像搭积木一样高效直观。
运行环境要求
- 未说明
- 非必需,但支持多 GPU 和 TPU 加速
- 2023 年更新提及在 A100 上测试通过,显存占用已优化,具体需求视模型大小(Base/Large)而定
未说明

快速开始
bert4keras
- 我们对bert的轻量级keras实现
- 更清晰、更轻量级的keras版bert
- 个人博客:https://kexue.fm/
- 在线文档:http://bert4keras.spaces.ac.cn/ (还在构建中)
说明
这是笔者重新实现的keras版的transformer模型库,致力于用尽可能清爽的代码来实现结合transformer和keras。
本项目的初衷是为了修改、定制上的方便,所以可能会频繁更新。
因此欢迎star,但不建议fork,因为你fork下来的版本可能很快就过期了。
功能
目前已经实现:
- 加载bert/roberta/albert的预训练权重进行finetune;
- 实现语言模型、seq2seq所需要的attention mask;
- 丰富的examples;
- 从零预训练代码(支持TPU、多GPU,请看pretraining);
- 兼容keras、tf.keras
使用
安装稳定版:
pip install bert4keras
安装最新版:
pip install git+https://www.github.com/bojone/bert4keras.git
使用例子请参考examples目录。
之前基于keras-bert给出的例子,仍适用于本项目,只需要将bert_model的加载方式换成本项目的。
理论上兼容Python2和Python3,兼容tensorflow 1.14+和tensorflow 2.x,实验环境是Python 2.7、Tesorflow 1.14+以及Keras 2.3.1(已经在2.2.4、2.3.0、2.3.1、tf.keras下测试通过)。
为了获得最好的体验,建议你使用Tensorflow 1.14 + Keras 2.3.1组合。
关于环境组合
支持tf+keras和tf+tf.keras,后者需要提前传入环境变量TF_KERAS=1。
当使用tf+keras时,建议2.2.4 <= keras <= 2.3.1,以及 1.14 <= tf <= 2.2,不能使用tf 2.3+。
keras 2.4+可以用,但事实上keras 2.4.x基本上已经完全等价于tf.keras了,因此如果你要用keras 2.4+,倒不如直接用tf.keras。
当然,乐于贡献的朋友如果发现了某些bug的话,也欢迎指出修正甚至Pull Requests~
权重
目前支持加载的权重:
- Google原版bert: https://github.com/google-research/bert
- brightmart版roberta: https://github.com/brightmart/roberta_zh
- 哈工大版roberta: https://github.com/ymcui/Chinese-BERT-wwm
- Google原版albert[例子]: https://github.com/google-research/ALBERT
- brightmart版albert: https://github.com/brightmart/albert_zh
- 转换后的albert: https://github.com/bojone/albert_zh
- 华为的NEZHA: https://github.com/huawei-noah/Pretrained-Language-Model/tree/master/NEZHA-TensorFlow
- 华为的NEZHA-GEN: https://github.com/huawei-noah/Pretrained-Language-Model/tree/master/NEZHA-Gen-TensorFlow
- 自研语言模型: https://github.com/ZhuiyiTechnology/pretrained-models
- T5模型: https://github.com/google-research/text-to-text-transfer-transformer
- GPT_OpenAI: https://github.com/bojone/CDial-GPT-tf
- GPT2_ML: https://github.com/imcaspar/gpt2-ml
- Google原版ELECTRA: https://github.com/google-research/electra
- 哈工大版ELECTRA: https://github.com/ymcui/Chinese-ELECTRA
- CLUE版ELECTRA: https://github.com/CLUEbenchmark/ELECTRA
- LaBSE(多国语言BERT): https://github.com/bojone/labse
- Chinese-GEN项目下的模型: https://github.com/bojone/chinese-gen
- T5.1.1: https://github.com/google-research/text-to-text-transfer-transformer/blob/master/released_checkpoints.md#t511
- Multilingual T5: https://github.com/google-research/multilingual-t5/
注意事项
- 注1:brightmart版albert的开源时间早于Google版albert,这导致早期brightmart版albert的权重与Google版的不完全一致,换言之两者不能直接相互替换。为了减少代码冗余,bert4keras的0.2.4及后续版本均只支持加载Google版以brightmart版中带Google字眼的权重。如果要加载早期版本的权重,请用0.2.3版本,或者考虑作者转换过的albert_zh。
- 注2:下载下来的ELECTRA权重,如果没有json配置文件的话,参考这里自己改一个(需要加上
type_vocab_size字段)。
更新
- 2023.03.06: 无穷大改np.inf;优化显存占用。将无穷大改为np.inf,运算更加准确,而且在低精度运算时不容易出错;同时合并了若干mask算子,减少了显存占用。实测在A100上训练base和large级别模型时,速度有明显加快,显存占用也有降低。
- 2022.03.20: 增加RoFormerV2。
- 2022.02.28: 增加GatedAttentionUnit。
- 2021.04.23: 增加GlobalPointer。
- 2021.03.23: 增加RoFormer。
- 2021.01.30: 发布0.9.9版,完善多GPU支持,增加多GPU例子:task_seq2seq_autotitle_multigpu.py。
- 2020.12.29: 增加
residual_attention_scores参数来实现RealFormer,只需要在build_transformer_model中传入参数residual_attention_scores=True启用。 - 2020.12.04:
PositionEmbedding引入层次分解,可以让BERT直接处理超长文本,在build_transformer_model中传入参数hierarchical_position=True启用。 - 2020.11.19: 支持GPT2模型,参考CPM_LM_bert4keras项目。
- 2020.11.14: 新增分参数学习率
extend_with_parameter_wise_lr,可用于给每层设置不同的学习率。 - 2020.10.27: 支持T5.1.1和Multilingual T5。
- 2020.08.28: 支持GPT_OpenAI。
- 2020.08.22: 新增
WebServing类,允许简单地将模型转换为Web接口,详情请参考该类的说明。 - 2020.07.14:
Transformer类加入prefix参数;snippets.py引入to_array函数;AutoRegressiveDecoder修改rtype='logits'时的一个隐藏bug。 - 2020.06.06: 强迫症作祟:将
Tokenizer原来的max_length参数重命名为maxlen,同时保留向后兼容性,建议大家用新参数名。 - 2020.04.29: 增加重计算(参考keras_recompute),可以通过时间换空间,通过设置环境变量
RECOMPUTE=1启用。 - 2020.04.25: 优化tf2下的表现。
- 2020.04.16: 所有example均适配tensorflow 2.0。
- 2020.04.06: 增加UniLM预训练模式(测试中)。
- 2020.04.06: 完善
rematch方法。 - 2020.04.01:
Tokenizer增加rematch方法,给出分词结果与原序列的映射关系。 - 2020.03.30: 尽量统一py文件的写法。
- 2020.03.25: 支持ELECTRA。
- 2020.03.24: 继续加强
DataGenerator,允许传入迭代器时进行局部shuffle。 - 2020.03.23: 增加调整Attention的
key_size的选项。 - 2020.03.17: 增强
DataGenerator;优化模型写法。 - 2020.03.15: 支持GPT2_ML。
- 2020.03.10: 支持Google的T5模型。
- 2020.03.05: 将
tokenizer.py更名为tokenizers.py。 - 2020.03.05:
application='seq2seq'改名为application='unilm'。 - 2020.03.05:
build_bert_model更名为build_transformer_model。 - 2020.03.05: 重写
models.py结构。 - 2020.03.04: 将
bert.py更名为models.py。 - 2020.03.02: 重构mask机制(用回Keras自带的mask机制),以便更好地编写更复杂的应用。
- 2020.02.22: 新增
AutoRegressiveDecoder类,统一处理Seq2Seq的解码问题。 - 2020.02.19: transformer block的前缀改为Transformer(本来是Encoder),使得其含义局限性更少。
- 2020.02.13: 优化
load_vocab函数;将build_bert_model中的keep_words参数更名为keep_tokens,此处改动可能会对部分脚本产生影响。 - 2020.01.18: 调整文本处理方式,去掉codecs的使用。
- 2020.01.17: 各api日趋稳定,为了方便大家使用,打包到pypi,首个打包版本号为0.4.6。
- 2020.01.10: 重写模型mask方案,某种程度上让代码更为简练清晰;后端优化。
- 2019.12.27: 重构预训练代码,减少冗余;目前支持RoBERTa和GPT两种预训练方式,详见pretraining。
- 2019.12.17: 适配华为的nezha权重,只需要在
build_bert_model函数里加上model='nezha';此外原来albert的加载方式albert=True改为model='albert'。 - 2019.12.16: 通过跟keras 2.3+版本类似的思路给低版本引入层中层功能,从而恢复对低于2.3.0版本的keras的支持。
- 2019.12.14: 新增Conditional Layer Normalization及相关demo。
- 2019.12.09: 各example的data_generator规范化;修复application='lm'时的一个错误。
- 2019.12.05: 优化tokenizer的do_lower_case,同时微调各个example。
- 2019.11.23: 将train.py重命名为optimizers.py,更新大量优化器实现,全面兼容keras和tf.keras。
- 2019.11.19: 将utils.py重命名为tokenizer.py。
- 2019.11.19: 想来想去,最后还是决定把snippets放到bert4keras.snippets下面去好了。
- 2019.11.18: 优化预训练权重加载逻辑,增加保存模型权重至Bert的checkpoint格式方法。
- 2019.11.17:
分离一些与Bert本身不直接相关的常用代码片段到python_snippets,供其它项目共用。 - 2019.11.11: 添加NSP部分。
- 2019.11.05: 适配google版albert,不再支持非Google版albert_zh。
- 2019.11.05: 以RoBERTa为例子的预训练代码开发完毕,同时支持TPU/多GPU训练,详见roberta。欢迎在此基础上构建更多的预训练代码。
- 2019.11.01: 逐步增加预训练相关代码,详见pretraining。
- 2019.10.28: 支持使用基于sentencepiece的tokenizer。
- 2019.10.25: 引入原生tokenizer。
- 2019.10.22: 引入梯度累积优化器。
- 2019.10.21: 为了简化代码结构,决定放弃keras 2.3.0之前的版本的支持,目前只支持keras 2.3.0+以及tf.keras。
- 2019.10.20: 应网友要求,现支持直接用
model.save保存模型结构,用load_model加载整个模型(只需要在load_model之前执行from bert4keras.layers import *,不需要额外写custom_objects)。 - 2019.10.09: 已兼容tf.keras,同时在tf 1.13和tf 2.0下的tf.keras测试通过,通过设置环境变量
TF_KERAS=1来切换tf.keras。 - 2019.10.09: 已兼容Keras 2.3.x,但只是临时方案,后续可能直接移除掉2.3之前版本的支持。
- 2019.10.02: 适配albert,能成功加载albert_zh的权重,只需要在
load_pretrained_model函数里加上albert=True。
背景
之前一直用CyberZHG大佬的keras-bert,如果纯粹只是为了在keras下对bert进行调用和fine tune来说,keras-bert已经足够能让人满意了。
然而,如果想要在加载官方预训练权重的基础上,对bert的内部结构进行修改,那么keras-bert就比较难满足我们的需求了,因为keras-bert为了代码的复用性,几乎将每个小模块都封装为了一个单独的库,比如keras-bert依赖于keras-transformer,而keras-transformer依赖于keras-multi-head,keras-multi-head依赖于keras-self-attention,这样一重重依赖下去,改起来就相当头疼了。
所以,我决定重新写一个keras版的bert,争取在几个文件内把它完整地实现出来,减少这些依赖性,并且保留可以加载官方预训练权重的特性。
致谢
感谢CyberZHG大佬实现的keras-bert,本实现有不少地方参考了keras-bert的源码,在此衷心感谢大佬的无私奉献。
相关
bert4torch:一个跟bert4keras风格很相似的pytorch-based的transofrmer库,使用pytorch的读者可以尝试。
引用
@misc{bert4keras,
title={bert4keras},
author={Jianlin Su},
year={2020},
howpublished={\url{https://bert4keras.spaces.ac.cn}},
}
版本历史
v0.11.12022/03/22v0.10.82021/10/25v0.9.92021/01/30v0.9.72020/12/26v0.9.62020/12/15v0.9.22020/11/14v0.8.32020/07/170.7.42020/04/25v0.6.62020/03/27v0.6.12020/03/17v0.5.82020/03/05v0.5.72020/03/04v0.5.62020/03/03v0.5.32020/02/22v0.5.22020/02/20v0.5.02020/02/13v0.4.92020/02/05v0.4.62020/01/17v0.4.32020/01/10v0.4.22019/12/26常见问题
相似工具推荐
openclaw
OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你
stable-diffusion-webui
stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。
everything-claude-code
everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上
ComfyUI
ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
markitdown
MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器
LLMs-from-scratch
LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目,旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型(LLM)。它不仅是同名技术著作的官方代码库,更提供了一套完整的实践方案,涵盖模型开发、预训练及微调的全过程。 该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型,却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码,用户能够透彻掌握 Transformer 架构、注意力机制等关键原理,从而真正理解大模型是如何“思考”的。此外,项目还包含了加载大型预训练权重进行微调的代码,帮助用户将理论知识延伸至实际应用。 LLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API,而是渴望探究模型构建细节的技术人员而言,这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计:将复杂的系统工程拆解为清晰的步骤,配合详细的图表与示例,让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础,还是为未来研发更大规模的模型做准备