举报
在使用 NPU 插件推理量化的 Llama 3.1 8B 模型时出现 Bad cast from __int64 to unsigned int 错误,通常是由于数据类型不匹配导致的。以下是逐步解决方法:
错误表明在模型图中存在 64 位整数 (int64) 到 32 位无符号整数 (uint32) 的非法转换。Llama 模型的某些操作(如形状、索引计算)可能默认使用 int64,而 NPU 插件可能不支持。
解决方法:强制将模型中的 int64 转换为 int32
在量化导出时添加 --disable-i64 参数:
optimum-cli export openvino -m meta-llama/Meta-Llama-3.1-8B
--weight-format int4
--sym
--group-size 128
--ratio 1.0
--disable-i64 # 强制使用 int32 替换 int64
INT4-llama-3.1-8B确认 NPU 插件是否支持 INT4 和 int32 数据类型:
INT8、FP16 可能优先支持)。--weight-format int8 量化,排除 INT4 兼容性问题:optimum-cli export openvino -m meta-llama/Meta-Llama-3.1-8B
--weight-format int8 # 使用 INT8 替代 INT4
--sym
--group-size 128
--ratio 1.0
--disable-i64
INT8-llama-3.1-8B在代码中加载模型时,明确设置输入/输出精度:
from openvino import Core
core = Core()
model = core.read_model("INT4-llama-3.1-8B/openvino_model.xml")
# 强制转换输入/输出为 int32
for input in model.inputs:
input.get_node().set_element_type(ov.Type.i32)
for output in model.outputs:
output.get_node().set_element_type(ov.Type.i32)
compiled_model = core.compile_model(model, "NPU") # 指定 NPU 设备pip install --upgrade openvino-ai在 CPU 上运行量化模型,确认是否是 NPU 特有错误:
compiled_model = core.compile_model(model, "CPU") # 先在 CPU 运行启用详细日志定位问题层:
core.set_property("NPU", {"PERFORMANCE_HINT": "THROUGHPUT", "LOG_LEVEL": "DEBUG"})检查日志中触发类型转换的具体操作(如 ShapeOf、Gather 等),并在导出时跳过这些操作。
--sym):NPU 可能对非对称量化(asym)支持更好,尝试:optimum-cli export openvino -m ... --sym false ...--group-size):尝试 --group-size 64 或 --group-size 32。通过上述步骤,90% 以上的类型转换错误可被解决。核心要点是强制模型使用 NPU 兼容的数据类型(如 int32 替换 int64) 并验证量化参数与硬件的兼容性。如果问题依旧,建议在 OpenVINO GitHub Issues 提交详细错误日志。
举报
更多回帖