十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

CANN权重更新实战教程:系统管理与用户管理内存的2大模式完整指南

CANN权重更新实战教程:系统管理与用户管理内存的2大模式完整指南 CANN权重更新实战教程系统管理与用户管理内存的2大模式完整指南【免费下载链接】docs该仓库用于维护cann公共文档项目地址: https://gitcode.com/cann/docs在CANN模型开发中权重更新是一个高频场景只需一次编译离线模型就能在模型执行阶段动态刷新权重避免反复编译、大幅提升部署效率。本文带你快速掌握CANN权重更新的2大模式——由系统管理内存和由用户管理内存从接口调用流程到关键细节一次讲透新手也能照着落地。为什么需要CANN权重更新传统做法是改一次权重、重新编译一次模型在以下场景中非常低效 模型在线微调后需要快速生效 多租户服务共享同一份推理代码、各自刷新权重⚡ 权重频繁变更编译开销不可接受CANN的解决方案是一次编译、多次刷新。基于构图接口编译的捆绑模型bundle.om中同时包含多张图推理图、变量初始化图、变量更新图执行阶段按图ID分别执行即可。 小贴士权重初始化是可选步骤。根据业务场景判断是否需要包含权重初始化图不包含可节省模型加载所需的Device内存。两大模式怎么选一图看懂核心差异CANN提供两套捆绑模型加载接口核心区别在于模型运行所需的内存由谁来申请对比项系统管理内存模式用户管理内存模式加载入口aclmdlBundleLoadFromFileaclmdlBundleQueryInfoFromFileaclmdlBundleInitFromFile内存申请系统内部自动完成用户通过aclrtMalloc自行申请接口数量少上手快多流程长内存控制力一般精细不浪费适用场景快速开发、常规业务多模型并发、内存敏感场景一句话选型求快选系统管理求省选用户管理。模式一由系统管理内存最简单上手的CANN权重更新路径该模式接口最少适合绝大多数业务场景。完整接口调用流程如下基于构图接口编译并保存模型aclgrphBundleBuildModelaclgrphBundleSaveModel模型中包含推理图、变量初始化图、变量更新图调用aclmdlBundleLoadFromFile或aclmdlBundleLoadFromMem加载模型调用aclmdlBundleGetModelId获取图的ID根据权重初始化图ID调用模型执行接口如aclmdlExecute执行权重初始化若需更新权重先调用aclmdlSetDatasetTensorDesc设置图的tensor描述信息根据权重更新图ID执行权重更新图根据推理图ID执行推理图推理结束后调用aclmdlBundleUnload卸载模型以3张图的bundle.om为例各图索引固定为0推理图、1初始化图、2更新图核心执行序列为aclmdlBundleLoadFromFile(./bundle.om, bundle_id); // 加载捆绑模型 aclmdlBundleGetModelId(bundle_id, 0, infer_id); // 获取推理图ID aclmdlBundleGetModelId(bundle_id, 2, update_id); // 获取权重更新图ID aclmdlSetDatasetTensorDesc(update_mdl_input, tensorDesc, need_refresh_index); // 设置权重描述 aclmdlExecute(update_id, update_mdl_input, update_mdl_output); // 执行权重更新图 aclmdlExecute(infer_id, infer_mdl_input, infer_mdl_output); // 执行推理图 aclmdlBundleUnload(bundle_id); // 卸载捆绑模型完整示例代码见 weight_update_system_manages_memory.md。关键细节不想刷新的权重怎么办若不需要更新某一个权重比如第0个shape可以传入空tensor但Device内存必须有效std::vectorint64_t dims{0}; // dims元素为0表示空tensor auto tensorDesc aclCreateTensorDesc(ACL_FLOAT, dims.size(), dims.data(), ACL_FORMAT_ND); aclmdlSetDatasetTensorDesc(update_mdl_input, tensorDesc, no_need_refresh_index);模式二由用户管理内存精准掌控每一块Device内存该模式下用户先查询模型内存信息、自行申请工作内存和权重内存再加载图。接口调用流程调用aclmdlBundleQueryInfoFromFile获取模型描述信息调用aclmdlBundleGetQueryModelNum获取捆绑模型中的图总数调用aclmdlBundleGetVarWeightSize和aclmdlBundleGetSize获取内存信息可刷新权重大小、每张图的工作内存与权重内存大小调用aclmdlBundleInitFromFile初始化模型根据索引多次调用aclmdlBundleLoadModelWithMem加载图传入申请好的内存得到对应图的modelId依次执行权重初始化图 → 权重更新图 → 推理图卸载时需先调用aclmdlBundleUnloadModel卸载图再调用aclmdlBundleUnload卸载模型aclmdlBundleQueryInfoFromFile(./bundle.om, query_info); // 查询内存信息 aclmdlBundleGetVarWeightSize(query_info, variableWeightSize); // 可刷新权重大小 aclmdlBundleGetSize(query_info, 0, inferWorkSize, inferConstWeightSize); aclrtMalloc(var_p, variableWeightSize, ACL_MEM_MALLOC_NORMAL_ONLY); // 用户申请内存 aclmdlBundleInitFromFile(./bundle.om, var_p, variableWeightSize, bundle_id); aclmdlBundleLoadModelWithMem(bundle_id, 0, inferWorkPtr, inferWorkSize, inferConstWeightPtr, inferConstWeightSize, infer_id);完整示例代码见 weight_update_user_manages_memory.md。⚠️ 注意如果不希望系统内部申请内存在var_p处传nullptr、variableWeightSize处传0即可切换回系统管理。常见问题与最佳实践Q1两种模式可以混用吗可以。用户管理内存模式下aclmdlBundleLoadModelWithMem对每张图可单独决定是否传内存——某张图不想自行管理传nullptr, 0即可由系统内部申请。Q2更新权重后一定要执行推理图吗是的。标准执行序列为权重初始化图可选→ 权重更新图 → 推理图保证推理读到的是最新权重。Q3如何节省Device内存不包含权重初始化图按需编译选择用户管理内存模式精确申请、按需加载图Q4调用接口后需要做什么务必增加异常处理分支并记录报错日志、提示日志——上述示例代码仅展示关键步骤不能直接拷贝编译运行。延伸阅读想深入CANN模型开发全链路建议按顺序阅读权重更新总览weight_update.md模型编译model_build.md模型加载含两套acl接口对比model_load.md模型执行model_execute.md应用开发入门00_acl_cpp_dev.md掌握本文的2大模式后你就能在CANN中实现编译一次、刷新无限次的权重更新方案让模型部署从此告别反复编译的烦恼 【免费下载链接】docs该仓库用于维护cann公共文档项目地址: https://gitcode.com/cann/docs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表