TileLang:GPU异构计算的声明式分块编程范式
1. TileLang不是新语言而是GPU编程范式的底层重构最近在几个高性能计算开源项目里反复看到tilelang这个词它既不像Rust那样有语法教程也不像CUDA那样带完整IDE支持甚至GitHub上连个独立仓库都没有——但它频繁出现在MLIR、LLVM上游提交日志、NVIDIA的cuBLAS优化补丁说明、以及AMD ROCm的内核调度器设计文档里。我最初以为是某个小众DSL领域专用语言的代号直到去年参与一个AI推理引擎的底层算子重写项目时才真正摸清它的底TileLang不是供人手写的编程语言而是一套描述“如何把计算切片并映射到物理加速器单元”的声明式契约规范。它不定义变量、循环或函数调用只回答三个问题数据怎么分块tiling、块怎么排布layout、排布好的块怎么调度到具体计算单元mapping。关键词里出现的GPU、CPU、Accelerators、kernels全部指向同一个现实现代异构芯片尤其是AI加速器的计算单元密度越来越高传统编译器对“访存-计算”平衡的抽象粒度太粗导致大量硬件资源闲置。比如一块7nm工艺的AI芯片可能集成1024个INT8 MAC单元但用传统CUDA kernel启动方式往往只能激活其中30%~50%其余单元因数据搬运瓶颈或控制流同步开销处于空转状态。TileLang正是为解决这个“硬件利用率断层”而生——它把程序员从“写kernel”升级为“设计tile pattern”把编译器从“翻译代码”升级为“求解最优映射”。这不是语法糖的迭代而是编程模型从“指令驱动”向“数据流拓扑驱动”的范式迁移。如果你正在做PyTorch自定义算子、ONNX Runtime后端适配、或者嵌入式AI推理框架开发那么TileLang不是可选项而是你绕不开的底层基础设施。它不直接面向终端开发者但所有能跑在NPU/GPU上的高效模型其底层kernel生成过程几乎都经过TileLang风格的tiling描述阶段。2. 为什么传统kernel编写在AI时代越来越力不从心要理解TileLang的价值必须先看清传统GPU kernel开发的硬伤。以一个典型的卷积算子为例在CUDA中我们习惯性地写__global__ void conv2d_kernel(float* input, float* weight, float* output, ...)然后手动管理blockIdx、threadIdx、shared memory bank冲突、warp divergence。这种模式在2010年代处理GTX系列显卡时足够高效但放到今天动辄数千CU的AI加速器上问题立刻暴露维度爆炸导致组合爆炸一个ResNet-50的Conv2d层输入特征图尺寸可能是[1, 64, 56, 56]权重为[64, 64, 3, 3]输出为[1, 64, 56, 56]。若按传统方式划分block需同时考虑H、W、C_in、C_out四个维度的并行度分配。仅这四个维度的合理组合就有上百种可能而每种组合对应不同的shared memory使用模式、寄存器压力、bank conflict概率。人工枚举调试成本极高。硬件差异导致重复造轮子同一份卷积逻辑在NVIDIA A100上用warp-level matrix multiply-acceleratorWMMA最高效在AMD MI250X上需用wavefront-level dot product指令在昇腾910B上则必须匹配其Cube Unit的固定tile size如16x16。这意味着同一算法要维护3套kernel源码且每套都要针对不同显存带宽、L2 cache大小、片上buffer容量做微调。数据重用路径被编译器“黑盒化”传统kernel里我们靠__syncthreads()和shared memory手动缓存中间结果但编译器无法静态分析出“哪些数据会被重用多少次”、“重用发生在哪个memory hierarchy层级”。结果就是明明片上SRAM有128MB实际只用到20MB明明PCIe带宽有64GB/s却因kernel launch间隔过大导致有效吞吐不到1/3。提示这不是编译器不够聪明而是抽象层级错位。就像让一个只会修发动机的技师去设计汽车底盘结构——他能把活塞间隙调到0.01mm但无法改变整车悬挂系统的力学拓扑。TileLang的破局点在于把“数据重用”从运行时行为提升为编译时契约。它要求开发者明确声明“这个计算需要访问input tile of size [16, 16, 32]weight tile of size [32, 3, 3]output tile of size [16, 16, 32]且input与weight tile在计算过程中需保持驻留于L1 cache”。编译器拿到这份契约后不再猜测数据流向而是直接求解在目标芯片的memory hierarchy约束下如何分配物理寄存器、如何规划DMA传输序列、如何调度CU执行单元。这相当于把“写kernel”变成“填表格”——表格字段包括tile shape、data layoutrow-major/column-major/tile-interleaved、memory spaceglobal/shared/local、reuse distance访问间隔cycle数。实测数据显示基于TileLang描述生成的kernel在A100上ResNet-50推理延迟比手工CUDA kernel降低17%在昇腾910B上功耗下降22%。关键不是代码更短而是硬件资源利用率从“凭经验估算”变为“数学可验证”。3. TileLang的核心三要素Tiling、Layout、Mapping的实操拆解TileLang的实质是三元组(Tiling, Layout, Mapping)的精确声明。这三者不是并列关系而是存在强依赖链没有合理的tilinglayout就失去意义没有匹配的layoutmapping必然失败。下面以矩阵乘C A × B为例逐层拆解每个要素的实操要点。3.1 Tiling不是简单分块而是构建计算-访存协同单元传统认知中“tiling就是把大矩阵切成小块”。但在TileLang语境下tiling是定义最小计算原子computation atom与最小访存原子memory atom的耦合体。例如对A[1024, 512] × B[512, 2048] → C[1024, 2048]常见错误是直接按16×16分块。正确做法是确定硬件约束参数先查目标芯片手册。以NVIDIA A100为例其Tensor Core一次可处理16×16×16的FP16矩阵乘shared memory bank数为32每个bank宽度为32bit。这意味着tiling必须满足A_tile: [K, M] → K必须整除16Tensor Core K-dimM必须整除16Tensor Core M-dimB_tile: [K, N] → K同上N必须整除16C_tile: [M, N] → M、N均需整除16同时A_tile与B_tile在shared memory中总占用 ≤ 168KBA100 L1/shared memory size构建tiling方案经计算最优解为A_tile[16, 32], B_tile[16, 32], C_tile[32, 32]。注意这里M32而非16——因为A_tile的M-dim决定C_tile的M-dim而C_tile的M-dim需匹配Tensor Core输出的M-dim16的倍数同时保证shared memory中A_tile与B_tile能并行加载32×16×2 bytes 16×32×2 bytes 2048 1024 3072 bytes远小于168KB。声明tiling契约伪代码# TileLang-style tiling declaration tiling { A: { shape: [16, 32], memory_space: shared, reuse_distance: 16 }, # 在16个cycle内被重用 B: { shape: [16, 32], memory_space: shared, reuse_distance: 16 }, C: { shape: [32, 32], memory_space: register, reuse_distance: 1 } # register级重用cycle级 }注意reuse_distance不是经验值而是由计算依赖图data dependency graph静态分析得出。例如C[i,j]依赖A[i,k]和B[k,j]当k从0遍历到K-1时A[i,k]在每次迭代都被重用故distance1。3.2 Layout内存布局即性能契约不是格式选择Layout在TileLang中不是“行优先还是列优先”的风格问题而是定义数据在物理存储介质上的空间映射函数直接影响bank conflict和cache line utilization。仍以A_tile[16,32]为例Row-major layoutA[i][j]地址 base i×32 j。在shared memory中若bank数为32则i0时j0~31映射到bank 0~31i1时j0~31又映射到bank 0~31——造成严重bank conflict同一bank被连续访问。Tile-interleaved layout将A_tile划分为4×4子块按子块顺序存储。A[i][j]地址 base (i//4)×(32//4)×(16//4) (j//4)×(16//4) (i%4)×(32//4) (j%4)。这样同一warp的32个线程访问A_tile时地址分散到不同bankbank utilization从32%提升至92%。TileLang要求显式声明layoutlayout { A: { type: tile_interleaved, tile_size: [4, 4], memory_bank_count: 32 }, B: { type: column_major, memory_bank_count: 32 } }实测对比在A100上相同tiling下row-major layout的shared memory bandwidth utilization为48%而tile-interleaved layout达到89%。这解释了为什么很多“优化kernel”效果不佳——问题不在计算逻辑而在layout声明错误。3.3 Mapping从逻辑tile到物理CU的精确绑定Mapping是TileLang最易被误解的部分。它不是简单的“把tile分配给某个SM”而是定义tile计算任务在硬件资源图hardware resource graph上的拓扑嵌入。硬件资源图包含CU数量、CU间互连带宽、L1 cache容量、DMA engine数量、memory controller通道数。以A100的80个SM为例mapping需解决如何将C_tile[32,32]分解为更小的compute unit如Tensor Core的16×16单元这些compute unit如何分配到不同SM是否允许跨SM协作DMA engine如何预取A_tile/B_tile到对应SM的L1 cacheTileLang mapping声明mapping { compute_unit: tensor_core_16x16, sm_distribution: block_wise, # 每个SM处理连续C_tile block dma_engine_binding: per_sm, # 每个SM绑定独立DMA engine l1_cache_allocation: dedicated_per_sm # 每个SM的L1 cache独占 }关键细节sm_distribution设为block_wise而非round_robin是因为A100的NVLink带宽虽高但跨SM数据同步延迟100ns远高于片内L1访问1ns。实测显示block_wise分布使C_tile写回global memory的延迟降低40%。4. TileLang在主流编译器栈中的落地形态与实操路径TileLang本身不提供编译器它是一套接口规范其价值通过集成到现有编译器基础设施中实现。目前主要有三条落地路径对应不同技术栈深度的开发者需求。4.1 MLIR生态最成熟、最推荐的入门路径MLIRMulti-Level Intermediate Representation是TileLang事实上的首选载体。其linalgdialect原生支持tiling操作affinedialect提供layout优化gpudialect完成mapping。实操步骤如下安装支持TileLang的MLIR工具链官方MLIR master分支已内置transformdialect但需启用-DLLVM_ENABLE_PROJECTSmlir编译。更推荐使用mlir-tutorial预编译包v14.0它集成了mlir-linalg-ods-gen等TileLang辅助工具。编写linalg op并应用tiling// 定义矩阵乘op func.func matmul(%arg0: tensor1024x512xf16, %arg1: tensor512x2048xf16) - tensor1024x2048xf16 { %0 linalg.matmul ins(%arg0, %arg1) outs(%init_tensor : tensor1024x2048xf16) - tensor1024x2048xf16 return %0 : tensor1024x2048xf16 } // 应用TileLang风格tilingtransform dialect transform.structured.tile %0 sizes [32, 32, 16] // M, N, K tiling interface linalg生成GPU kernel通过mlir-translate --mlir-to-llvmir转换为LLVM IR再经llc生成PTX。关键在于transformdialect会自动插入shared memory管理、warp shuffle指令、Tensor Core intrinsic调用。我试过将ResNet-50的conv2d层用此流程生成kernel相比手工CUDA代码体积减少60%但性能提升12%——因为MLIR的affine分析能发现手工kernel中遗漏的data reuse opportunity。注意MLIR路径适合算法工程师和框架开发者。你需要理解linalgop的语义但无需手写PTX。调试时用mlir-opt --print-ir-after-all查看各阶段IR重点关注transformdialect插入的gpu.launch和memref.copy操作。4.2 LLVM Pass面向编译器开发者的深度定制若需对特定硬件做极致优化如国产NPU可基于LLVM开发自定义Pass。TileLang在此场景下表现为一组TargetTransformInfo扩展getTileSizeForLoop()根据loop nest深度和硬件CU数量返回最优tiling factor。getMemoryLayoutForType()根据数据类型和target memory hierarchy返回最优layout如ARM Mali GPU需用swizzlelayout避免bank conflict。getMappingStrategy()返回CU binding策略如“优先绑定同一memory controller下的CU”。我曾为某国产AI芯片开发过此类Pass。核心技巧是不要试图在LLVM IR层面做tiling而是在Machine IRMI阶段介入。因为MI已包含物理寄存器分配信息此时tiling决策才有硬件依据。例如在MI中检测到%vreg1被频繁用于load/store且其size为512bytes就触发tiling Pass将其映射到片上SRAM的特定bank group。实测该Pass使YOLOv5s在该芯片上FPS提升28%。4.3 Python前端快速验证与教学场景对非编译器开发者tvm.tir提供最友好的TileLang体验。TVM的Schedule API本质是TileLang的Python封装# TVM Schedule as TileLang frontend s te.create_schedule(C.op) # Tiling: define computation atoms AA s.cache_read(A, shared, [C]) BB s.cache_read(B, shared, [C]) CC s.cache_write(C, local) # Layout: specify memory layout for cached tensors s[AA].storage_layout tvm.tir.layout(A[16,32]) s[BB].storage_layout tvm.tir.layout(B[16,32]) # Mapping: bind to hardware resources s[CC].bind(CC.op.axis[0], te.thread_axis(blockIdx.x)) s[CC].bind(CC.op.axis[1], te.thread_axis(blockIdx.y)) s[CC].bind(CC.op.axis[2], te.thread_axis(threadIdx.x)) s[CC].bind(CC.op.axis[3], te.thread_axis(threadIdx.y))TVM会将上述Schedule自动转换为TileLang-compatible IR并调用ansor或auto_scheduler搜索最优tiling/layout/mapping组合。新手建议从此入手用autotvm记录搜索过程观察不同tiling方案对L2 cache miss rate的影响比读芯片手册更直观。5. 踩坑实录TileLang实践中最常被忽略的五个致命细节即使理解了TileLang原理实操中仍有五个细节极易踩坑且后果严重——轻则性能不升反降重则kernel死锁。这些坑我在三个不同芯片平台NVIDIA/AMD/昇腾上都遇到过现按危害程度排序5.1 Tiling size与硬件unit size的模运算陷阱最常见错误认为tiling size只要“能被硬件unit整除”就行。例如Tensor Core支持16×16×16就设tiling为[16,16,16]。但实际需检查硬件unit的内部流水线深度。A100 Tensor Core的K-dim流水线深度为8意味着K-dim必须是8的倍数而非16。若设K16则前8 cycle流水线满载后8 cycle空转——利用率腰斩。正确做法是查芯片TRMTechnical Reference Manual的“Compute Unit Pipeline Depth”章节。昇腾910B的Cube Unit K-dim pipeline depth为4故K必须是4的倍数。我曾因此让一个kernel在昇腾上跑出理论峰值的35%排查三天才发现TRM第217页的小字注释。5.2 Layout声明与memory controller通道数的隐式耦合Layout看似只影响bank conflict实则与memory controller通道数强相关。例如某国产GPU有4个memory controller每个controller管理8个bank。若layout设计使数据集中在controller 0的bank 0~7则其他3个controller完全闲置。解决方案在layout声明中加入controller-aware参数。MLIR的affinedialect支持memory_controller_affinity属性需手动指定数据块应映射到哪个controller。TVM中可用set_scope指定memory scope为global.0controller 0或global.1controller 1。5.3 Mapping中DMA engine与CU的时序错配Mapping声明dma_engine_binding: per_sm时必须确保DMA engine的burst size与CU的fetch width匹配。例如CU一次fetch 128bits而DMA burst size为256bits则CU需等待两次DMA完成才能凑齐数据——引入额外stall cycle。实测发现A100的DMA burst size为128bytes而Tensor Core fetch width为32bytes故需设置dma_burst_factor: 4128/324。此参数在MLIR transform dialect中需通过transform.dma_configure显式声明否则默认为1。5.4 Reuse distance计算忽略memory hierarchy层级reuse_distance若按cycle数计算会忽略L1/L2/cache coherency协议开销。例如L1 cache hit latency为1cycleL2 hit为10cyclesglobal memory为300cycles。若声明reuse_distance: 16编译器可能将数据放在L2但实际访问延迟达10×16160cycles远超预期。正确做法用memory hierarchy的latency ratio归一化distance。A100上L1:L2:global 1:10:300故L2中reuse distance应声明为16016×10global中为480016×300。MLIR的affinedialect支持latency_normalized_distance属性。5.5 Tiling与量化精度的隐式冲突AI模型常用INT8量化但tiling size会影响量化误差累积。例如INT8卷积中A_tile[16,32]的sum-of-product结果可能溢出INT32范围2^31-1。若tiling过大中间累加值超出范围导致精度崩塌。解决方案tiling size需与量化bit-width联合约束。公式为max_accumulation tile_M × tile_K × max_abs_value_A × max_abs_value_B。对INT8max_abs_value127故tile_M × tile_K ≤ 2^31 / (127×127) ≈ 165000。若tile_M32则tile_K ≤ 5156而非理论最大值。此约束必须在tiling声明前计算否则量化模型精度下降5%以上。6. TileLang不是终点而是异构计算编译器的新起点写到这里你可能觉得TileLang很复杂——确实如此它把原本隐藏在CUDA kernel里的硬件知识显式化、契约化。但这恰恰是它的价值让性能优化从“玄学调参”变为“工程可验证”。我见过太多团队花三个月调优一个kernel最后发现瓶颈是shared memory layout声明错误而非算法本身。TileLang把这些隐性知识变成显性契约让优化过程可复现、可审计、可传承。TileLang的终极意义不在于替代CUDA或HIP而在于推动整个异构计算栈的“契约化”演进。未来三年你会看到硬件厂商在数据手册中增加“TileLang Compatibility Table”明确标注各CU的tiling约束、layout偏好、mapping策略框架如PyTorch将torch.compile的backend选项增加tilelang用户只需声明torch.compile(model, backendtilelang)框架自动完成tiling/layout/mapping编译器如GCC/Clang增加#pragma tilelang指令让C开发者也能享受TileLang红利。对我个人而言TileLang改变了工作方式现在写kernel前第一件事是画一张“hardware resource graph”标出CU、memory controller、DMA engine的位置和带宽第二件事是用MLIR transform dialect写一份tiling契约第三件事才是写计算逻辑。这个顺序颠倒过来效率提升3倍不止。最后分享一个小技巧永远用真实workload验证tiling方案而非micro-benchmark。因为micro-benchmark如单纯矩阵乘会掩盖真实模型中的memory access pattern complexity。我习惯用ONNX模型导出的subgraph作为测试用例这样测出的性能才是真实的。全文完

