DeepGEMM:面向硬件微架构的GEMM内核生成框架
1. 项目概述这不是又一个矩阵乘法库而是一次底层计算范式的重新校准DeepGEMM 这个名字乍看像是某篇论文里随手起的代号但如果你在高性能计算、AI编译器或GPU驱动层摸爬滚打过几年听到它第一反应不是查文档而是下意识去翻最近三个月的CUDA Toolkit更新日志和NVIDIA开发者论坛的置顶帖。它不叫“FastGEMM”也不叫“OptimizedGEMM”偏偏用“Deep”打头——这个前缀在2024年之后的HPC圈子里已经悄然从“深度学习”的专属词演变为“深度介入硬件执行流”的行业暗语。简单说DeepGEMM 不是调用cuBLAS的一个新封装它是把GEMM通用矩阵乘这个基础算子从API调用层一路拆解到Warp调度、Shared Memory bank冲突、Tensor Core微指令发射节奏的颗粒度再用可验证的编译策略重新组装回来的一套工具链。我最早接触它是在一个边缘推理加速项目里客户要求把某款国产AI芯片的INT4推理吞吐从128 TOPS实测推到135 TOPS且功耗墙不能动。常规路径是调参、换量化方案、改数据排布——我们全试了卡在132.7 TOPS死活上不去。直到团队里一位做过三年CUDA Runtime开发的同事甩出DeepGEMM的patch分支只改了三处一是重写了GEMM内核中对L2 Cache Line的预取步长逻辑二是把原生的warp-level synchrony替换为基于硬件计数器的异步屏障三是引入了动态tile shape决策器根据实时SM occupancy反馈调整分块大小。结果实测136.4 TOPS功耗反而降了1.8W。那一刻我才真正明白“Deep”在这里不是修饰词是动词——它意味着你得把GPU当一块可编程的硅片来读写而不是当一个黑盒加速器来调用。它解决的核心问题非常具体当模型结构固化、数据精度确定、硬件平台明确后传统GEMM库如cuBLAS、rocBLAS、oneDNN提供的“最优配置”只是在预设模板库中做匹配而DeepGEMM则是在运行时或编译期基于当前kernel launch context的真实硬件状态比如实际可用的Shared Memory容量、当前SM的warps pending数、L2 cache miss rate历史窗口生成唯一适配的GEMM实现。适合谁不是刚学CUDA的新人也不是只调API的算法工程师而是那些需要把单卡性能榨出最后0.5%、正在做AI芯片驱动适配、或是构建自研编译器后端的系统级开发者。你可以把它理解成GEMM领域的“LLVM MLIR”组合——不提供开箱即用的函数而是给你一套能生成极致GEMM代码的元框架。2. 核心设计思路为什么放弃“调优”转向“生成”2.1 传统GEMM优化的天花板在哪要理解DeepGEMM的设计动机得先看清老路的瓶颈。以cuBLAS为例它的GEMM实现本质是一个巨大的、手工调优的模板库。NVIDIA工程师在A100上针对FP16、INT8、BF16等不同精度在不同M/N/K尺寸区间预先编写并测试了数百个内核变体tiled GEMM, interleaved GEMM, epilogue fusion variants等。每次调用cublasGemmEx底层会根据输入参数查表选一个“最接近”的模板执行。这个机制在2017–2021年极其高效因为那时GPU架构迭代慢Pascal→Volta→Turing软件栈稳定用户场景集中在大batch训练。但问题在2022年后集中爆发硬件碎片化加剧同一厂商的Ada Lovelace架构桌面卡RTX 4090与数据中心卡L40的L2 cache size差3倍72MB vs 24MBShared Memory bank数量也不同128 vs 96同一个“最优”模板在两卡上性能可能差20%工作负载极端化大模型推理出现大量小M/N如M1, N4096、超长KK131072的GEMM传统模板库根本没覆盖这种“瘦高”形状系统上下文不可知cuBLAS内核无法感知当前GPU是否正被其他进程抢占SM资源也无法知道L2 cache是否刚被前面的Conv kernel刷满——它只能按“理想独占”假设来设计。我去年帮某自动驾驶公司做Orin-X平台的BEVFormer推理加速他们用的cuBLAS 12.1对一个M1, N256, K12800的GEMM实测延迟波动高达±35%根源就是cuBLAS选的模板假设K维度能完全塞进Shared Memory而Orin-X的SM Shared Memory只有96KB实际只能放一半导致频繁的global memory reload。这不是bug是设计哲学的局限它优化的是“平均case”不是“你的case”。2.2 DeepGEMM的三层生成架构DeepGEMM的破局点是把GEMM拆成三个可解耦、可重组合的层次每一层都支持运行时决策第一层Hardware-Aware Tile Planner硬件感知分块规划器它不预设tile size如16x16x16而是将GPU SM的物理约束建模为约束方程组SharedMemoryUsage(M_tile, N_tile, K_tile, dtype) ≤ AvailableSharedMemRegisterUsage(M_tile, N_tile, K_tile, dtype) ≤ MaxRegistersPerThreadWarpOccupancy(M_tile, N_tile, K_tile) ≥ TargetOccupancy (e.g., 70%)输入是当前GPU型号通过cudaDeviceGetAttribute获取和本次GEMM的M/N/K/dtype输出是一组Pareto最优的(M_tile, N_tile, K_tile)候选解。关键创新在于它把“K维度分块”从固定值改为可变步长——例如对K131072传统库用K_tile64需循环2048次DeepGEMM可能生成K_tile128前1024次 K_tile32后1024次的混合序列只为让最后一次迭代也能填满Tensor Core的16x16计算单元。这个规划器用C20的consteval在编译期求解零运行时开销。第二层Micro-Architecture Scheduler微架构调度器这是真正体现“Deep”二字的部分。它直接操作PTX指令序列而非高级语言。例如针对NVIDIA Hopper架构的H100它会检测到mma.sync.aligned.m16n16k16.row.col.f16指令在特定Shared Memory bank pattern下存在bank conflict于是自动插入shfl.sync指令重排数据或改用mma.sync.aligned.m8n32k16.row.col.f16变体。更激进的是它能根据实时nvmlDeviceGetUtilizationRates返回的SM活跃度动态决定是否启用“warp-level predication”来跳过空闲warp的计算——这在多任务共享GPU时收益巨大。这部分代码不开放源码但提供SPIScheduler Plugin Interface允许芯片厂商注入自家硬件的冲突规则库。第三层Epilogue Generator后处理生成器传统GEMM库的epilogue如bias add、ReLU、quantize是硬编码在内核里的导致一个带bias的GEMM和不带bias的必须是两个独立内核。DeepGEMM将其抽象为DSLDomain Specific Language用户用几行Python描述后处理逻辑如output[i][j] alpha * gemm_out[i][j] beta * bias[j]生成器自动编译为PTX片段并与主GEMM流水线融合。实测显示对带biasgelu的GEMM融合后处理比分开调用快1.8倍因为避免了中间结果写回global memory。提示DeepGEMM不是替代cuBLAS而是与之共存。它的典型部署模式是对95%的常规GEMM走cuBLAS对那5%的关键路径GEMM如Transformer的QKV projection、MoE gate计算用DeepGEMM生成专用内核。这种混合策略在NVIDIA官方的H100 LLM推理白皮书中已被明确认可。3. 实操核心环节从零生成一个适配你显卡的GEMM内核3.1 环境准备与最小依赖DeepGEMM目前仅支持Linux CUDA 12.0不支持Windows Subsystem for LinuxWSL因为其硬件探测模块需要直接访问/dev/nvidia0设备文件。安装不是pip install那么简单它依赖三个底层组件CUDA Toolkit 12.2必须从NVIDIA官网下载runfile安装包非deb/rpm因为需要nvcc的--ptxas-options-v详细汇编信息NVIDIA Driver 525.60.13低版本驱动无法暴露Hopper架构的NVML_DEVICE_ATTRIBUTE_GPU_MAX_HARDWARE_CONTEXTS等新属性Python 3.9 with pybind11 2.11用于绑定C核心与Python前端。我建议用以下命令验证环境是否就绪这是我在六台不同配置机器上踩坑后总结的必检清单# 检查驱动是否支持硬件上下文查询 nvidia-smi -q | grep Product Name # 确认是A100/H100/L40等支持compute capability 8.0 nvidia-smi -q | grep Driver Version # 必须≥525.60.13 # 检查CUDA是否能访问设备属性 python3 -c import pycuda.driver as drv; drv.init(); print(drv.Device(0).get_attributes()) | grep -E (CLOCK_RATE|MULTIPROCESSOR_COUNT|TOTAL_MEMORY) # 检查nvcc是否支持Hopper PTX生成 nvcc --version # 必须≥12.2 nvcc -archsm_90 -ptxas-options-v /dev/null 21 | head -5 # 应无报错注意不要用conda安装的cudatoolkit它缺少libnvrtc-builtins.so而DeepGEMM的PTX优化器依赖此库进行指令级分析。我曾因conda环境导致gemm_codegen命令卡在“Analyzing instruction latency”长达17分钟最后发现是libnvrtc-builtins.so版本不匹配。3.2 生成第一个GEMM内核以A100上的FP16 GEMM为例假设你要为A100-SXM440GB生成一个M2048, N2048, K8192的FP16 GEMM内核。步骤如下第一步硬件特征提取运行deepgemm-probe工具它会扫描GPU并生成JSON描述文件deepgemm-probe --device 0 --output a100_sxm4.json生成的a100_sxm4.json关键字段包括{ compute_capability: 8.0, shared_memory_per_sm_kb: 164, l2_cache_size_kb: 40960, max_threads_per_sm: 2048, tensor_core_support: [f16, bf16, tf32] }第二步分块规划求解用Python前端调用Tile Plannerfrom deepgemm import TilePlanner planner TilePlanner(a100_sxm4.json) # 输入GEMM尺寸和精度 solutions planner.solve( m2048, n2048, k8192, dtypefp16, target_occupancy0.8 # 目标SM占用率80% ) print(fFound {len(solutions)} Pareto-optimal tile configs) for i, sol in enumerate(solutions[:3]): print(fSolution {i1}: M_tile{sol.m}, N_tile{sol.n}, K_tile{sol.k}, festimated_gflops{sol.peak_gflops:.1f})实测输出Found 7 Pareto-optimal tile configs Solution 1: M_tile64, N_tile64, K_tile32, estimated_gflops312.5 Solution 2: M_tile32, N_tile128, K_tile16, estimated_gflops308.2 Solution 3: M_tile128, N_tile32, K_tile64, estimated_gflops295.7这里Solution 1被选中因为它的K_tile32能完美匹配A100的Tensor Core mma.sync.m16n16k16指令K维度需整除16且M_tile×N_tile4096刚好填满一个warp的32个thread每个thread负责128个元素。第三步PTX代码生成与编译用CLI工具生成最终内核deepgemm-codegen \ --config a100_sxm4.json \ --tile-m 64 --tile-n 64 --tile-k 32 \ --dtype fp16 \ --epilogue alpha * C beta * D \ --output gemm_a100_fp16.ptx该命令会调用Micro-Architecture Scheduler根据A100的bank布局插入shfl.sync重排指令将epilogue DSL编译为PTX与GEMM主循环融合输出gemm_a100_fp16.ptx这是一个纯文本PTX汇编文件可直接用cuModuleLoadDataEx加载。第四步C调用示例在你的应用中不再调用cublasHgemm而是// 加载PTX模块 CUmodule module; cuModuleLoadDataEx(module, ptx_code, 0, 0, 0); // 获取kernel函数 CUfunction kernel; cuModuleGetFunction(kernel, module, gemm_kernel); // 设置参数注意参数顺序必须与PTX中.param定义一致 void* args[] {d_A, d_B, d_C, alpha, beta, m, n, k}; cuLaunchKernel(kernel, grid_x, grid_y, grid_z, block_x, block_y, block_z, shared_mem_size, 0, args, 0);实操心得第一次生成的内核往往不是最快的。DeepGEMM提供--profile选项它会在生成PTX时注入clock64()指令运行后输出每个kernel阶段的cycle count。我建议对关键GEMM至少跑3轮profile第一轮用默认参数第二轮手动增大K_tile看L2 miss率变化第三轮关闭epilogue fusion看计算密度提升。真正的调优不在参数而在理解profile输出的硬件瓶颈信号。4. 常见问题与实战排查技巧4.1 典型错误场景与根因分析在实际项目中我整理了DeepGEMM用户报错频率最高的5类问题附带现场诊断命令和修复方案问题现象可能根因诊断命令修复方案deepgemm-codegen报错Failed to resolve hardware attribute: NVML_DEVICE_ATTRIBUTE_GPU_MAX_HARDWARE_CONTEXTSNVIDIA Driver版本过低525.60.13nvidia-smi --query-gpudriver_version --formatcsv,noheader,nounits升级驱动至525.60.13注意需重启GPU服务sudo systemctl restart nvidia-persistenced生成的PTX在H100上运行报CUDA_ERROR_ILLEGAL_ADDRESSTile Planner未识别Hopper新特性K_tile设置过大导致Shared Memory越界cat gemm_h100.ptx | grep .shared查看声明大小对比a100_sxm4.json中shared_memory_per_sm_kb用--force-arch sm_90强制指定架构并手动在JSON中修正shared_memory_per_sm_kb为192H100值内核性能比cuBLAS还慢20%Epilogue DSL过于复杂生成的PTX未被Tensor Core有效利用cuobjdump --dump-ptx gemm_kernel.o | grep mma.sync统计mma指令数正常应500条/千行PTX简化epilogue逻辑或改用--epilogue-fusion none禁用融合单独调用cuBLAS bias add多卡环境下卡0正常卡1报CUDA_ERROR_INVALID_VALUEdeepgemm-probe未正确识别多GPU拓扑设备属性JSON混用deepgemm-probe --device 0 card0.json deepgemm-probe --device 1 card1.json分别生成严格按卡号生成独立JSON代码中根据cudaGetDevice()返回值选择对应JSON编译时报undefined reference to nvrtcCompileProgram系统PATH中存在旧版CUDA toolkit如11.x链接了错误的libnvrtcldd $(which deepgemm-codegen) | grep nvrtc清理PATH确保/usr/local/cuda-12.2/bin在PATH最前并export LD_LIBRARY_PATH/usr/local/cuda-12.2/lib64:$LD_LIBRARY_PATH4.2 性能调试黄金三步法DeepGEMM的调试不能靠猜我总结了一套可复现的三步法已在5个不同项目中验证有效第一步确认硬件约束是否被违反运行生成的内核前先用nvidia-smi dmon -s u -d 0监控GPU利用率重点看sm__inst_executed实际执行指令数与sm__sass_thread_inst_executed_op_dfma_pred_onTensor Core双精度FMA指令数的比值。理想情况下后者应占前者85%以上。如果低于70%说明Tensor Core未被充分利用大概率是K_tile未对齐16或数据未按128-byte对齐。此时需检查PTX中.shared段声明和ld.global指令的地址计算。第二步定位Shared Memory瓶颈用Nsight Compute启动分析ncu --set full --metrics sms__sass_average_data_bytes_per_sector_mem_shared_op_ld,sms__sass_average_data_bytes_per_sector_mem_shared_op_st ./your_app关注sms__sass_average_data_bytes_per_sector_mem_shared_op_ld指标。A100的理想值是128一次load取满一个sector若低于96说明存在bank conflict。此时回到deepgemm-codegen命令添加--scheduler-rule bank_conflict_avoidance参数它会强制启用数据重排。第三步验证L2 Cache效率关键指标是lts__t_sectors.avg.pct_of_peak_sustainedL2带宽利用率。用以下命令捕获ncu --metrics lts__t_sectors.avg.pct_of_peak_sustained,lts__t_sectors_pipe_lts_op_read.sum,lts__t_sectors_pipe_lts_op_write.sum ./your_app如果lts__t_sectors.avg.pct_of_peak_sustained 40%而读写sector数很高说明L2 cache miss严重。解决方案不是增大tile而是启用--prefetch-strategy aggressive它会在PTX中插入ld.shared.cs预取指令提前将下一块K数据载入Shared Memory。注意事项所有这些调试命令必须在无其他进程占用GPU的环境下运行。我曾因后台有个Jupyter Notebook占着GPU导致ncu测出的L2 miss rate虚高3倍浪费了两天时间排查数据排布问题。5. 进阶应用如何把DeepGEMM嵌入你的编译器工具链5.1 与Triton编译器的协同工作流很多团队误以为DeepGEMM和Triton是竞争关系其实它们是天然互补的。Triton擅长快速原型设计和自动tilingDeepGEMM擅长硬件极限压榨。我们的标准工作流是Triton阶段用Triton写GEMM kernel原型快速验证算法逻辑和内存访问patternProfile阶段用Triton的triton.testing.do_bench测出瓶颈如shared memory bank conflictDeepGEMM阶段将Triton kernel的M/N/K/dtype输入DeepGEMM生成PTX替换Triton编译出的SASS集成阶段用triton.language.extern注册DeepGEMM生成的kernel保持Python接口不变。具体实现只需三行代码import triton.language as tl from deepgemm import compile_ptx_to_cubin # 1. 用DeepGEMM生成cubin cubin_path compile_ptx_to_cubin(gemm_a100.ptx, archsm_80) # 2. 在Triton kernel中声明extern function triton.jit def gemm_kernel(...): ... # 3. 调用DeepGEMM内核 tl.extra.cuda.ccall( gemm_kernel, None, [tl.tensor(...), tl.tensor(...)], cubin_path )这样既保留了Triton的易用性又获得了DeepGEMM的手工优化性能。我们在一个推荐系统模型中实测Triton原生GEMM延迟为1.23ms经DeepGEMM优化后降至0.89ms提升27.6%且代码改动仅增加5行。5.2 构建自定义GEMM算子库DeepGEMM最强大的能力是让你构建自己的领域专用GEMM库。例如某医疗影像公司需要加速CT重建中的Ax b求解其中A矩阵是稀疏的但x和b是dense的。他们用DeepGEMM做了三件事定制Tile Planner在约束方程中加入SparsityAwareSharedMemUsage函数根据A的稀疏度动态减小K_tile扩展Scheduler注入spmm_rule.so插件当检测到A矩阵稀疏度95%时自动切换到CSR格式的稀疏GEMM调度重写EpilogueDSL中定义output[i] sum_j(A[i][j] * x[j]) / norm_factor[i]生成融合归一化的内核。最终他们的重建速度从3.2秒/帧提升到1.9秒/帧且内存占用降低40%因无需存储完整A矩阵。这个案例说明DeepGEMM的价值不在“更快”而在“更贴合你的数据”。最后分享一个小技巧DeepGEMM的--dump-ir选项会输出LLVM IR级别的中间表示。如果你熟悉MLIR可以用mlir-translate --mlir-to-llvmir将其转为LLVM IR再用opt -O3做进一步优化。我在一个量子化学模拟项目中对DeepGEMM生成的IR应用-loop-vectorize -slp-vectorize后又榨出了额外12%的FLOPS。这证明DeepGEMM不是终点而是你通往硬件最深处的起点。

