cuBERT

GitHub
548 84 较难 1 次阅读 3周前MIT语言模型开发框架
AI 解读 由 AI 自动生成,仅供参考

cuBERT 是一款专为加速 BERT 模型推理而打造的高性能开源工具。它摒弃了 TensorFlow 等重型框架的冗余开销,直接基于 NVIDIA CUDA/CUBLAS 或 Intel MKL 底层库进行高度定制化开发,从而显著提升了运行效率。

在实际应用中,cuBERT 有效解决了传统框架在部署 BERT 时存在的延迟高、资源占用大等痛点。测试数据显示,无论是在 GPU 还是 CPU 环境下,其推理速度均大幅优于原生 TensorFlow 实现,特别是在小批量或单次请求场景下,响应时间可缩短数倍。此外,cuBERT 还支持混合精度计算,利用 NVIDIA Tensor Core 技术,在保持误差低于 1% 的前提下,进一步将运算速度提升两倍以上。

这款工具非常适合需要高效部署 NLP 模型的后端工程师、算法研究人员以及对推理延迟敏感的开发团队。虽然它目前仅支持标准的 BERT(Transformer)架构,但提供了灵活的池化方法和多样的输出接口,并附带便捷的 Python 封装,方便用户快速集成到现有系统中。如果你正在寻求轻量级、极速的 BERT 推理方案,cuBERT 是一个值得尝试的专业选择。

使用场景

某电商平台的算法团队需要在高并发场景下,实时对海量用户评论进行情感分析与垃圾内容过滤。

没有 cuBERT 时

  • 推理延迟过高:依赖 TensorFlow 框架运行 BERT 模型,单次请求耗时较长,在流量高峰期导致用户评论审核出现明显积压。
  • 资源浪费严重:框架本身的开销占用了大量 GPU 显存和计算资源,导致服务器无法部署更多实例,硬件利用率低下。
  • 低延迟场景受限:在 CPU 环境下处理单条请求时响应缓慢(约 70ms),难以满足即时互动的严苛要求。
  • 混合精度支持复杂:想要利用 NVIDIA Tensor Core 加速需繁琐配置,且难以在保证精度的前提下实现倍级提速。

使用 cuBERT 后

  • 推理速度显著提升:去除 TensorFlow 冗余开销,直接基于 CUDA/CUBLAS 优化,GPU 批量处理速度提升约 28%,单条处理更快。
  • 硬件成本大幅降低:更高效的资源占用允许在同等算力下部署更多服务实例,显著降低了服务器扩容成本。
  • 极致低延迟响应:在 CPU 端利用 MKL 优化后,单条请求耗时从 69.9ms 降至 24.0ms,实现了毫秒级实时反馈。
  • 自动混合精度加速:原生支持 FP16 存储与 FP32 计算,在误差小于 1% 的前提下,借助 Tensor Core 实现超过 2 倍的加速效果。

cuBERT 通过剥离重型框架依赖并深度优化底层算子,让 BERT 模型在生产环境中实现了极致的推理速度与资源效率。

运行环境要求

操作系统
  • Linux
GPU
  • 可选(支持 CPU 模式)
  • 若使用 GPU,需 NVIDIA GPU(基准测试使用 Tesla P4),支持 Volta 和 Turing 架构以启用 Tensor Core 混合精度加速
  • CUDA 版本需与编译环境一致(基准测试使用 CUDA 9.0)
内存

未说明

依赖
notes1. 该工具不依赖 TensorFlow,直接基于 CUDA/CUBLAS 或 Intel MKL 实现 BERT 推理。 2. 仅支持 BERT (Transformer) 模型。 3. CPU 模式下需通过环境变量(如 OMP_NUM_THREADS, CUBERT_NUM_CPU_MODELS)精细调整线程数以平衡延迟和吞吐量。 4. 预编译的 Python 包目前仅支持 Linux 且基于 MKL。 5. 多线程安全性通过内部的 BertM 类包装器实现,采用轮询方式分配模型实例。
python未说明(提供 Cython 封装,需自行构建 wheel)
CUDA (可选,版本需匹配)
Intel MKL (可选,用于 CPU 加速)
protobuf-c
CMake
GCC
OpenMP
Cython (Python 绑定)
JNA (Java 绑定)
cuBERT hero image

快速开始

在 NVIDIA(CUDA、CUBLAS)和 Intel MKL 上直接快速实现 BERT 推理

构建状态

高度定制化且优化的 BERT 推理,直接运行在 NVIDIA(CUDA、CUBLAS)或 Intel MKL 上,无需 TensorFlow 及其框架开销。

支持 BERT(Transformer)模型。

基准测试

环境

  • Tesla P4
  • 28 核 Intel(R) Xeon(R) CPU E5-2680 v4 @ 2.40GHz
  • Debian GNU/Linux 8 (jessie)
  • gcc (Debian 4.9.2-10+deb8u1) 4.9.2
  • CUDA:版本 9.0,V9.0.176
  • MKL:2019.0.1.20181227
  • tensorflow:1.12.0
  • BERT:序列长度 = 32