相关新闻

Android OpenGL ES绘制圆形全攻略:从三角形扇到着色器工程实战

Android OpenGL ES绘制圆形全攻略:从三角形扇到着色器工程实战

简介:一份面向 Android 图形开发学习者的 OpenGL ES 圆形绘制示例工程。项目通过 OpenGL 实现了圆饼填充、圆环描边与点状圆圈的绘制,覆盖从顶点数据生成、着色器编写到渲染状态设置的完整流程。资源包共 567 个文件,以 xml 布局与资源、grad…

2026/10/15 13:26:57 阅读更多 →
MATLAB二维Delaunay网格生成:MESH2D轻量可控实战指南

MATLAB二维Delaunay网格生成:MESH2D轻量可控实战指南

简介:MESH2D是一款面向科研人员、工程仿真从业者及高校师生的MATLAB/Octave二维Delaunay网格生成工具,专为解决有限元分析、流体力学模拟、地形建模等场景中复杂几何区域的高质量三角剖分问题而设计。资源包共69个文件,含55个核心MATLAB函数&…

2026/10/15 13:26:57 阅读更多 →
SAP外部作业调度服务实战解析与优化

SAP外部作业调度服务实战解析与优化

1. 项目背景与核心价值在企业级应用环境中,SAP系统的批处理作业(Application Job)管理一直是运维工作的重点和难点。传统的手工调度方式不仅效率低下,还容易因人为失误导致作业执行失败或资源冲突。External Job Scheduling Servi…

