news 2026/9/16 17:31:59

SkyPilot 批量音频转写实战:用 Hugging Face Bucket 作为跨云统一存储层

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SkyPilot 批量音频转写实战:用 Hugging Face Bucket 作为跨云统一存储层

SkyPilot 批量音频转写实战:用 Hugging Face Bucket 作为跨云统一存储层

【免费下载链接】skypilotThe AI Compute Platform for frontier teams. SkyPilot turns fragmented AI compute into one AI supercomputer, so frontier AI teams build custom intelligence faster.项目地址: https://gitcode.com/GitHub_Trending/sk/skypilot

本文是一份以 examples/hf-storage-transcription/README.md 为核心的技术实战指南,介绍如何用 SkyPilot 在任意云上批量转写一个目录下的音频文件,并将输入音频与输出转写稿全部存放在 Hugging Face Bucket(HF 上的 S3 风格对象存储)中。读完本文,你将掌握hf://buckets/...这类存储源的挂载方式、transcribe.yaml的完整配置、跨云零改动的运行技巧,以及 HF Bucket 在 SkyPilot 底层的挂载实现原理,可直接复制该方案落地自己的批量推理任务。

背景:为什么用 Hugging Face Bucket 做批量任务的存储

Hugging Face Bucket 是 Hub 上提供的 S3 风格对象存储:可变、无版本、可从任意机器挂载为文件系统。与 model/dataset 仓库不同,Bucket 定位为"工作存储"(working storage)——存放输入、输出和中间数据,而不是最终产物。在批量音频转写场景中,这一特性天然契合:

  • 输入与输出分离:音频从一个 Bucket 读入,转写稿写入另一个 Bucket,任务完成后结果已经在 Hub 上,无需回传;
  • 与 GPU 解耦:音频和转写稿都不在虚拟机本地,VM 可以随时销毁而数据不丢失;
  • 云厂商无关:同一个脚本、同一个 Bucket 对,可以不加任何改动地在 Hugging Face Jobs、SkyPilot on Lambda、SkyPilot on AWS 上运行。

本示例的数据流如下:

hf://buckets/<you>/skypilot-tutorial-audio │ 挂载为 /input ▼ GPU on any cloud (transcribe.yaml) │ 写入 /output ▼ hf://buckets/<you>/skypilot-tutorial-transcripts

转写模型选用较小的语音转文字模型(Cohere Transcribe 2B),转写脚本来自 Hub 上的 uv-scripts 仓库,因此本示例真正需要读者阅读的"新东西"只有存储层的配置,即示例目录下的 transcribe.yaml。

前置条件

  1. 安装带 Hugging Face extra 的 SkyPilot,并启用至少一个云:

    uv tool install --with pip "skypilot[huggingface,lambda]" # 或 aws, gcp, ... sky check

    其中--with pip用于引入 pip 安装路径的额外依赖,[huggingface,lambda]表示安装 HF 存储支持与 Lambda 云适配;如需在 AWS/GCP/K8s 上运行,替换 extra 即可(如[huggingface,aws])。

  2. Hugging Face 账号与 token:执行hf auth login完成登录。SkyPilot 会把 token 转发到云 VM 上,Bucket 挂载无需额外配置即可完成鉴权——这是下文"token 自动注入"机制的体现。

  3. 接受模型条款:在 Cohere Transcribe 模型页面上接受一次(自动批准的)使用条款。

注意:挂载环境要求:FUSE 挂载需要 VM 具备/dev/fuse且 glibc ≥ 2.34——裸机云(bare-VM)通常满足;在 Kubernetes 上需要设置更新的image_id(例如docker:mirror.gcr.io/ubuntu:22.04)。纯容器类云(如 RunPod)不支持 SkyPilot 中的对象存储挂载。相关细节可进一步参考仓库中的存储参考文档与 HF 官方集成页面。

Step 1:创建 Bucket 并放入音频

先创建两个 Bucket,再把音频灌入输入 Bucket。可以直接从本地复制:

hf buckets create skypilot-tutorial-audio hf buckets create skypilot-tutorial-transcripts hf buckets cp ./my-audio/ hf://buckets/<you>/skypilot-tutorial-audio/

如果想立刻体验,可以用 Hugging Face Jobs 上的一个 CPU 任务,从 Internet Archive 拉取公共领域广播剧的十集音频——该任务里 Bucket 同样以-v参数挂载:

hf jobs uv run -v hf://buckets/<you>/skypilot-tutorial-audio:/output \ https://huggingface.co/datasets/uv-scripts/transcription/raw/main/download-ia.py \ SUSPENSE /output --max-files 10

注意这里-v的语义是"把本地路径挂载进 Job"的通用参数,此处源路径换成hf://URI,就等价于在 Hugging Face Jobs 中挂载了同一个 Bucket。

Step 2:在任意云上的 GPU 上转写

export HF_TOKEN=$(hf auth whoami --token) # 或直接粘贴你的 token sky launch -c transcribe transcribe.yaml --env HF_USER=<you> --secret HF_TOKEN