GPU(cuBERT)

批大小 128(毫秒) 32(毫秒)
tensorflow 255.2 70.0
cuBERT 184.6 54.5

CPU(mklBERT)

批大小 128(毫秒) 1(毫秒)
tensorflow 1504.0 69.9
mklBERT 984.9 24.0

注意:MKL 应在 OMP_NUM_THREADS=? 下运行以控制线程数。其他环境变量及其可能取值包括:

  • KMP_BLOCKTIME=0
  • KMP_AFFINITY=granularity=fine,verbose,compact,1,0

混合精度

cuBERT 可以利用 NVIDIA Volta 和 Turing 架构 GPU 上的 Tensor Core混合精度计算 来加速推理。我们支持将变量存储为 fp16 格式,并以 fp32 进行计算的混合精度模式。与单精度推理相比,典型精度误差小于 1%,而速度则可提升至两倍以上。

API

API .h 头文件

Pooler

我们支持以下两种池化方法:

  • 标准 BERT pooler,定义如下:
with tf.variable_scope("pooler"):
  # 我们通过简单地取第一个 token 对应的隐藏状态来“池化”模型。我们假设该模型已预训练过。
  first_token_tensor = tf.squeeze(self.sequence_output[:, 0:1, :], axis=1)
  self.pooled_output = tf.layers.dense(
    first_token_tensor,
    config.hidden_size,
    activation=tf.tanh,
    kernel_initializer=create_initializer(config.initializer_range))
  • 简单平均池化器:
self.pooled_output = tf.reduce_mean(self.sequence_output, axis=1)

输出

支持以下输出类型:

cuBERT_OutputType python代码
cuBERT_LOGITS model.get_pooled_output() * output_weights + output_bias
cuBERT_PROBS probs = tf.nn.softmax(logits, axis=-1)
cuBERT_POOLED_OUTPUT model.get_pooled_output()
cuBERT_SEQUENCE_OUTPUT model.get_sequence_output()
cuBERT_EMBEDDING_OUTPUT model.get_embedding_output()

从源码构建

mkdir build && cd build
# 如果使用 CUDA 构建
cmake -DCMAKE_BUILD_TYPE=Release -DcuBERT_ENABLE_GPU=ON -DCUDA_ARCH_NAME=Common ..
# 或者使用 MKL 构建
cmake -DCMAKE_BUILD_TYPE=Release -DcuBERT_ENABLE_MKL_SUPPORT=ON ..
make -j4

# 安装到 /usr/local
# 如果指定了 -DcuBERT_ENABLE_MKL_SUPPORT=ON,也会同时安装 MKL
sudo make install

如果您想运行 tfBERT_benchmark 进行性能对比,请先从 https://www.tensorflow.org/install/lang_c 安装 TensorFlow C API。

运行单元测试

Dropbox 下载 BERT 测试模型 bert_frozen_seq32.pbvocab.txt,并将它们放置在 build 目录下,然后运行 make test./cuBERT_test

Python

我们提供了基于 Cython 的简单 Python 封装,可以在 C++ 构建完成后按以下步骤进行构建和安装:

cd python
python setup.py bdist_wheel

# 安装
pip install dist/cuBERT-xxx.whl

# 测试
python cuBERT_test.py

更多详细信息和 Python API 的使用示例,请参阅 cuBERT_test.py

Java

Java 封装通过 JNA 实现。在安装 Maven 并完成 C++ 构建后,可以按以下步骤进行构建:

cd java
mvn clean package # -DskipTests

使用 Java JAR 文件时,如果 libcuBERT.so 未安装到系统路径中,需要指定 jna.library.path 为该库的路径。此外,应在 JVM 启动脚本中设置 jna.encoding=UTF8

更多关于 Java API 的使用和示例,请参阅 ModelTest.java

安装

预编译的 Python 二进制包(目前仅适用于 Linux 上的 MKL)可以按以下步骤安装:

  • 下载并安装 MKL 到系统路径。

  • 下载 wheel 包并运行 pip install cuBERT-xxx-linux_x86_64.whl

  • 运行 python -c 'import libcubert' 以验证安装是否成功。

依赖项

Protobuf

cuBERT 使用 protobuf-c 构建,以避免与 TensorFlow 的 protobuf 版本和代码发生冲突。

CUDA

不同版本的 CUDA 编译的库之间不兼容。

MKL

MKL 是动态链接的。我们在执行 sudo make install 时会同时安装 cuBERT 和 MKL。

多线程

我们假设 cuBERT 的典型用法是用于在线服务,在这种情况下,需要尽可能快速地处理不同批大小的并发请求。因此,在纯 CPU 环境下,吞吐量和延迟之间需要取得平衡。