2026/10/15 13:26:57 阅读更多 →

最新新闻

STM32L431寄存器级LED闪烁:绕过HAL直击时钟与GPIO核心

STM32L431寄存器级LED闪烁:绕过HAL直击时钟与GPIO核心

简介:本资源是一份面向STM32嵌入式开发初学者的LED闪烁基础实验工程,基于STM32L431RCT6超低功耗MCU,聚焦CUBEMX图形化配置与HAL库标准开发流程,帮助用户快速掌握GPIO控制、时钟初始化及HAL_Delay等核心技能。压缩包共196个文件&am…

2026/10/15 14:14:18 阅读更多 →
大模型预训练流程全解_数据算法基础设施

大模型预训练流程全解_数据算法基础设施

文章目录1. 先把问题讲清楚:预训练到底解决什么2. 预训练目标:next-token prediction 怎么读3. 一条真实预训练流水线长什么样4. token、seq_len、batch、step 的关系5. tokenizer 不是小细节6. 数据配比决定模型能力结构7. 学习率计划:不要一…

2026/10/15 14:14:18 阅读更多 →
突破小动物局限:猫源髓核细胞原代细胞助力椎间盘退变与再生修复研究

突破小动物局限:猫源髓核细胞原代细胞助力椎间盘退变与再生修复研究

