昇腾950大模型迁移实战:PyTorch代码不重写背后的真相与调优指南
1. 昇腾950的大模型训练代码迁移别只盯着“不用重写”四个字最近这个标题在我的朋友圈反复出现。做AI Infra的同学转做大模型训练的同学也在转。说实话看到“代码不用重写”的时候我第一反应是这话只说对了一半另一半藏着大量需要实操验证的前提。在真正上手之前有必要先把这个逻辑拆明白。先明确一点昇腾950这代芯片和昇腾910系列相比提升的不光是算力数字更关键的是它在软件生态兼容上做了一个非常大的转向。PyTorch训练脚本能不能直接跑取决于昇腾的CANN工具链和torch_npu适配层做到什么程度。所谓“不用重写”指的其实是“Python层代码不需要改动或者只做极小改动”但底层的分布式策略、算子实现、混合精度配置、甚至数据加载管道都是需要逐项验证和调整的。这篇就来聊聊我的真实体验从拿到一台昇腾950的服务器到把一套基于PyTorch的大模型训练代码真正跑起来中间经历了哪些环节哪些地方确实不用动哪些地方被标题党一句话带过去了。顺便把几个容易踩坑的点一并整理出来给准备做国产化迁移的团队做个参考。在展开说之前先给一个总结性的判断如果你想迁移的代码是标准的PyTorch实现用的都是torch.nn里的常用模块、AdamW优化器、HuggingFace的transformers接口那么昇腾950这代配合新版CANN和torch_npu确实能做到“脚本级不重写”。但如果你用了自定义CUDA算子、深度依赖某些第三方库的底层实现、或者对训练吞吐有严格要求那该调的地方一样都少不了只是不需要在代码层面大动干戈而已。2. “不用重写”的技术底座到底是怎么实现的这句话背后的技术基础有必要先讲清楚。昇腾的软件栈里承接PyTorch代码的关键组件是torch_npu它做的事情听起来简单实际是一个庞大的工程把PyTorch前端的Tensor操作、自动微分、算子调度映射到昇腾NPU的算子库和CANN运行时上。2.1 torch_npu和CANN的层次关系从软件栈的角度看从上往下大概是这样的PyTorch框架层你写的nn.Module、loss函数、optimizer都是标准的PyTorch接口torch_npu适配层把PyTorch的device概念扩展出NPU设备把算子的调用路由到CANN的算子实现上CANN计算库提供算子实现、图优化、内存管理、通信原语Ascend驱动和固件最底层的硬件抽象所以当你把代码里的model.to(cuda)改成model.to(npu)其余什么都不动就能跑主要是torch_npu在背后把PyTorch的dispatch机制接管了。PyTorch本身设计了一个很好的算子分发机制torch_npu通过注册自己的算子实现让PyTorch在前端仍然保持用户熟悉的调用方式。2.2 为什么不是所有场景都能无缝迁移这里要说一个现实PyTorch的算子覆盖范围非常广而昇腾的算子库虽然逐年增多但和CUDA生态里多年的积累比起来还是有覆盖差异的。常见的conv、matmul、softmax、layernorm这些高频算子没问题但如果你用到的是比较小众的算子或者某些对算子实现有特殊优化的第三方库那迁移时就需要查一下是否已经被支持。举个实际例子我在一个文本生成模型里用到了flash attention的优化实现这个在NVIDIA环境里是经过高度优化的。迁移到昇腾时需要看CANN侧是否提供等价的融合算子。当前昇腾生态里已经有类似功能的实现但如果你代码里硬编码了某个具体的flash attn版本可能就需要做一些适配比如切换到昇腾自定义的attention融合接口。这就解释了为什么“不用重写”这个说法会引起误解它准确描述的是“标准Python层代码可以不重写”而不是“所有机制完全等价性能也一样”。实际工程上迁移之后做性能对齐、算子替换、通信调优都是常态工作。3. 实操把一个PyTorch大模型训练脚本迁到昇腾950说了一堆原理来看实际操作。我拿一个标准的GPT类语言模型训练脚本举例这个脚本原本是在NVIDIA A系列显卡上跑的用的PyTorch 2.x transformers库。迁移到昇腾950的完整过程如下。3.1 环境准备和适配包安装拿到服务器之后首先要确认CANN版本和torch_npu版本是配套的。这里有个很关键的细节昇腾的驱动、固件、CANN工具包三者之间有严格的版本配套关系不能自己随意组合。# 查看NPU设备是否被正确识别 npu-smi info如果这里能看到设备信息说明驱动和固件没问题。接着安装CANN工具包和torch_npu# 以root或具有权限的用户执行安装 ./Ascend-cann-toolkit_x.x.x_linux-aarch64.run --install pip install torch_npu-2.x.x-cp39-cp39-linux_aarch64.whl这里有个值得注意的经验torch_npu的版本必须和你的PyTorch版本严格对应官方会按照PyTorch版本分别发布对应的适配包不能跨版本装。我第一次装的时候就因为PyTorch是2.0.1、torch_npu却装成了对应2.1的版本结果运行时一堆符号找不到排查了半天才发现是版本错配。3.2 代码改动的“最小集”安装好环境之后代码层面的改动确实非常小。核心只需要做三件事import torch import torch_npu # 关键加载NPU适配层 # 把原来的cuda替换为npu device torch.device(npu) model model.to(device) # 数据加载阶段 batch {k: v.to(device) for k, v in batch.items()}如果你用的是transformers的Trainer接口改动就更小了可以直接通过环境变量或参数指定设备类型。实测下来标准模型定义的forward函数、loss计算、optimizer step这些PyTorch原生代码统统不需要动。但有一个隐藏点必须注意如果你代码里硬编码了torch.cuda.amp.autocast这个在昇腾环境不会自动生效需要换成等价的torch.npu.amp.autocast或者更通用一点在代码里做一次抽象。我在迁移一个多卡训练脚本的时候就因为AMP这部分没有处理好导致混合精度根本没有打开训练速度不增反降。3.3 实际的运行验证流程代码改完之后先别急着跑全量数据。我的习惯是三步走先跑一个极小的规模例如10步训练确认loss能正常下降用单个batch反复跑多次确认结果可复现再上多卡和全量数据这里要特别说一句迁移前后如果用的是随机初始化两边的loss曲线不会完全一样这是正常的因为计算顺序、算子实现细节差异都会带来浮点结果上的微小不同。核心判断标准是loss的收敛趋势是否一致最终指标是否在合理范围内。我见过有些团队迁移后一对比loss曲线发现开头差了一点点就开始怀疑算子实现有问题花了很多时间排查最后发现只是随机种子或数据顺序不同造成的。这个问题在跨硬件平台迁移时非常常见建议一开始就把两边的数据加载顺序、随机种子、shuffle逻辑全部对齐减少无关变量。4. 单卡到多卡分布式训练的迁移重点和隐藏差异“代码不用重写”这句话最容易误导人的地方就是在分布式训练场景。单卡能跑通和64卡能高效训练这中间隔着一整个调优工程。4.1 分布式通信库的替换NVIDIA环境里的分布式训练默认走的是NCCL通信库。昇腾环境对应的是HCCL这是昇腾自己的集合通信库。好消息是如果你的代码用的是PyTorch的DistributedDataParallelDDP那么在代码层面确实不需要改动torch_npu会把通信调用路由到HCCL实现上。但这里有几个实际差异要留意。首先是通信环境的初始化方式如果你是用torch.distributed.init_process_group需要手动指定后端参数。实测推荐这样初始化import torch.distributed as dist import torch_npu dist.init_process_group( backendhccl, # 这里从nccl改为hccl init_methodenv://, rankrank, world_sizeworld_size )第二种方式是使用torchrun启动脚本。torchrun本身是框架层的工具它能跨硬件工作但你需要在环境变量里设置好NPU相关的配置。我实际用一个64卡的训练任务做过验证把这行backend参数改掉之后torchrun能够正常拉起分布式训练allreduce的同步行为也符合预期。4.2 大模型训练中分布式策略的实际差异用DDP做同步数据并行处理10亿参数以内的模型问题不大。但如果你要训练的是百亿甚至千亿参数级别的大模型光靠DDP就不够了得用到分片优化器如FSDP或者更复杂的3D并行策略。这里要提醒一个容易掉进去的坑PyTorch原生FSDP理论上在NPU上也能跑但性能差异可能会很大。原因是FSDP的通信模式和显存管理逻辑涉及很多对通信库的特定调用习惯HCCL和NCCL在这类复杂模式下的优化程度不完全一样。如果你在NVIDIA上已经用FSDP磨合得非常好迁移到昇腾后建议先做一次性能基线测试看FSDP的通信占比和显存碎片情况。更复杂的手动并行策略比如流水并行和专家并行涉及大量自定义通信和调度逻辑。这些在迁移时就不是简单改一个backend参数能搞定的了。通常需要结合昇腾的通信算子特点重新设计部分逻辑。这就是为什么很多声称“不用重写”的项目实际落地时还是有一个适配团队在做持续优化。4.3 分布式训练性能瓶颈的排查思路多卡训练性能上不去一个常见问题是通信和计算没有做重叠。NVIDIA的NCCL在这方面有非常成熟的异步执行机制HCCL也在快速发展但两者在具体场景下的表现会有差异。我在一个百亿参数的模型训练中遇到过这样的情况64卡训练时GPU利用率看起来很高但整体吞吐始终上不去。排查后发现是通信粒度设置过大每个通信操作的数据量太大导致计算单元等待通信完成的时间过长。解决方案是调整梯度分桶的大小把一次通信拆成更小的块让计算和通信更好地重叠起来。这个调整在代码里的体现就是DDP的参数bucket_cap_mb。默认值可能适合NCCL通信模式但在昇腾的环境里需要尝试不同配置ddp_model torch.nn.parallel.DistributedDataParallel( model, device_ids[local_rank], bucket_cap_mb25 # 根据实际情况调整 )我把这个值从默认的25调低到10再到5分别测试过通信耗时和整体吞吐最后在一个中型模型上找到了最优配置。这属于典型的“代码不用重写但要调参数”的场景也是从“能跑”到“跑得快”之间最关键的一步。5. 性能调优的真正核心从“能跑”到“跑得快”这一部分可能才是本文最有价值的内容。代码迁移跑通只是第一步实际工程目标永远是吞吐和效率。昇腾950在硬件规格上给了很强的算力底子但软件层能否充分发挥取决于你怎么调优。5.1 混合精度的设置策略大模型训练必然要用混合精度。昇腾环境下AMP的接口和CUDA环境类似但实现细节有不少差异。我推荐的做法是在代码里显式控制loss scaling的策略。自动loss scaling虽然省事但在训练初期loss变化剧烈时容易出现overflows导致大的batch被跳过。在昇腾的环境里我实测下来手动设置一个初始scale值比如2的16次方配合动态调整策略训练稳定性会更好。from torch.npu.amp import GradScaler, autocast scaler GradScaler(init_scale2**16) with autocast(): outputs model(batch) loss criterion(outputs, targets) scaler.scale(loss).backward() scaler.step(optimizer) scaler.update()这里有个值得注意的性能观察点混合精度开启之后并不是所有算子都适合降精度。在昇腾950上某些特殊的算子降精度后精度损失比较大这个需要在开发阶段就做好算子的精度敏感度测试。我在迁移一个使用了大量LayerNorm的模型时就遇到过LayerNorm降精度后训练不稳定、loss震荡的现象。解决办法是把这些敏感算子的计算精度显式保持在FP32。5.2 内存管理和图模式优化大模型训练对显存的需求非常夸张。昇腾环境中有几个内存管理的特点需要注意。首先是显存的动态分配和释放策略。PyTorch默认的显存分配器在CUDA环境上有缓存机制昇腾的CANN也有类似设计但行为和默认参数不完全相同。如果训练到中途出现内存不足需要检查是否可以通过环境变量调整缓存策略例如关闭内存碎片回收、增加预分配比例。其次是图模式。PyTorch 2.0引入的torch.compile技术在昇腾950上同样有对应的支持路径。但我的实测经验是并非所有模型都能从图模式中获益图模式在小模型上甚至可能因为图编译的时间开销而变慢。建议的做法是先用eager模式跑通并验证正确性然后用torch.compile试一个较小规模的任务做A/B对比如果收益明显再全量使用。5.3 算子替换的实践案例纯PyTorch实现的大模型在训练效率上通常会比手工优化过的版本低不少。昇腾950上某些高频算子可以通过替换为CANN的融合版实现来获得明显性能提升。最典型的是Attention模块。标准的PyTorch多头注意力实现里Q乘K的矩阵乘、softmax、再乘V这三步是分开计算的。昇腾CANN提供了融合后的Attention实现可以减少显存读写次数。在实际测试中融合算子替换后的Attention计算耗时能降低将近30%。但这里有个平衡要考虑CANN的高性能Attention实现通常需要把输入维度格式调整成特定的layout。如果你在模型定义里使用了自定义的attention mask方式可能无法直接匹配融合版本此时要评估到底是用融合算子还是要保留自定义逻辑。5.4 数据加载管道的调整这个环节经常被忽略但在昇腾环境下对整体训练吞吐影响很大。PyTorch的DataLoader默认在多进程模式下使用CPU来做数据预处理。昇腾服务器上CPU和NPU之间的数据拷贝路径和NVIDIA平台上的GPU与CPU交互路径有一些差异。我迁移一个大模型训练任务时发现每次数据加载的等待时间明显偏长排查后发现是数据预处理中的某些操作自动降级到了CPU的某个低效路径上。解决办法是把数据预处理尽可能多地放到NPU上执行。把tokenization等之前放在CPU上处理的操作迁移到模型forward里用NPU做张量运算充分利用NPU的并行能力。另外调整num_workers和prefetch_factor这一类的参数在不同硬件平台上会有不同的最优值需要通过实际实验来确定。6. 常见问题排查速查表与实操避坑经验结合自己的迁移经历整理一份常见问题排查表。现象可能原因排查方法解决方向程序启动即报“找不到设备”驱动/固件未正确安装或版本不匹配执行npu-smi info查看设备按官方版本配套表重新安装运行时提示算子不支持代码中使用了CANN尚未覆盖的算子查看报错日志中的算子名替换为等价PyTorch实现或联系厂商支持模型能跑但loss不下降混合精度设置不正确或随机种子未对齐先关闭AMP测试全FP32是否能收敛重新配置AMP相关参数多卡训练吞吐远低于预期通信和计算没有充分重叠使用昇腾profiling工具查看通信耗时调整bucket_cap_mb、通信粒度等参数训练一段时间后内存不足显存碎片化或缓存策略不当监控显存占用曲线调整环境变量优化缓存策略保存的checkpoint无法加载模型参数中包含CUDA特定状态检查是加载了整个模型还是只加载了state_dict只保存和加载state_dict避免设备绑定6.1 几个容易被忽视的细节一个是IO和文件系统的影响。大模型训练过程中checkpoint的保存和加载非常频繁。昇腾950所在的服务器如果搭配的是传统的机械硬盘checkpoint读写的时间会非常夸张。强烈建议在有条件的情况下使用NVMe闪存盘存储训练数据和工作目录。另一个是整个链路中PyTorch版本的选择。不是越新的版本越好而是要看torch_npu适配层是否跟上了对应版本的特性。我在实际迁移中发现某个新版本的PyTorch加入了一个算子的重命名导致torch_npu没有及时跟上运行时报错。后来锁定到官方明确验证过的稳定组合问题就解决了。6.2 关于性能测试的一点经验之谈很多团队在迁移后会直接拿着MFU模型算力利用率数据做对比。如果发现MFU比NVIDIA环境低也不必急着下结论说芯片不行。这里要仔细看三点第一两边的分布式规模是否一致。64卡和128卡在不同通信最优配置下的MFU本身就有差异。第二模型超参数是否一致。有些模型在NVIDIA环境里是经过反复调优的把同样的配置直接搬到昇腾环境不一定就是最优解。第三软件栈成熟度。CUDA生态在NVIDIA上发展了这么多年已经过无数轮迭代优化。昇腾在软件生态上投入的时间相对短一些但每一代都在快速追赶。用追赶者当前的版本和成熟生态做绝对对比得到的结果需要客观解读。6.3 迁移前的一个简易评估方法给准备做迁移的团队一个简易评估清单把手头训练脚本里的关键算子提取出来和昇腾支持的算子清单做一次比对。如果覆盖度在95%以上就可以比较放心地做“代码不重写”的迁移。如果覆盖度不够就要提前规划替代方案。这里的“关键算子”不只是模型forward里的还包括loss计算、优化器更新、数据增强等环节里调用的所有算子。把这些算子跑一遍基本上能预估迁移的工作量。7. 用实际案例说明迁移后的收益与代价光说不练没有意义。分享一个我经历的完整案例可以更直观地展示实践中的迁移结果。某团队手头有一个13B参数的对话模型训练项目原先生成代码是用PyTorch在NVIDIA A100集群上做的使用了数据并行加载参数分片的方式。整个代码库包括基于transformers的模型定义、自定义的loss函数、动态的batch size调整逻辑以及一个多阶段的训练流程。迁移到昇腾950之后第一轮只需要改设备类型和少量分布式初始化代码先让脚本能跑起来。第二周开始做性能调优依次分析了混合精度配置、通信参数和数据加载管道。最终的结果是代码层面的改动量非常小核心训练脚本几乎没动过。但工程上的工作时间并没有减少太多主要花在性能分析、参数调试和环境问题排查上。这个案例比较真实地反映了“代码不用重写”和“工程不需要投入”之间的区别。从更长远的角度看硬件平台的迁移不是一次性工作。随着训练任务的变化模型规模的扩大你仍然需要持续关注昇腾软件生态的迭代定期更新工具链版本跟着官方发布的最佳实践调整自己的参数配置。最后提一个我个人的实操建议无论你的迁移脚本看起来有多简单都建议先在小组内安排一名有分布式训练经验的工程师作为适配负责人。此人负责持续追踪昇腾版本的更新、做性能回归测试、积累团队自己的调优手册。这一角色可能比多写几个脚本的价值要大得多。

相关新闻

从0搭建CSDN技术博客:注册、写作、SEO与数据复盘的完整指南

从0搭建CSDN技术博客:注册、写作、SEO与数据复盘的完整指南

“从0搭建自己的CSDN技术分享博客”,这个标题里的“从0”我自己的理解,其实是两层意思。第一层很直白,注册账号、填资料、选编辑器,一套动作十分钟就搞定了。第二层就麻烦多了——你要从零开始,搭建一套“愿意长期写下…

2026/10/14 5:32:14 阅读更多 →
昇腾950大模型训练代码迁移:不重写也能跑,关键在生态兼容层

昇腾950大模型训练代码迁移:不重写也能跑,关键在生态兼容层

1. 一次代码迁移带来的“重写恐惧”,这次可以放下我手里有一份训练数据模型的核心训练代码,从去年开始就在某硬件平台上跑。最近团队收到消息:要把训练任务迁到昇腾950上。按以往习惯,换一套硬件,训练脚本、通信库、算…

2026/10/14 5:32:14 阅读更多 →
Ubuntu使用ESP32上传程序出错

Ubuntu使用ESP32上传程序出错

目录 1.错误显示 2.修复 3.示例程序 1.错误显示 A fatal error occurred: Unable to verify flash chip connection (No serial data received.). 这个错误意思是:Arduino IDE 在上传代码时无法与 ESP32 的闪存芯片建立连接,通常是由于串口连接或硬件…

2026/10/14 5:31:14 阅读更多 →

最新新闻

Flutter跨平台开发实战:从环境搭建到架构优化的完整指南

Flutter跨平台开发实战:从环境搭建到架构优化的完整指南

简介:这份PDF资料面向跨平台移动应用开发的初学者,以及有编程基础但尚未接触Flutter的开发者,系统讲解Flutter从环境搭建到项目实战的完整路径。内容涵盖Flutter自绘引擎、AOT编译与热重载等核心优势,Windows与macOS下的SDK安装和…

2026/10/14 6:19:25 阅读更多 →
Agent稳定性工程化:Harness机制设计与落地实践

Agent稳定性工程化:Harness机制设计与落地实践

1. 从“能跑”到“跑得稳”:Agent 稳定性问题的工程化破局思路做 Agent 开发的人大概都有过这种体验:Demo 阶段一切丝滑,一旦放到真实业务里跑上几百上千次,各种稀奇古怪的失败就开始冒出来。同一个输入,今天返回正常结…

2026/10/14 6:19:25 阅读更多 →
EMC Symmetrix DMX操作手册:企业级存储现场作业指南

EMC Symmetrix DMX操作手册:企业级存储现场作业指南

简介:本资源是EMC Symmetrix DMX系列企业级存储系统的官方级操作手册,面向存储运维工程师、系统集成人员及维保技术人员,聚焦DMX设备日常巡检、硬件故障定位与现场处置等核心运维场景。手册覆盖DMX 800/1000/2000/3000全型号架构图示&#xf…

2026/10/14 6:19:25 阅读更多 →
短视频背景音乐版权如何合规解决?可商用音乐素材平台盘点

短视频背景音乐版权如何合规解决?可商用音乐素材平台盘点

在短视频与商业内容爆发式增长的今天,背景音乐的版权合规已成为创作者和企业必须正视的核心问题。未经授权使用音乐不仅可能导致视频下架、账号限流,还可能引发法律纠纷与经济损失。选择正规可商用音乐素材平台,是保障内容安全、提升创作效率…

2026/10/14 6:19:25 阅读更多 →
豆包优化公司哪家好?AI搜索推荐优化找谁做

豆包优化公司哪家好?AI搜索推荐优化找谁做

越来越多用户开始用豆包这类AI助手查资料、做决策。QuestMobile数据显示,2026年6月豆包月活跃用户已达到约3.82亿。对企业来说,品牌能否在AI回答中被提及、被推荐,直接影响新客户对品牌的初步印象。“豆包优化公司哪家好、AI搜索推荐优化找谁…

2026/10/14 6:19:25 阅读更多 →
Hive文件存储格式深度解析:从TextFile到ORC的选型与优化

Hive文件存储格式深度解析:从TextFile到ORC的选型与优化

1. 为什么文件存储格式值得单独拎出来讲做数据仓库这行的人,绕不开Hive。而一旦你开始认真用Hive处理稍微上点规模的数据,迟早会撞上一个问题:同样的SQL,为什么别人跑几分钟,我跑半小时?排除掉数据倾斜、资…

2026/10/14 6:18:25 阅读更多 →

日新闻

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/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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 阅读更多 →