CANN Runtime 模型任务回退实战:基于 Model RI 的 Task 级参数切换与禁用
CANNAscend人工智能任务调度【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址https://gitcode.com/cann/runtime点击查看免费下载本技术指南围绕开源仓库cann/runtime中的示例example/6_scenarios/fault_tolerant_exec/0_model_task_fallback展开讲解如何在 CANN Runtime 中通过模型运行实例Model RI的 Task 级 API 实现输入不适配时切换到备用路径、并禁用可选后处理任务的回退策略。读完本文你将掌握aclmdlRICaptureBegin/End捕获模型、aclmdlRIGetStreams/aclmdlRITaskGetType/aclmdlRITaskGetSeqId遍历与唯一定位 Task、以及aclmdlRITaskSetParams/aclmdlRITaskDisable/aclmdlRIUpdate提交回退更新的完整实战链路。场景背景什么情况下需要模型任务回退在实际推理链路中主计算任务的输入有时会因为数据质量、格式或语义不符而不适合继续走后续的可选后处理post-processing流程。传统做法是在 Host 侧修改输入后重新捕获、重新下发整个模型开销大且流程繁琐。0_model_task_fallback示例给出的方案更加轻量先按完整路径主计算任务 可选后处理任务正常捕获并执行一遍作为基线Baseline随后在不重新捕获模型的前提下直接定位模型内部的 Task把主任务的输入参数切换为备用输入并整体禁用可选后处理任务再次执行验证回退路径Fallback。最终输出证明主任务输出来自备用输入、后处理输出保持了预设的哨兵值-1从而验证了 Task 级动态调整的可行性。该示例位于 example/6_scenarios/fault_tolerant_exec/0_model_task_fallback适用于需要在运行期动态调整模型内部任务、实现故障容错或遇错降级的开发者。产品支持范围ProductSupportedAtlas A2 training series products/Atlas A2 inference series productsYesAtlas A3 training series products/Atlas A3 inference series productsYesAscend 950PR/Ascend 950DTYes说明以上支持矩阵来自示例自带 READMEREADME_en.md实际部署前请以当前安装的 CANN 版本配套产品文档为准。示例的编译与运行示例的编译、运行入口是 run.sh核心步骤与 README 保持一致将示例代码下载到已安装 CANN 的环境并切换到示例目录cd ${git_clone_path}/example/6_scenarios/fault_tolerant_exec/0_model_task_fallback设置环境变量${install_root}替换为 CANN 安装根目录source ${install_root}/set_env.sh source ${git_clone_path}/example/set_sample_env.sh其中 example/set_sample_env.sh 会依次完成调用 example/common/resolve_cann_env.sh 定位 CANN 安装路径编译并运行 example/tools/get_soc_version/get_soc_version.cpp 小工具通过aclrtGetSocName探测当前芯片的SOC_VERSION再自动探测ASCENDC_CMAKE_DIRascendc.cmake 所在目录并导出ASCEND_INSTALL_PATH、ASCEND_HOME_PATH、SOC_VERSION、ASCENDC_CMAKE_DIR四个变量。编译并执行bash run.shrun.sh内部会检查ASCEND_HOME_PATH、SOC_VERSION、ASCENDC_CMAKE_DIR是否已设置随后依次执行cmake -B build -DASCEND_CANN_PACKAGE_PATH${ASCEND_HOME_PATH}、cmake --build build -j、cmake --install build最后运行./build/main | tee output_msg.txt将运行日志同时输出到屏幕与output_msg.txt。构建层面由 CMakeLists.txt 负责通过ascendc_fatbin_library(model_task_fallback_kernel kernel/model_task_fallback_kernel.cpp)调用 ASCENDC 工具链把 kernel/model_task_fallback_kernel.cpp 编译为 fatbinadd_executable(main main.cpp model_task_fallback.cpp)将入口与主逻辑编译成 Host 侧可执行程序链接${ASCEND_CANN_PACKAGE_PATH}/lib64/libacl_rt.so编译选项为-O2 -stdc17 -D_GLIBCXX_USE_CXX11_ABI0 -Wall -Werror。示例输出正常执行时main程序会打印以下日志[INFO] Start to run 0_model_task_fallback sample. [INFO] Baseline path verified: main_first11, optional_first22. [INFO] Selected fallback tasks: main_seq0, optional_seq1. [INFO] Fallback path verified: main_first31, optional_first-1. [INFO] Run the 0_model_task_fallback sample successfully.四行关键日志的语义Baseline path verified: main_first11, optional_first22完整路径基线验证通过。主任务输出首元素 主输入 1 偏置 10 11后处理输出首元素 11 × 缩放 2 22Selected fallback tasks: main_seq0, optional_seq1成功唯一定位到两个 Kernel Task且主任务序号0先于可选任务序号1Fallback path verified: main_first31, optional_first-1回退路径验证通过。主任务输出首元素 备用输入 21 10 31后处理任务已被禁用输出保持预设哨兵值 -1最后打印整体成功信息进程返回 0。涉及的 CANN RUNTIME API 全景README 将示例涉及的接口按功能归类结合源码 model_task_fallback.cpp 可确认全部接口的真实调用点初始化与去初始化aclInit、aclrtSetDevice选择 Device 0、aclrtResetDeviceForce释放 Device 0 资源、aclFinalizeDevice 内存aclrtMalloc分配两个输入、两个输出共 4 块 Device 缓冲、aclrtMemcpy写入输入/输出哨兵值并读回结果、aclrtFreeStreamaclrtCreateStream创建用于捕获与执行模型的 Stream、aclrtSynchronizeStreamWithTimeout带超时地等待模型执行示例超时 5000 ms、aclrtDestroyStreamKernelaclrtBinaryLoadFromFile加载包含主/可选任务的 Kernel 二进制、aclrtBinaryGetFunction获取fallback_main与fallback_postprocess两个函数句柄、aclrtLaunchKernelWithHostArgs以紧凑 Host 参数下发两个被捕获任务、aclrtBinaryUnLoad模型捕获与执行aclmdlRICaptureBegin、aclmdlRICaptureEnd、aclmdlRIExecuteAsync、aclmdlRIDestroyTask 选择与回退更新aclmdlRIGetStreams、aclmdlRIGetTasksByStream、aclmdlRITaskGetType、aclmdlRITaskGetSeqId、aclmdlRITaskGetParams、aclmdlRITaskSetParams、aclmdlRITaskDisable、aclmdlRIUpdate。示例实现拆解从捕获到回退的完整流程示例主流程由 model_task_fallback.cpp 中的ModelFallbackWorkflow::Run()串起Initialize → AllocateAndPrepare → LoadKernels → CaptureModel → ExecuteVerifyPath(Baseline) → ResetOutputs → SelectTasks → ApplyFallback → ExecuteVerifyPath(Fallback)。下面按阶段剖析。1. 初始化、内存准备与 Kernel 加载Initialize()依次执行aclInit(nullptr)、aclrtSetDevice(0)、aclrtCreateStream(stream_)。AllocateAndPrepare()用aclrtMalloc(..., ACL_MEM_MALLOC_HUGE_FIRST)分配 4 块各 32 字节8 个 int32的 Device 缓冲并把两组输入搬到 Device 侧constexpr BufferData kPrimaryInput {1, 2, 3, 4, 5, 6, 7, 8}; // 主输入 constexpr BufferData kBackupInput {21, 22, 23, 24, 25, 26, 27, 28}; // 备用输入ResetOutputs()将两个输出缓冲填充为哨兵值 -1用于区分任务是否真实执行过。LoadKernels()使用realpath解析 Kernel fatbin 路径./out/fatbin/model_task_fallback_kernel/model_task_fallback_kernel.o后通过aclrtBinaryLoadFromFile加载二进制再用aclrtBinaryGetFunction分别取得fallback_main和fallback_postprocess句柄。Kernel 定义位于 kernel/model_task_fallback_kernel.cpp两个算子均为单核8 个元素逐元素计算fallback_main(input, output)output[i] input[i] 10偏置 kMainBiasfallback_postprocess(input, output)output[i] input[i] * 2缩放 kPostScale。其中在__NPU_ARCH__ 3510架构上还会通过dcci对输出做整行缓存刷写CACHELINE_OUT保证结果对 Host 可见属于平台相关的缓存一致性处理。2. 捕获模型把两次 Kernel 下发固化为 Task 序列CaptureModel()演示了 Model RI 的捕获语义initialMainArgs_ {primaryInput_, mainOutput_}; optionalArgs_ {mainOutput_, optionalOutput_}; aclmdlRICaptureBegin(stream_, ACL_MODEL_RI_CAPTURE_MODE_RELAXED); aclrtLaunchKernelWithHostArgs(mainFunction_, 1, stream_, nullptr, initialMainArgs_, sizeof(initialMainArgs_), nullptr, 0); aclrtLaunchKernelWithHostArgs(optionalFunction_, 1, stream_, nullptr, optionalArgs_, sizeof(optionalArgs_), nullptr, 0); aclmdlRICaptureEnd(stream_, model_);要点捕获模式使用ACL_MODEL_RI_CAPTURE_MODE_RELAXED枚举定义见 include/external/acl/acl_rt.h表示流式捕获约束较为宽松适合本示例的单 Stream 场景两次aclrtLaunchKernelWithHostArgs的参数使用KernelArgs{input, output}这一 8 字节紧凑结构isHostArgs语义上等价于 Host 侧参数aclmdlRICaptureEnd返回模型句柄model_此后两次 Kernel 下发被固化为模型内部的两个 Task序号 0、1。需要说明的是捕获期间主任务读取的是主输入缓冲primaryInput_而后处理任务读取的是主输出缓冲mainOutput_从而在数据流上形成主输入 → 主输出 → 后处理输出的链式依赖。3. 基线路径验证Execute()通过aclmdlRIExecuteAsync(model_, stream_)异步执行完整模型用aclrtSynchronizeStreamWithTimeout(stream_, 5000)等待执行完成再把两块输出aclrtMemcpy回 Host。VerifyPath(kPrimaryInput, main, optional, true)逐元素校验主输出 输入 10首元素 1 10 11后处理输出 主输出 × 2首元素 11 × 2 22。校验通过即打印Baseline path verified: main_first11, optional_first22.随后ResetOutputs()把输出缓冲重新填回 -1为回退路径执行做好准备。4. 定位并唯一识别主任务与可选任务这是示例最核心的部分。SelectTasks()先通过两段式调用获得模型 Stream 列表先查数量再取数据aclmdlRIGetStreams声明见 include/external/acl/acl_rt.h再对 Stream 上的 Task 做同样的两段式查询aclmdlRIGetTasksByStream。随后遍历每个 TaskaclmdlRITaskType type ACL_MODEL_RI_TASK_DEFAULT; aclmdlRITaskGetType(task, type); // 过滤出 Kernel 类型任务 if (type ! ACL_MODEL_RI_TASK_KERNEL) { continue; } aclmdlRITaskGetSeqId(task, sequence); // 取任务序号验证先后关系 aclmdlRITaskGetParams(task, params); // 取 Kernel 句柄、参数布局、块数等 if (params.kernelTaskParams.funcHandle mainFunction_) { selected.main task; selected.mainSequence sequence; selected.mainParams params; } else if (params.kernelTaskParams.funcHandle optionalFunction_) { selected.optional task; selected.optionalSequence sequence; }识别依据是类型 函数句柄 序号三重条件只有ACL_MODEL_RI_TASK_KERNEL类型才可能是计算任务通过aclmdlRITaskGetParams返回的kernelTaskParams.funcHandle与两个函数句柄比对即可唯一区分主/可选任务最后用mainSequence optionalSequence校验主任务确实排在可选任务之前。任一条件不满足Kernel 任务数不是 2、句柄未命中、序号乱序都会报错Cannot uniquely identify the ordered main and optional tasks.。Task 类型枚举aclmdlRITaskType定义于 include/external/acl/acl_rt.h除ACL_MODEL_RI_TASK_KERNEL外还包括 EVENT_RECORD / EVENT_WAIT / EVENT_RESET / VALUE_WRITE / VALUE_WAIT 等类型说明 Model RI 的 Task 抽象覆盖了事件与值同步等更丰富的图内原语。5. 应用回退切换主任务参数 禁用可选任务ApplyFallback()先对捕获时的 Kernel 下发参数做一致性校验类型为 KERNEL、句柄命中fallback_main、isHostArgs 0、argsSize sizeof(KernelArgs)、numBlocks 1确认参数布局与捕获时完全一致随后构造回退参数并提交fallbackMainArgs_ {backupInput_, mainOutput_}; // 主任务输入切换为备用输入 aclmdlRITaskParams updated selected.mainParams; updated.kernelTaskParams.args fallbackMainArgs_; // 指向新的 Host 参数 updated.kernelTaskParams.isHostArgs 1; // 标记为 Host 参数 aclmdlRITaskSetParams(selected.main, updated); // 更新主任务参数 aclmdlRITaskDisable(selected.optional); // 禁用可选后处理任务 aclmdlRIUpdate(model_); // 提交全部更新这里需要理解aclmdlRITaskParams的联合体布局该结构体include/external/acl/acl_rt.h公共部分包含type、taskGrp、opInfoPtr/opInfoSize等字段联合体内按任务类型区分kernelTaskParams、eventRecordTaskParams、valueWriteTaskParams等专用参数结构。对 Kernel 任务aclmdlRIKernelTaskParamsinclude/external/acl/acl_rt.h携带funcHandle、cfg、args、isHostArgs、argsSize、numBlocks。示例正是通过整体拷贝原 params 后仅改写args与isHostArgs的方式保证除输入指针外其余任务属性不变。三个关键接口的语义声明分别见 include/external/acl/acl_rt.h、include/external/acl/acl_rt.h、include/external/acl/acl_rt.haclmdlRITaskSetParams在下次aclmdlRIUpdate前缓存该 Task 的参数更新aclmdlRITaskDisable将 Task 标记为禁用执行时跳过aclmdlRIUpdate把此前所有 Task 参数修改与禁用状态一次性提交到模型后续aclmdlRIExecuteAsync按新状态执行。这种先修改、后提交的两阶段设计意味着可以在一次aclmdlRIUpdate中打包多个 Task 的调整减少 Host 与 Device 之间的交互次数。6. 回退路径验证再次aclmdlRIExecuteAsync执行更新后的模型VerifyPath(kBackupInput, main, optional, false)校验主输出 备用输入 10首元素 21 10 31证明主任务确实改读了备用输入后处理输出 哨兵值 -1证明可选任务被禁用后未再执行若仍执行则应为 31 × 2 62。校验通过后打印Fallback path verified: main_first31, optional_first-1.。7. 资源清理Cleanup()在任意阶段失败时都会按逆序释放资源若捕获未结束先补一次aclmdlRICaptureEnd随后aclmdlRIDestroy销毁模型、aclrtBinaryUnLoad卸载 Kernel 二进制、aclrtFree释放 4 块缓冲、aclrtDestroyStream销毁 Stream、aclrtResetDeviceForce复位 Device 0、最后aclFinalize。每个清理动作都会记录错误码避免异常路径下资源泄漏。从源码看 Model RI 的任务抽象设计结合 include/external/acl/acl_rt.h 中 Model RI 相关接口族可以推断模型运行实例Model RI把一次捕获得到的图Graph进一步细化为Stream → Task → TaskParams的三层可查询结构模型级提供aclmdlRIGetStreams、aclmdlRIExecuteAsync、aclmdlRIUpdateStream 级提供aclmdlRIGetTasksByStreamTask 级提供类型、序号、参数查询与参数设置、禁用接口。这套结构使得开发者无需关心模型内部算子调度的具体实现即可按图内任务的粒度做诊断与动态调整。示例正是这一设计的一个典型应用通过函数句柄唯一标识计算语义、序号唯一标识执行顺序在多个 Kernel 任务中稳定定位目标任务从而在不重建模型的前提下完成输入切换与任务禁用。这也意味着 Model RI 任务级 API 天然适用于故障容错如异常输入降级、运行时任务裁剪如关闭非关键后处理以省算力等场景。常见问题与注意事项路径与环境Kernel fatbin 路径./out/fatbin/...依赖run.sh在当前示例目录下执行cmake --install因此必须在示例目录内运行bash run.sh并确保ASCEND_HOME_PATH、SOC_VERSION、ASCENDC_CMAKE_DIR三个变量已正确设置否则脚本会报错退出任务识别唯一性若模型 Stream 上存在多个同类型 Kernel 任务仅靠类型无法区分必须结合funcHandle与aclmdlRITaskGetSeqId双重判定示例通过kernelCount ! 2与序号乱序检查兜底参数一致性aclmdlRITaskSetParams前应对argsSize、numBlocks、isHostArgs等做一致性校验避免新参数与任务原有调度信息不匹配更新生效时机aclmdlRITaskSetParams/aclmdlRITaskDisable需要配合aclmdlRIUpdate才会生效修改后务必提交更新再执行同步等待示例使用aclrtSynchronizeStreamWithTimeout超时 5000 ms而非无界等待回退场景下建议同样采用带超时的同步方式避免任务被禁用或参数异常时无限阻塞产品适配按 README该能力覆盖 Atlas A2/A3 训练与推理系列及 Ascend 950PR/950DT运行前请确认目标硬件型号。相关代码与文档索引示例 READMEREADME_en.md对应中文版 README.md示例主逻辑model_task_fallback.cpp示例入口main.cppKernel 实现kernel/model_task_fallback_kernel.cpp构建与运行CMakeLists.txt、run.shModel RI 任务参数结构体与接口声明include/external/acl/acl_rt.h环境探测脚本example/set_sample_env.sh、example/common/resolve_cann_env.sh、example/tools/get_soc_version/get_soc_version.cpp小结0_model_task_fallback示例完整演示了 CANN Runtime Model RI 的捕获—查询—定位—修改—提交全链路通过aclmdlRICaptureBegin/End把两次 Kernel 下发固化为可查询的 Task 序列通过aclmdlRIGetStreams、aclmdlRITaskGetType、aclmdlRITaskGetSeqId、aclmdlRITaskGetParams唯一定位目标任务再通过aclmdlRITaskSetParams、aclmdlRITaskDisable、aclmdlRIUpdate把切换主任务输入 禁用后处理任务一次性提交并验证执行结果。这一模式为故障容错、动态降级和运行时任务裁剪提供了不重建模型的轻量级实现思路也是理解 CANN Runtime 图内任务抽象Task 类型、TaskParams 联合体、Stream/Task 层级查询的最佳入门样例。赞分享CANNAscend人工智能任务调度【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址https://gitcode.com/cann/runtime点击查看免费下载相关推荐告别网盘限速烦恼这可能是最好用的网盘直链下载助手告别网盘限速烦恼这可能是最好用的网盘直链下载助手 你是否曾被网盘下载速度折磨得焦头烂额面对几十KB/s的龟速下载看着进度条缓慢爬行那种煎熬让人抓狂。更让CANNAscend人工智能任务调度CANN Runtime 容错执行指南基于 ACL-Graph 模型任务回退Model Task Fallback的降级处理实战CANN Runtime 容错执行指南基于 ACL Graph 模型任务回退Model Task Fallback的降级处理实战 导读 在推理或训练流水线CANNAscend人工智能任务调度CANN Runtime 模型运行时实例Model RI任务更新实战基于 aclmdlRICaptureTaskGrp 与 aclmdlRICaptureTaskUpdate 的算子级模型更新CANN Runtime 模型运行时实例Model RI任务更新实战基于 aclmdlRICaptureTaskGrp 与 aclmdlRICaptureCANNAscend人工智能任务调度上一篇Undecimus 项目推荐下一篇NVIDIA CUDA Samples 项目推荐创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

