asc-devkit 算子 Tiling 独立调测:OpTilingRegistry 加载 Tiling 动态库与获取 Tiling 函数指针详解
人工智能深度学习算子库CANNAscend【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址https://gitcode.com/cann/asc-devkit点击查看免费下载本文围绕 asc-devkit 提供的OpTilingRegistry类展开讲解其在工程化算子开发中独立进行 Tiling 调测场景下的完整用法如何加载编译产物中的 Tiling 动态库、如何按算子类型获取 Tiling 函数指针以及该函数指针如何与ContextBuilder构建的TilingContext配合执行。读完本文你可以独立编写一套脱离图引擎的 Tiling 单元测试程序并结合仓库源码理解其底层dlopen加载与注册表查询机制。一、OpTilingRegistry 是什么在工程化算子开发流程中开发者需要实现一个固定原型的 Tiling 函数它接受TilingContext作为输入负责完成数据分片、平台信息填充等工作正常在线运行时由框架负责构造TilingContext并调用 Tiling 函数。但为了单独调试 Tiling 逻辑例如在算子未入图、或未部署到目标机器时验证 Tiling 代码正确性asc-devkit 提供了OpTilingRegistry类。OpTilingRegistry类属于context_ascendc命名空间主要用于加载 Tiling 实现的动态库并获取算子的 Tiling 函数指针以进行调试和验证该类通常与ContextBuilder类配合使用后者用于构造 Tiling 函数所需的输入参数TilingContext。所需的头文件和库文件类型内容需要包含的头文件#include tiling/context/context_builder.h需要链接的库文件libtiling_api.a动态链接场景对应libtiling_api.soPublic 成员函数OpTilingRegistry() ~OpTilingRegistry() TilingFunc GetTilingFunc(const char *opType) const bool LoadTilingLibrary(const char *tilingSoPath) const四类接口职责清晰构造/析构负责对象生命周期管理LoadTilingLibrary负责把 Tiling 动态库加载进进程并注册到全局实现注册表GetTilingFunc负责按算子类型OpType查表返回 Tiling 函数指针。二、类声明与源码结构OpTilingRegistry的对外声明位于 include/utils/context/context_builder.husing TilingFunc uint32_t (*)(gert::TilingContext *); class OpTilingRegistryImpl; class OpTilingRegistry { public: OpTilingRegistry() default; ~OpTilingRegistry() default; TilingFunc GetTilingFunc(const char *opType) const; bool LoadTilingLibrary(const char *tilingSoPath) const; private: std::shared_ptrOpTilingRegistryImpl impl_; };从源码结构看有三点值得注意TilingFunc类型别名Tiling 函数指针的返回类型为uint32_t入参为gert::TilingContext*返回值即 Tiling 执行状态码如ge::GRAPH_SUCCESS与 Tiling 函数固定原型保持一致Pimpl 设计类内部仅持有一个std::shared_ptrOpTilingRegistryImpl私有实现指针对外头文件不暴露任何内部数据结构与 ContextBuilder 同头文件ContextBuilder、KernelRunContextHolder与OpTilingRegistry共同定义在该头文件中印证了官方文档两者配合使用的设计意图——ContextBuilder负责构建上下文OpTilingRegistry负责提供被调用的 Tiling 函数。说明官方 API 文档中给出的 include 路径为tiling/context/context_builder.hCANN 安装目录下的头文件布局而在本仓库源码中该头文件位于 include/utils/context/context_builder.h。两者对应同一 API编译时以实际安装环境的 include 目录为准。三、构造和析构函数功能说明创建与释放OpTilingRegistry对象。函数原型OpTilingRegistry() ~OpTilingRegistry()参数说明无。返回值说明无。约束说明无。调用示例context_ascendc::OpTilingRegistry tmpIns; // ... ...从源码看构造函数与析构函数均为 default见 include/utils/context/context_builder.h即对象本身不持有任何需要显式初始化的状态真正的加载动作发生在LoadTilingLibrary调用时注册结果保存在进程级的全局注册表中而非对象内部。因此同一个进程内一次加载即可服务多次GetTilingFunc查询对象本身可以随用随建。四、LoadTilingLibrary加载 Tiling 动态库功能说明根据输入的路径加载对应的 Tiling 动态库。开发者基于工程化算子开发方式完成算子实现后可通过算子包编译或算子动态库编译获取对应的 Tiling 动态库文件算子包编译Tiling 实现对应的动态库为算子包部署目录下的liboptiling.so。具体路径可参考算子包部署动态库编译Tiling 实现集成在算子动态库libcust_opapi.so中。具体路径可参考算子动态库和静态库编译。在算子包目录结构中liboptiling.so位于算子包部署目录的op_api库路径下见 basic_process.md 中给出的部署目录树。函数原型bool LoadTilingLibrary(const char *tilingSoPath) const参数说明参数名输入/输出描述tilingSoPath输入Tiling 动态库的路径支持相对路径与绝对路径。返回值说明trueTiling 动态库加载成功falseTiling 动态库加载失败。具体错误可参考 Log 信息关于日志配置和查看可参考 CANN 环境变量参考文档中日志相关环境变量。约束说明无。调用示例context_ascendc::OpTilingRegistry tmpIns; bool flag tmpIns.LoadTilingLibrary(/your/path/to/so_path/liboptiling.so); if (flag false) { std::cout Load tiling so failed std::endl; ... } // ...源码级实现剖析LoadTilingLibrary的完整实现位于 impl/utils/context/context_builder.cpp内部流程可拆解为 5 步bool OpTilingRegistry::LoadTilingLibrary(const char* tilingSoPath) const { if (tilingSoPath nullptr) { CXT_ASCENDC_LOGE(tilingSoPath is null.); return false; } if (strlen(tilingSoPath) PATH_MAX) { CXT_ASCENDC_LOGE(OpTilingRegistry tiling so path [%s] is too long., tilingSoPath); return false; } char resovedPath[PATH_MAX] {0}; if (realpath(tilingSoPath, resovedPath) nullptr) { CXT_ASCENDC_LOGE(OpTilingRegistry Tiling so path [%s] is not exist., tilingSoPath); return false; } std::string absFilePath(resovedPath); void* handle dlopen(absFilePath.c_str(), RTLD_LAZY); if (handle nullptr) { CXT_ASCENDC_LOGE(OpTilingRegistry dlopen so path [%s] failed., absFilePath.c_str()); return false; } void (*registryFunc)(const char*); registryFunc reinterpret_castvoid (*)(const char*)(dlsym(handle, TbeLoadSoAndSaveToRegistry)); if (registryFunc nullptr) { dlclose(handle); CXT_ASCENDC_LOGE(OpTilingRegistry get TbeLoadSoAndSaveToRegistry func failed.); return false; } registryFunc(absFilePath.c_str()); dlclose(handle); return true; }各步骤含义空指针与长度校验入参为nullptr或长度达到PATH_MAX时直接返回falserealpath解析绝对路径这也解释了文档中支持相对路径的原因——相对路径会在函数内部被解析为绝对路径文件不存在时同样返回falsedlopen(absFilePath, RTLD_LAZY)以延迟绑定方式加载动态库加载失败如架构不匹配、依赖库缺失时返回false查找注册符号通过dlsym查找导出符号TbeLoadSoAndSaveToRegistry。该符号由算子包编译产物提供是 Tiling 库与宿主程序之间的约定接口调用注册函数后dlcloseregistryFunc(absFilePath)会被调用把该库中的 Tiling 实现注册到进程级注册表注册完成后句柄随即释放。从源码结构看注册表本身持有实现所需的状态因此dlclose并不影响后续GetTilingFunc的使用。由此可以推断出加载失败的完整边界条件与源码日志一一对应入参为空、路径超长、文件不存在、dlopen失败、找不到TbeLoadSoAndSaveToRegistry符号任一环节失败均返回false需结合 Log 信息定位。仓库中的测试用例 tests/api/utils/tiling/test_tiling.cppTestOpTilingRegistryLoadTilingLibrary正是通过 mockrealpath、dlopen、dlsym分别覆盖了上述空路径、超长路径、dlopen失败、符号查找失败与成功注册这五类分支。五、GetTilingFunc按算子类型获取 Tiling 函数功能说明根据算子类型 OpType 获取对应的 Tiling 函数。函数原型TilingFunc GetTilingFunc(const char *opType) const参数说明参数名输入/输出描述opType输入算子类型与原型定义时的算子类型保持一致。注意此处传入的是算子类型OpType如AddCustom而不是算子名OpName。若与自定义算子原型声明中的类型名不一致查询将返回空指针。返回值说明获取成功则返回对应的 Tiling 函数指针失败则返回空指针。Tiling 函数指针定义如下using TilingFunc uint32_t(*)(gert::TilingContext*);约束说明无。调用示例context_ascendc::OpTilingRegistry tmpIns; bool flag tmpIns.LoadTilingLibrary(/your/path/to/so_path/liboptiling.so); if (flag false) { std::cout Load tiling so failed std::endl; return -1; } context_ascendc::TilingFunc tilingFunc tmpIns.GetTilingFunc(AddCustom); if (tilingFunc ! nullptr) { // use tiling func ... } else { std::cout get tiling func failed. std::endl; return -1; } // ...源码级实现剖析GetTilingFunc的实现位于 impl/utils/context/context_builder.cppTilingFunc OpTilingRegistry::GetTilingFunc(const char* opType) const { auto registry gert::DefaultOpImplSpaceRegistryV2::GetInstance().GetSpaceRegistry(); const gert::OpImplKernelRegistry::OpImplFunctionsV2* funcs; if (registry nullptr) { CXT_ASCENDC_LOGD(failed to find implfuncs in 2.0 way, registery is null. op type is %s., opType); return nullptr; } funcs registry-GetOpImpl(opType); if (funcs nullptr || funcs-tiling nullptr || funcs-tiling_parse nullptr) { return nullptr; } CXT_ASCENDC_LOGD(find implfuncs in 2.0 way, op type is %s., opType); return funcs-tiling; }从源码看其查询链路为通过单例gert::DefaultOpImplSpaceRegistryV2::GetInstance()获取默认实现空间注册表GetSpaceRegistry()——这正是LoadTilingLibrary中TbeLoadSoAndSaveToRegistry写入数据的目标容器二者构成写注册表 / 读注册表的对应关系调用registry-GetOpImpl(opType)按算子类型查表取出OpImplFunctionsV2结构只有当查到的实现中tiling与tiling_parse两个函数指针均非空时才返回funcs-tiling否则返回nullptr。由此可以推断出返回空指针的几种情形尚未调用LoadTilingLibrary注册表为空、opType 与原型声明不一致、或该库中不存在对应类型的 Tiling 实现。对应的测试用例 tests/api/utils/tiling/test_tiling.cppTestOpTilingRegistryGetTilingFunc通过 mock 注册表分别验证了注册表为 null算子未注册返回空指针以及注册成功返回非空指针三条路径。六、完整调测流程构建 TilingContext 并执行 Tiling 函数OpTilingRegistry解决的是拿到 Tiling 函数的问题而要真正执行它还需要一个构造好的TilingContext。官方指南如何进行 Tiling 调测给出了端到端流程这里完整继承并串讲。步骤 1完成算子实现并获取 Tiling 动态库算子包编译得到liboptiling.so或动态库编译得到libcust_opapi.so。步骤 2编写测试代码——使用ContextBuilder配置输入输出 Tensor 的形状、数据类型、格式及平台信息等构建TilingContext通过LoadTilingLibrary加载 Tiling 动态库GetTilingFunc获取函数指针最后执行 Tiling 函数验证正确性// test.cpp #include iostream #include exe_graph/runtime/storage_shape.h #include tiling/context/context_builder.h int main() { gert::StorageShape x_shape {{2, 32}, {2, 32}}; gert::StorageShape y_shape {{2, 32}, {2, 32}}; gert::StorageShape z_shape {{2, 32}, {2, 32}}; auto param gert::TilingData::CreateCap(4096); auto workspace_size_holder gert::ContinuousVector::Createsize_t(4096); auto ws_size reinterpret_castgert::ContinuousVector *(workspace_size_holder.get()); auto holder context_ascendc::ContextBuilder() .NodeIoNum(2, 1) .IrInstanceNum({1, 1}) .AddInputTd(0, ge::DT_FLOAT, ge::FORMAT_ND, ge::FORMAT_ND, x_shape) .AddInputTd(1, ge::DT_FLOAT, ge::FORMAT_ND, ge::FORMAT_ND, y_shape) .AddOutputTd(0, ge::DT_FLOAT, ge::FORMAT_ND, ge::FORMAT_ND, z_shape) .TilingData(param.get()) .Workspace(ws_size) .AddPlatformInfo(Ascendxxxyy) .BuildTilingContext(); auto tilingContext holder-GetContextgert::TilingContext(); context_ascendc::OpTilingRegistry tmpIns; bool flag tmpIns.LoadTilingLibrary(/your/path/to/so_path/liboptiling.so); // 加载对应的Tiling动态库文件 if (flag false) { std::cout Failed to load tiling so std::endl; return -1; } context_ascendc::TilingFunc tilingFunc tmpIns.GetTilingFunc(AddCustom); // 获取AddCustom算子对应的Tiling函数,此处入参为OpType if (tilingFunc ! nullptr) { ge::graphStatus ret tilingFunc(tilingContext); // 执行Tiling函数 if (ret ! ge::GRAPH_SUCCESS) { std::cout Exec tiling func failed. std::endl; return -1; } } else { std::cout Get tiling func failed. std::endl; return -1; } return 0; }示例中各ContextBuilder链式调用的作用NodeIoNum(2, 1)声明算子 2 输入 1 输出IrInstanceNum({1, 1})声明各 IR 实例数量AddInputTd/AddOutputTd按索引填充每个 Tensor 的数据类型ge::DataType、原始格式与存储格式ge::Format、存储形状gert::StorageShapeTilingData(param.get())提供 Tiling 数据输出缓冲gert::TilingData::CreateCap申请容量 4096 字节Workspace(ws_size)提供 workspace 大小输出指针gert::ContinuousVector承载AddPlatformInfo(Ascendxxxyy)指定模拟的平台版本请替换为实际 SoC 版本如Ascend910B用于填充 Tiling 函数中用到的硬件信息。步骤 3编译测试代码g test.cpp -I${INSTALL_DIR}/include -L${INSTALL_DIR}/lib64 -Wl,-rpath,${INSTALL_DIR}/lib64 -ltiling_api -lc_sec -lgraph_base -lregister -lunified_dlog -lplatform -o test${INSTALL_DIR}请替换为 CANN 软件安装后文件存储路径。以 root 用户安装为例安装后文件默认存储路径为/usr/local/Ascend/cann开发者根据需要链接依赖的动态库必需链接的动态库有libtiling_api.soTiling 功能相关的动态库包含ContextBuilder类、OpTilingRegistry类等libc_sec.so安全函数库libtiling_api.so依赖该库libgraph_base.so基础数据结构与接口库libtiling_api.so依赖该库libregister.so业务函数注册相关库例如 Tiling 函数注册、算子原型注册等——这正是承载TbeLoadSoAndSaveToRegistry注册机制的库libunified_dlog.solog 库libtiling_api.so依赖该库libplatform.so平台信息库libtiling_api.so依赖该库Tiling 函数中使用硬件平台信息时需要依赖该库。步骤 4执行可执行文件./test七、使用要点小结要点说明调用顺序必须先LoadTilingLibrary成功再调用GetTilingFunc未加载时注册表为空查不到实现opType 取值必须与算子原型声明中的算子类型完全一致而不是算子名路径要求tilingSoPath支持相对/绝对路径内部经realpath解析文件不存在、长度 ≥PATH_MAX均会失败库来源算子包编译 →liboptiling.so算子动态库编译 →libcust_opapi.soTiling 实现集成其中失败排查任一环节失败均返回false/ 空指针需结合 Log 信息判断是路径问题、dlopen问题还是符号缺失问题配套类ContextBuilder负责构建TilingContext接口详情可参考 ContextBuilder 文档更多 API 细节可继续查阅 OpTilingRegistry 简介、构造和析构函数、GetTilingFunc、LoadTilingLibrary实现代码见 include/utils/context/context_builder.h 与 impl/utils/context/context_builder.cpp行为验证用例见 tests/api/utils/tiling/test_tiling.cpp。赞分享人工智能深度学习算子库CANNAscend【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址https://gitcode.com/cann/asc-devkit点击查看免费下载相关推荐asc-devkit 中 GetTilingFunc 接口详解按算子类型获取 Tiling 函数并独立调测asc devkit 中 GetTilingFunc 接口详解按算子类型获取 Tiling 函数并独立调测 本篇以 asc devkit 的 Tiling 调人工智能深度学习算子库CANNAscendasc-devkit ContextBuilder 详解手动构造 TilingContext 与 KernelContext独立验证 Tiling 函数与 TilingParseasc devkit ContextBuilder 详解手动构造 TilingContext 与 KernelContext独立验证 Tiling 函数与人工智能深度学习算子库CANNAscendasc-devkit Tiling 上下文构建指南用 ContextBuilder::BuildTilingContext 离线验证算子 Tiling 函数asc devkit Tiling 上下文构建指南用 ContextBuilder::BuildTilingContext 离线验证算子 Tiling 函数人工智能深度学习算子库CANNAscend上一篇网盘直链下载助手告别限速困扰的终极解决方案下一篇网盘直链下载助手九大网盘高速下载终极解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

