PyTorch Blog

Evolution of the PyTorch Media Processing Landscape

6.9内容质量
Evolution of the PyTorch Media Processing Landscape

TL;DR · AI 摘要

Evolution of the PyTorch Media Processing Landscape – PyTorch Featured projects TL;DR If you need to decode or encode me...

核心要点

  • 主题聚焦:Evolution of the PyTorch Media Processing Landsc
  • 来源:PyTorch Blog,建议结合原文判断细节。
  • AI 分析暂不可用,本条为保底评分与摘要。
#AI#编程#后端#产品#开源
打开原文

PyTorch 媒体处理技术演进 – PyTorch

特色项目

TL;DR

如果需要解码或编码媒体(包括图像、视频或音频),请使用 TorchCodec。如果需要转换媒体,请使用 TorchVision 处理图像和视频,使用 TorchAudio 处理音频。其他原本存在于这些库中的内容(模型、数据集等)现在由更广泛的生态系统提供更好支持,例如 HuggingFace 库。

如今,图像、视频和音频在许多模型开发中处于核心地位,从视觉语言模型到生成图像和视频的扩散模型。训练这些模型需要将媒体解码为张量并进行转换,生成模型则需要将输出重新编码为媒体文件。过去两年间,我们已将 PyTorch 的媒体处理栈整合到三个库中:TorchCodec、TorchVision 和 TorchAudio。本文将说明当前进展及其背后的原因。

过去与现在

TorchCodec:统一的解码与编码入口

几年前,媒体解码和编码功能分散在 TorchVision 和 TorchAudio 中,各自构建独立的实现栈。TorchVision 有多个入口点(io.read_video() 和 io.VideoReader()),分布在三个后端:Python 的 PyAV、C++ 的 FFmpeg 后端以及 CUDA/NVCUVID 后端。仅 PyAV 后端提供开箱即用支持,另外两个后端需要从源码构建且依赖特定 FFmpeg 版本。TorchAudio 提供了视频和音频的 StreamReader/StreamWriter,以及基于不同后端(FFmpeg、libsoundfile、libsox)的额外音频解码工具。图像解码功能则位于 TorchVision 中。

对此,我们已将所有媒体解码和编码功能统一到 TorchCodec 中,支持图像、视频和音频在 CPU 和 CUDA 上的处理。原本存在于 TorchVision 或 TorchAudio 中的 API 已被弃用或移除。我们这么做有三个原因:

为用户提供统一入口 所有媒体 I/O 功能集中于 TorchCodec 后,用户无需再判断哪个库提供所需解码器,也无需面对碎片化的独立 API,而是获得一个整体设计的库。

性能优化 集中式开发使优化工作聚焦于单一库而非分散到多个实现中。过去不同实现间难以判断哪些值得优化,现在 TorchCodec 的任何性能提升都会惠及所有用户。与之前 TorchVision 和 TorchAudio 的实现相比,TorchCodec 在 CUDA 视频解码等场景下通常表现更优。

维护与依赖管理 媒体 I/O 涉及大量依赖项:六个主要 FFmpeg 版本(写作时为 4 至 9)、NVIDIA GPU 解码编解码器 SDK,以及每个图像格式对应的库(libjpeg、libpng 等),每个都有独立的许可协议。更复杂的是这些依赖都不是纯 Python 实现,而是 C/C++ 库,这使构建、CI 和发布流程复杂度大幅增加。现在所有这些复杂性都集中到 TorchCodec 中,极大减轻了 TorchVision 和 TorchAudio 的维护负担。

TorchVision 和 TorchAudio:聚焦媒体转换

...(译文继续)

TorchVision 和 TorchAudio 支持广泛的产品功能,涵盖模型、数据集、流水线、转换操作以及 I/O 操作。如今,这两个库的重心都集中在各自最擅长的领域:转换操作。其余功能已不再积极开发。

这一调整的核心原因是观察到 TorchVision 和 TorchAudio 的转换操作是社区中最活跃的使用场景。相比之下,模型、数据集和流水线的使用率增长缓慢,因为出现了许多优秀的替代方案,例如 HuggingFace 库。缩小 TorchAudio 和 TorchVision 的功能范围,使我们能够集中精力强化其核心优势,以及生态体系中其他部分尚未覆盖的领域。

这次转型对 TorchAudio 来说尤其具有破坏性:许多 API 被弃用并最终移除。我们感谢社区的耐心和反馈,这使我们重新考虑了最初的计划。最初计划移除的几个热门 API 最终得以保留。这次迁移过程充满挑战,但我们认为这是值得的。一个规模更小的 TorchAudio 才能真正被维护,因此用户可以继续依赖它。

它们如何协同工作

实际上,这种拆分非常简单:TorchCodec 将媒体文件或编码字节转换为张量(解码),再将张量转换回媒体文件(编码)。TorchVision 和 TorchAudio 则负责处理中间的张量转换。

对于视频,使用 TorchCodec 的 VideoDecoder 和 TorchVision 的 v2 转换操作:

python
import torch
from torchcodec.decoders import VideoDecoder
from torchvision.transforms import v2

clip = VideoDecoder("video.mp4")[10:20]   # FrameBatch, uint8, (10, C, H, W)

transform = v2.Compose([
    v2.RandomResizedCrop(224),
    v2.ToDtype(torch.float32, scale=True),
])
batch = transform(clip.data)

对于音频,使用 TorchCodec 的 AudioDecoder 和 TorchAudio 的转换操作:

python
from torchcodec.decoders import AudioDecoder
from torchaudio.transforms import MelSpectrogram

samples = AudioDecoder("audio.mp3").get_all_samples()   # AudioSamples

mel = MelSpectrogram(sample_rate=samples.sample_rate)(samples.data)

图像的处理方式相同:decode_image 及相关函数会返回普通张量,直接输入到 torchvision.transforms.v2 中。编码则通过 VideoEncoder、AudioEncoder、JpegEncoder 和 PngEncoder 实现。

就版本发布而言,这三个库现在都实现了 ABI 稳定性。这意味着特定版本的 TorchCodec、TorchVision 或 TorchAudio 不再绑定到单一 PyTorch 版本:它们可以继续与后续的 PyTorch 版本兼容。它们不再需要为每个 PyTorch 版本重新构建,因此发布节奏不再与 PyTorch 同步。这是预期的结果!

如果你仍在使用 TorchVision 或 TorchAudio 中的解码或编码 API,现在是转向 TorchCodec 的好时机:从我们的迁移指南开始,如果发现缺少所需功能,请在 GitHub 上告知我们。

关于媒体处理库还有更多内容需要说明,我们将在后续文章中详细阐述:每个库的新特性,以及如何充分发挥完整解码和转换流水线的性能。敬请期待!

/post-content

/inner-wrap