清理 package.json:5 个可安全删除的 npm 依赖及迁移指南

清理 package.json:5 个可安全删除的 npm 依赖及迁移指南

1. 为什么现在可以动手清理 package.json 了如果你维护过超过两年的前端项目,打开package.json的那一刻大概率会有一种翻旧仓库的感觉:有些依赖你根本想不起来当初为什么装,有些依赖的 GitHub 仓库已经两年没提交,还有些依赖你每次…

2026/9/20 11:49:16 阅读更多 →
chezmoi ejson 模板函数详解:`ejsonDecrypt` 与 `ejsonDecryptWithKey` 在 dotfiles 中的安全密钥解密实践

chezmoi ejson 模板函数详解:`ejsonDecrypt` 与 `ejsonDecryptWithKey` 在 dotfiles 中的安全密钥解密实践

chezmoi ejson 模板函数详解:ejsonDecrypt 与 ejsonDecryptWithKey 在 dotfiles 中的安全密钥解密实践 【免费下载链接】chezmoi Manage your dotfiles across multiple diverse machines, securely. 项目地址: https://gitcode.com/gh_mirrors/ch/chezmoi 本…

2026/9/20 11:49:16 阅读更多 →
RocketMQ 客户端负载均衡机制深度解析:Producer 发送与 Consumer 订阅的全链路原理

