TorchAir inductor-npu-ext 静态 Shape 融合算子 TopN 调优与 PGO 选优完整指南
人工智能模型编译Ascend【免费下载链接】torchairTorchAir 支持用户基于PyTorch框架和torch_npu插件在昇腾NPU上使用图模式进行推理。项目地址https://gitcode.com/Ascend/torchair点击查看免费下载导读本文介绍 TorchAir 仓库中experimental/_inductor_npu_extAscendC 后端在静态 shape 场景下的融合算子性能调优能力编译期由 AutofuserAF生成 TopN 候选 tiling 解并逐一编译为静态 kernel运行时或 CppWrapper 的代码生成期通过torch_npu.profiler对候选做 PGOProfile-Guided Optimization实测选优最终把最优解固化进缓存后续调用零 profiling、零运行时 tiling 计算开销。读完本文你将掌握该能力的三环节原理TopN 候选生成 → PGO 实测选优 → 缓存、触发条件、TORCHINDUCTOR_ASCENDC_AUTOTUNE_TOPN等配置用法、CppWrapper 集成方式、设备控核联动以及调试与排障手段。说明文中涉及的代码文件路径均相对experimental/_inductor_npu_ext/文章末尾给出了从仓库根目录出发的完整相对路径索引。1 能力定位与术语1.1 两条编译路径AscendC 后端的编译单元是融合 kernelFusedASCGraph。按 shape 是否静态融合 kernel 有两条编译路径路径适用场景tiling 时机说明jit 路径动态 shapekernel 参数含SizeArg运行时 host 侧执行AutofuseTiling每次下发时计算 tilingTASK_QUEUE_ENABLE2时在队列任务内计算灵活但有 host 开销静态 topn 路径静态 shape编译期确定tiling 固化进静态 kernel消除运行时 tiling 计算开销并支持调优选优静态 shape 调优能力构建在 topn 路径之上由三个环节组成TopN 候选生成编译期调用 Autofuser 生成的GenerateTopnSolutions产出最多 10 组候选 tiling 解tiling_repr/workspace/block_dim每个候选编译为独立的静态kernel.soPGO 实测选优PythonWrapper 在首次调用时、CppWrapper 在代码生成期用真实输入在设备上运行全部候选通过torch_npu.profiler采集真实执行耗时选出最优候选缓存后续调用/运行选优结果落盘optimize_tiling后续调用直接加载最优静态 kernel不再重复 profiling。在 README.md 的特性规划中“静态化编译支持”与“PGO 性能寻优”即对应本能力“基于硬件性能建模的模板Tiling寻优”对应 TopN 候选生成环节。README 同时给出启用方式已随 torch_npu 打包为torch_npu/_inductor/ascendc通过torch.compile(options{npu_backend: ascendc})启用也可在import torch前设置环境变量TORCHINDUCTOR_NPU_BACKENDascendc。1.2 术语说明术语含义静态 shape融合 kernel 的参数中不含动态尺寸符号SizeArg即_is_static TrueTopN编译期让 AF 生成候选 tiling 解的机制扩展固定请求最多 10 组实际保留数量由TORCHINDUCTOR_ASCENDC_AUTOTUNE_TOPN控制PGOProfile-Guided Optimization通过 profiler 采集候选 kernel 的真实执行性能来指导选优autotune候选实测选优过程对候选逐一 profiling、比较并缓存最优解PythonWrapper 在首次调用时执行CppWrapper 在代码生成期执行kernel_key候选的唯一标识md5(tiling_repr|workspace|block_dim)wrapper 据此索引 tiling 信息与静态 kerneloptimize_tiling选优结果缓存文件内容为tiling_repr|workspace|block_dim2 触发条件topn 路径与 autotune 的使能条件是逐融合 kernel 判定的判定函数为 compiler/_compiler.py 中的decide_use_topn_tiling源码注释明确其为 jit/topn 两条分发路径的“单一判定来源” single source of truth条件判定依据说明静态 shapeis_static True常规融合 kernel参数中无SizeArgnpu.py 中_is_static not any(isinstance(v, SizeArg) for v in self._fused_graph.args)独立转置 kernel无动态符号CANN 版本 9.1.0GenerateTopnSolutions接口要求对应is_gte_cann_version(9.1.0)检查host 代码能力host_impl 含GenerateTopnSolutions与GetTilingDataRepr由 AF 生成代码侧据此探测_can_use_topn_tiling非 matmul templatehas_matmul_template ! Truematmul template 走专用路径以上全部满足即走 topn 编译路径。是否进一步触发 autotune 取决于 topn 配置源码中_compiler.py第 846~848 行对候选做tiling_infos[:autotune_topn]裁剪autotune_topn 1请求生成多个候选实际候选 1 时返回NpuInductorAutoTuneKernelPythonWrapper 在首次调用时、CppWrapper 在代码生成期触发 PGO autotune若 AF 实际只给出 1 组解则退化为下述行为autotune_topn 1默认候选裁剪为 1 个直接把该候选写入optimize_tiling缓存并返回普通NpuInductorKernel——有静态化收益但没有PGO 实测选优动态 shape kernel 一律走 jit 路径不参与本能力。同一张图中静态/动态 kernel 混合时各自走对应路径互不影响。注意topn 配置只影响候选裁剪数量与是否 autotune不影响 topn 路径本身的判定。topn 路径内部生成候选时固定请求AUTOTUNE_TOPN10个解再裁剪到用户配置值见 3.2 节。3 编译期TopN 候选生成3.1 编译产物与 jit 路径kernel.sowrapper.so两个产物相比topn 路径的产物结构为缓存根目录/融合kernel/artifact_hash/ ├── asc_tiling.py # tiling 编译脚本tiling_def host_impl ├── tiling.so # tiling 编译产物导出 AutofuseTiling / GenerateTopnSolutions / GetTilingDataRepr ├── tiling_wrapper.so # TopN 获取 wrapper导出 init_tiling / get_topn / set_device_limit ├── wrapper.so # 运行时 wrapper导出 init / wrapper / release / set_device_limit ├── static_kernel/ │ └── kernel_key/ │ ├── asc_kernel.py # 该候选的静态 kernel 编译脚本 │ └── kernel.so # 每个候选一个静态 kernel ├── optimize_tiling # 选优结果缓存候选数为 1 或 PGO 成功后才生成 └── compile.lock # 编译/选优文件锁调试目录TORCH_COMPILE_DEBUG1时另有asc_kernel_kernel_key.py等带 hash 的脚本。缓存根目录由 config.py 的_get_asc_cache_dir()决定复用原生 Inductor 的TORCHINDUCTOR_CACHE_DIR默认/tmp/torchinductor_{用户名}AscendC 产物落在其ascendc子目录_get_lib_dircompiler/init.py以排除name/is_static/has_matmul_template后的源码 artifact 哈希为缓存 key。3.2 编译流程compile_ascendccompiler/_compiler.py中 topn 分支按依赖串行执行编译 tiling.so由asc_tiling.pysetup_asc_host_compile_command产出包含 tiling 定义与GenerateTopnSolutions实现编译 tiling_wrapper.socodegen_cpp_tiling_wrappercodegen/_asc_codegen.py生成 C 源码dlopen tiling.so向 Python 暴露init_tiling/get_topn/set_device_limit接口生成候选get_topn通过 ctypes 调用get_topn(configs, 10, ...)内部执行GenerateTopnSolutions返回最多 10 组{tiling_repr, workspace, block_dim}候选数量由 AF 决定可能少于请求值随后按autotune_topn裁剪生成 tiling_map 并编译 wrapper.so每个候选计算kernel_key md5(tiling_repr|workspace|block_dim)对应get_kernel_hash全部候选的kernel_key → TilingInfo映射注入 wrapper 源码std::mapstd::string, TilingInfo tiling_map见_compiler.py第 849~872 行后编译逐候选编译静态 kernel每个候选以固定 tiling_repr 走setup_asc_kernel_compile_command编译出static_kernel/kernel_key/kernel.so对应调测产物asc_kernel_hash.py返回值候选数 1 返回NpuInductorAutoTuneKernel携带全部候选的KernelInfo列表见_autotune.py候选数 1 直接写optimize_tiling并返回普通NpuInductorKernel_compiler.py第 906~909 行。wrapper 运行时按kernel_key查tiling_map获取 tiling_data / workspace / block_dim 后直接下发静态 kernel无需再执行 tiling 计算。3.3 与异步编译的关系async_compilecompiler/init.py按路径分发jit 路径wrapper / tiling obj / kernel obj 三路编译任务并行提交进程池全部完成后回调链接 kernel.sotopn 路径存在 host→select→device 的依赖链整体作为一个任务compile_ascendc提交进程池串行编译同步模式TORCHINDUCTOR_COMPILE_THREADS1或 CPU 调试直接在当前进程执行compile_ascendc两条路径逻辑一致decide_use_topn_tiling是两条分发路径的单一判定来源。4 PGO 实测选优4.1 PythonWrapper 触发时机PythonWrapper 模式下NpuInductorAutoTuneKernel首次被调用时__call__ → load(args)执行autotune()compiler/_autotune.py。全过程持有compile.lock文件锁多进程/多线程并发场景下只有一个执行者。4.2 选优流程缓存检查若optimize_tiling已存在直接加载最优解load_optimize_file对文件内容做 md5 得到 kernel_keyinit 后立即返回跳过后续所有步骤加载候选dl.init逐个加载全部候选静态 kernelPGO 实测使用torch_npu.profilerProfilerLevel.Level1AiCMetrics.PipeUtilization见_autotune.py中_ExperimentalConfig构造schedule 为wait0, warmup1, active1, repeat1, skip_first1共执行 4 轮每轮所有候选轮流下发并同步 stream其中 1 轮为有效采集窗口输入为 PythonWrapper 首次调用时传入的实际参数tensor 转 device 指针标量按 ABI 转换CppWrapper 的前置 Python 编译阶段则使用 materialize 后的real_inputs源码级细节为避免原地in-placekernel 在重复计时中写穿真实输入缓冲benchmark 会先用clone_preserve_strides克隆输入、每轮恢复留底副本再经_to_ctypes_arg转 ctypes 参数与 compiler/_kernel.py 的下发 ABI 一致解析耗时profiling 结果落盘./profile_result/md5/解析其中kernel_details.csv按 kernel 名autofused前缀过滤读取Duration(us)耗时条数必须等于候选数否则报错选优与缓存取耗时最小的候选为最优min(timings.items(), key...)调用dl.release传入最优 kernel_keywrapper 据此卸载其余候选仅保留最优静态 kernelsave_optimize_file写入tiling_repr|workspace|block_dim随后run()一直以最优kernel_key下发见_autotune.py第 167~174 行。日志会输出每个候选的耗时与最优 indexinductor_ascloggerinfo 级别Autotune completed ...可用于确认选优结果。4.3 流程图5 CppWrapper 模式下的集成CppWrapperTORCHINDUCTOR_CPP_WRAPPER1或cpp_wrapperTrue下autotune 被前移到代码生成期完成cpp_wrapper.py 中 patch 的codegen_with_cpp_wrapperautotune_topn 1时直接走 inductor 原生 cpp_wrapper 代码生成不做任何额外处理autotune_topn 1时先以 PythonWrapper 模式编译模块并用真实输入含编译期记录的参数执行module.call(real_inputs)——此过程触发各融合 kernel 的 autotune/profiling被 mutate 的输入先 clone避免污染真实输入源码中对self.mutated_inputs命中的输入执行clone_preserve_strides记录未被真实执行覆盖的分支存在候选但未经过 PGO 选优到_ascendc_unvisited_topn代码生成时这些 kernel 回退使用第一个候选cpp_wrapper.py的_emit_compiled_kernel中对NpuInductorAutoTuneKernel且 wrapper 在 unvisited 集合内的场景取kernel_infos[0]再以 cpp_wrapper 模式重新 codegen选优出的最优候选的lib_kernel与kernel_key直接烘焙进 C 图代码运行期零 Python 开销C 侧通过_kernel_state_runtime_source生成的静态状态对象 dlopen wrapper.so并在构造时initrelease选中最优 kernel。因此在autotune_topn 1的 CppWrapper 模式下首次代码生成耗时包含一次整图的 Python 模式执行 PGO 采集。扩展缓存命中时会跳过候选编译和 PGO但若重新触发代码生成仍可能执行用于生成 CppWrapper 的 Python 模式compile_to_module()/module.call()。6 缓存与后续运行选优缓存optimize_tiling文件是 autotune 的最终结果。async_compile在编译入口即检查compiler/__init__.py的async_compile文件存在且 wrapper/kernel 有效时直接返回携带最优kernel_key的普通NpuInductorKernel完全跳过候选编译与 profiling编译缓存缓存根目录跟随原生 InductorTORCHINDUCTOR_CACHE_DIR默认/tmp/torchinductor_{用户名}AscendC kernel 落在其ascendc子目录下跨 OS 共享文件系统场景建议按 OS 隔离避免文件锁失效导致缓存损坏调试注意TORCHINDUCTOR_FORCE_DISABLE_CACHES1只控制 Inductor 自身缓存不会绕过本扩展的ascendc缓存。要强制重新编译应使用新的扩展缓存目录或清理对应扩展缓存二次运行若要外挂性能采集工具请保留缓存见 8 节约束。7 设备资源限制set_device_limit 联动torch.npu.set_device_limitAIV/AIC 核数限制会影响 tiling 搜索空间因此需要保证候选生成与运行时看到同一份资源视图父进程在提交编译任务前读取并归一化控核限制_read_device_limit_info未显式设置过set_device_limit时视为无限制归一化时以设备属性中的vector_core_num/cube_core_num为上限做 min 截断控核信息随编译任务序列化传递给编译 workerworker 不重复读取设备状态避免进程池环境不一致async_compile中的worker_limit _read_device_limit_info()显式随任务下发_inject_device_limit将限制注入 tiling_wrapper.so 与 wrapper.so 的set_device_limit接口GenerateTopnSolutions与运行时下发使用一致的g_device_limitub_size传 0后端视为使用默认 UB。静态 topn 的缓存 key 包含vector_core_num/ai_core_num_get_lib_dir中is_static时不排除这两个字段因此不同控核配置的静态缓存相互隔离而动态路径按 tiling 运行时重算generic .so 可跨核数共享。这一行为在 tests/smoke/test_device_limit_smoke.py 中有对应测试test_core_limit_is_part_of_cache_key静态缓存 key 按核数隔离、test_cache_reuse_across_core_num动态缓存跨核数复用、test_autotune_candidatesautotune 候选的 block_dim 受控核限制、test_static_topn_block_dim_limitedprofiler 验证 Block Num 8等。8 配置项与约束8.1 配置项配置默认值说明TORCHINDUCTOR_ASCENDC_AUTOTUNE_TOPN1不使能 PGO调优最优解数量正整数上限 10超限告警并最多返回 10 组实际解数量与融合算子相关可能小于配置值TORCHINDUCTOR_COMPILE_THREADS按 CPU 核数设为 1 关闭异步编译调试用topn 路径在异步模式下整体串行编译TORCHINDUCTOR_CACHE_DIR/tmp/torchinductor_{用户名}原生 Inductor 缓存根目录AscendC 编译/选优缓存落其ascendc子目录TORCHINDUCTOR_CPP_WRAPPER/cpp_wrapperTrue关闭CppWrapper 模式autotune 前移至代码生成期配置解析位于 config.pyTORCHINDUCTOR_ASCENDC_AUTOTUNE_TOPN非整数或小于 1 时分别在启动期抛出TORCHINDUCTOR_ASCENDC_AUTOTUNE_TOPN must be a positive integer / must be 1_compiler.py中若配置值超过AUTOTUNE_TOPN10会打印告警。使用手册 docs/manuals.md 给出示例export TORCHINDUCTOR_ASCENDC_AUTOTUNE_TOPN3使能 PGO 调优。代码内另有AUTOTUNE_CONFIGScompiler/_compiler.py当前为空列表用于向GenerateTopnSolutions透传 tiling 搜索配置项如ub_threshold、corenum_threshold、enable_multicore_ub_tradeoff等源码中留有注释示例为后续搜索空间扩展预留tests/smoke/test_device_limit_smoke.py的_worker_autotune展示了实际注入三组配置的做法。8.2 约束与代价首次编译耗时显著增加相比 jit 路径多编译 tiling.so、tiling_wrapper.so以及 N 个静态 kernel.so首次选优自动开启 profilingPythonWrapper 在首次调用时、CppWrapper 在代码生成期执行 PGOPGO 与外部性能采集工具互斥嵌套场景现有 profiling 工具无法兼容如需采集性能指标保留编译缓存后在二次运行时开启候选数量不保证实际候选数由 AF 的解空间决定可能少于配置值候选数为 1 时无选优过程适用范围仅静态 shape 融合 kernel动态 shape 走 jit 路径未进入融合图的算子aten fallback不经过本编译路径均不涉及profiling 中间产物选优过程会在执行目录产生./profile_result/md5/临时目录选优完成后自动清理。8.3 错误提示场景异常/表现处理建议topn 配置非法启动即报TORCHINDUCTOR_ASCENDC_AUTOTUNE_TOPN must be a positive integer / must be 1修正为正整数候选 tiling 生成失败NPU kernel {name} get topn failed检查 CANN 版本 9.1.0 与 tiling.so 产物profiling 解析失败Autotune {kernel_dir} parse profiling error, timing info count: N候选数与耗时条数不符多为 profiler 未采集到 kernel检查环境后清缓存重试静态 kernel init 失败NPU kernel {lib_kernel} init failed检查缓存目录完整性必要时清缓存重新编译9 调试产物与运行观测开启TORCH_COMPILE_DEBUG1后torch_compile_debug/run_id/torchinductor/model__*/autofused_*/下与 topn 调优直接相关的产物产物说明asc_tiling.pytiling 实现 tiling.so 编译脚本可直接执行复现 tiling 编译asc_kernel_hash.py每个候选 tiling 的静态 kernel 编译脚本hash 即 kernel_keyinductor_tiling_wrapper.cppTopN 获取 wrapper 源码get_topn/GenerateTopnSolutions 调用侧inductor_wrapper.cpp运行时 wrapper 源码tiling_map 注入后benchmark.py融合 kernel 性能测试脚本可单独复现与比对候选性能运行期观测autotune 选优结果与各候选耗时通过inductor_asc日志info 级别输出_autotune.py中Autotune completed %s, best kernel index: %d及逐候选Timing xx.xx usTORCHINDUCTOR_ASCENDC_DEBUG、layout_check等通用调测开关见使用手册 docs/manuals.md。相关测试用例可作为行为参考tests/test_cpu_scalar_tensor_scalardata_st.pytest_add_cpu_scalar_tensor_static_kernel_pathtopn1 时静态 kernel 通过非空 kernel_key 下发、test_add_cpu_scalar_tensor_topn_tiling_pathtopn2 的多候选编译执行tests/smoke/cpp_wrapper_test.pyCppWrapper 下 topn 多候选编译、执行、输入突变x.add_(1)原地算子场景与分支切换torch.cond未访问分支回退首候选tests/smoke/test_device_limit_smoke.py设备核数限制与候选 block_dim 的联动、静态/动态缓存隔离。10 快速上手示例在满足静态 shape、CANN 9.1.0 的前提下可按下面方式使能 PGO 选优# 使能 PGO请求最多 3 组候选 tiling 解配置超 10 会告警并截断 export TORCHINDUCTOR_ASCENDC_AUTOTUNE_TOPN3 # 可选调试同步编译 保存编译中间产物 export TORCHINDUCTOR_COMPILE_THREADS1 export TORCH_COMPILE_DEBUG1import torch import torch_npu torch.compile(options{npu_backend: ascendc}) def test_add_sum(x, y): return torch.add(x, y).sum() x torch.randn(32, 1024).npu() y torch.randn(1, 1024).npu() out test_add_sum(x, y) # 首次调用触发 PGO编译候选 实测选优 落盘 optimize_tiling golden (x y).sum() assert torch.max(torch.abs(out - golden)) 1e-3, torch.max(torch.abs(out - golden))首次执行后检查缓存目录默认/tmp/torchinductor_{用户名}/ascendc/下各融合 kernel 目录存在optimize_tiling表示选优已落盘static_kernel/kernel_key/kernel.so的个数即候选数。二次运行命中缓存后不再编译候选、不再开启 profiling直接以最优kernel_key下发静态 kernel。附源码与文档路径索引相对仓库根目录设计文档experimental/_inductor_npu_ext/docs/design/static_shape_autotune.md使用手册experimental/_inductor_npu_ext/docs/manuals.md项目说明experimental/_inductor_npu_ext/README.md编译/调优核心实现experimental/_inductor_npu_ext/python/inductor_npu_ext/compiler/_compiler.py、experimental/_inductor_npu_ext/python/inductor_npu_ext/compiler/_autotune.py、experimental/_inductor_npu_ext/python/inductor_npu_ext/compiler/_kernel.py异步编译分发experimental/_inductor_npu_ext/python/inductor_npu_ext/compiler/init.py配置解析experimental/_inductor_npu_ext/python/inductor_npu_ext/config.pyCppWrapper 集成experimental/_inductor_npu_ext/python/inductor_npu_ext/cpp_wrapper.py静态判定experimental/_inductor_npu_ext/python/inductor_npu_ext/npu.py测试用例experimental/_inductor_npu_ext/tests/test_cpu_scalar_tensor_scalardata_st.py、experimental/_inductor_npu_ext/tests/smoke/cpp_wrapper_test.py、experimental/_inductor_npu_ext/tests/smoke/test_device_limit_smoke.py赞分享人工智能模型编译Ascend【免费下载链接】torchairTorchAir 支持用户基于PyTorch框架和torch_npu插件在昇腾NPU上使用图模式进行推理。项目地址https://gitcode.com/Ascend/torchair点击查看免费下载相关推荐TorchAir inductor-npu-ext 全解析为 PyTorch Inductor 引入昇腾 NPU 亲和的 AscendC 融合 Kernel 后端TorchAir inductor npu ext 全解析为 PyTorch Inductor 引入昇腾 NPU 亲和的 AscendC 融合 Kernel人工智能模型编译Ascendinductor-npu-ext 融合 Kernel Profiling 上报机制深度解析从 aclprofRangePushEx 到动态 Shape 符号处理inductor npu ext 融合 Kernel Profiling 上报机制深度解析从 aclprofRangePushEx 到动态 Shape 符号处人工智能模型编译AscendTorchAir 的 inductor-npu-ext 精度对比与基准测试工具从 benchmark.py 生成到 ASC kernel Profiling 的完整实践TorchAir 的 inductor npu ext 精度对比与基准测试工具从 benchmark.py 生成到 ASC kernel Profiling人工智能模型编译Ascend上一篇终极OpenDrop指南如何用Python实现跨平台苹果AirDrop文件传输下一篇Easy Mock数据迁移工具MongoDB导出与导入创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

