Ray 2.55集成Google Cloud TPU:KubeRay多主机自动编排实践
在实际分布式机器学习项目中资源调度和异构硬件支持一直是影响迭代效率的关键因素。传统 GPU 集群虽然成熟但在特定模型训练和推理场景下TPU 的专用架构能带来显著的性能优势。然而跨多主机的 TPU 资源编排、任务分发和故障恢复往往需要复杂的自定义脚本和运维介入。Ray 2.55 版本正式宣布支持 Google Cloud TPU并通过 KubeRay 实现了多主机 TPU 切片的自动编排。这意味着开发者现在可以直接在 Kubernetes 集群中声明式地申请 TPU 资源由 KubeRay 自动完成节点发现、网络配置、资源分配和任务调度无需手动管理 TPU 工作节点的连接和生命周期。对于正在构建多智能体系统、大模型训练流水线或需要高性能张量计算的应用来说这一集成显著降低了异构硬件集群的管理门槛。本文将以一个实际的分布式训练任务为例演示如何从零搭建环境通过 KubeRay 在 GCP 上申请 TPU 资源并运行一个支持多主机切片的 Ray 任务。我们将重点解释 TPU 资源声明方式、KubeRay 配置参数、任务分发机制和常见排错点帮助你在生产环境中安全、高效地使用这一新特性。1. 理解 Ray 与 TPU 集成的核心价值1.1 为什么需要 TPU 支持Google Cloud TPUTensor Processing Unit是专为机器学习工作负载设计的张量计算加速器。与通用 GPU 相比TPU 在矩阵乘法、卷积运算等典型 AI 计算任务上具有更高的计算密度和能效。尤其是在训练超大规模模型或运行批量推理时TPU 的 pod 模式允许将计算任务分布到数百个核心上实现近乎线性的扩展。然而TPU 的使用门槛一直较高。开发者需要手动配置 TPU 节点和客户端节点的网络连通性。处理多主机环境下的数据并行和模型并行逻辑。管理 TPU 资源的创建、释放和故障转移。Ray 的分布式任务调度框架天然适合解决这些问题。通过将 TPU 资源抽象为 Ray 集群中的一种设备资源Ray 可以自动将计算任务分发到 TPU 节点并处理节点间通信、容错和负载均衡。1.2 KubeRay 在多主机编排中的作用KubeRay 是 Ray 在 Kubernetes 上的官方操作器Operator负责管理 Ray 集群的生命周期。在 2.55 版本之前KubeRay 主要支持 CPU 和 GPU 资源调度。现在通过集成 GCP TPU 驱动和资源插件KubeRay 可以自动识别集群中的 TPU 资源类型和数量。根据 Ray 集群配置创建带有 TPU 标签的工作节点组。为 Ray 任务分配具体的 TPU 设备句柄。监控 TPU 节点健康状态并自动恢复。多主机切片Multi-host Slice是指一个计算任务需要跨多个物理主机上的 TPU 核心协同工作。KubeRay 通过协调多个 Ray 工作节点使它们能够作为一个逻辑上的 TPU pod 对外提供服务。2. 环境准备与依赖配置2.1 GCP 项目与权限准备在开始之前你需要一个启用了 TPU 服务的 GCP 项目。确保当前用户或服务账号具有以下权限tpu.admin创建和管理 TPU 节点。compute.admin管理计算实例和网络配置。kubernetes.admin创建和管理 GKE 集群。可以通过以下命令检查当前项目是否已启用必要服务gcloud services list --enabled --filtername:tpu.googleapis.com gcloud services list --enabled --filtername:container.googleapis.com如果未启用使用以下命令启用gcloud services enable tpu.googleapis.com gcloud services enable container.googleapis.com2.2 创建支持 TPU 的 GKE 集群TPU 资源需要特定的 GKE 版本和节点配置。以下命令创建一个带有 TPU 驱动支持的集群gcloud container clusters create ray-tpu-cluster \ --zoneus-central1-a \ --cluster-version1.28 \ --machine-typen1-standard-4 \ --num-nodes1 \ --enable-tpu \ --scopescloud-platform关键参数说明--zone必须选择支持 TPU 的区域如us-central1-a、europe-west4-a等。--cluster-versionGKE 版本需要与 TPU 驱动兼容1.28 是当前稳定版本。--enable-tpu启用 TPU 支持自动安装必要的驱动和插件。--scopescloud-platform授予节点访问其他 GCP 服务的权限。创建完成后配置 kubectl 连接到该集群gcloud container clusters get-credentials ray-tpu-cluster --zoneus-central1-a2.3 安装 KubeRay Operator使用 Helm 安装最新版本的 KubeRayhelm repo add kuberay https://ray-project.github.io/kuberay-helm/ helm repo update helm install kuberay-operator kuberay/kuberay-operator --namespace kuberay-system --create-namespace验证 Operator 是否正常运行kubectl get pods -n kuberay-system -l app.kubernetes.io/namekuberay-operator预期看到kuberay-operatorpod 状态为Running。3. 配置 Ray 集群支持 TPU 资源3.1 创建 Ray 集群配置文件创建一个名为ray-cluster-tpu.yaml的 Kubernetes 自定义资源文件定义带有 TPU 支持的 Ray 集群apiVersion: ray.io/v1alpha1 kind: RayCluster metadata: name: ray-tpu-cluster namespace: default spec: headGroupSpec: template: spec: containers: - name: ray-head image: rayproject/ray:2.55.0 ports: - containerPort: 6379 name: gcs - containerPort: 8265 name: dashboard - containerPort: 10001 name: client resources: requests: cpu: 1 memory: 2Gi limits: cpu: 2 memory: 4Gi env: - name: RAY_DISABLE_IMPORT_WARNING value: 1 workerGroupSpecs: - replicas: 1 minReplicas: 1 maxReplicas: 4 groupName: tpu-worker-group template: spec: containers: - name: ray-worker image: rayproject/ray:2.55.0 resources: requests: cpu: 4 memory: 16Gi google.com/tpu: 8 limits: cpu: 8 memory: 32Gi google.com/tpu: 8 env: - name: RAY_DISABLE_IMPORT_WARNING value: 1 rayStartParams: num-cpus: 8 num-tpus: 8关键配置说明workerGroupSpecs[].template.spec.containers[].resources通过google.com/tpu: 8请求 8 个 TPU 核心。rayStartParamsnum-tpus: 8告诉 Ray 每个工作节点有 8 个 TPU 设备可用。镜像版本必须为rayproject/ray:2.55.0或更高这是首个正式支持 TPU 的版本。3.2 部署 Ray 集群并验证 TPU 资源应用配置文件创建 Ray 集群kubectl apply -f ray-cluster-tpu.yaml等待所有 pod 进入 Running 状态kubectl get pods -l ray.io/clusterray-tpu-cluster检查 TPU 资源是否被正确识别kubectl describe node | grep -A5 -B5 google.com/tpu应该看到节点分配了 TPU 资源。进入 Ray 工作节点容器验证 TPU 设备# 获取 worker pod 名称 WORKER_POD$(kubectl get pods -l ray.io/node-typeworker -o name | head -1) # 进入容器执行验证命令 kubectl exec -it $WORKER_POD -- python -c import ray ray.init(auto) print(TPU resources available:, ray.available_resources().get(TPU, 0)) 预期输出显示可用的 TPU 资源数量为 8。4. 编写和运行 TPU 加速的 Ray 任务4.1 创建分布式训练示例下面是一个使用 Ray 和 TPU 进行数据并行训练的完整示例。创建一个名为tpu_training.py的文件import ray import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader, TensorDataset # 初始化 Ray自动连接集群 ray.init() # 定义简单的神经网络模型 class SimpleModel(nn.Module): def __init__(self): super(SimpleModel, self).__init__() self.linear1 nn.Linear(10, 50) self.relu nn.ReLU() self.linear2 nn.Linear(50, 1) def forward(self, x): x self.linear1(x) x self.relu(x) x self.linear2(x) return x # 远程函数在 TPU 设备上执行训练步骤 ray.remote(num_cpus1, num_tpus1) def train_on_tpu(worker_id, model_state, data_shard, num_epochs10): # 将模型移动到 TPU device torch.device(xla) model SimpleModel() model.load_state_dict(model_state) model.to(device) # 准备数据 dataset TensorDataset(data_shard) dataloader DataLoader(dataset, batch_size32, shuffleTrue) optimizer optim.Adam(model.parameters(), lr0.001) criterion nn.MSELoss() # 训练循环 for epoch in range(num_epochs): total_loss 0.0 for batch in dataloader: inputs batch[0].to(device) optimizer.zero_grad() outputs model(inputs) loss criterion(outputs, inputs.sum(keepdimTrue, dim1)) loss.backward() optimizer.step() total_loss loss.item() if epoch % 5 0: print(fWorker {worker_id}, Epoch {epoch}, Loss: {total_loss/len(dataloader):.4f}) # 返回更新后的模型参数 return model.cpu().state_dict() # 主训练函数 def distributed_training(): # 准备模拟数据 num_samples 1000 input_data torch.randn(num_samples, 10) # 将数据分片到不同 worker data_shards torch.chunk(input_data, chunks8, dim0) # 初始化模型 model SimpleModel() initial_state model.state_dict() # 在每个 TPU worker 上启动训练任务 futures [] for i in range(8): # 对应 8 个 TPU 核心 future train_on_tpu.remote(i, initial_state, data_shards[i]) futures.append(future) # 收集所有 worker 的训练结果 updated_states ray.get(futures) # 平均模型参数简化版的模型平均 averaged_state {} for key in initial_state.keys(): averaged_state[key] torch.stack([state[key] for state in updated_states]).mean(dim0) print(Distributed training completed) return averaged_state if __name__ __main__: final_model distributed_training() print(Training finished, model ready for use)4.2 在集群中运行训练任务将训练脚本复制到 Ray 集群中执行# 获取 head pod 名称 HEAD_POD$(kubectl get pods -l ray.io/node-typehead -o name) # 复制脚本到 head 节点 kubectl cp tpu_training.py $HEAD_POD:/tmp/ # 在 head 节点中执行训练 kubectl exec -it $HEAD_POD -- python /tmp/tpu_training.py4.3 验证 TPU 使用情况在执行过程中可以监控 TPU 资源的使用情况# 查看 Ray 集群资源状态 kubectl exec -it $HEAD_POD -- python -c import ray ray.init(auto) print(Cluster resources:, ray.available_resources()) # 查看 TPU 设备活动 kubectl exec -it $WORKER_POD -- python -c import torch_xla.core.xla_model as xm devices xm.get_xla_supported_devices() print(Available XLA devices:, devices) 5. 多主机切片配置与高级用法5.1 配置跨主机的 TPU Pod当需要超过单个主机支持的 TPU 核心数时可以配置多主机 TPU pod。修改 Ray 集群配置workerGroupSpecs: - replicas: 2 # 两个工作节点 groupName: tpu-pod-group template: spec: nodeSelector: cloud.google.com/gke-tpu-accelerator: v3-8 # 指定 TPU 类型 containers: - name: ray-worker image: rayproject/ray:2.55.0 resources: requests: cpu: 8 memory: 32Gi google.com/tpu: 8 limits: cpu: 16 memory: 64Gi google.com/tpu: 8 rayStartParams: num-cpus: 8 num-tpus: 8 block: true # 等待所有节点就绪这种配置下KubeRay 会创建两个工作节点每个节点拥有 8 个 TPU 核心共同组成一个 16 核心的 TPU pod。5.2 使用 Ray Train 进行高级分布式训练对于生产级训练任务建议使用 Ray Train 抽象层。以下示例展示如何结合 TPU 使用 Ray Trainfrom ray.train import ScalingConfig from ray.train.torch import TorchTrainer import torch.optim as optim def train_loop(config): # 自动处理设备分配 from ray.train.torch import get_device device get_device() model config[model] dataset config[dataset] model.to(device) optimizer optim.Adam(model.parameters(), lr0.001) # 训练逻辑 for epoch in range(config[epochs]): for batch in dataset: inputs, targets batch inputs, targets inputs.to(device), targets.to(device) optimizer.zero_grad() outputs model(inputs) loss torch.nn.functional.mse_loss(outputs, targets) loss.backward() optimizer.step() # 报告指标 from ray.train import report report({loss: loss.item(), epoch: epoch}) # 配置分布式训练 scaling_config ScalingConfig( num_workers2, # 两个工作节点 use_gpuFalse, resources_per_worker{TPU: 4} # 每个 worker 使用 4 个 TPU 核心 ) trainer TorchTrainer( train_loop, scaling_configscaling_config, train_loop_config{ model: SimpleModel(), dataset: train_dataset, epochs: 100 } ) result trainer.fit()6. 常见问题排查与性能优化6.1 TPU 资源分配失败现象Ray 任务一直处于 pending 状态日志显示 TPU 资源不可用。排查步骤检查节点 TPU 资源状态kubectl describe node | grep -A10 Capacity验证 TPU 驱动是否正常加载kubectl exec -it $WORKER_POD -- ls /dev/accel*检查 Ray 集群资源发现kubectl exec -it $HEAD_POD -- python -c import ray ray.init(auto) print(Resources:, ray.cluster_resources()) 解决方案确认 GKE 集群创建时指定了--enable-tpu。检查 TPU 配额是否充足gcloud compute regions describe us-central1 --formatvalue(quotas)。验证 Ray 工作节点配置中的google.com/tpu请求值是否超过节点容量。6.2 多主机通信超时现象跨节点的 Ray 任务通信失败出现RayTimeoutError。排查步骤检查节点网络连通性kubectl get pods -l ray.io/node-typeworker -o wide验证防火墙规则gcloud compute firewall-rules list --filtername~gke-ray-tpu-cluster检查 Ray 日志中的网络错误kubectl logs $WORKER_POD | grep -i timeout\|connection解决方案确保所有工作节点在同一个网络子网内。配置正确的防火墙规则允许 Ray 节点间通信端口 6379、10001-10020 等。增加 Ray 超时配置ray.init(auto, _redis_passwordxxx, _node_ip_addressxxx)。6.3 TPU 性能调优建议低效使用模式频繁在 CPU 和 TPU 之间移动数据。使用不适合 TPU 架构的小批量大小。未充分利用 TPU 的矩阵计算特性。优化建议数据批量优化# 不推荐批量大小过小 dataloader DataLoader(dataset, batch_size8) # 推荐使用适合 TPU 的批量大小128 dataloader DataLoader(dataset, batch_size128)设备驻留优化# 不推荐频繁设备切换 for batch in dataloader: inputs batch[0].to(xla) # 每次迭代都移动数据 # ...训练逻辑... results results.cpu() # 移回 CPU # 推荐保持数据在 TPU 上 inputs inputs.to(xla) for batch in dataloader: # 直接在 TPU 上处理 # ...训练逻辑...使用 XLA 优化编译import torch_xla.core.xla_model as xm # 在训练循环中启用 XLA 图编译 for epoch in range(epochs): for batch in dataloader: # ...前向传播、损失计算、反向传播... xm.optimizer_step(optimizer) # XLA 优化的参数更新 xm.mark_step() # 插入编译边界7. 生产环境最佳实践7.1 资源管理与成本控制TPU 资源成本较高需要精细化管理资源请求策略resources: requests: google.com/tpu: 4 # 按实际需求申请不要过度配置 limits: google.com/tpu: 4自动扩缩容配置autoscaling: minReplicas: 1 maxReplicas: 8 metrics: - type: Resource resource: name: google.com/tpu target: type: Utilization averageUtilization: 707.2 监控与日志收集建立完整的监控体系Prometheus 监控配置apiVersion: v1 kind: ConfigMap metadata: name: ray-monitoring-config data: prometheus.yml: | global: scrape_interval: 15s scrape_configs: - job_name: ray-tpu static_configs: - targets: [ray-dashboard:8265]日志收集示例# 查看 TPU 相关日志 kubectl logs -f $WORKER_POD | grep -i tpu # 监控资源使用情况 kubectl top pod -l ray.io/node-typeworker7.3 安全与权限管理最小权限原则为 Ray 服务账号分配精确的权限范围。使用 Kubernetes RBAC 限制 pod 权限。隔离生产环境和开发环境集群。网络安全配置networkPolicy: ingress: - from: - podSelector: matchLabels: ray.io/cluster: ray-tpu-cluster ports: - protocol: TCP port: 6379 - protocol: TCP port: 10001-10020Ray 2.55 对 Google Cloud TPU 的正式支持结合 KubeRay 的自动编排能力显著简化了多主机 TPU 集群的管理复杂度。在实际项目中建议从单节点 TPU 任务开始验证基础功能再逐步扩展到多主机切片场景。重点关注资源配额管理、网络配置和性能调优确保 TPU 资源得到高效利用。对于需要长期运行的生产任务建立完善的监控、告警和成本控制机制至关重要。