SkyPilot 会在你启用的所有云中挑选当前最便宜的可用 GPU。想固定云厂商时,使用--infra参数指定即可:--infra lambda--infra aws--infra k8s——注意 YAML 本身完全不需要改动。

VM 上发生的事情依次是:

  1. 两个 Bucket 通过 hf-mount(FUSE 后端)挂载到/input/output
  2. uv安装脚本锁定的依赖并下载模型;
  3. 每个/input/*.mp3转写为/output/*.txt。写入直接落到 Hub 上——在另一个标签页打开转写 Bucket,可以看到文件实时出现。

实测数据(Lambda 1× A10):十集共 295 分钟音频,1.7 分钟内完成转写,约合 173× 实时;从sky launchJob finished的整体墙钟时间约 4 分钟,包含资源供给、依赖安装与 2B 模型下载。

收尾命令:

sky down transcribe # 销毁集群;转写稿已经全部在 Hub 上 hf buckets ls <you>/skypilot-tutorial-transcripts

sky down只是拆除 VM,两个 Bucket 及其中的转写结果与数据都不受影响,这正是"存储与计算解耦"带来的操作安全。

深入拆解 transcribe.yaml:HF Bucket 挂载的完整配置

示例目录下的 transcribe.yaml 是全文核心,逐段拆解如下:

name: hf-storage-transcription resources: accelerators: {A10:1, L4:1, A100:1} # 任意单张 24GB+ GPU envs: HF_USER: # 你的 HF 用户名或组织(两个 Bucket 的属主) LANGUAGE: en # en, de, fr, it, es, pt, el, nl, pl, ar, vi, zh, ja, ko secrets: HF_TOKEN: # 用 `--secret HF_TOKEN` 传入;模型有门禁(自动批准) file_mounts: # 音频输入:之前填好的 Bucket(见 README)。以读写方式挂载,实际只读使用。 /input: source: hf://buckets/${HF_USER}/skypilot-tutorial-audio store: hf mode: MOUNT # 转写输出:脚本写出的每个 .txt 都会实时落到 Hub 上。 /output: source: hf://buckets/${HF_USER}/skypilot-tutorial-transcripts store: hf mode: MOUNT setup: | curl -LsSf https://astral.sh/uv/install.sh | sh run: | set -euo pipefail export PATH="$HOME/.local/bin:$PATH" # 脚本是托管在 Hub 上的自包含 uv 脚本(PEP 723); # uv 在首次运行时解析其依赖。固定到某个 revision。 # --python 3.12:torch 的 wheel 包会滞后于新版 CPython;不要让 uv 挑最新版本。 UV_TORCH_BACKEND=auto uv run --python 3.12 \ https://huggingface.co/datasets/uv-scripts/transcription/resolve/caa60d95d008741a5fb0a8b33a22eed6fbf1165a/cohere-transcribe.py \ /input /output --language ${LANGUAGE} echo "Done. Transcripts: https://huggingface.co/buckets/${HF_USER}/skypilot-tutorial-transcripts"

几个值得展开的配置点:

  • source: hf://buckets/<namespace>/<bucket-name>:这是 HF Bucket 的标准 URI 形式。从仓库源码看,sky/adaptors/huggingface.py 定义了HF_URL_PREFIX = 'hf://'HF_BUCKETS_URL_PREFIX = 'hf://buckets/';而 sky/data/data_utils.py 中的split_hf_path会把该 URI 解析为(bucket_id, sub_path),其中bucket_id<namespace>/<bucket-name>。也就是说 Bucket 的名称空间实际上属于某个用户或组织,HF_USER变量即用于填充这一属主。

  • store: hfmode: MOUNTstore指定存储后端类型为 Hugging Face。在 sky/data/storage.py 中可以看到'hf': HFCloudStorage()被注册进StoreType的映射表;mode: MOUNT则代表以 FUSE 挂载方式把对象存储映射为本地目录,而非 COPY 模式那样启动时全量同步。同样在_validate_source中,hf://是唯一被豁免"只能挂载目录根"限制的 scheme——因为 hf-mount 本身支持挂载 Bucket 或仓库内的子路径(见 sky/data/storage.py 的注释)。

  • secrets: HF_TOKEN--secret HF_TOKEN:SkyPilot 的--secret机制会把本机环境变量中的HF_TOKEN安全地设置到集群上的对应环境变量(sky/client/cli/flags.py 中定义了该参数)。在 VM 内部,token 会被写入标准位置~/.cache/huggingface/token(见 sky/adaptors/huggingface.py 的HF_TOKEN_PATH),hf-mount 与huggingface_hubSDK 都能直接读到,因此模型下载与 Bucket 挂载都无需再手动配置凭证。

  • resources.accelerators--infra的关系:YAML 只声明"需要任意单张 24GB+ GPU",具体落到哪朵云由 SkyPilot 的优化器在启动时按价格与可用性决策;--infra lambda/aws/k8s只是把候选云锁定到一个,配置与脚本保持一致。

源码视角:HF 存储挂载的底层实现

理解挂载原理能帮助你判断在哪些环境下可以放心使用该方案。相关实现集中在 sky/data/mounting_utils.py:

  • 挂载工具是 hf-mount:仓库以HF_MOUNT_VERSION = 'v0.6.5'HF_MOUNT_REPO = 'huggingface/hf-mount'固定版本(sky/data/mounting_utils.py)。get_hf_mount_install_cmd()会下载hf-mounthf-mount-fuse两个二进制并安装,同时借助已有的FUSE3_INSTALL_CMD在缺失 fuse3 的主机上通过 apt/yum 补装(源码注释明确写道:hf-mount 的 FUSE 后端依赖提供fusermount3的 libfuse3)。

  • 默认走 FUSE 后端而非 NFSget_hf_mount_cmd()生成的命令为hf-mount start --fuse ...(sky/data/mounting_utils.py)。hf-mount 本身默认使用 NFS 后端,但 NFS 后端要求宿主内核支持 NFS 客户端,因此 SkyPilot 显式选择 FUSE 后端以获得更一致的跨云行为;这也解释了 README 中"需要/dev/fuse且 glibc ≥ 2.34"的环境约束来源。

  • 只读/可写语义:对 Bucket 挂载,读写属性按挂载点用途区分;对仓库(repo)挂载则恒为只读,无需额外标志(sky/data/mounting_utils.py 的注释)。本示例中/input虽以读写方式挂载但实际只读使用,/output的写入会实时同步到 Hub。

  • 启动流程hf-mount start会分离到后台守护进程,日志写入~/.hf-mount/logs/,PID 记录在~/.hf-mount/pids/;SkyPilot 在挂载命令中显式传入--token-file指向标准 token 路径,保证守护进程与huggingface_hub共享同一份凭证。

Going further:从单机批量到生产级流水线

README 末尾给出了两条扩展路径,这里结合仓库补充落地建议:

  • 托管任务(Managed job):将sky launch换成sky jobs launch transcribe.yaml ...,同一任务即可获得自动恢复能力——当 VM 被抢占或丢失时,SkyPilot 会重新拉起并重跑。由于已写入 Bucket 的转写稿在 VM 之外,数据不会丢失;恢复后的任务会从头重跑脚本(因此脚本本身需具备幂等性,例如对已存在的输出文件跳过或覆盖)。托管任务的入口实现可参考 sky/jobs 目录下的控制器代码。

  • 更大规模与并行

    • 每个集合或每种语言使用一对 Bucket,修改两个挂载点后重新 launch;
    • 要把单个 Bucket 的负载分散到多张 GPU,可给脚本增加一个分片(shard)参数,配合 examples/pools_batch_inference/ 中的 SkyPilot Pools 使用——每个 worker 挂载同样的两个 Bucket,各处理一个分片,输出全部汇集到同一个转写 Bucket 中。

小结

通过本示例可以看到,SkyPilot 把"云上对象存储"抽象成了统一的file_mounts配置:本地目录、S3/GCS、乃至 HF Bucket 在任务描述中具有完全一致的写法。HF Bucket 作为工作存储层的加入,让"输入放一个 Bucket、输出写进另一个 Bucket、GPU 随便挑最便宜的云"成为一行 YAML 就能表达的工程实践。这套模式不仅适用于音频转写,也适用于一切"读一批、算一批、写一批"的批量推理与数据加工任务。

【免费下载链接】skypilotThe AI Compute Platform for frontier teams. SkyPilot turns fragmented AI compute into one AI supercomputer, so frontier AI teams build custom intelligence faster.项目地址: https://gitcode.com/GitHub_Trending/sk/skypilot

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 17:30:21

书霸AI官网www.shubaai.com,公众号搜一搜书霸AI写作

一份开题报告&#xff0c;像是论文正式写作前的“施工图”。题目是否清楚、研究问题是否具体、方法是否可行&#xff0c;都会影响后续论文能否顺利展开。截图中的书霸AI开题报告功能&#xff0c;重点解决的正是前期构思难、结构乱、资料不会组织等问题。使用时&#xff0c;可以…

作者头像 李华
网站建设 2026/9/16 17:28:32

MATLAB滑动窗口S值计算在声发射信号分析中的应用

1. 项目背景与核心价值声发射信号分析在工业无损检测、结构健康监测等领域有着广泛应用。传统分析方法往往采用固定时间窗口&#xff0c;难以捕捉信号中的瞬态特征。滑动窗口技术通过动态分割信号&#xff0c;能够更精准地定位异常事件并提取特征参数。其中S值&#xff08;Sign…

作者头像 李华
网站建设 2026/9/16 17:28:23

STM32H743固件加密:C#上位机与AES-GCM实现详解

简介&#xff1a;一套基于STM32H743单片机生成AES加密固件的上位机软件源码包&#xff0c;面向嵌入式开发者与安全固件研究人员&#xff0c;解决固件加密传输、密钥管理及在线升级等需求。压缩包共808个文件&#xff0c;约20.24MB&#xff0c;涵盖C/C源码&#xff08;.h/.c&…

作者头像 李华