OpenCV+Python车牌识别实操:HSV定位+双CNN字符识别

OpenCV+Python车牌识别实操:HSV定位+双CNN字符识别

简介:本资源是一份面向计算机专业本科生及深度学习初学者的车牌识别系统课程设计详解PPT,聚焦智能交通场景下的实际工程实现。内容完整覆盖基于Python与OpenCV开发的双阶段CNN车牌识别系统:第一阶段通过图像预处理、HSV色彩分割、Sobel边缘检…

2026/10/14 2:16:21 阅读更多 →
ModelEngine agent RAG 插件机制全解析:plugins.json 配置、MCP 插件开发与预置插件覆写指南

ModelEngine agent RAG 插件机制全解析:plugins.json 配置、MCP 插件开发与预置插件覆写指南

人工智能大模型RAGAI 应用医疗健康数据分析 【免费下载链接】agent 该项目已停止维护,请参考https://gitcode.com/ModelEngine/nexent项目。 致力于汇聚利用 ModelEngine 能力的创新应用,开发和推广高质量的应用程序,旨在创建一个强大的多智能…

2026/10/14 2:16:21 阅读更多 →
PrismLauncher 构建配置解析:vcpkg Triplet 覆盖机制与 static-release 跨平台依赖管理

PrismLauncher 构建配置解析:vcpkg Triplet 覆盖机制与 static-release 跨平台依赖管理