相关新闻

技术工具评估指南:从部署到性能的全面评测方法

技术工具评估指南:从部署到性能的全面评测方法

今天来看一个很有意思的项目——"这笔好用吗!"。这个标题看似简单,但背后涉及的是对工具、设备或软件实用性的深度评测。在技术领域,我们经常需要评估各种工具的实际表现,无论是硬件设备、开发工具还是AI模型&#xff0…

2026/10/15 20:29:00 阅读更多 →
大语言模型长文本处理的分段提示技术实践

大语言模型长文本处理的分段提示技术实践

1. 长文本处理的挑战与分段提示的必要性在处理大语言模型(LLM)应用时,我们经常会遇到一个典型问题:当输入文本超过模型的最大上下文窗口限制时,模型的表现会急剧下降。以GPT-3.5为例,其上下文窗口约为4k tokens,而GPT-…

2026/10/15 21:20:46 阅读更多 →
AI生成文本检测技术解析:从学术诚信到实践应用

AI生成文本检测技术解析:从学术诚信到实践应用

最近在学术圈和AI领域有个热议话题:ArXiv上超过30%的新投稿被检测出具有AI撰写的文本特征。这个现象不仅反映了AI写作工具的普及程度,更引发了关于学术诚信、论文质量评估和科研规范的重要讨论。本文将深入分析这一现象的技术背景、检测原理、影响范围以…