由于原生的 Bert 类 因其内部计算缓冲区而不具备线程安全性,因此我们编写了一个包装类 BertM 类,用于为不同的 Bert 实例加锁以确保线程安全。BertM 会以轮询方式选择一个底层的 Bert 实例,因此对同一 Bert 实例的后续请求可能会被其对应的锁阻塞排队。

GPU

每个 Bert 实例都部署在一个 GPU 卡上。最大并发请求数等于一台机器上可用的 GPU 数量,可以通过设置 CUDA_VISIBLE_DEVICES 来控制。

CPU

对于纯 CPU 环境,情况比 GPU 更为复杂。并行性可以分为两个层次:

  1. 请求级并行:在多线程的在线服务中,并发请求会竞争 CPU 资源。如果服务器是单线程的(例如某些 Python 实现的服务器),则处理起来会简单得多。

  2. 操作级并行:矩阵运算由 OpenMP 和 MKL 进行并行化。最大并行度受 OMP_NUM_THREADSMKL_NUM_THREADS 以及其他多个环境变量的控制。我们建议用户先阅读 在多线程应用程序中使用线程化的 Intel® MKL从多线程应用程序调用 Intel MKL 例程的推荐设置

因此,我们引入了 CUBERT_NUM_CPU_MODELS,以便更好地控制请求级并行度。该变量指定了在 CPU/内存上创建的 Bert 实例数量,其作用类似于 GPU 上的 CUDA_VISIBLE_DEVICES

  • 如果您的 CPU 核心数量有限(例如旧式 CPU、桌面 CPU 或 Docker 容器中),则无需设置 CUBERT_NUM_CPU_MODELS。例如,在 4 核 CPU 上,将请求级并行度设为 1、操作级并行度设为 4,通常就能取得不错的效果。

  • 但如果您拥有大量 CPU 核心(如 40 核),则可以尝试将请求级并行度设为 5、操作级并行度设为 8。

总之,OMP_NUM_THREADSMKL_NUM_THREADS 决定单个模型可使用的线程数,而 CUBERT_NUM_CPU_MODELS 则决定总的模型数量。

再次强调,每次请求的延迟和整体吞吐量需要权衡,这与模型的序列长度、批大小、CPU 核心数、服务器 QPS 以及许多其他因素有关。您应当进行充分的基准测试,以找到最佳的平衡点。祝您成功!

作者

  • fanliwen
  • wangruixin
  • fangkuan
  • sunxian

版本历史

v0.0.52019/12/27
v0.0.42019/12/18
v0.0.32019/08/16
v0.0.22019/06/05
v0.0.12019/05/27

常见问题

相似工具推荐

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|今天
开发框架图像Agent

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 真正成长为懂上

139k|★★☆☆☆|今天
开发框架Agent语言模型

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

107.7k|★★☆☆☆|2天前
开发框架图像Agent

NextChat

NextChat 是一款轻量且极速的 AI 助手,旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性,以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发,NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。 这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言,它也提供了便捷的自托管方案,支持一键部署到 Vercel 或 Zeabur 等平台。 NextChat 的核心亮点在于其广泛的模型兼容性,原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型,让用户在一个界面即可自由切换不同 AI 能力。此外,它还率先支持 MCP(Model Context Protocol)协议,增强了上下文处理能力。针对企业用户,NextChat 提供专业版解决方案,具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能,满足公司对数据隐私和个性化管理的高标准要求。

87.6k|★★☆☆☆|今天
开发框架语言模型

ML-For-Beginners

ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程,旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周,包含 26 节精炼课程和 52 道配套测验,内容涵盖从基础概念到实际应用的完整流程,有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。 无论是希望转型的开发者、需要补充算法背景的研究人员,还是对人工智能充满好奇的普通爱好者,都能从中受益。课程不仅提供了清晰的理论讲解,还强调动手实践,让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持,通过自动化机制提供了包括简体中文在内的 50 多种语言版本,极大地降低了全球不同背景用户的学习门槛。此外,项目采用开源协作模式,社区活跃且内容持续更新,确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路,ML-For-Beginners 将是理想的起点。

85k|★★☆☆☆|今天
图像数据工具视频

ragflow

RAGFlow 是一款领先的开源检索增强生成(RAG)引擎,旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体(Agent)能力相结合,不仅支持从各类文档中高效提取知识,还能让模型基于这些知识进行逻辑推理和任务执行。 在大模型应用中,幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构(如表格、图表及混合排版),显著提升了信息检索的准确度,从而有效减少模型“胡编乱造”的现象,确保回答既有据可依又具备时效性。其内置的智能体机制更进一步,使系统不仅能回答问题,还能自主规划步骤解决复杂问题。 这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统,还是致力于探索大模型在垂直领域落地的创新者,都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口,既降低了非算法背景用户的上手门槛,也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目,它正成为连接通用大模型与行业专有知识之间的重要桥梁。

77.1k|★★★☆☆|昨天
Agent图像开发框架