RocketMQ 客户端负载均衡机制深度解析:Producer 发送与 Consumer 订阅的全链路原理

RocketMQ 客户端负载均衡机制深度解析:Producer 发送与 Consumer 订阅的全链路原理 【免费下载链接】rocketmq Apache RocketMQ is a cloud native messaging and streaming platform, making it simple to build event-driven applications. 项目地址: https://g…

2026/9/20 11:49:16 阅读更多 →

最新新闻

汽车电子EMC测试全解析:发射与抗扰实操要点及整改思路

汽车电子EMC测试全解析:发射与抗扰实操要点及整改思路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 12:25:36 阅读更多 →
终端、Shell与tmux:从概念到高效命令行工作流搭建指南

终端、Shell与tmux:从概念到高效命令行工作流搭建指南

天天写代码的人,手里少不了终端。但说实话,我跟不少刚入行的朋友聊过,很多人对终端、Shell这些概念都是一笔糊涂账——天天在终端里敲命令,却分不清终端模拟器和Shell到底谁是谁,更别提提示符、插件、复用器这些进阶玩…

2026/9/20 12:25:36 阅读更多 →
从华为杯到BSPC:竞赛成果转期刊论文全流程实战指南

从华为杯到BSPC:竞赛成果转期刊论文全流程实战指南