2026/10/15 21:21:14 阅读更多 →

最新新闻

YOLOv10【第十一章:生成式 AI 与自动标注篇·第1节】生成式 AI 如何赋能 YOLOv10:数据、标签、推理三条路线

YOLOv10【第十一章:生成式 AI 与自动标注篇·第1节】生成式 AI 如何赋能 YOLOv10:数据、标签、推理三条路线

🏆 本文收录于 《YOLOv10实战:从入门到深度优化》 专栏。 该专栏系统复现并深度梳理全网主流 YOLOv10 改进方法与工程实战案例,覆盖分类、目标检测、实例分割、多目标追踪、关键点检测、旋转目标检测等多个方向,坚持 持续更新 + 深度解析 + 工程验证。 专栏将围绕 YOLOv10…

2026/10/15 21:21:31 阅读更多 →
小尺寸宿舍屏推荐:24 英寸高刷屏为何成了宿舍刚需

小尺寸宿舍屏推荐:24 英寸高刷屏为何成了宿舍刚需

近两年宿舍桌面的变化很明显。一方面,越来越多学生在有限的空间里搭起了完整的主机加外设桌面;另一方面,游戏本性能不断上探,屏幕反倒成了整套配置里最容易被将就的一环。笔记本自带屏幕处理文档尚可,一旦进入 FPS 或 …

