🚀 I-BERT基础模型
ibert-roberta-base
模型是 RoBERTa 的仅整数量化版本,该模型在 这篇论文 中被提出。I-BERT 使用 INT8 表示存储所有参数,并使用仅整数运算进行整个推理过程。具体而言,I-BERT 用近似的整数运算替换了 Transformer 架构中的所有浮点运算(例如,矩阵乘法、GELU、Softmax 和层归一化)。在 Nvidia T4 GPU 上测试时,与浮点版本相比,这可以使推理速度提高多达 4 倍。通过量化感知微调搜索到的最佳模型参数可以随后导出(例如,导出到 TensorRT),以实现模型的仅整数部署。
🚀 快速开始
✨ 主要特性
- 仅整数量化:I-BERT 存储所有参数使用 INT8 表示,并使用仅整数运算进行整个推理过程。
- 运算替换:用近似的整数运算替换了 Transformer 架构中的所有浮点运算。
- 推理加速:在 Nvidia T4 GPU 上测试时,与浮点版本相比,推理速度可提高多达 4 倍。
- 可部署性:通过量化感知微调搜索到的最佳模型参数可以导出,以实现模型的仅整数部署。
📦 安装指南
文档未提及安装步骤,故跳过此章节。
💻 使用示例
基础用法
I-BERT 的微调过程包括三个阶段:
- 全精度微调:从预训练模型在下游任务上进行全精度微调。
- 模型量化:将全精度模型转换为仅整数模型。
- 仅整数微调:对量化后的模型进行仅整数微调(即量化感知训练)。
高级用法
以下是每个阶段的详细说明和示例代码:
全精度微调
I-BERT 的全精度微调与 RoBERTa 微调类似。例如,你可以运行以下命令在 MRPC 文本分类任务上进行微调:
python examples/text-classification/run_glue.py \
--model_name_or_path kssteven/ibert-roberta-base \
--task_name MRPC \
--do_eval \
--do_train \
--evaluation_strategy epoch \
--max_seq_length 128 \
--per_device_train_batch_size 32 \
--save_steps 115 \
--learning_rate 2e-5 \
--num_train_epochs 10 \
--output_dir $OUTPUT_DIR
模型量化
完成全精度微调后,打开检查点目录中的 config.json
文件,并将 quantize
属性设置为 true
:
{
"_name_or_path": "kssteven/ibert-roberta-base",
"architectures": [
"IBertForSequenceClassification"
],
"attention_probs_dropout_prob": 0.1,
"bos_token_id": 0,
"eos_token_id": 2,
"finetuning_task": "mrpc",
"force_dequant": "none",
"hidden_act": "gelu",
"hidden_dropout_prob": 0.1,
"hidden_size": 768,
"initializer_range": 0.02,
"intermediate_size": 3072,
"layer_norm_eps": 1e-05,
"max_position_embeddings": 514,
"model_type": "ibert",
"num_attention_heads": 12,
"num_hidden_layers": 12,
"pad_token_id": 1,
"position_embedding_type": "absolute",
"quant_mode": true,
"tokenizer_class": "RobertaTokenizer",
"transformers_version": "4.4.0.dev0",
"type_vocab_size": 1,
"vocab_size": 50265
}
然后,当你加载检查点时,模型将自动以仅整数模式运行。此外,请确保删除同一目录中的 optimizer.pt
、scheduler.pt
和 trainer_state.json
文件。否则,Hugging Face 将不会为后续的仅整数微调重置优化器、调度器或训练器状态。
仅整数微调(量化感知训练)
最后,你只需加载修改后的检查点文件即可运行仅整数微调。请注意,以下示例命令中唯一的区别是 model_name_or_path
:
python examples/text-classification/run_glue.py \
--model_name_or_path $CHECKPOINT_DIR
--task_name MRPC \
--do_eval \
--do_train \
--evaluation_strategy epoch \
--max_seq_length 128 \
--per_device_train_batch_size 32 \
--save_steps 115 \
--learning_rate 1e-6 \
--num_train_epochs 10 \
--output_dir $OUTPUT_DIR
📚 详细文档
文档未提及详细说明,故跳过此章节。
🔧 技术细节
文档未提及技术实现细节,故跳过此章节。
📄 许可证
文档未提及许可证信息,故跳过此章节。
📄 引用信息
如果你使用 I-BERT,请引用 我们的论文:
@article{kim2021bert,
title={I-BERT: Integer-only BERT Quantization},
author={Kim, Sehoon and Gholami, Amir and Yao, Zhewei and Mahoney, Michael W and Keutzer, Kurt},
journal={arXiv preprint arXiv:2101.01321},
year={2021}
}