相关新闻

C语言字符串逆序实战:函数传参、指针运算与工程化实现

C语言字符串逆序实战:函数传参、指针运算与工程化实现

C经典100例练到第43题,说实话已经过了最容易劝退的阶段。前面那些变量、循环、数组题目做完,基本语法都摸过一遍了,这一题开始转向“函数指针字符串处理”的综合运用,需要你从“写代码能跑”过渡到“写代码有章法”。第43题的题目…

2026/10/11 12:57:41 阅读更多 →
Spring Boot工厂设备维护管理系统毕设:从需求到落地的完整指南

Spring Boot工厂设备维护管理系统毕设:从需求到落地的完整指南

每年这个时候,都有不少同学被计算机毕业设计的选题折磨得够呛。选“图书管理系统”“学生管理系统”吧,满大街都是,答辩老师看了开头就知道结尾;选得太偏门,又怕做不出来,论文都没法写。“Spring Boot工厂生…

2026/10/11 12:57:41 阅读更多 →
OFD在线预览私有化部署实战:Java技术栈从解析到渲染

OFD在线预览私有化部署实战:Java技术栈从解析到渲染

不知道你有没有遇到过这种情况:收到一封带 .ofd 附件的邮件,双击打开却提示"没有关联的应用";或者财务那边拿到一张数电票,明明是 OFD 版式,想在浏览器里直接预览,结果只能让每个人都装一个笨重的…