2026/10/15 21:21:31 阅读更多 →
2020软件工程试卷解析:题型分布、答题技巧与避坑指南

2020软件工程试卷解析:题型分布、答题技巧与避坑指南

简介:合肥工业大学2020年软件工程试卷(A卷)是计算机与信息学院软件工程课程的期末真题,适合计算机专业学生、考研复习者及软件工程自学者用于考前自测与考点梳理。资源压缩包共1个docx文档,大小仅25KB,内容…

2026/10/15 21:21:31 阅读更多 →
10 分钟上手 BeefTV:从安装到生成第一个 AI 视频的完整指南

10 分钟上手 BeefTV:从安装到生成第一个 AI 视频的完整指南

人工智能AI 应用AI Agent媒体生成音视频桌面应用 【免费下载链接】BeefTV High-performance Lightweight AI Native Video workspace. 面向 AI 时代的视频创作工作台。 在画布中,和Agent一起自由连接创意、模型与素材。 项目地址: https://gitcode.com…

2026/10/15 21:21:30 阅读更多 →
无犯罪证明NAATI翻译去哪办?有效期多久?移民速看

无犯罪证明NAATI翻译去哪办?有效期多久?移民速看

技术移民、打工度假、留学签证常被要求提供无犯罪记录证明的英文译本,这份材料有个特殊点:底层文件本身有时效,通常要求出具后3—12个月内的版本,翻译环节拖久了,证明可能先过期。无犯罪证明NAATI认证翻译可在线办理&a…

2026/10/15 21:20:30 阅读更多 →
YOLOv10【第十一章:生成式 AI 与自动标注篇·第4节】YOLO-World 开放词汇检测与 YOLOv10 数据冷启动

YOLOv10【第十一章:生成式 AI 与自动标注篇·第4节】YOLO-World 开放词汇检测与 YOLOv10 数据冷启动

🏆 本文收录于 《YOLOv10实战:从入门到深度优化》 专栏。 该专栏系统复现并深度梳理全网主流 YOLOv10 改进方法与工程实战案例,覆盖分类、目标检测、实例分割、多目标追踪、关键点检测、旋转目标检测等多个方向,坚持 持续更新 + 深度解析 + 工程验证。 专栏将围绕 YOLOv10…

2026/10/15 21:20:30 阅读更多 →

日新闻

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