搜索插入位置LeetCode热题100:二分查找边界条件与Java实现详解

搜索插入位置LeetCode热题100:二分查找边界条件与Java实现详解

LeetCode热题100里有一道搜索插入位置,题面简单到只有一句话:给定一个排序数组和一个目标值,在数组中找到目标值,如果不存在,则返回它将会被按顺序插入的位置。很多第一次刷到它的人觉得这题不过如此,暴力f…

2026/10/16 8:28:29 阅读更多 →
Delphi/BCB电子表格控件源码深度解析与遗留系统集成指南

Delphi/BCB电子表格控件源码深度解析与遗留系统集成指南

简介:本资源为DevExpress ExpressSpreadSheet v1.38版本的完整Delphi与C Builder(BCB)源代码包,面向中高级桌面应用开发者,解决电子表格功能深度集成、性能调优及UI主题适配等核心开发难题。包内共382个文件&#xff0…

2026/10/16 8:28:29 阅读更多 →
技术书籍参考资源章节写作指南:从凑数链接到知识地图

技术书籍参考资源章节写作指南:从凑数链接到知识地图

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

2026/10/16 8:28:29 阅读更多 →

最新新闻

C#面向对象:Person类、Student类继承与构造函数全解析

C#面向对象:Person类、Student类继承与构造函数全解析