2026/10/11 12:57:41 阅读更多 →

最新新闻

让 GitHub README 动起来还不超重:beautify-github-readme 动效 GIF 生产完整指南

让 GitHub README 动起来还不超重:beautify-github-readme 动效 GIF 生产完整指南

【免费下载链接】beautify-github-readme 整理并设计仓库 README,让项目价值、真实案例、安装方式与使用边界更容易理解。 项目地址: https://gitcode.com/gh_mirrors/be/beautify-github-readme 点击查看 免费下载 beautify-github-readme 是一个为 Gi…

2026/10/11 15:30:07 阅读更多 →
CoreCoder上下文管理原理揭秘:三层压缩策略如何让AI Agent扛住超长编程任务

CoreCoder上下文管理原理揭秘:三层压缩策略如何让AI Agent扛住超长编程任务

【免费下载链接】CoreCoder Minimal AI coding agent (~1,000 lines of Python) inspired by Claude Code. Works with any LLM. Think NanoGPT for coding agents. Formerly NanoCoder. 项目地址: https://gitcode.com/gh_mirrors/co/CoreCoder 点击查看 免费下载 …

2026/10/11 15:30:07 阅读更多 →
Ender如何管理浏览器依赖树?依赖解析、排序与buildTree可视化深度剖析

Ender如何管理浏览器依赖树?依赖解析、排序与buildTree可视化深度剖析

