Optimum详解
Optimum 是 Hugging Face 提供的 Transformers 和 Diffusers 的扩展库,旨在帮助用户在目标硬件上以最高效率训练和运行模型,同时保持易于使用的特性。
主要功能
-
模型优化 :支持多种优化技术,如图优化、训练后动态量化、训练后静态量化、量化感知训练、FP16 等,可适应不同的硬件和应用场景。
-
硬件加速支持 :兼容多种硬件加速框架,包括 ONNX Runtime、TensorFlow Lite、OpenVINO、Habana Gaudi、TensorRT 等,能根据硬件设备特性实现最优性能。
-
模型导出与转换 :可将模型导出为 ONNX 等格式,便于在不同平台和环境中部署,并支持从 PyTorch 等框架检查点转换为优化后的模型格式。
-
与 Transformers 无缝集成 :使用简单,只需替换 Transformers 中的对应类,即可加载和运行优化后的模型,无需大幅修改现有代码结构。
-
量化功能 :支持对模型进行量化,以减少显存占用、提高推理速度,同时保持模型精度。
安装依赖
conda create -n llm python=3.11
conda activate llm
pip install --pre -U openvino-genai openvino openvino-tokenizers --extra-index-url https://storage.openvinotoolkit.org/simple/wheels/nightly
pip install nncf
pip install git+https://github.com/openvino-dev-samples/optimum-intel.git@2aebd4441023d3c003b27c87fff5312254ac
optimum-cli 参数详解
optimum-cli 是 Hugging Face Optimum 提供的一个命令行工具,可用于将模型导出为不同的格式,如 ONNX 或 OpenVINO IR,并对模型进行优化等操作。
模型导出相关参数
-
-m
或--model
:指定模型 ID 或模型在本地的路径,这是要进行导出或优化的模型来源,比如meta-llama/Meta-Llama-3.1-8B
。 -
--task
:指定模型的任务类型,如果不指定,工具会尝试根据模型自动推断。若为本地模型或需要指定特定任务时,必须使用该参数,例如text-generation
表示文本生成任务,question-answering
表示问答任务等。任务类型包括:['feature-extraction', 'image-to-text', 'audio-xvector', 'text-generation', 'multiple-choice', 'reinforcement-learning','zero-shot-image-classification', 'audio-classification', 'text-to-audio', 'audio-frame-classification', 'token-classification', 'automatic-speech-recognition', 'question-answering','semantic-segmentation', 'sentence-similarity', 'object-detection', 'mask-generation', 'fill-mask', 'image-classification', 'image-segmentation', 'text2text-generation', 'zero-shot-object-detection', 'masked-im', 'text-classification', 'image-to-image', 'depth-estimation','visual-question-answering']。对于解码器模型,使用xxx-with-past
来导出模型,利用解码器中的过去键值。 -
--monolith
:强制将模型导出为单个 ONNX 文件,默认情况下,对于编码器 - 解码器模型等可能包含多个组件的模型,导出工具可能会将其拆分为多个 ONNX 文件。 -
--device
:指定用于导出的设备,默认为cpu
,也可设置为cuda
等其他设备。 -
--opset
:指定导出模型时使用的 ONNX opset 版本,若不指定,则使用默认的 opset 版本。 -
--atol
:指定验证模型时的绝对误差容忍度,如果不指定,则使用模型的默认 atol 值。 -
--framework
:指定用于 ONNX 导出的框架,可选值为pt
或tf
,若不提供,将尝试使用本地模型原始框架或环境中可用的框架。 -
--cache_dir
:指定缓存目录的路径,用于存储相关缓存文件。 -
--trust-remote-code
:允许使用模型仓库中托管的自定义代码,仅在信任仓库中的代码并已阅读时使用,因为这会在本地机器上执行模型仓库中的任意代码。 -
--no-post-process
:禁用导出后对 ONNX 模型执行的默认后处理操作,如将解码器和带 past 的解码器模型合并为一个 ONNX 文件以减少内存占用等。
模型优化相关参数
-
--optimize
:在 ONNX 导出期间直接对模型进行优化,可选值有O1
、O2
、O3
、O4
,其中O1
为基本通用优化,O2
包括基本和扩展的通用优化以及 transformers 相关的融合,O3
与O2
相同但带有 GELU 近似,O4
与O3
相同但带有混合精度(fp16),O4
仅限 GPU 且需要--device cuda
。 -
--weight-format
:指定权重量化格式,取值如下:{fp32,fp16,int8,int4,mxfp4,nf4},用于对模型权重进行量化以实现更轻量化的部署和最佳性能表现。 -
--quant-mode
:量化精度模式。这用于应用全模型量化,包括激活函数。取值如下:{int8,f8e4m3,f8e5m2,nf4_f8e4m3,nf4_f8e5m2,int4_f8e4m3,int4_f8e5m2}。 -
--group-size
:在权重量化时,指定分组大小,例如--group-size 128
,与--weight-format
配合使用以控制量化过程中的分组粒度。 -
--ratio
:在量化时指定保留权重量化的比率,例如--ratio 0.8
,表示保留 80% 的量化权重。 -
--sym
:在量化时使用对称量化方式。(1) --weight-format int8 --sym => 权重的 int8 对称量化;(2) --weight-format int4 => 权重的 int4 非对称量化;(3) --weight-format int4 --sym --backup-precision int8_asym => 权重的 int4 对称量化,带有 int8 非对称备份精度;(4) --quant-mode int8 --sym => 权重和激活函数量化为 int8 对称数据类型;(5) --quant-mode int8 => 激活函数量化为 int8 非对称数据类型,权重量化为 int8 对称数据类型;(6) --quant-mode int4_f8e5m2 --sym => 激活函数量化为 f8e5m2 数据类型,权重量化为 int4 对称数据类型。 -
--backup-precision
:指定备份精度,例如--backup-precision int8_sym
,用于在量化过程中保留备份的精度格式。取值如下:{none,int8_sym,int8_asym}。 -
--scale-estimation
:在量化时进行尺度估计。
其他参数
-
--pad_token_id
:某些模型在某些任务中需要该参数,若未提供,将尝试使用 tokenizer 猜测。 -
--batch_size
:指定输入批次的大小,对于处理批量数据时有用。 -
--sequence_length
:指定序列长度,适用于自然语言处理任务中对输入序列长度的设置。 -
--num_choices
:用于多项选择任务,指定选项的数量。 -
--width
、--height
、--num_channels
、--feature_size
、--nb_max_frames
、--audio_sequence_length
:这些参数分别对应于图像或音频等数据的特征维度设置,在处理相应的视觉或音频任务时使用。 -
--library
:在导出之前加载模型所使用的库。如果没有提供,将尝试推断本地检查点的库。取值如下:{transformers,diffusers,timm,sentence_transformers,open_clip}。 -
--dataset
:DATASET 用于基于数据的压缩或使用 NNCF 量化的数据集。对于语言模型,可以使用以下列表中的一个:['auto','wikitext2','c4','c4-new'] 。使用 'auto' 时,数据集将从模型的生成中收集。对于扩散模型,应该是 ['conceptual_captions','laion/220k-GPT4Vision-captions-from-LIVIS','laion/filtered-wit'] 中的一个。对于视觉语言模型,数据集必须设置为 'contextual' 。注意:如果未选择任何基于数据的压缩算法,并且省略了比例参数或其值为 1.0,则数据集参数对结果模型不会产生影响。 -
--awq
:是否应用 AWQ 算法。AWQ 可提高 INT4 压缩大型语言模型的生成质量,但需要额外的时间在校准数据集上调整权重。要运行 AWQ ,请同时提供数据集参数。注意:有可能在模型中没有可应用 AWQ 的匹配模式,在这种情况下将跳过 AWQ 。 -
--scale-estimation
:表示是否应用一种缩放估计算法,以最小化原始层和压缩层之间的 L2 误差。运行缩放估计需要提供数据集。请注意,应用缩放估计会消耗额外的内存和时间。
使用示例
将QWEN3-4B模型转为openvino IR模型
optimum-cli export openvino --model D:\AI\llm_openvino\qwen3-4b --weight-format int4 --task text-generation D:\AI\llm_openvino\qwen3-4b-ov
optimum 的使用方法
加载 qwen3-4b-ov 模型并使用 OpenVINO Runtime 运行推理
from modelscope import AutoTokenizer
from optimum.intel.openvino import OVModelForCausalLMmodel_id = "D:\AI\llm_openvino\qwen3-4b-ov"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = OVModelForCausalLM.from_pretrained(model_id, use_cache=False)inputs = tokenizer("北京故宫始建于", return_tensors="pt")outputs = model.generate(**inputs, max_length=200)
text = tokenizer.batch_decode(outputs)[0]
print(text)