huggingface
HuggingFace是一个高速发展的社区,包括Meta、Google、Microsoft、Amazon在内的超过5000家组织机构在为HuggingFace开源社区贡献代码、数据集和模型。目前包括模型236,291个,数据集44,810个。刚开始大多数的模型和数据集是NLP方向的,但图像和语音的功能模型正在快速更新中。
Transformers
Hugging Face出品的Transformers提供了一系列的 API 和工具,可以说是自然语言处理领域中当下最常用的包之一,它实现了大量的主流预训练模型架构,并提供了对应的与训练好的模型文件,使用者可以轻松下载和训练 SOTA 预训练模型,支持 PyTorch、TensorFlow 和 JAX,并支持框架之间的互操作。模型还可以导出为 ONNX 和 TorchScript 等格式,以方便在生产环境中部署。
借助Transformers工具包,可以非常方便的调用主流预训练模型解决实际的下游任务,如文本分类、文本匹配、命名实体识别、阅读理解、文本生成、文本摘要等。
文档地址: https://hf.co/docs/transformers
Optimum
Optimum 是 huggingface transformers 的扩展,它提供了一组性能优化工具,可以在特定的目标硬件上以最高效率训练和运行模型。
文档地址:https://hf.co/docs/optimum
安装
Optimum 可以按照以下方式安装:
python -m pip install optimum
如果要使用 Optimum 的加速器特定功能,可以根据下表安装所需的依赖项:
Accelerator |
Installation |
pip install --upgrade-strategy eager install optimum[onnxruntime] |
|
pip install --upgrade-strategy eager optimum[neural-compressor] |
|
pip install --upgrade-strategy eager optimum[openvino,nncf] |
|
pip install --upgrade-strategy eager optimum[habana] |
|
pip install --upgrade-strategy eager optimum[furiosa] |
如果想安装最新版(源码安装),使用如下命令:
python -m pip install git+https://github.com/huggingface/optimum.git
如果源码安装需要指定硬件,使用如下命令:
python -m pip install optimum[onnxruntime]@git+https://github.com/huggingface/optimum.git
将Transformer模型导出为onnx:
可以使用ORTModelForXXX
加载transformers 模型,注意如果模型来至于Transformers
,需要加上from_transformers=true
from optimum.onnxruntime import ORTModelForSequenceClassification
from transformers import AutoTokenizer
model_checkpoint = "distilbert-base-uncased-finetuned-sst-2-english"
save_directory = "tmp/onnx/"
# Load a model from transformers and export it to ONNX
ort_model = ORTModelForSequenceClassification.from_pretrained(model_checkpoint, from_transformers=True)
tokenizer = AutoTokenizer.from_pretrained(model_checkpoint)
# Save the onnx model and tokenizer
ort_model.save_pretrained(save_directory)
tokenizer.save_pretrained(save_directory)
保存为ONNX
后,可以继续通过ORTModelForXXX
来加载模型,然后使用pipeline来运行任务。
from optimum.onnxruntime import ORTModelForSequenceClassification
from transformers import pipeline, AutoTokenizer
model = ORTModelForSequenceClassification.from_pretrained(save_directory, file_name="model_quantized.onnx")
tokenizer = AutoTokenizer.from_pretrained(save_directory)
cls_pipeline = pipeline("text-classification", model=model, tokenizer=tokenizer)
results = cls_pipeline("I love burritos!")
ONNX模型优化
通过ORTOptimizer
可以优化模型,OptimizationConfig
配置优化参数,可以导出onnx模型,并优化Grpah,进行fp16等优化。
from optimum.onnxruntime import ORTOptimizer, ORTModelForSequenceClassification
from optimum.onnxruntime.configuration import OptimizationConfig
model_id = "distilbert-base-uncased-finetuned-sst-2-english"
save_dir = "/tmp/outputs"
model = ORTModelForSequenceClassification.from_pretrained(model_id, from_transformers=True)
optimizer = ORTOptimizer.from_pretrained(model)
optimization_config = OptimizationConfig(
optimization_level=2,
optimize_with_onnxruntime_only=False,
optimize_for_gpu=False,
)
optimizer.optimize(save_dir=save_dir, optimization_config=optimization_config)
OptimizationConfig
:
- optimization_level 优化等级
- optimize_for_gpu 是否面向GPU优化
- fp16 是否转换为半精度,配置后可以减小模型体积
Pipeline使用
在pipeline中使用,只需要accelerator="ort"
即可。
from optimum.pipelines import pipeline
classifier = pipeline(task="text-classification", accelerator="ort")
classifier("I like you. I love you.")
[{'label': 'POSITIVE', 'score': 0.9998838901519775}]
当然,我们还可以使用上面optimize
后的模型。
from transformers import AutoTokenizer
from optimum.onnxruntime import ORTModelForQuestionAnswering
from optimum.pipelines import pipeline
tokenizer = AutoTokenizer.from_pretrained("optimum/roberta-base-squad2")
# Loading already converted and optimized ORT checkpoint for inference
model = ORTModelForQuestionAnswering.from_pretrained("optimum/roberta-base-squad2")
onnx_qa = pipeline("question-answering", model=model, tokenizer=tokenizer)
question = "What's my name?"
context = "My name is Philipp and I live in Nuremberg."
pred = onnx_qa(question=question, context=context)
你好