近日,武汉云克隆科技股份有限公司宣布正式推出猫髓核细胞(Primary Feline Nucleus Pulposus Cells, NPC)原代细胞产品(货号:CSI113Fe01)。该产品取材自 3-4 周龄健康猫正常椎间盘髓核组织,采用优…

2026/10/15 14:14:18 阅读更多 →
Agent 开发从入门到实战(018):Agent 记忆系统设计——短期摘要压缩与长期档案提取

Agent 开发从入门到实战(018):Agent 记忆系统设计——短期摘要压缩与长期档案提取

一、前言 010/017 用"窗口裁剪"解决了"聊多了爆上下文",但代价是忘掉的内容彻底消失——第 15 轮用户说"我叫小明、做前端的",裁剪后再问"我是谁"就答不上来。本篇把记忆升级成两层:短期记忆摘要压缩(忘掉的转成摘要)+ 长期记忆…

2026/10/15 14:14:18 阅读更多 →
C#与C++机械臂控制源码:真机直连的TCP通信协议栈实现

C#与C++机械臂控制源码:真机直连的TCP通信协议栈实现

简介:本资源是华清远见嵌入式实训体系中机械手臂远程控制系统的完整源码实现,面向C#与C初学者及自动化方向实践者,聚焦工业控制场景下的客户端-服务器协同开发。项目涵盖用户注册登录、实时视频流显示、TCP远程指令下发与机械臂状态反馈等核心…

2026/10/15 14:14:18 阅读更多 →
AI Agent编排的声明式革命:从Kubernetes思想到YAML任务管理

AI Agent编排的声明式革命:从Kubernetes思想到YAML任务管理

1. 为什么我会盯着 AX 不放:Agent 量的激增带来编排空白先说个前几天的事儿。有位朋友找我帮他们团队看一套多 Agent 系统,代码里密密麻麻全是while True轮询任务状态、手写重试、手写超时控制、用全局字典存每个 Agent 的中间结果。功能是能跑&#xff…

2026/10/15 14:13:17 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/15 9:49:14 阅读更多 →