我当年打完华为杯,拿了奖杯和一张证书,躺了两周之后突然意识到一个问题:这份成果如果只停在竞赛层面,那它对我的学术简历来说就是一次性的。所以我把建模成果重新整理,投到了Biomedical Signal Processing and Control…

2026/9/20 12:25:36 阅读更多 →
Agent-Driver实战:大模型如何安全接入自动驾驶决策闭环

Agent-Driver实战:大模型如何安全接入自动驾驶决策闭环

1. 从“会聊天”到“会开车”:Agent-Driver 到底在解决什么问题大模型上车这件事,这两年讨论得很多,但真正落到工程层面,绝大多数团队卡在同一个地方:模型能跟你聊天气、能写诗、能回答“前面那个标志是什么意思”&…

2026/9/20 12:25:36 阅读更多 →
AI Skill开源合集实战:从角色蒸馏到生产级技能包落地

AI Skill开源合集实战:从角色蒸馏到生产级技能包落地

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 12:25:36 阅读更多 →
Easy-Vibe 全解析:从零到产品工程师的 AI 编程学习路径指南

Easy-Vibe 全解析:从零到产品工程师的 AI 编程学习路径指南

Easy-Vibe 全解析:从零到产品工程师的 AI 编程学习路径指南 【免费下载链接】easy-vibe 从 0 到 1 学会 vibe coding,项目制学习 项目地址: https://gitcode.com/datawhalechina/easy-vibe Easy-Vibe 是 Datawhale 社区推出的开源 AI 编程实战课件…

2026/9/20 12:24:35 阅读更多 →

日新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/19 23:01:36 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →