PyTorch GPU指定全攻略:从原理到实践,解决显存与多卡管理难题
1. 从“能用”到“用好”为什么需要指定GPU在深度学习项目里尤其是当你面对一台拥有多块GPU的服务器时一个看似简单却至关重要的操作就是指定你的PyTorch程序在哪块GPU上运行。很多新手朋友可能会觉得只要代码能跑起来GPU能用上就行至于用哪一块似乎不那么重要。但实际情况是如果你不主动管理可能会遇到一系列意想不到的麻烦。最常见的情况是你通过nvidia-smi命令看到GPU 0正在被另一个同事的炼丹任务占得满满的而GPU 1却悠闲地空着。此时如果你启动自己的训练脚本PyTorch默认会尝试使用GPU 0结果就是你的程序要么因为显存不足而直接崩溃要么就和别人的任务挤在一起导致两者的训练速度都变得奇慢无比。另一种情况是不同型号的GPU性能差异巨大比如服务器上有一张老旧的Titan Xp和一张崭新的RTX 4090你肯定希望自己的任务能跑在4090上。如果不指定程序可能会“随机”或者按照默认顺序选中那块老卡让你的训练时间凭空多出好几倍。所以指定GPU不是一个“高级技巧”而是进行高效、协作式深度学习开发的基础操作。它关乎资源利用的效率、任务运行的稳定性在多用户环境中更是体现了基本的职业素养。本文将从最基础的设置方法讲起覆盖训练和推理全流程并深入那些容易踩坑的细节帮你彻底掌握PyTorch的GPU指定策略。2. 核心原理PyTorch如何与GPU交互在动手写代码之前我们需要花点时间理解PyTorch底层是如何管理GPU的。这能帮助我们在遇到复杂情况时做出正确的判断和调试。PyTorch通过一个叫做CUDA的并行计算平台来利用NVIDIA GPU进行计算。当你安装好PyTorch的GPU版本即torch.cuda.is_available()返回True后PyTorch会维护一个或多个CUDA设备也就是GPU的上下文。默认情况下PyTorch会使用索引为0的设备即cuda:0。关键概念GPU索引Device Index这个索引0, 1, 2…是PyTorch内部用来标识物理GPU的顺序。它通常但不总是对应nvidia-smi命令输出中显示的GPU编号。这个顺序由NVIDIA的驱动和系统总线决定。你可以通过torch.cuda.device_count()获取当前可用的GPU数量通过torch.cuda.get_device_name(0)来获取第一块GPU的名称。张量Tensor与设备Device在PyTorch中每一个Tensor和nn.Module模型都有一个.device属性用来标识它当前所处的设备。设备可以是CPU‘cpu’或GPU如‘cuda:0’。一个核心原则是直接的计算操作只能在处于同一设备上的张量之间进行。如果你试图将一个在CPU上的张量与一个在GPU 0上的张量相加PyTorch会直接抛出一个运行时错误。因此指定GPU的本质就是控制我们的模型和数据被创建和移动到哪个cuda:{index}设备上。整个训练或推理流程就是确保模型、优化器、输入数据、损失函数等所有组件都在同一个目标设备上协同工作。注意这里有一个常见的误解认为设置环境变量CUDA_VISIBLE_DEVICES或在代码中指定cuda:0就是“锁定”了物理GPU 0。更准确的理解是你为当前进程创建了一个“虚拟的”GPU列表cuda:0指向的是这个列表里的第一块对你可见的GPU而不一定是物理GPU 0。理解这一点对后续的多卡和复杂环境配置非常重要。3. 训练阶段如何精准控制模型与数据的归属训练过程涉及多个环节的GPU指定我们需要一个清晰的策略。下面我将按照一个标准训练脚本的流程分解每一步该如何操作。3.1 第一步全局设备指定最推荐的方法在脚本的最开始甚至在定义模型之前就明确设定本次运行要使用的GPU。这是最清晰、最不容易出错的方式。方法A使用环境变量命令行启动时这是最“干净”的方法在启动Python脚本的命令行中直接指定。它作用于整个进程PyTorch代码内部甚至无需做任何修改。# 只使用物理GPU 1对PyTorch进程可见的只有这一块在代码中它被称为cuda:0 CUDA_VISIBLE_DEVICES1 python train.py # 使用物理GPU 0和2对PyTorch进程可见的有两块在代码中它们被称为cuda:0和cuda:1 CUDA_VISIBLE_DEVICES0,2 python train.py # 不使用任何GPU强制使用CPU CUDA_VISIBLE_DEVICES python train.py为什么推荐这种方法灵活性高无需修改代码通过启动命令即可灵活切换使用的GPU非常适合在共享服务器上运行不同任务。避免硬编码代码中不出现具体的GPU索引使得代码更具可移植性。同一份代码可以在任何配置的机器上运行只需调整启动命令。权限清晰在多用户环境下系统管理员或用户可以通过这个环境变量来管理资源分配避免冲突。方法B在Python代码内部设置如果你必须在代码内部决定可以在文件开头使用os.environ来设置但这必须在import torch之前完成。import os os.environ[“CUDA_VISIBLE_DEVICES”] “1” # 同样只对物理GPU 1可见 import torch ...注意这种方法将设备选择写死在代码里降低了灵活性通常只在快速测试或确定性的单机环境中使用。3.2 第二步模型与数据移至目标设备设定了全局可见的GPU后在代码中我们通常使用一个变量device来统一管理目标设备。import torch import torch.nn as nn # 判断是否有可用的GPU并定义目标设备 device torch.device(‘cuda:0’ if torch.cuda.is_available() else ‘cpu’) # 如果使用了CUDA_VISIBLE_DEVICES1那么这里的‘cuda:0’实际上对应物理GPU 1。 print(f’Using device: {device}’)将模型移动到设备model MyAwesomeModel() model model.to(device) # 关键操作将模型所有参数和缓冲区移到指定设备将数据移动到设备在训练循环中每一个batch的数据都需要被移动到与模型相同的设备上。for epoch in range(num_epochs): for batch_idx, (data, target) in enumerate(train_loader): # 将数据和标签移动到指定设备 data, target data.to(device), target.to(device) # 前向传播、计算损失、反向传播等操作... optimizer.zero_grad() output model(data) loss criterion(output, target) loss.backward() optimizer.step()一个关键的实操心得很多人喜欢写成data data.cuda()和model.cuda()。这在只使用单卡且是默认卡cuda:0时是等效的。但to(device)是更通用、更推荐的做法因为它同时兼容CPU和GPU并且可以明确指定非默认的GPU如to(‘cuda:1’)代码意图更清晰。3.3 第三步优化器与损失函数的设备一致性优化器是在模型参数之上构建的。一旦模型被移动到device其参数也就位于device上此时创建的优化器会自动与之关联无需额外操作。optimizer torch.optim.Adam(model.parameters(), lr0.001) # 优化器追踪的已经是device上的参数自定义损失函数如果包含可学习参数也需要将其移动到对应设备。但像nn.CrossEntropyLoss、nn.MSELoss这样的标准损失函数是无状态的它们在哪里被调用就在哪里计算因此只需要保证输入给它的output和target在正确的device上即可损失函数本身不需要.to(device)。3.4 多GPU训练DataParallel/DistributedDataParallel时的指定策略当你使用nn.DataParallel进行单机多卡训练时指定方式有所不同。DataParallel会自动将数据拆分到所有可见的GPU上。import os os.environ[‘CUDA_VISIBLE_DEVICES’] ‘0,1,2’ # 指定使用三块物理GPU import torch import torch.nn as nn model MyAwesomeModel() if torch.cuda.device_count() 1: print(f’Using {torch.cuda.device_count()} GPUs!’) # 模型会被复制到cuda:0, cuda:1, cuda:2对应物理GPU 0,1,2 model nn.DataParallel(model) model model.to(‘cuda’) # 或者 model.cuda()。DataParallel要求模型首先放在一个GPU上通常是cuda:0它会自动处理其他GPU。对于更高级、更高效的nn.parallel.DistributedDataParallel设备指定通常与进程启动命令如torchrun和环境变量LOCAL_RANK紧密结合逻辑更为复杂但核心思想依然是控制每个进程看到的CUDA_VISIBLE_DEVICES。4. 推理阶段部署时的GPU指定策略模型训练好后在部署进行推理Inference时GPU指定的逻辑与训练基本一致但场景可能更复杂。4.1 加载已训练模型时的设备映射这是推理时最容易出错的地方。你训练好的模型权重.pth文件保存时其参数是存储在某个设备比如cuda:0上的。当你加载时如果目标设备与保存时不同就需要处理设备映射。情况一加载到与保存时相同的设备最常见# 假设训练时在cuda:0上保存 model MyAwesomeModel().to(‘cuda:0’) checkpoint torch.load(‘best_model.pth’) # 默认加载到模型当前所在的设备cuda:0 model.load_state_dict(checkpoint[‘model_state_dict’])情况二加载到不同的设备例如从GPU服务器训练在另一台GPU机器上部署# 在新机器上我们想加载到cuda:1上 device torch.device(‘cuda:1’) model MyAwesomeModel().to(device) # 方法A先加载到CPU再转移到目标GPU最安全通用 checkpoint torch.load(‘best_model.pth’, map_location‘cpu’) model.load_state_dict(checkpoint[‘model_state_dict’]) model.to(device) # 方法B直接映射到目标设备 checkpoint torch.load(‘best_model.pth’, map_locationdevice) model.load_state_dict(checkpoint[‘model_state_dict’])强烈推荐使用map_location‘cpu’。这是最稳健的做法先将所有参数加载到CPU内存然后再通过.to(device)转移到目标GPU。这避免了因原保存设备不存在比如在新机器上只有一块GPU索引为0但模型是在旧机器的cuda:2上保存的而导致的错误。4.2 推理脚本的GPU指定推理脚本同样需要明确指定设备。通常我们会从配置文件中读取要使用的GPU ID。import argparse parser argparse.ArgumentParser() parser.add_argument(‘—gpu’, typeint, default0, help‘GPU id to use’) args parser.parse_args() os.environ[“CUDA_VISIBLE_DEVICES”] str(args.gpu) device torch.device(f’cuda:{args.gpu}’ if torch.cuda.is_available() else ‘cpu’) # 加载模型和权重 model load_model(‘path/to/model.pth’, device) model.eval() # 处理输入数据 with torch.no_grad(): # 推理时关闭梯度计算节省显存和计算 for input_data in data_stream: input_tensor preprocess(input_data).to(device) output model(input_tensor) result postprocess(output.cpu()) # 结果通常移回CPU进行后续处理4.3 批处理推理与显存管理推理时尤其是处理图像或长文本需要特别注意batch_size。即使指定了GPU过大的batch_size也会导致CUDA out of memory错误。def inference_with_batch_control(model, dataloader, device, max_batch_size8): model.to(device) model.eval() all_results [] with torch.no_grad(): for batch in dataloader: # 动态调整batch size或拆分batch inputs batch[‘image’].to(device) # 如果inputs太大可以在这里手动拆分 if inputs.size(0) max_batch_size: outputs [] for i in range(0, inputs.size(0), max_batch_size): sub_input inputs[i:imax_batch_size] outputs.append(model(sub_input)) output torch.cat(outputs, dim0) else: output model(inputs) all_results.append(output.cpu()) return torch.cat(all_results, dim0)5. 避坑指南那些让你头疼的常见问题与排查手段即使按照上述步骤操作你依然可能会遇到一些诡异的问题。下面是我在实战中总结的几个典型坑位和排查方法。5.1 错误“RuntimeError: Expected all tensors to be on the same device”这是最经典的错误根本原因就是违反了“同设备计算”原则。排查流程打印所有相关张量的设备在错误发生前打印出参与计算的每一个张量的.device属性。print(f”Model device: {next(model.parameters()).device}”) print(f”Data device: {data.device}”) print(f”Target device: {target.device}”)检查数据流确保数据加载器DataLoader的每个batch都被正确.to(device)。注意DataLoader使用num_workers 0进行多进程加载时主进程的设备设置不会自动传递给子进程必须在worker_init_fn或数据集内部处理设备问题通常建议在主进程移动数据。检查自定义模块或损失函数如果你自己写了nn.Module或损失函数并且内部创建了新的Parameter或Tensor务必在__init__或前向传播开始时将它们移动到与输入相同的设备上。可以使用self.register_buffer(‘tensor_name’, tensor, persistentFalse)来注册缓冲区并确保其设备一致性。5.2 错误“CUDA error: out of memory”指定了GPU但显存还是炸了。排查与解决监控工具在运行脚本的同时在另一个终端用watch -n 0.5 nvidia-smi实时监控目标GPU的显存占用。检查batch_size这是显存占用的首要因素。逐步减小batch_size直到程序稳定运行。检查模型尺寸确认模型本身的大小。过大的模型如参数量巨大的Transformer可能单张卡就放不下需要考虑模型并行或梯度检查点Gradient Checkpointing技术。释放缓存PyTorch的CUDA内核会缓存内存以加速分配。如果程序间歇性崩溃可以在每个epoch或迭代后尝试torch.cuda.empty_cache()。但注意这不能解决持续的显存泄漏。排查显存泄漏确保在不需要计算梯度的部分如验证、推理使用with torch.no_grad():。确保循环中没有意外地累积计算图如将损失张量.item()而不是.detach()后放入列表。5.3 现象指定了GPU但nvidia-smi显示使用率为0%代码没报错但GPU看起来是“空闲”的。可能原因与排查计算密集型任务你的任务可能不是持续计算型而是IO密集型如频繁读写数据或CPU预处理密集型。GPU只在做矩阵运算时使用率高等待数据时使用率会降为0。使用nvtop或gpustat等工具可以查看更细粒度的显存占用和计算状态。DataLoader的瓶颈如果数据加载是瓶颈GPU会经常空闲等待数据。尝试增加DataLoader的num_workers使用更快的存储如NVMe SSD或者启用pin_memoryTrue配合.to(device, non_blockingTrue)来加速CPU到GPU的数据传输。代码实际仍在CPU运行最根本的检查确认model.device和data.device确实显示为cuda:x而不是cpu。可能你的.to(device)操作被意外跳过了。5.4 多卡环境下的索引混乱CUDA_VISIBLE_DEVICES2,3时代码中的cuda:0和cuda:1分别对应物理GPU 2和3。这有时会让人困惑特别是当需要根据物理GPU编号来设置风扇速度或监控温度时。解决方案记录日志在程序开始时打印出物理GPU与逻辑GPU的映射关系。visible_devices os.environ.get(‘CUDA_VISIBLE_DEVICES’, ‘all’) print(f”CUDA_VISIBLE_DEVICES: {visible_devices}”) for i in range(torch.cuda.device_count()): print(f”PyTorch logical GPU {i} - Physical GPU {torch.cuda.get_device_properties(i).name}”)使用pynvml库可以直接通过NVIDIA Management Library (NVML)查询物理GPU的信息不受CUDA_VISIBLE_DEVICES影响适合编写系统监控脚本。6. 进阶技巧与最佳实践掌握了基础操作和排错方法后下面这些技巧能让你的GPU使用更加得心应手。6.1 使用torch.cuda.set_device进行上下文管理除了.to(device)你还可以使用torch.cuda.set_device(index)来设置当前上下文Context的默认GPU。之后所有新创建的CUDA张量都会自动放在这个设备上。torch.cuda.set_device(1) # 设置默认GPU为逻辑设备1 x torch.randn(3, 3).cuda() # x会自动创建在cuda:1上但请注意这种方式不改变已有张量或模型的设备。它通常用于脚本中某个特定代码块需要集中使用某块GPU的情况。我个人更倾向于显式使用.to(device)因为代码的意图更加清晰不易混淆。6.2 混合精度训练AMP与设备指定自动混合精度训练可以大幅减少显存占用并加速训练。它与设备指定是正交的可以结合使用。from torch.cuda.amp import autocast, GradScaler scaler GradScaler() model.to(device) optimizer torch.optim.Adam(model.parameters()) for data, target in train_loader: data, target data.to(device), target.to(device) optimizer.zero_grad() with autocast(): # 自动混合精度上下文 output model(data) loss criterion(output, target) scaler.scale(loss).backward() # 缩放损失 scaler.step(optimizer) # 缩放梯度并更新参数 scaler.update() # 更新缩放因子关键点autocast上下文管理器内的计算会自动使用半精度FP16但输入数据data和模型model仍然需要事先被移动到正确的device上。6.3 在Jupyter Notebook或交互式环境中管理GPU在交互式环境中由于内核状态是持续的管理GPU需要更小心。重启内核是最彻底的方法如果之前运行了占用大量显存的代码即使代码执行完毕PyTorch的缓存可能仍未释放。最直接的方法是重启Notebook内核。主动清理可以使用torch.cuda.empty_cache()来清空未使用的缓存。更彻底地可以尝试删除所有引用CUDA张量的变量并调用垃圾回收。import gc del variable_name # 删除持有显存的变量 gc.collect() # 触发垃圾回收 torch.cuda.empty_cache() # 清空CUDA缓存使用%env魔术命令在Notebook的第一个Cell中设置环境变量。%env CUDA_VISIBLE_DEVICES0避免重复加载模型在Notebook中反复执行加载模型的Cell会导致同一模型多次加载到显存造成泄漏。确保模型加载只执行一次。6.4 编写设备无关的代码为了代码的最大可复用性可以编写自动检测并适应设备的代码。def get_device(prefer‘gpu’): “””获取可用设备优先返回指定的设备类型。””” if prefer.lower() ‘gpu’ and torch.cuda.is_available(): # 可以选择空闲显存最多的GPU gpu_id torch.cuda.device_count() - 1 # 这里简单取最后一块实际可根据显存选择 return torch.device(f’cuda:{gpu_id}’) else: return torch.device(‘cpu’) device get_device() print(f”Running on: {device}”)对于更复杂的多设备逻辑可以考虑使用第三方库如accelerateHugging Face它提供了统一的API来抽象化设备、分布式训练和混合精度等细节让代码几乎无需修改就能在不同硬件配置上运行。指定GPU在PyTorch工作中是一个从入门到精通都无法绕开的操作。它始于一行简单的环境变量或.to(device)调用但深入下去涉及到计算图、设备上下文、内存管理和多进程协作等多个层面。我的经验是从一开始就养成清晰管理设备的好习惯远比出了问题再去调试要高效得多。尤其是在团队协作中明确、可配置的GPU指定方式是对他人工作环境的尊重也是保证自己任务稳定运行的前提。下次启动你的训练脚本前不妨花一秒想想我的代码真的跑在我想让它跑的那块卡上了吗

相关新闻

STM32 ADC单通道采集函数封装:从原理到工程实践

STM32 ADC单通道采集函数封装:从原理到工程实践

1. 项目概述:为什么需要封装一个AD单通道函数?在嵌入式开发,尤其是基于STM32这类MCU的项目里,ADC(模数转换器)的配置和使用是家常便饭。无论是读取电位器的电压、检测电池电量,还是采集温度、光…

2026/10/13 1:43:00 阅读更多 →
S32K3 TRGMUX硬件触发原理与汽车电子实战配置详解

S32K3 TRGMUX硬件触发原理与汽车电子实战配置详解

1. 项目概述:为什么S32K3的TRGMUX值得你花时间研究?如果你正在用或者打算用NXP的S32K3系列MCU做汽车电子相关的开发,尤其是涉及到电机控制、复杂定时器联动、或者需要精确定时触发的功能,那么“Trigger MUX”这个模块,…

2026/10/3 3:02:14 阅读更多 →
Python数据采集实战:从零构建爬虫系统与工程化实践

Python数据采集实战:从零构建爬虫系统与工程化实践

在实际技术开发中,我们常常需要处理来自不同数据源的结构化或非结构化信息,并将其整合、分析,以服务于特定的业务逻辑或决策支持。这个过程的核心,是构建一套稳定、高效、可维护的数据采集与处理管道。本文将围绕如何从零开始&…

2026/10/13 18:37:38 阅读更多 →

最新新闻

Windows平台Rust开发环境配置与优化指南

Windows平台Rust开发环境配置与优化指南

1. Rust语言与Windows环境适配背景Rust作为一门系统级编程语言,其编译器工具链对操作系统底层有着深度依赖。在Windows平台进行Rust开发需要特别注意环境配置的差异性——与Linux/macOS不同,Windows存在MSVC和GNU两种ABI(应用程序二进制接口&…

2026/10/14 2:25:24 阅读更多 →
长波红外超构透镜偏振复用FDTD仿真全流程解析

长波红外超构透镜偏振复用FDTD仿真全流程解析

1. 项目背景与核心价值长波红外超构透镜偏振复用聚焦技术是近年来光学领域的前沿研究方向。作为一名光学工程师,我在实际项目中发现传统红外光学系统存在体积大、重量沉、功能单一等问题。而基于超构表面的偏振复用透镜,能在单层平面上实现多通道光学功能…

2026/10/14 2:25:24 阅读更多 →
2026 查重率和 AIGC 率都飘红?一站式降AI率软件实测推荐

2026 查重率和 AIGC 率都飘红?一站式降AI率软件实测推荐

一、前言:2026 高校论文审核新难题随着高校学术审核体系不断升级,知网、维普等主流检测平台全面上线AIGC 智能检测功能,当代毕业生的论文写作与修改迎来双重考验。以往论文仅需攻克重复率超标问题,如今还要规避AI写作痕迹检测风险…

2026/10/14 2:25:24 阅读更多 →
摄影工作室AI提效手册:婚纱写真儿童摄影的修图、营销与交付(v1.0)

摄影工作室AI提效手册:婚纱写真儿童摄影的修图、营销与交付(v1.0)

摄影工作室AI提效手册:婚纱、写真、儿童摄影的修图营销与交付版本 v1.0  2026年10月写在前面:这本手册解决什么这本手册写给三类人:开婚纱影楼的老板与修图主管、拍个人写真和家庭照的独立摄影师、做儿童摄影工作室的店长与后期。你大概率已…

2026/10/14 2:25:24 阅读更多 →
流水线设计实战:从冒险机制到乱序执行的性能优化

流水线设计实战:从冒险机制到乱序执行的性能优化

/* 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 2:25:24 阅读更多 →
【数据可视化-155】第十五届全运会乒乓球男单半决赛:樊振东VS王楚钦技术分析报告

【数据可视化-155】第十五届全运会乒乓球男单半决赛:樊振东VS王楚钦技术分析报告

🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN人工智能领域的优质创作者,提供AI相关的技术咨询、项目开发和个…

2026/10/14 2:24:24 阅读更多 →

日新闻

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 阅读更多 →