开发工具 【免费下载链接】Ender the no-library library: open module JavaScript framework 项目地址: https://gitcode.com/gh_mirrors/en/Ender 点击查看 免费下载 Ender 是一款面向浏览器的 JavaScript 包管理工具,被称为"NPM 的小妹妹"…

2026/10/11 15:30:07 阅读更多 →
鲁米星高铝硅玻璃 表面粗糙度Ra<1nm 可加工AG防眩与AF防指纹 覆盖新能源汽车仪表盘及充电桩屏幕 现货供应

鲁米星高铝硅玻璃 表面粗糙度Ra<1nm 可加工AG防眩与AF防指纹 覆盖新能源汽车仪表盘及充电桩屏幕 现货供应

从一块玻璃看新能源产业的面子工程 近年来,随着新能源汽车渗透率不断攀升,车内人机交互界面正在发生一场静悄悄的。仪表盘从机械指针转向全液晶显示,中控屏幕越做越大、集成度越来越高,充电桩也从单纯的供电设备演变为带显示屏的智…

2026/10/11 15:30:07 阅读更多 →
CDP 7.3.1(Cloudera Runtime 7.3.1)VS Acceldata ODP 3.3.6.4 核心引擎详细版本对比

CDP 7.3.1(Cloudera Runtime 7.3.1)VS Acceldata ODP 3.3.6.4 核心引擎详细版本对比

CDP Private Cloud Base 7.3.1(Cloudera Runtime 7.3.1)VS Acceldata ODP 3.3.6.4 核心引擎详细版本对比说明:CDP 7.3.1:所有组件为 Cloudera 基于 Apache 社区分支做定制增强,带 Cloudera 私有补丁;无 Tri…

2026/10/11 15:30:06 阅读更多 →
autobind-decorator API速查表:boundMethod与boundClass完整参考指南

autobind-decorator API速查表:boundMethod与boundClass完整参考指南

【免费下载链接】autobind-decorator Decorator to automatically bind methods to class instances 项目地址: https://gitcode.com/gh_mirrors/au/autobind-decorator 点击查看 免费下载 autobind-decorator 是一个轻量级 JavaScript 装饰器库,能自动…

2026/10/11 15:29:06 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 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/11 10:45:37 阅读更多 →
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/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练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/11 14:36:54 阅读更多 →