feat(model): 新增 ModelLoader 链式构建 API 及 ORT GPU/Tract 多线程配置
- 在 ddddocr-core 中定义 ModelBuilder Trait 及其错误类型 - ddddocr-ort 支持 use_gpu、device_id 及 num_threads 链式配置与 CUDA 硬件加速 - ddddocr-tract 基于 multithread-mm 特性支持 CPU 线程数控制 - 支持基于 tract-linalg 配置推理线程数,显式引入 tract-linalg 的 multithread-mm 特性,控制 GEMM 算子并发 - 优化线程池加载策略,适配 Tokio 异步及 CLI 等多场景
This commit is contained in:
66
ddddocr-ort/src/loader/error.rs
Normal file
66
ddddocr-ort/src/loader/error.rs
Normal file
@@ -0,0 +1,66 @@
|
||||
use ort::Error as OrtError;
|
||||
pub type Result<T> = std::result::Result<T, Error>;
|
||||
#[derive(thiserror::Error, Debug)]
|
||||
pub enum Error {
|
||||
#[error("builder构建失败")]
|
||||
Build(#[from] BuildError),
|
||||
/// 解析 ONNX 模型/路径失败(如文件损坏、算子不支持、路径非法)
|
||||
#[error("解析 ONNX 模型结构失败: {0}")]
|
||||
ModelParse(#[from] ParseError),
|
||||
|
||||
/// 模型计算图优化失败(如常量折叠、形状推导失败)
|
||||
#[error("优化 Tract 模型图失败: {0}")]
|
||||
OptimizationFailed(#[source] OrtError),
|
||||
|
||||
/// 构建可执行 Session 失败(如输入输出 Tensor 类型/形状未确定)
|
||||
#[error("构建可运行 Tract 实例失败: {0}")]
|
||||
RunnableBuildFailed(#[source] OrtError),
|
||||
|
||||
/// JSON 反序列化失败(自动透传 serde_json 报错)
|
||||
#[error("模型 Metadata JSON 解析失败: {0}")]
|
||||
JsonParse(#[from] serde_json::Error),
|
||||
|
||||
/// 字节流非合法 UTF-8 编码(自动透传 Utf8Error)
|
||||
#[error("Metadata 字节流不是合法的 UTF-8 编码: {0}")]
|
||||
InvalidUtf8(#[from] std::str::Utf8Error),
|
||||
|
||||
#[error("模型元数据解析失败: {0}")]
|
||||
MetadataParse(String),
|
||||
|
||||
/// 承载任何第三方扩展、解密、特定预处理插件在执行时产生的自定义错误
|
||||
#[error("{0}: {1}")]
|
||||
Other(String, #[source] Box<dyn std::error::Error + Send + Sync>),
|
||||
}
|
||||
|
||||
|
||||
|
||||
impl Error {
|
||||
/// 方便将任何第三方 Error 包装为 Error::Other
|
||||
pub fn new<E>(msg: impl Into<String>, err: E) -> Self
|
||||
where
|
||||
E: Into<Box<dyn std::error::Error + Send + Sync>>,
|
||||
{
|
||||
Self::Other(msg.into(), err.into())
|
||||
}
|
||||
}
|
||||
#[derive(thiserror::Error, Debug)]
|
||||
pub enum ParseError {
|
||||
/// 策略 A:从文件路径加载失败(附带路径上下文信息,方便排查是找不到文件还是格式不对)
|
||||
#[error("从路径 '{0}' 加载 ONNX 模型失败: {1}")]
|
||||
Path(String, #[source] OrtError),
|
||||
|
||||
/// 策略 B:从内存字节流加载失败(如 include_bytes! 传入的字节流损坏)
|
||||
#[error("从内存字节流解析 ONNX 模型失败: {0}")]
|
||||
Bytes(#[source] OrtError),
|
||||
}
|
||||
#[derive(thiserror::Error, Debug)]
|
||||
pub enum BuildError{
|
||||
#[error("builder构建失败")]
|
||||
BuildFailed(#[from] OrtError),
|
||||
#[error("builder构建失败")]
|
||||
Threads(String),
|
||||
#[error("builder构建失败")]
|
||||
EnabledCudaFailed(String),
|
||||
#[error("builder构建失败")]
|
||||
NotEnabledCuda(String)
|
||||
}
|
||||
Reference in New Issue
Block a user