桌面应用 【免费下载链接】PrismLauncher A custom launcher for Minecraft that allows you to easily manage multiple installations of Minecraft at once (Fork of MultiMC) 项目地址: https://gitcode.com/gh_mirrors/pr/PrismLauncher 点击查看 免费下载 导…

2026/10/14 2:16:21 阅读更多 →

最新新闻

Python爬虫实战:手机APP数据抓取与解析全流程

Python爬虫实战:手机APP数据抓取与解析全流程

简介:这份PDF资料面向具备Python基础、对网络请求与爬虫开发感兴趣的技术爱好者与研发工程师,围绕手机APP数据传输的抓取与解析展开,重点讲解如何借助Fiddler抓包定位登录与话题接口,再通过urllib2构造HTTP请求、携带Header与表单…

2026/10/14 3:04:31 阅读更多 →
C++ 对接 S3 对象存储实战:SDK 选型、分片上传与避坑指南

C++ 对接 S3 对象存储实战:SDK 选型、分片上传与避坑指南

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

2026/10/14 3:04:31 阅读更多 →
SQLite安装全指南:嵌入式数据库跨平台配置与常见坑

SQLite安装全指南:嵌入式数据库跨平台配置与常见坑

第一次折腾SQLite的时候,我找了一圈“Setup.exe”,愣是没找到。下载页面全是压缩包,网上一堆教程各写各的,有人说不用装,有人说得编译源码,看得人发懵。后来我才搞明白:SQLite的“安装”逻辑跟M…