1. 面向对象的第一步:从Person类的设计说起很多人学C#敲的第一段面向对象代码,就是从定义人类Person开始的。这个题目看着简单,但背后其实藏着一堆值得掰扯清楚的细节——构造函数怎么写、字段和属性有什么区别、继承之后构造函数怎么联动。我…

2026/10/16 10:41:46 阅读更多 →
Tailwind CSS组件库v6.23:纯CSS驱动的62个可复用UI模块

Tailwind CSS组件库v6.23:纯CSS驱动的62个可复用UI模块

简介:本资源是 Tailwind CSS 6.23 版本的完整组件实践包,面向前端开发者、UI 工程师及响应式项目快速搭建者,解决传统 CSS 开发效率低、定制难、响应式适配繁琐等痛点。压缩包含 2007 个文件,主体为 1304 个 HTML 示例页&#xff…

2026/10/16 10:41:46 阅读更多 →
线性加权滑移平均精准捕捉局部小峰值的Matlab实现与调参

线性加权滑移平均精准捕捉局部小峰值的Matlab实现与调参

前阵子处理一段传感器信号时,我遇到一个特别典型的困境:数据里明明有很关键的局部小峰值,结果一用常规的滑动平均去噪,峰值幅度被削掉一大半,位置还往后偏移了好几个采样点。后来换成线性加权滑移平均算法,…

