十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

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

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 BucketHF 上的 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。前置条件安装带 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]。Hugging Face 账号与 token执行hf auth login完成登录。SkyPilot 会把 token 转发到云 VM 上Bucket 挂载无需额外配置即可完成鉴权——这是下文token 自动注入机制的体现。接受模型条款在 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_USERyou --secret HF_TOKENSkyPilot 会在你启用的所有云中挑选当前最便宜的可用 GPU。想固定云厂商时使用--infra参数指定即可--infra lambda、--infra aws、--infra k8s——注意 YAML 本身完全不需要改动。VM 上发生的事情依次是两个 Bucket 通过 hf-mountFUSE 后端挂载到/input与/outputuv安装脚本锁定的依赖并下载模型每个/input/*.mp3转写为/output/*.txt。写入直接落到 Hub 上——在另一个标签页打开转写 Bucket可以看到文件实时出现。实测数据Lambda 1× A10十集共 295 分钟音频1.7 分钟内完成转写约合 173× 实时从sky launch到Job finished的整体墙钟时间约 4 分钟包含资源供给、依赖安装与 2B 模型下载。收尾命令sky down transcribe # 销毁集群转写稿已经全部在 Hub 上 hf buckets ls you/skypilot-tutorial-transcriptssky down只是拆除 VM两个 Bucket 及其中的转写结果与数据都不受影响这正是存储与计算解耦带来的操作安全。深入拆解 transcribe.yamlHF 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.12torch 的 wheel 包会滞后于新版 CPython不要让 uv 挑最新版本。 UV_TORCH_BACKENDauto 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: hf与mode: 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_TOKENSkyPilot 的--secret机制会把本机环境变量中的HF_TOKEN安全地设置到集群上的对应环境变量sky/client/cli/flags.py 中定义了该参数。在 VM 内部token 会被写入标准位置~/.cache/huggingface/token见 sky/adaptors/huggingface.py 的HF_TOKEN_PATHhf-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-mount与hf-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),仅供参考
返回列表