常见问题解答

ModelOpt-Windows

ONNX PTQ

1. 为什么在ONNX量化过程中,awq-scale搜索耗时过长或卡在0%?

Awq-scale 搜索应在几分钟内完成,使用 NVIDIA GPU 加速。如果停滞:

  • GPU加速可能被禁用。 安装 cupy 及其依赖项(参见ModelOpt-Windows设置)。

  • GPU内存不足。 量化需要20-24GB的显存;内存不足会强制使用较慢的共享内存。

  • 使用CPU进行量化。 安装ORT-GPU(支持CUDA EP)或ORT-DML(支持DML EP)以获得更快的速度。

2. 为什么在ONNX量化过程中会出现“CUDA EP未找到”错误?

在GenAI中使用的ORT可能与ModelOpt-Windows ORT发生冲突:

  • 卸载ORT,运行pip cache purge,然后重新安装nvidia-modelopt[onnx]

  • 为GenAI和量化使用独立的虚拟环境(例如,使用venvconda)。

3. 为什么在拥有CUDA工具包和cuDNN的情况下,ORT会话创建仍然失败?

这通常是由于CUDA和cuDNN版本不匹配或路径缺失导致的。请确保:

  • 兼容的CUDA工具包和cuDNN版本(请查看CUDA EP要求)。

  • 将cuDNN的binlib路径添加到PATH中,并重新启动命令提示符。

4. 为什么量化模型的大小在重新运行时会增加?

确保在每次量化运行之前输出目录是干净的,否则,现有的量化模型文件可能会在每次运行中被追加,导致模型大小增加并可能损坏它。

5. 在DirectML后端上运行量化的ONNX模型时出现以下错误。可能是什么问题?

错误 无法识别的属性:block_size 用于操作符 DequantizeLinear

ModelOpt-Windows 使用 ONNX 的 DequantizeLinear (DQ) 节点。block_size 属性在 Opset-21 的 DeQuantizeLinear 节点中被添加。确保量化模型的 opset 版本为 21 或更高。详情请参考 应用训练后量化 (PTQ)

6. 在DirectML后端上运行INT4量化的ONNX模型时出现以下类型的错误。可能是什么问题?

错误:节点 (onnx::MatMul_6508_DequantizeLinear) 中操作符 (DequantizeLinear) 的输入参数 (onnx::MatMul_6508_i4) 的类型 'tensor(int4)' 无效。

上述错误的一个可能原因是INT4量化的ONNX模型的opset版本(默认或onnx域)小于21。确保INT4量化模型的opset版本为21或更高,因为DeQuantizeLinear ONNX节点中的INT4数据类型支持是在opset-21中引入的。

NAS/剪枝

猴子补丁函数

在转换过程中(mtn.convert()),我们使用了一个monkey patch来增强forward()eval()train()方法的功能。这使得ModelOpt转换过程与对这些方法的其他monkey patch不兼容。

# Internally in mtn.convert, we do:
model.forward = types.MethodType(nas_forward_func, model)
model.train = types.MethodType(nas_train_func, model)

已知问题

1. 使用FSDP时,use_orig_params=True可能导致内存泄漏

当使用FSDP并设置use_orig_params=True时,在训练过程中可能会存在内存泄漏问题,尤其是在与modelopt转换的模型一起使用时。请使用use_orig_params=False来避免这个问题。