2026/10/16 10:41:46 阅读更多 →
用Niagara制作逼真火焰:噪声、颜色曲线与透明淡出全解析

用Niagara制作逼真火焰:噪声、颜色曲线与透明淡出全解析

从小我就觉得粒子特效是门“骗术”:喷泉喷的是水,火焰烧的是粒子,但只要观感对了,没人会在意那是不是真的流体。喷泉那一篇发出来后,不少人问我能不能把发射器关掉重力、换个橙色贴图,直接当火焰用。我的回…

2026/10/16 10:41:46 阅读更多 →
Utilman.exe丢失或找不到怎么办?系统自带安全修复方法全解析

Utilman.exe丢失或找不到怎么办?系统自带安全修复方法全解析

系统突然出现“Utilman.exe文件丢失或找不到”的报错,登录界面右下角的“轻松使用”按钮点了没反应,甚至开机就卡在欢迎界面。这个问题在Windows 7到Windows 11上都可能出现,不少朋友第一反应是去第三方下载站找个exe文件补上——我劝你千万打…

2026/10/16 10:41:46 阅读更多 →
AI逆向工程实战:大语言模型如何将二进制翻译为伪代码

AI逆向工程实战:大语言模型如何将二进制翻译为伪代码

这个标题是我在刷开源社区动态的时候看到的,第一反应是“又来了个套壳项目”,但点进去翻了源码和论文之后,我承认我小看它了。这个项目目前在 GitHub 上拿下了 31.2K Star,热度确实不是刷出来的。我花了两天时间把它部署到本地&am…

2026/10/16 10:40:41 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

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

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

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

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

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

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

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

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

2026/10/15 19:41:51 阅读更多 →
影刀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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →