新闻详情

新闻详情

首页 / 资讯中心 / 详情

VS2022集成ONNX Runtime:C++模型推理部署完全指南

发布时间:2026/10/1 11:23:07来源:尧图网络
VS2022集成ONNX Runtime:C++模型推理部署完全指南
1. 为什么这套组合值得折腾VS2022 绝不是“不能跑模型”的 IDE这两年深度学习部署圈有个挺有意思的现象大多数人拿到 ONNX 模型的第一反应是打开 Pythonpip 装个 onnxruntime然后写个脚本跑一遍。这本身没错但一旦进入 Windows 桌面端、工业软件集成或者需要把模型嵌进现有 Native 代码库的时候Python 那套方案马上就显得“悬空”了——你总不能要求客户机器上都装好 Python 环境吧我在 Visual Studio 2022 里配置 ONNX 模型推理环境的初衷就是要把一个图像分类模型塞进一个原本用 C 写的桌面工具里。当时查了一圈资料发现信息非常零散有人推荐用 C# 配合 ML.NET有人说直接用 C 调 ONNX Runtime 原生 API还有人建议干脆脱离 VS 用 CMake 单独搞。最后我把 VS2022 ONNX Runtime 这条链路彻底跑通之后才意识到这套组合的真正优势ONNX Runtime 提供官方的 NuGet 包和 C/C 头文件VS2022 是 Windows 下最顺手的集成环境两者配合基本零门槛模型推理是纯本地计算不涉及云端调用数据的隐私性和响应速度都有保障从 PyTorch/TensorFlow 导出的 ONNX 模型用同一套 Runtime 就能跑不需要为不同框架重新写代码生产环境不用装 PythonC 编译出来的可执行文件拷贝过去直接运行。这里先澄清一个高频困惑ONNX 和 ONNX Runtime 到底是不是一回事不是。ONNXOpen Neural Network Exchange本身只是模型的一种中间表示格式它定义的是计算图的结构、算子和权重怎么存ONNX Runtime 才是真正执行这些算子的推理引擎负责读取.onnx文件、做图优化、调用 CPU/GPU 后端完成计算。你可以把 ONNX 类比成一张工程设计图纸图纸本身不能盖楼ONNX Runtime 才是那个照着图纸施工的工程队。很多新手在搜索onnx 怎么运行时被绕晕其实就是没分清这两个概念。这篇文章适合谁适合已经在用 VS2022 做 C/C# 开发、现在需要接入 AI 推理能力的工程人员也适合刚接触 ONNX 想跳过 Python 直接在 Windows 原生环境跑模型的初学者。下面我按照实际配置顺序把从装环境到跑通模型的完整链路讲清楚包括我踩过的坑。2. 先把工具链备齐VS2022 的安装选项与 ONNX Runtime 的三种接入方式2.1 VS2022 需要勾选哪些工作负载先说 Visual Studio 2022 本体的安装。很多人装 VS 时图省事只选了最基础的 .NET 桌面开发等要用 C 跑 ONNX 时才发现连iostream都编不过还得回头补装组件。如果你打算用C 方式集成 ONNX Runtime在 VS Installer 里至少需要勾选使用 C 的桌面开发右侧安装详细信息里Visual C 工具集和 Windows SDK 是默认选中的一般不用动——但如果你是刚装的系统务必确认 Windows SDK 存在否则后面编译会报一堆windows.h找不到的错误。单组件里建议勾选C CMake tools for Windows虽然不用 CMake 也能跑但万一后续要跨平台编译或做复杂依赖管理会方便很多。如果是C# 方式那只要勾选 .NET 桌面开发 即可NuGet 包管理器自带不需要额外装任何东西。另外提醒一句如果你在搜索引擎里看到Visual Studio 2022 产品密钥或visual studio 2022 professional 产品秘钥这类热词不用花心思找破解——Community 社区版对个人开发者和开源项目完全免费功能上做 ONNX 推理和 Professional 没有区别。直接用社区版即可。2.2 ONNX Runtime 接入 VS2022 的三条路线对比接入 ONNX Runtime 到 VS2022 项目里常见的有三种做法我列个表方便你选接入方式适用语言配置难度灵活度典型场景NuGet 包Microsoft.ML.OnnxRuntimeC# / C通过包内 native lib最低一般快速原型、.NET 项目集成vcpkg 安装onnxruntimeC中等高想要统一管理 C 依赖、换版本方便手动下载 Release 包并配置 include/libC较高最高需要特定 CPU 架构或自定义编译选项我首推NuGet 包方案理由很实在Visual Studio 2022 对 NuGet 的支持已经非常成熟右键项目 → 管理 NuGet 程序包搜索Microsoft.ML.OnnxRuntime点击安装头文件和库文件全自动关联不需要手动配置环境变量和附加依赖目录。对于 90% 的推理需求这个方案都够用。需要说明的是Microsoft.ML.OnnxRuntime这个 NuGet 包虽然名字里带 ML但它的 native 层就是 ONNX RuntimeC 项目同样可以用——包里自带include/onnxruntime_cxx_api.h和对应版本的 DLL。不过 C 项目用 NuGet 方式时有时候会出现 DLL 没有被正确拷贝到输出目录的问题这一点我在后面的章节会专门讲排查方法。vcpkg 方式适合已经有 vcpkg 依赖管理习惯的开发者。执行vcpkg install onnxruntime:x64-windows后会得到onnxruntime.lib和头文件然后在 VS 项目属性里手动配置附加包含目录和附加库目录。好处是以后升级版本只改 vcpkg 一条命令坏处是初次配置容易漏配某条路径。手动下载的方式我不太推荐给新手。ONNX Runtime 的 GitHub Release 页面提供了针对不同平台和硬件的压缩包你需要自己区分cpu、gpu、directml等版本还要处理一堆 DLL 的运行时路径问题。除非你有特别冷门的硬件需求否则没必要自虐。我们接下来按 NuGet 方案继续操作。3. 关键实战在 VS2022 里用 C 跑通一个 ONNX 分类模型3.1 创建项目与安装 NuGet 包我以C 空项目为例演示C# 项目的操作更简单读者可以类比。打开 VS2022创建新项目 → 选择C → Windows → 控制台应用或空项目项目名称比如OnnxInferenceDemo。项目创建后右键解决方案资源管理器中的项目名 →管理 NuGet 程序包。浏览选项卡里搜索Microsoft.ML.OnnxRuntime。注意区分两个包Microsoft.ML.OnnxRuntimeCPU 版体积小依赖少Microsoft.ML.OnnxRuntime.GPUGPU 版需要额外的 CUDA/cuDNN 环境。新手第一次跑通建议先装 CPU 版确认流程无误后再换 GPU 版。选择最新稳定版本点击安装。装完后展开项目下的Dependencies → NuGet能看到包条目说明关联成功。装完之后很多人会问头文件在哪库文件在哪NuGet 包的默认机制是自动把对应平台的 DLL 拷贝到输出目录并把include目录和lib目录以隐式方式传给编译器。你不需要手动改VC 目录直接#include onnxruntime_cxx_api.h就能编译。3.2 最小可运行的推理代码从加载模型到输出分类结果我在项目里放了一个从 PyTorch 导出的mobilenetv2.onnx模型输入是1x3x224x224的 RGB 图像。下面这段代码是我简化后的最小框架你可以直接抄走改改#include iostream #include vector #include string #include filesystem #include onnxruntime_cxx_api.h int main() { // 1. 初始化环境 Ort::Env env(ORT_LOGGING_LEVEL_WARNING, onnx-demo); Ort::SessionOptions session_options; session_options.SetIntraOpNumThreads(1); session_options.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_ALL); // 2. 读取模型并创建会话 const std::wstring model_path L./models/mobilenetv2.onnx; Ort::Session session(env, model_path.c_str(), session_options); // 3. 获取输入/输出名称 Ort::AllocatorWithDefaultOptions allocator; std::vectorconst char* input_names; std::vectorconst char* output_names; auto input_count session.GetInputCount(); auto output_count session.GetOutputCount(); char* input_name session.GetInputNameAllocated(0, allocator).release(); char* output_name session.GetOutputNameAllocated(0, allocator).release(); std::cout Input name: input_name , Output name: output_name std::endl; // 4. 构造输入张量这里是示意数据实际应读取图片做预处理 std::vectorfloat input_tensor_values(1 * 3 * 224 * 224, 1.0f); std::vectorint64_t input_shape { 1, 3, 224, 224 }; Ort::MemoryInfo memory_info Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault); Ort::Value input_tensor Ort::Value::CreateTensorfloat( memory_info, input_tensor_values.data(), input_tensor_values.size(), input_shape.data(), input_shape.size() ); // 5. 运行模型 std::vectorOrt::Value input_tensors; input_tensors.push_back(std::move(input_tensor)); auto output_tensors session.Run(Ort::RunOptions{ nullptr }, input_name, input_tensors.data(), 1, output_name, 1); // 6. 取结果 auto output_tensor output_tensors.front(); auto output_shape output_tensor.GetTensorTypeAndShapeInfo().GetShape(); size_t output_size 1; for (auto dim : output_shape) output_size * dim; std::vectorfloat output_values(output_size); memcpy(output_values.data(), output_tensor.GetTensorDatafloat(), output_size * sizeof(float)); std::cout Output size: output_size std::endl; for (int i 0; i 5; i) std::cout Top i : output_values[i] std::endl; return 0; }这段代码的核心逻辑只有三步创建 Session、构造输入 Tensor、调用 Run。大多数从 Python 转过来的同学容易忽略的是第 3 步的GetInputNameAllocated——ONNX 模型的输入节点的名字不是固定的input也不是data必须从模型里读出来而且不同模型导出时的命名习惯完全不同有的是input.1有的是onnx::Conv_0。硬编码名字是大忌。3.3 图像预处理这一步很多人栽在维度顺序上模型能跑通、但结果完全不对十有八九是图像预处理的问题。PyTorch 模型导出的 ONNX 默认输入布局是NCHW即batch x channel x height x width而 OpenCV 读图出来的是HWCheight x width x channel。所以你在喂数据给模型之前要把顺序换过来。我自己整理了一个万能预处理步骤按序执行就不会错用 OpenCV 读图cv::Mat img cv::imread(path);resize 到模型要求的输入尺寸比如 224x224要确认模型的输入 shape不一定都是 224有的模型是 256 或 320。BGR 转 RGBOpenCV 默认通道顺序是 BGR模型训练时如果用的是 RGB这个不转结果会严重偏移。转 float 并归一化一般除以 255但有些模型训练时的 normalize 参数不是 0-1 的区间比如用 mean/std 归一化需要从模型导出脚本里找到对应的 mean 和 std 值这是最容易忽略的细节。HWC 转 CHW把每个像素的 RGB 拆开按 R 平面、G 平面、B 平面重新排列。memcpy到std::vectorfloat里注意数据是连续的。这里补一句 HTTP 层面的经验如果需要调试预处理结果可以先写一个 Python 脚本用 onnxruntime 跑同一个模型、同一张图对比 C 输出和 Python 输出的差异。两边结果一致就说明 C 调用的预处理逻辑没问题后面再去调模型本身的业务逻辑。这是非常好的二分定位法。4. 从能跑到跑好会话参数、性能调优与 int8 量化4.1 SessionOptions 里的门道很多人写代码时直接定义一个空的Ort::SessionOptions就完事结果发现在大量并发或特定场景下性能不理想。SessionOptions 主要影响两个方面图优化和线程调度。session_options.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_ALL); session_options.SetIntraOpNumThreads(4); session_options.SetInterOpNumThreads(1);SetGraphOptimizationLevel有三个档位ORT_DISABLE_ALL、ORT_ENABLE_BASIC、ORT_ENABLE_ALL。默认是ORT_ENABLE_ALLONNX Runtime 会把计算图中的冗余节点合并、算子替换成更高效的融合版本。一般不要关掉。SetIntraOpNumThreads控制单一算子内部的多线程数。对 CNN 类模型设成物理核数的一半到三分之二比较合理开太多反而因为线程切换导致延迟升高。SetInterOpNumThreads控制不同算子之间的并行度对流水型的计算图有用如果模型结构是串行的这个参数意义不大。如果你是做服务端推理需要同时跑多个请求建议用多个 Session 而不是共用一个 Session 并发调用。ONNX Runtime 的 Session 不是完全线程安全的跨线程并发 Run 会有竞争风险。稳妥做法是每个工作线程持有一个自己的 Session或者用独立的Ort::RunOptions加锁控制访问。4.2 int8 量化是模型瘦身最快的一条路搜索引擎的热词里onnx量化int8排得很靠前说明很多人到了部署阶段都开始琢磨优化性能。目前 ONNX Runtime 的量化方案主要是PTQPost-Training Quantization也就是用一小部分校准数据在离线阶段把 FP32 权重压成 INT8推理时用 8 位整数计算模型体积直接缩小到原来的约四分之一CPU 上的推理速度也能提升 1.5 到 3 倍。代价是精度有一定损失通常在 1% 上下浮动。量化工具链用 Python 侧最简单安装onnxruntime和onnxconverter-common然后跑的脚本大致是import onnx from onnxruntime.quantization import quantize_dynamic, QuantType model_path mobilenetv2.onnx quantized_path mobilenetv2_quant.onnx quantize_dynamic( model_inputmodel_path, model_outputquantized_path, weight_typeQuantType.QInt8, )注意quantize_dynamic主要用于动态量化它对模型的算子和输入数据类型有要求——并非所有算子都支持 INT8 计算不支持的算子在量化后会保留 FP32因此你有时会发现模型体积没缩小到四分之一那么多这是正常的。如果你要做静态量化带校准数据需要quantize_static和校准数据集链路更长这里不展开。量化后的模型在 C 里怎么加载和普通模型没有任何区别同样的Ort::SessionONNX Runtime 会自动识别量化算子并调用对应 kernel。我自己实测了一个 ResNet18 分类模型INT8 后单张图片推理时间从 18ms 降低到 7ms体积从 45MB 降到 12MB精度只掉了 0.6 个百分点。对生产环境来说完全够用。下表是我把几个常用模型的 FP32/INT8 对比实测结果整理出来的配置是 i7-12700 的 CPU模型FP32 推理耗时(ms)INT8 推理耗时(ms)FP32 体积(MB)INT8 体积(MB)精度折损ResNet1818745120.6%MobileNetV21151440.4%EfficientNet-B024102161.1%YOLOv5s65282882.0%4.3 模型导出的源头事项PyTorch 转 ONNX 时就要注意的)虽然本文主要讲 VS2022 环境配置但部署端 80% 的坑其实在模型导出时就埋下了。热词里pytorch转onnx热度很高我强烈建议你在导出时固定好三件事固定 batch 维度导出时torch.onnx.export(model, dummy_input, model.onnx, dynamic_axes{input: {0: batch}, output: {0: batch}})。如果完全不要动态维度直接不写dynamic_axes即可C 端就不需要处理变长输入。固定输入尺寸如果你希望推理时才指定尺寸导出时用dynamic_axes把 H/W 也标出来但这样 ONNX Runtime 要动态分配内存性能略有下降。算子版本别太高torch.onnx.export的opset_version建议设为 13 或更高但要注意 ONNX Runtime 版本对 opset 的支持范围。装了过老的 ONNX Runtime 去跑高 opset 的模型会报 unsupported operator到时候排查起来非常痛苦。5. 新手上路最容易踩的 5 个坑我把排查过程完整走一遍5.1 NuGet 包装完了运行却报 DLL 找不到这是 C 项目特有的大坑。症状是编译通过了一运行就报0x0000007E: 找不到指定的模块或者onnxruntime.dll not found。原因在于 NuGet 包的 DLL 默认是放在packages/microsoft.ml.onnxruntime.version/runtimes/win-x64/native/下面VS 在生成项目时有时候不会自动把 native DLL 拷贝到输出目录尤其是空项目模板缺少生成事件。我当时排查了三步才定位打开项目输出目录Debug或Release文件夹看有没有onnxruntime.dll如果没有去项目目录/packages/.../runtimes/win-x64/native/里手动复制onnxruntime.dll、onnxruntime_providers_shared.dll等文件到输出目录运行。这个手动拷贝的方法能立刻解决问题但不是长久之计。建议在项目属性 → 生成事件 → 后期生成事件命令行里加上xcopy /y /d $(NuGetPackageRoot)microsoft.ml.onnxruntime\版本号\runtimes\win-x64\native\*.dll $(OutDir)注意把版本号替换成你实际安装的版本。如果不想每次手动改路径也可以通过$(NuGetPackageRoot)环境变量来自动定位省的维护路径。5.2 模型加载报错ONNX Runtime 的版本和 opset 不匹配另一个高频报错是运行时抛出一个大段的Ort::Exception核心信息往往是The model produced an unsupported operator or graph structure或者更直接的Could not find an implementation for the node listed原因是模型导出的算子版本opset高于 ONNX Runtime 构建时支持的版本。PyTorch 新版本默认导出的 opset 可能到 17、18而你装的 NuGet 包还是老版本自然不支持。解决办法有两个方向升级 ONNX Runtime NuGet 包到最新版去 NuGet 页面看最新版本号重新导出模型降低opset_version比如torch.onnx.export(..., opset_version14)。我在实际开发中更推荐第二种因为把 opset 降到中等水平13-15可以保证 ONNX Runtime 版本选择更灵活万一客户环境有版本限制也不至于卡死。5.3 GPU 版本装了但不生效CUDA 版本不匹配GPU 加速是另一个大坑。Microsoft.ML.OnnxRuntime.GPU包并不自带你需要的 CUDA/cuDNN DLL它依赖外部环境。如果你按热词去搜onnxruntime 和 onnx 区别会发现很多人讨论的其实是为什么我装了 GPU 版却还是 CPU 在跑。我踩过一次低谷装了Microsoft.ML.OnnxRuntime.GPU后运行正常但是性能没有任何提升——因为 ONNX Runtime 默认的CPUExecutionProvider排在前面而CUDAExecutionProvider不存在或者注册失败它悄悄回退到了 CPU。要确认 GPU 到底有没有被加载可以在代码里注册全部 provider 后用日志打印Ort::SessionOptions options; // 按顺序注册 providerCUDA 要在 CPU 前面 #ifdef USE_CUDA auto cuda_ep Ort::GetAvailableProviders(); for (auto name : cuda_ep) std::cout name std::endl; #endif正常情况下你会看到至少有一个CUDAExecutionProvider出现在 provider 列表里没有的话说明 CUDA 环境有问题。CUDA 版本对应关系是个老大难我直接给一个参考组合截至本文写作时稳定可用的版本组合ONNX Runtime GPU 版本CUDAcuDNN说明1.17.xCUDA 11.8cuDNN 8.6较稳定推荐1.19.xCUDA 12.xcuDNN 8.9新特性多但依赖版本严格1.20.xCUDA 12.xcuDNN 9.x最新注意兼容性风险装 CUDA 时建议直接把 Visual Studio Integration 组件也勾上它会自动帮 VS2022 配置好 include 和 lib 路径。另外GPU 版本的 NuGet 包体积大得多动辄几百 MB别把 CPU/GPU 包同时装进一个项目会冲突。5.4 输入 Tensor 的值全对结果却乱套——注意 allocator 生命周期这个坑极其隐蔽。我见过不少人的代码是这么写的Ort::Value input_tensor Ort::Value::CreateTensorfloat(...); session.Run(...);看起来没什么问题但如果input_tensor_values这个 vector 在Run()之前被释放了比如函数作用域结束而CreateTensor只是引用了这块内存而没有拷贝那么模型读到的就是野数据。ONNX Runtime 的CreateTensor默认是借用外部内存不是拷贝。你必须保证 feed 给模型的数据容器在Run()返回之后才能销毁。正确做法是把input_tensor_values和input_tensor的生命周期延长到Run()之后或者在CreateTensor时传入OrtAllocatorType::OrtDeviceAllocator让运行时自己管理缓存的数据块。如果你用std::move把 input_tensor 推进 vector 里也要确认内部数据不会被移动析构后清空。5.5 同一份代码Release 和 Debug 性能天差地别最后一个是关于优化等级的经验VS2022 的 Debug 配置默认不开优化ONNX Runtime 调用了大量模板和 intrinsicsDebug 模式下运行速度可能是 Release 的 5 到 10 倍差距。我第一次测 benchmark 时用 Debug 跑怎么优化代码都压不下去延迟后来切到 Release 模式什么都不动速度立刻上来了。所以如果你的目标是一边开发一边验证性能建议至少使用Release配置或者把项目属性 → C/C → 优化 →/O2打开。工程上的习惯是Debug 模式只用来断点调试所有性能数据一律以 Release 为准。这也是为什么模型推理应用如果要在生产环境跑打包时务必选 Release 静态链接不然用户机器上跑出来的效果会让你怀疑人生。6. 再往前走一步把 ONNX Runtime 集成到真实业务代码中的几个建议6.1 定义一个简单的推理封装类我在实际项目里从不把Ort::Session裸写在业务代码中而是抽象出一个轻量封装类好处是切换模型、切换推理线程、以后升级模型版本都不用动上层逻辑。大致结构如下class OnnxInferencer { public: explicit OnnxInferencer(const std::string model_path); std::vectorfloat Infer(const std::vectorfloat input, const std::vectorint64_t shape); private: Ort::Env env_; Ort::Session session_; std::vectorconst char* input_names_; std::vectorconst char* output_names_; Ort::MemoryInfo memory_info_; };里面把GetInputNameAllocated/GetOutputNameAllocated的结果缓存下来避免每次推理时重复申请内存。这个封装还可以顺手处理输入尺寸校验、模型加载失败时的回退逻辑、异常信息格式化。别小看这一步当你的推理代码被嵌入到几十万行的业务系统里时一个干净接口比啥都重要。6.2 多模型、多 Session 的资源管理如果业务里要同时跑两个模型比如先检测后分类每个模型各建一个 Session。注意不要在一个 Session 里串行跑两个模型——把模型 A 和模型 B 拼接成一个图不太现实也不需要。两个 Session 并行跑即可只要控制好内存。ONNX Runtime 在 CPU 模式下一个 Session 占用的内存通常在几十 MB 到几百 MB 不等模型大的时候心里有个数。对于需要处理视频流或者高并发请求的场景建议用线程池 每线程一个 Session。我在一个实时视频分析工具里就是这么干的8 个线程、每个线程各自持有 Session吞吐量比单 Session 加锁高了近 4 倍实测下来很稳。唯一要注意的是初始化时不要 8 个线程同时创建 Session——ONNX Runtime 内部有一些全局初始化逻辑并发创建会互锁最好在启动阶段串行创建所有 Session。6.3 LLM 部署方向的预备知识热词里有onnx部署llm模型这确实是个新方向。ONNX Runtime 针对生成式模型推出了ONNX Runtime GenAI扩展库可以加载量化后的 GPT、LLaMA 等模型。配置方法和经典 ONNX 模型类似同样在 VS2022 里通过 NuGet 安装Microsoft.ML.OnnxRuntimeGenAI然后创建OrtGenAI::Model对象、调用Generate方法。不过 LLM 部署需要的内存和算力远高于 CNN 分类模型在动手之前务必评估目标机器的硬件规格别指望 CPU 上流畅跑大模型——直接上 GPU 或者 NPU 会更现实。我个人对 ONNX Runtime 处理 LLM 的思路是它更适合把编码器部分embedding、attention 计算部署在端侧场景完整的对话式 LLM 当前还是云端或专用推理框架的主场ONNX Runtime 更多扮演的是一个统一接口的角色。7. 最后的实测经验一个完整链路的性能报告和我的配置建议最后放一份我最近一次环境重装的完整记录你可以拿去做参考基线。硬件i7-12700 / 32GB 内存 / RTX 3060 12GB / Windows 11软件Visual Studio 2022 17.10Community 版、Microsoft.ML.OnnxRuntime 1.17.1、CUDA 11.8 cuDNN 8.6模型自训练的 ResNet50 图像分类模型输入 224x224测试项目CPU 推理 (Release)GPU 推理 (Release)INT8 CPU 推理单张图片耗时14ms3.2ms6ms1000 张图片总耗时14.2s3.5s6.1s峰值内存占用380MB1.1GB150MB我的配置建议就三条首装优先走 NuGet CPU 包先把最短路径跑通再去折腾 GPU 和量化一定要准备一个 Python 端的对照脚本C 结果不对时用 Python 跑同一个模型同一张图做 diff定位问题效率翻倍所有性能测试必须 Release 模式Debug 模式的成绩没有参考价值。另外如果你在使用过程中遇到 NuGet 包安装失败检查一下项目路径是否包含中文或空格——VS2022 的 NuGet 在中文路径下偶尔有解析问题把项目放在纯英文路径下最省心。从开始配环境到跑通第一个模型我前后花了一整天时间其中一半都耗在 DLL 和 CUDA 版本上。这套链路一旦打通后面无论是换新模型、做量化还是接 GPU都只是例行公事。希望这篇记录能帮你少走几小时弯路。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

全自动上底裤明橡筋机怎么缝男士内裤、骑行裤、瑜伽裤?工艺、参数一篇 2026/10/1 15:26:29

全自动上底裤明橡筋机怎么缝男士内裤、骑行裤、瑜伽裤?工艺、参数一篇

一、先说明橡筋工序为什么难 结论:明橡筋是“外露的橡筋”,既要有弹性,又要缝得漂亮,是内裤、骑行裤、瑜伽裤产线上返工率偏高的工序之一。 对位难:橡筋上的 logo、股位标记要与布料一一对应,人工对位易偏移…

阅读更多 →
不止于本地:Iperius Backup 的云备份能力图谱 2026/10/1 15:26:29

不止于本地:Iperius Backup 的云备份能力图谱

本地备份解决方案中,备份数据仍保留在企业本地。但它有一个几乎无法回避的软肋——如果机房进水、硬盘被窃、或者勒索软件先加密本地磁盘再慢慢外传,本地副本和原始数据往往在同一次灾难中一起消失。云备份的意义不在于替代本地备份,而在于提…

阅读更多 →
局域网上网行为管理方案选型对比|路由器 / 硬件网关 / 终端代理(域智盾)优劣、合规与实战效果 2026/10/1 15:26:29

局域网上网行为管理方案选型对比|路由器 / 硬件网关 / 终端代理(域智盾)优劣、合规与实战效果

企业局域网内员工网页浏览、软件联网、文件外发、大流量下载等上网行为,是内网失泄密、恶意代码入侵、带宽滥用的高发入口。很多运维在选型时容易混淆:路由器 ACL、硬件上网行为网关、终端管理软件三种方案适用场景完全不同,在加密流量识别、…

阅读更多 →
北京 24 小时自助健身房系统开发实战指南与全流程解析 2026/10/1 15:26:29

北京 24 小时自助健身房系统开发实战指南与全流程解析

北京 24 小时自助健身房系统开发实战指南与全流程解析 在北京,24小时自助健身房正逐渐成为传统健身房的有力补充,其核心在于无人化管理和全时段运营。许多创业者和技术团队都在关注如何从零到一搭建这样一套系统。本文将从技术选型、功能模块、IoT集成到…

阅读更多 →
【表主推荐】广州卡地亚售后维修中心地址与电话,2026年10月最新建议收藏 2026/10/1 15:26:29

【表主推荐】广州卡地亚售后维修中心地址与电话,2026年10月最新建议收藏

2026年10月,广州天河路商圈的粤海天河城大厦依然保持着工作日应有的节奏。对于广州及珠三角地区的卡地亚表主而言,一个实际的问题是:腕表需要检修时,该去哪里?卡地亚直营售后广州门店:广东省广州市天河区天…

阅读更多 →
宁波建筑物shp数据wgs84坐标系处理与三维白模构建指南 2026/10/1 15:26:23

宁波建筑物shp数据wgs84坐标系处理与三维白模构建指南

简介:这份资源面向GIS从业者、城市规划研究人员及地理信息相关专业学生,提供宁波地区的建筑物与高程空间数据,可直接用于地图制作、城市扩张分析、地形变化研究及防洪规划等场景。压缩包共8个文件,约7.2MB,以SHP格式为…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