+
Skip to content

Angel-ML/SNIP

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

SNIP

1.项目介绍

SNIP 为一款集成了“精调+蒸馏+模型加速”一体的模型上线助力工具。用户只需要提供经过 post-train 以后的预训练模型和业务精调数据,并且修改 3~8 行训练代码, SNIP就会自动输出加速后的模型。

通过对多种量化与蒸馏算法的深度优化,我们相比实现了更高的加速效果,同时在多业务上都成功适配了行之有效的无损加速手段。

当前初步在AI、视频、文章相关场景取得了不错的效果。

工具包基于python3.8开发,支持作为一个python包进行使用,同时本身作为一个工具包,对环境的依赖程度低。

注意:目前Auto48X只支持调用自己的modeling文件(目前只支持BertForSequenceClassification,如果需要扩展支持请联系负责人)。用户需要自己intialize:

model: original model that is used for quantization or distillation, this is the student model w.r.t. knowledge distillation.

optimizer (for model): optimizer for optimizating the model.

teacher model: the teacher model. In pure_distillation, this is the larger model. In model quantization, this is the original uncompressed model or a larger model.

optimizer_param_group (the parameter_group that is used for initialize the parameter group)。

2.功能特性

  • 轻量级

    工具包作为Python 包,执行简单安装后,通过简单导入即可使用。

  • 易使用

    用户只需要修改七行用户脚本代码即可训练量化后的模型

  • 适用于神经网络量化与蒸馏训练场景

3.快速上手

Build SNIP:

目前Auto48X支持pip instal 使用(setuptools==50.3.2)以及直接import项目文件夹使用两种方式。

git clone /Auto48X.git 
cd Auto48X 
pip install .
requires:

python >= 3.8

transformers==4.19.0

torch better be 1.11.0

-------------------------------------------------------------------------------------------------------------------

EXAMPLE

  1. 标准AUTO48 qat with distillation。

见 Auto48/example/ 路径下脚本。

BUILD STEP

1)配置Auto48X所需参数。

Auto48X默认参数配置使用 Auto48X/config/auto48_default.json 文件配置。用户如需自定义Auto48超参,可通过args和json文件配置参数,args优先级高于json文件

修改parser用来接收Auto48X所需参数(分别放在解析parser之前和之后):

parser = Auto48X.add_core_argument(parser) #用来添加Auto48需要用的arguments args = parser.parse_args() args = Auto48X.config_auto48(args) #设置一些Auto48的默认设置
若不打算使用argparse来初始化Auto48X参数,可以使用如下代码,使用dict修改Auto48X参数。
auto48x_args = Auto48X.set_auto48_args(
{            
"ddp": True,            
"qat": True,            
"local_rank": args.local_rank,            
"auto48_config": args.auto48x_config,        
})

2)初始化Teacher model:

model = modeling.BertForSequenceClassification(config=bert_config) model = model.to(device) teacher_model = modeling.BertForSequenceClassification(config=bert_config) teacher_model.to(device) #初始化teacher model checkpoint = torch.load(os.path.join(args.model_path, "pytorch_model.bin"), map_location="cpu") teacher_model.load_state_dict(checkpoint, strict= True) #load teacher model的参数 model.load_state_dict(checkpoint, strict = True)

3)初始化Auto48引擎:

model, optimizer, teacher_model, engine = Auto48X.Auto48Init(args, model, optimizer=optimizer,optimizer_param_group=optimizer_grouped_parameters,teacher_model=teacher_model, lr_scheduler=scheduler)

4)运行forward:

outputs = engine.engine_forward(batch)

注意这里forward不能直接model(batch)运行,需要用engine.engine_forward(batch)来运行。返回的第一个值是正常的BERT的返回类。(这个只需要在training的时候调用,evaluate的时候正常model(batch)就好了)

5)添加蒸馏:

num_input = torch.sum(attention_mask, dim=1) loss = engine.add_knowledge_distillation(loss, num_input=num_input) 

注意这里num_input是每个sample的token数,可以直接用

6)进行backward并更新模型:

engine.backward(loss) engine.step()

-------------------------------------------------------------------------------------------------------------------

*如果是从老版本Auto48X迁移过来的用户,一共有三处需要修改的地方:

1)outputs, _, _ = engine.engine_forward(batch) 修改成 outputs = engine.engine_forward(batch)。

2)model.backward(loss)修改成engine.backward(loss)。

3)model.step()修改成engine.step()。