2026/10/14 3:04:31 阅读更多 →
C++手写数据结构实战:动态数组、哈希表、AVL树与图算法

C++手写数据结构实战:动态数组、哈希表、AVL树与图算法

简介:《Implementing Useful Algorithms in C》由Dmytro Kedyk撰写,面向具备一定C基础、希望深入掌握算法设计与工程实现的开发者与计算机专业学生。全书从算法正确性证明、渐进记法与机器模型等基本原则切入,系统讲解数据类型选择、内存管理…

2026/10/14 3:04:31 阅读更多 →
本地27B模型配Function Calling:工具不触发的原因与实战

本地27B模型配Function Calling:工具不触发的原因与实战

给本地跑的27B模型配了三个专业工具之后,我做的第一件事就是拿它试聊天。你猜怎么着——工具列表明明挂在接口定义里,模型却像一个看见工具箱、却只肯用手拧瓶盖的人,简单问题全凭语言能力直接答,一个工具都不碰。我一度觉得这套配…

2026/10/14 3:04:31 阅读更多 →
容器内nvidia-smi报Unknown Error的排查与根治

容器内nvidia-smi报Unknown Error的排查与根治

凌晨两点半,工作群里弹出一条消息:某个长期跑的容器,前一秒还好好的,后一秒容器里的nvidia-smi直接报Failed to initialize NVML: Unknown Error。宿主机上执行nvidia-smi一切正常,新建一个临时容器也能正常看到卡&…

2026/10/14 3:03:31 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/12 18:11:17 阅读更多 →