4)若直接使用model,model的输出是一个dict数据

-------------------------------------------------------------------------------------------------------------------

SNIP启动教程:

Deepspeed :

deepspeed user_script.py \ --distillation_loss_scale 1 \ --distillation_attention_scale 1 \ --lr_input 0.01 \ --lr_weight 0.005 \ --qat user args commands etc...
Auto48X默认依赖于DeepSpeed(为了加速训练并且方便调用fp16和bp16)。
参照https://www.deepspeed.ai/getting-started/#launching-deepspeed-training里面的launching部分。

Python3 :

使用DDP :

python3 -m torch.distributed.launch --nproc_per_node 1 user_script.py \ --distillation_loss_scale 1 \ --distillation_attention_scale 1 \ --lr_input 0.01 \ --lr_weight 0.005 \ --qat --ddp user args commands etc...

不使用DDP:

python3 user_script.py \
--distillation_loss_scale 1 \
--distillation_attention_scale 1 \ 
--lr_input 0.01 \ 
--lr_weight 0.005 \ 
--qat  \
--disable_deepspeed user args commands etc...

-------------------------------------------------------------------------------------------------------------------

4.常见问题

Auto48X参数指引(具体定义可以参照auto48_utils.py):

注意事项:

(1)--qat、--pure_distillation、–pure_qat_eval、–pure_qat_eval 至少需要指定一项。

(2)命令台输入的args优先级高于指定的json文件。

(3)--pure_qat_eval模式需要模型先过Auto48Init后再load_from_ckpt。

(4)使用fp16训练需要安装apex包。

参数列表:

Mode
Auto48_mode Help
qat 启用qat模式。
pure_finetune 无QAT纯finetune模式。
pure_distillation 无QAT纯蒸馏模式。
pure_qat_eval 支持返回纯qat模型以供eval的模式。
All hyper-parameter
Name Help
auto48_config Auto48X的参数config路径,默认config已经在Auto48X/config/auto48_default.json中
qat 启用qat模式。
do_calib 用来设置calibration的flag。
calib_step calibration的次数,一般两次就好。
teacher 用来load teacher model的路径。
distillation_loss_scale 用来控制蒸馏强度,一般设置在10。
distillation_attention_scale 用来设置attention蒸馏的强度,一般设置1~10。
distillation_encode_scale 设置为1即可。
lr_input QAT里面input quantizer的学习率,一般0.05即可。不可以过大。
lr_weight QAT里面weight quantizer的学习率,一般0.01即可。不可以过大。
int4_layers 设置需要做int4量化的层(1_2代表第1,2层做int4量化,从第0层开始)。如果是None,则默认做全int8量化。
annealing_T 退火蒸馏参数,默认是1。
pure_finetune 无QAT纯finetune模式。
pure_distillation 纯蒸馏模式。
pure_qat_eval 支持返回纯qat模型以供eval的模式。
KD_function 蒸馏算法。目前支持minilm,minilmV2,multilayer蒸馏。建议minilm。
model_fp32 使用fp32来运行model。
teacher_fp32 使用fp32来运行teacher model。
bp16 使用bp16来运行model。
disable_deepspeed 不使用deepspeed的模式。
ddp 使用pytorch DDP做并行计算。需要和--disable_deepspeed配合使用。
load_from_calib 禁用自动加载校准模型的标志
add_pooled_outputs_kd 添加pool output蒸馏算法

--pure_qat_eval模式

1)配置Auto48所需参数

parser = Auto48.add_core_argument(parser) #用来添加Auto48需要用的arguments args = parser.parse_args() args = Auto48.config_auto48(args) #设置一些Auto48的默认设置

2)生成模型

import Auto48X.tools.auto48_qat_eval as auto48_qat_eval model_qat_eval = auto48_qat_eval.Auto48_qat_eval(args, model) ... #use your model ...

蒸馏细节:

对于不同的用户脚本,支持数据集无label蒸馏和有label蒸馏。

Auto48X 中 engine.add_knowledge_distillation(loss, num_input) 内置了对student和teacher的output进行loss计算。 可以通过Input中loss设置为None时代表用户的loss无法从数据集label获得。

About

Angel-SNIP- efficient machine learning model compression tool

Resources

License

MIT, Unknown licenses found

Licenses found

MIT
LICENSE
Unknown
LICENSE.txt

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published
点击 这是indexloc提供的php浏览器服务,不要输入任何密码和下载