From 5937eac736fdb1bf7516fbd47f0bdc85bf30db9f Mon Sep 17 00:00:00 2001 From: Scott Schneider Date: Tue, 5 Nov 2024 13:07:37 -0800 Subject: [PATCH 1/3] More benchmark refactoring --- benchmarks/decoders/benchmark_decoders.py | 93 ++++++----- .../decoders/benchmark_decoders_library.py | 128 +++++++------- .../decoders/benchmark_readme_chart.png | Bin 51324 -> 53163 bytes .../decoders/benchmark_readme_data.json | 158 +++++++++++------- benchmarks/decoders/generate_readme_data.py | 2 + 5 files changed, 214 insertions(+), 167 deletions(-) diff --git a/benchmarks/decoders/benchmark_decoders.py b/benchmarks/decoders/benchmark_decoders.py index 3924df450..eeac1cd3d 100644 --- a/benchmarks/decoders/benchmark_decoders.py +++ b/benchmarks/decoders/benchmark_decoders.py @@ -7,20 +7,42 @@ import argparse import importlib.resources import os +import typing from pathlib import Path +from dataclasses import dataclass, field from benchmark_decoders_library import ( - DecordNonBatchDecoderAccurateSeek, + AbstractDecoder, + DecordAccurate, + DecordAccurateBatch, plot_data, run_benchmarks, TorchAudioDecoder, TorchCodecCore, TorchCodecCoreBatch, + TorchCodecCoreNonBatch, TorchCodecCoreCompiled, TorchCodecPublic, TorchVision, ) +@dataclass +class DecoderKind: + display_name: str + kind: typing.Type[AbstractDecoder] + default_options: dict = field(default_factory=dict) + +decoder_registry = { + "decord": DecoderKind("DecordAccurate", DecordAccurate), + "decord_batch": DecoderKind("DecordAccurateBatch", DecordAccurateBatch), + "torchcodec_core": DecoderKind("TorchCodecCore:", TorchCodecCore), + "torchcodec_core_batch": DecoderKind("TorchCodecCoreBatch", TorchCodecCoreBatch), + "torchcodec_core_nonbatch": DecoderKind("TorchCodecCoreNonBatch", TorchCodecCoreNonBatch), + "torchcodec_core_compiled": DecoderKind("TorchCodecCoreCompiled", TorchCodecCoreCompiled), + "torchcodec_public": DecoderKind("TorchCodecPublic", TorchCodecPublic), + "torchvision": DecoderKind("TorchVision[backend=video_reader]", TorchVision, {"backend": "video_reader"}), + "torchaudio": DecoderKind("TorchAudio", TorchAudioDecoder), +} def in_fbcode() -> bool: return "FB_PAR_RUNTIME_FILES" in os.environ @@ -67,11 +89,18 @@ def main() -> None: "--decoders", help=( "Comma-separated list of decoders to benchmark. " - "Choices are torchcodec, torchaudio, torchvision, decord, tcoptions:num_threads=1+color_conversion_library=filtergraph, torchcodec_compiled" - "For torchcodec, you can specify options with tcoptions:. " + "Choices are: " + ", ".join(decoder_registry.keys()) + ". " + + "To specify options, append a ':' and then value pairs seperated by a '+'. " + "For example, torchcodec:num_threads=1+color_conversion_library=filtergraph." ), type=str, - default="decord,tcoptions:,torchvision,torchaudio,torchcodec_compiled,torchcodec_public,tcoptions:num_threads=1,tcbatchoptions:", + default=( + "decord,decord_batch," + + "torchvision," + + "torchaudio," + + "torchcodec_core,torchcodec_core:num_threads=1,torchcodec_core_batch,torchcodec_core_nonbatch," + + "torchcodec_public" + ), ) parser.add_argument( "--bm_video_dir", @@ -87,51 +116,35 @@ def main() -> None: ) args = parser.parse_args() - decoders = set(args.decoders.split(",")) + specified_decoders = set(args.decoders.split(",")) # These are the PTS values we want to extract from the small video. num_uniform_samples = 10 - decoder_dict = {} - for decoder in decoders: - if decoder == "decord": - decoder_dict["DecordNonBatchDecoderAccurateSeek"] = ( - DecordNonBatchDecoderAccurateSeek() - ) - elif decoder == "torchcodec": - decoder_dict["TorchCodecCore:"] = TorchCodecCore() - elif decoder == "torchcodec_compiled": - decoder_dict["TorchCodecCoreCompiled"] = TorchCodecCoreCompiled() - elif decoder == "torchcodec_public": - decoder_dict["TorchCodecPublic"] = TorchCodecPublic() - elif decoder == "torchvision": - decoder_dict["TorchVision[backend=video_reader]"] = ( - # We don't compare TorchVision's "pyav" backend because it doesn't support - # accurate seeks. - TorchVision("video_reader") - ) - elif decoder == "torchaudio": - decoder_dict["TorchAudioDecoder"] = TorchAudioDecoder() - elif decoder.startswith("tcbatchoptions:"): - options = decoder[len("tcbatchoptions:") :] - kwargs_dict = {} - for item in options.split("+"): - if item.strip() == "": - continue - k, v = item.split("=") - kwargs_dict[k] = v - decoder_dict["TorchCodecCoreBatch" + options] = TorchCodecCoreBatch( - **kwargs_dict - ) - elif decoder.startswith("tcoptions:"): - options = decoder[len("tcoptions:") :] + decoders_to_run = {} + for decoder in specified_decoders: + if ":" in decoder: + decoder_name, _, options = decoder.partition(":") + assert decoder_name in decoder_registry + kwargs_dict = {} for item in options.split("+"): if item.strip() == "": continue k, v = item.split("=") kwargs_dict[k] = v - decoder_dict["TorchCodecCore:" + options] = TorchCodecCore(**kwargs_dict) + + display_name = decoder_registry[decoder_name].display_name + kind = decoder_registry[decoder_name].kind + decoders_to_run[display_name + options] = kind(**kwargs_dict) + elif decoder in decoder_registry: + display_name = decoder_registry[decoder].display_name + kind = decoder_registry[decoder].kind + default_options = decoder_registry[decoder].default_options + decoders_to_run[display_name] = kind(**default_options) + else: + raise ValueError(f"Unknown decoder: {decoder}") + video_paths = args.bm_video_paths.split(",") if args.bm_video_dir: video_paths = [] @@ -140,7 +153,7 @@ def main() -> None: video_paths.append(entry.path) df_data = run_benchmarks( - decoder_dict, + decoders_to_run, video_paths, num_uniform_samples, num_sequential_frames_from_start=[1, 10, 100], diff --git a/benchmarks/decoders/benchmark_decoders_library.py b/benchmarks/decoders/benchmark_decoders_library.py index f69d709c4..98b8ef15f 100644 --- a/benchmarks/decoders/benchmark_decoders_library.py +++ b/benchmarks/decoders/benchmark_decoders_library.py @@ -18,6 +18,7 @@ _add_video_stream, create_from_file, get_frames_at_indices, + get_frames_by_pts, get_json_metadata, get_next_frame, scan_all_streams_to_update_metadata, @@ -37,47 +38,51 @@ def get_frames_from_video(self, video_file, pts_list): pass -class DecordNonBatchDecoderAccurateSeek(AbstractDecoder): +class DecordAccurate(AbstractDecoder): def __init__(self): import decord # noqa: F401 self.decord = decord - - self._print_each_iteration_time = False + self.decord.bridge.set_bridge("torch") def get_frames_from_video(self, video_file, pts_list): - self.decord.bridge.set_bridge("torch") decord_vr = self.decord.VideoReader(video_file, ctx=self.decord.cpu()) frames = [] - times = [] fps = decord_vr.get_avg_fps() for pts in pts_list: - start = timeit.default_timer() decord_vr.seek_accurate(int(pts * fps)) frame = decord_vr.next() - end = timeit.default_timer() - times.append(round(end - start, 3)) frames.append(frame) - if self._print_each_iteration_time: - print("decord times=", times, sum(times)) return frames def get_consecutive_frames_from_video(self, video_file, numFramesToDecode): - self.decord.bridge.set_bridge("torch") decord_vr = self.decord.VideoReader(video_file, ctx=self.decord.cpu()) frames = [] - times = [] for _ in range(numFramesToDecode): - start = timeit.default_timer() frame = decord_vr.next() - end = timeit.default_timer() - times.append(round(end - start, 3)) frames.append(frame) - if self._print_each_iteration_time: - print("decord times=", times, sum(times)) return frames +class DecordAccurateBatch(AbstractDecoder): + def __init__(self): + import decord # noqa: F401 + + self.decord = decord + self.decord.bridge.set_bridge("torch") + + def get_frames_from_video(self, video_file, pts_list): + decord_vr = self.decord.VideoReader(video_file, ctx=self.decord.cpu()) + average_fps = decord_vr.get_avg_fps() + indices_list = [int(pts * average_fps) for pts in pts_list] + return decord_vr.get_batch(indices_list) + + def get_consecutive_frames_from_video(self, video_file, numFramesToDecode): + decord_vr = self.decord.VideoReader(video_file, ctx=self.decord.cpu()) + indices_list = list(range(numFramesToDecode)) + return decord_vr.get_batch(indices_list) + + class TorchVision(AbstractDecoder): def __init__(self, backend): self._backend = backend @@ -87,47 +92,63 @@ def __init__(self, backend): self.torchvision = torchvision def get_frames_from_video(self, video_file, pts_list): - start = timeit.default_timer() self.torchvision.set_video_backend(self._backend) reader = self.torchvision.io.VideoReader(video_file, "video") - create_done = timeit.default_timer() frames = [] for pts in pts_list: reader.seek(pts) frame = next(reader) frames.append(frame["data"].permute(1, 2, 0)) - frames_done = timeit.default_timer() - if self._print_each_iteration_time: - create_duration = 1000 * round(create_done - start, 3) - frames_duration = 1000 * round(frames_done - create_done, 3) - total_duration = 1000 * round(frames_done - start, 3) - print(f"TV: {create_duration=} {frames_duration=} {total_duration=}") return frames def get_consecutive_frames_from_video(self, video_file, numFramesToDecode): - start = timeit.default_timer() self.torchvision.set_video_backend(self._backend) reader = self.torchvision.io.VideoReader(video_file, "video") - create_done = timeit.default_timer() frames = [] for _ in range(numFramesToDecode): frame = next(reader) frames.append(frame["data"].permute(1, 2, 0)) - frames_done = timeit.default_timer() - - if self._print_each_iteration_time: - create_duration = 1000 * round(create_done - start, 3) - frames_duration = 1000 * round(frames_done - create_done, 3) - total_duration = 1000 * round(frames_done - start, 3) - print( - f"TV: consecutive: {create_duration=} {frames_duration=} {total_duration=} {frames[0].shape=}" - ) return frames class TorchCodecCore(AbstractDecoder): def __init__(self, num_threads=None, color_conversion_library=None, device="cpu"): - self._print_each_iteration_time = False + self._num_threads = int(num_threads) if num_threads else None + self._color_conversion_library = color_conversion_library + self._device = device + + def get_frames_from_video(self, video_file, pts_list): + decoder = create_from_file(video_file) + scan_all_streams_to_update_metadata(decoder) + _add_video_stream( + decoder, + num_threads=self._num_threads, + color_conversion_library=self._color_conversion_library, + ) + metadata = json.loads(get_json_metadata(decoder)) + best_video_stream = metadata["bestVideoStreamIndex"] + frames, *_ = get_frames_by_pts( + decoder, stream_index=best_video_stream, timestamps=pts_list + ) + return frames + + def get_consecutive_frames_from_video(self, video_file, numFramesToDecode): + decoder = create_from_file(video_file) + _add_video_stream( + decoder, + num_threads=self._num_threads, + color_conversion_library=self._color_conversion_library, + ) + + frames = [] + for _ in range(numFramesToDecode): + frame = get_next_frame(decoder) + frames.append(frame) + + return frames + +class TorchCodecCoreNonBatch(AbstractDecoder): + def __init__(self, num_threads=None, color_conversion_library=None, device="cpu"): self._num_threads = int(num_threads) if num_threads else None self._color_conversion_library = color_conversion_library self._device = device @@ -140,49 +161,28 @@ def get_frames_from_video(self, video_file, pts_list): color_conversion_library=self._color_conversion_library, device=self._device, ) + frames = [] - times = [] for pts in pts_list: - start = timeit.default_timer() seek_to_pts(decoder, pts) frame = get_next_frame(decoder) - end = timeit.default_timer() - times.append(round(end - start, 3)) frames.append(frame) - if self._print_each_iteration_time: - print("torchcodec times=", times, sum(times)) return frames def get_consecutive_frames_from_video(self, video_file, numFramesToDecode): - create_time = timeit.default_timer() decoder = create_from_file(video_file) - add_stream_time = timeit.default_timer() _add_video_stream( decoder, num_threads=self._num_threads, color_conversion_library=self._color_conversion_library, ) + frames = [] - times = [] - frames_time = timeit.default_timer() for _ in range(numFramesToDecode): - start = timeit.default_timer() frame = get_next_frame(decoder) - end = timeit.default_timer() - times.append(round(end - start, 3)) frames.append(frame) - if self._print_each_iteration_time: - done_time = timeit.default_timer() - create_duration = 1000 * round(add_stream_time - create_time, 3) - add_stream_duration = 1000 * round(frames_time - add_stream_time, 3) - frames_duration = 1000 * round(done_time - frames_time, 3) - total_duration = 1000 * round(done_time - create_time, 3) - print( - f"{numFramesToDecode=} {create_duration=} {add_stream_duration=} {frames_duration=} {total_duration=} {frames[0][0].shape=}" - ) - print("torchcodec times=", times, sum(times)) return frames @@ -201,12 +201,9 @@ def get_frames_from_video(self, video_file, pts_list): color_conversion_library=self._color_conversion_library, ) metadata = json.loads(get_json_metadata(decoder)) - average_fps = metadata["averageFps"] best_video_stream = metadata["bestVideoStreamIndex"] - indices_list = [int(pts * average_fps) for pts in pts_list] - frames = [] - frames, *_ = get_frames_at_indices( - decoder, stream_index=best_video_stream, frame_indices=indices_list + frames, *_ = get_frames_by_pts( + decoder, stream_index=best_video_stream, timestamps=pts_list ) return frames @@ -220,7 +217,6 @@ def get_consecutive_frames_from_video(self, video_file, numFramesToDecode): ) metadata = json.loads(get_json_metadata(decoder)) best_video_stream = metadata["bestVideoStreamIndex"] - frames = [] indices_list = list(range(numFramesToDecode)) frames, *_ = get_frames_at_indices( decoder, stream_index=best_video_stream, frame_indices=indices_list diff --git a/benchmarks/decoders/benchmark_readme_chart.png b/benchmarks/decoders/benchmark_readme_chart.png index a1fd6b47297e7552f68b364424354407ab5740bb..8c5466cc22f5fb39eb37a79e67547c90cee0a67b 100644 GIT binary patch literal 53163 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 UPU%PUQ=u?68a*_0$e%0zFNiabEC2ui diff --git a/benchmarks/decoders/benchmark_readme_data.json b/benchmarks/decoders/benchmark_readme_data.json index 56d50fb6d..5b3db1048 100644 --- a/benchmarks/decoders/benchmark_readme_data.json +++ b/benchmarks/decoders/benchmark_readme_data.json @@ -2,144 +2,180 @@ { "decoder": "TorchCodec", "description": "uniform 10 seek()+next()", - "fps": 315.05924655387844, - "fps_p25": 323.6567367722293, - "fps_p75": 303.4217234978234, + "fps": 312.84353293082387, + "fps_p25": 322.7871320121642, + "fps_p75": 302.8227679557008, "frame_count": 10, - "iqr": 0.0020604978781193495, - "median": 0.031740061938762665, + "iqr": 0.0020424467511475086, + "median": 0.03196486085653305, "type": "uniform:seek()+next()", "video": "/tmp/torchcodec_benchmarking_videos/640x480_10s_30fps_600gop_libx264_yuv420p.mp4" }, { "decoder": "TorchCodec", "description": "random 10 seek()+next()", - "fps": 312.8775910187949, - "fps_p25": 316.65411586172576, - "fps_p75": 304.67664202566044, + "fps": 313.33763162396417, + "fps_p25": 321.75500163530694, + "fps_p75": 303.2479405107031, "frame_count": 10, - "iqr": 0.0012414834462106256, - "median": 0.03196138134226203, + "iqr": 0.0018967683427035809, + "median": 0.03191445581614971, "type": "random:seek()+next()", "video": "/tmp/torchcodec_benchmarking_videos/640x480_10s_30fps_600gop_libx264_yuv420p.mp4" }, { "decoder": "TorchCodec", "description": "100 next()", - "fps": 948.3281062356014, - "fps_p25": 1211.2939721426944, - "fps_p75": 884.5162407819654, + "fps": 1194.7216700127474, + "fps_p25": 1256.8548260461632, + "fps_p75": 900.2557223623917, "frame_count": 100, - "iqr": 0.030499806627631187, - "median": 0.10544873587787151, + "iqr": 0.031515865586698055, + "median": 0.08370150346308947, "type": "next()", "video": "/tmp/torchcodec_benchmarking_videos/640x480_10s_30fps_600gop_libx264_yuv420p.mp4" }, { "decoder": "TorchCodec[num_threads=1]", "description": "uniform 10 seek()+next()", - "fps": 131.3991915256709, - "fps_p25": 132.80657677770856, - "fps_p75": 130.0875105195256, + "fps": 130.63321225706912, + "fps_p25": 131.92649622587825, + "fps_p75": 129.0592076739796, "frame_count": 10, - "iqr": 0.0015738545916974545, - "median": 0.07610396901145577, + "iqr": 0.0016840321477502584, + "median": 0.0765502112917602, "type": "uniform:seek()+next()", "video": "/tmp/torchcodec_benchmarking_videos/640x480_10s_30fps_600gop_libx264_yuv420p.mp4" }, { "decoder": "TorchCodec[num_threads=1]", "description": "random 10 seek()+next()", - "fps": 131.76952597486445, - "fps_p25": 133.43827127306128, - "fps_p75": 129.72933699334547, + "fps": 131.88189359890464, + "fps_p25": 132.88939755851635, + "fps_p75": 130.466572672506, "frame_count": 10, - "iqr": 0.0021425478626042604, - "median": 0.0758900810033083, + "iqr": 0.0013974376488476992, + "median": 0.07582542020827532, "type": "random:seek()+next()", "video": "/tmp/torchcodec_benchmarking_videos/640x480_10s_30fps_600gop_libx264_yuv420p.mp4" }, { "decoder": "TorchCodec[num_threads=1]", "description": "100 next()", - "fps": 767.4262194030912, - "fps_p25": 954.5964481242703, - "fps_p75": 751.3156802763621, + "fps": 976.1142182056929, + "fps_p25": 1016.0800435864988, + "fps_p75": 795.6587254838081, "frame_count": 100, - "iqr": 0.028343535726889968, - "median": 0.13030568603426218, + "iqr": 0.027264581993222237, + "median": 0.10244702734053135, "type": "next()", "video": "/tmp/torchcodec_benchmarking_videos/640x480_10s_30fps_600gop_libx264_yuv420p.mp4" }, { "decoder": "TorchVision[backend=video_reader]", "description": "uniform 10 seek()+next()", - "fps": 7.87802293808524, - "fps_p25": 7.9221952370727795, - "fps_p75": 7.816352619742458, + "fps": 7.77759549232789, + "fps_p25": 7.818750688897255, + "fps_p75": 7.708450468534736, "frame_count": 10, - "iqr": 0.017092708498239517, - "median": 1.2693540090695024, + "iqr": 0.018300878116860986, + "median": 1.2857444193214178, "type": "uniform:seek()+next()", "video": "/tmp/torchcodec_benchmarking_videos/640x480_10s_30fps_600gop_libx264_yuv420p.mp4" }, { "decoder": "TorchVision[backend=video_reader]", "description": "random 10 seek()+next()", - "fps": 7.257307771543773, - "fps_p25": 7.305370582206469, - "fps_p75": 7.209328679013935, + "fps": 7.160186815967891, + "fps_p25": 7.1908539836642165, + "fps_p75": 7.0379416903234775, "frame_count": 10, - "iqr": 0.018235752126201987, - "median": 1.3779214434325695, + "iqr": 0.030214559519663453, + "median": 1.3966116048395634, "type": "random:seek()+next()", "video": "/tmp/torchcodec_benchmarking_videos/640x480_10s_30fps_600gop_libx264_yuv420p.mp4" }, { "decoder": "TorchVision[backend=video_reader]", "description": "100 next()", - "fps": 843.6237746060216, - "fps_p25": 852.9895625098609, - "fps_p75": 830.8058002517034, + "fps": 842.1387064892538, + "fps_p25": 849.6200178567948, + "fps_p75": 831.8435513909374, "frame_count": 100, - "iqr": 0.0031303432770073414, - "median": 0.11853625159710646, + "iqr": 0.0025152377784252167, + "median": 0.11874528415501118, "type": "next()", "video": "/tmp/torchcodec_benchmarking_videos/640x480_10s_30fps_600gop_libx264_yuv420p.mp4" }, { "decoder": "TorchAudio", "description": "uniform 10 seek()+next()", - "fps": 28.283386183212908, - "fps_p25": 28.48861769505288, - "fps_p75": 27.962052080094207, + "fps": 27.90513829975662, + "fps_p25": 28.13882301993776, + "fps_p75": 27.54551640075421, "frame_count": 10, - "iqr": 0.006610161624848843, - "median": 0.3535644542425871, + "iqr": 0.007654597284272313, + "median": 0.35835694102570415, "type": "uniform:seek()+next()", "video": "/tmp/torchcodec_benchmarking_videos/640x480_10s_30fps_600gop_libx264_yuv420p.mp4" }, { "decoder": "TorchAudio", "description": "random 10 seek()+next()", - "fps": 26.009247898010745, - "fps_p25": 26.13538377314808, - "fps_p75": 25.757236346453418, + "fps": 25.684434182425214, + "fps_p25": 25.879457397198443, + "fps_p75": 25.267930621911752, "frame_count": 10, - "iqr": 0.00561736966483295, - "median": 0.38447863003239036, + "iqr": 0.009351701475679874, + "median": 0.38934087194502354, "type": "random:seek()+next()", "video": "/tmp/torchcodec_benchmarking_videos/640x480_10s_30fps_600gop_libx264_yuv420p.mp4" }, { "decoder": "TorchAudio", "description": "100 next()", - "fps": 659.7600283811723, - "fps_p25": 668.0071480761926, - "fps_p75": 652.052492189031, + "fps": 667.0015484089075, + "fps_p25": 673.7295038551645, + "fps_p75": 660.0931578201269, "frame_count": 100, - "iqr": 0.003662889124825597, - "median": 0.15157026145607233, + "iqr": 0.0030662475619465113, + "median": 0.14992468943819404, + "type": "next()", + "video": "/tmp/torchcodec_benchmarking_videos/640x480_10s_30fps_600gop_libx264_yuv420p.mp4" + }, + { + "decoder": "Decord", + "description": "uniform 10 seek()+next()", + "fps": 250.76314292043256, + "fps_p25": 255.79988799274403, + "fps_p75": 243.70338823712694, + "frame_count": 10, + "iqr": 0.0019404292106628418, + "median": 0.03987826872617006, + "type": "uniform:seek()+next()", + "video": "/tmp/torchcodec_benchmarking_videos/640x480_10s_30fps_600gop_libx264_yuv420p.mp4" + }, + { + "decoder": "Decord", + "description": "random 10 seek()+next()", + "fps": 108.95659719588485, + "fps_p25": 111.19152822111404, + "fps_p75": 106.52264411126707, + "frame_count": 10, + "iqr": 0.003941844217479229, + "median": 0.09177966509014368, + "type": "random:seek()+next()", + "video": "/tmp/torchcodec_benchmarking_videos/640x480_10s_30fps_600gop_libx264_yuv420p.mp4" + }, + { + "decoder": "Decord", + "description": "100 next()", + "fps": 1159.3142395946288, + "fps_p25": 1169.7791224490422, + "fps_p75": 1140.3958820854073, + "frame_count": 100, + "iqr": 0.0022026230581104755, + "median": 0.08625788986682892, "type": "next()", "video": "/tmp/torchcodec_benchmarking_videos/640x480_10s_30fps_600gop_libx264_yuv420p.mp4" }, @@ -150,4 +186,4 @@ "python_version": "3.11.10", "system": "Linux" } -] +] \ No newline at end of file diff --git a/benchmarks/decoders/generate_readme_data.py b/benchmarks/decoders/generate_readme_data.py index 03b47f9e8..01d30b571 100644 --- a/benchmarks/decoders/generate_readme_data.py +++ b/benchmarks/decoders/generate_readme_data.py @@ -12,6 +12,7 @@ from pathlib import Path from benchmark_decoders_library import ( + DecordAccurateBatch, generate_videos, run_benchmarks, TorchAudioDecoder, @@ -50,6 +51,7 @@ def main() -> None: decoder_dict["TorchCodec[num_threads=1]"] = TorchCodecPublic(num_ffmpeg_threads=1) decoder_dict["TorchVision[backend=video_reader]"] = TorchVision("video_reader") decoder_dict["TorchAudio"] = TorchAudioDecoder() + decoder_dict["Decord"] = DecordAccurateBatch() # These are the number of uniform seeks we do in the seek+decode benchmark. num_samples = 10 From 6ddfa6c25c628420dde341e764f73fec2529bc4c Mon Sep 17 00:00:00 2001 From: Scott Schneider Date: Tue, 5 Nov 2024 13:09:28 -0800 Subject: [PATCH 2/3] Fix formatting --- benchmarks/decoders/benchmark_decoders.py | 35 ++++++++++++------- .../decoders/benchmark_decoders_library.py | 2 +- .../decoders/benchmark_readme_data.json | 2 +- 3 files changed, 25 insertions(+), 14 deletions(-) diff --git a/benchmarks/decoders/benchmark_decoders.py b/benchmarks/decoders/benchmark_decoders.py index eeac1cd3d..74e90c976 100644 --- a/benchmarks/decoders/benchmark_decoders.py +++ b/benchmarks/decoders/benchmark_decoders.py @@ -8,8 +8,8 @@ import importlib.resources import os import typing -from pathlib import Path from dataclasses import dataclass, field +from pathlib import Path from benchmark_decoders_library import ( AbstractDecoder, @@ -20,30 +20,39 @@ TorchAudioDecoder, TorchCodecCore, TorchCodecCoreBatch, - TorchCodecCoreNonBatch, TorchCodecCoreCompiled, + TorchCodecCoreNonBatch, TorchCodecPublic, TorchVision, ) + @dataclass class DecoderKind: display_name: str kind: typing.Type[AbstractDecoder] default_options: dict = field(default_factory=dict) + decoder_registry = { "decord": DecoderKind("DecordAccurate", DecordAccurate), "decord_batch": DecoderKind("DecordAccurateBatch", DecordAccurateBatch), "torchcodec_core": DecoderKind("TorchCodecCore:", TorchCodecCore), "torchcodec_core_batch": DecoderKind("TorchCodecCoreBatch", TorchCodecCoreBatch), - "torchcodec_core_nonbatch": DecoderKind("TorchCodecCoreNonBatch", TorchCodecCoreNonBatch), - "torchcodec_core_compiled": DecoderKind("TorchCodecCoreCompiled", TorchCodecCoreCompiled), + "torchcodec_core_nonbatch": DecoderKind( + "TorchCodecCoreNonBatch", TorchCodecCoreNonBatch + ), + "torchcodec_core_compiled": DecoderKind( + "TorchCodecCoreCompiled", TorchCodecCoreCompiled + ), "torchcodec_public": DecoderKind("TorchCodecPublic", TorchCodecPublic), - "torchvision": DecoderKind("TorchVision[backend=video_reader]", TorchVision, {"backend": "video_reader"}), + "torchvision": DecoderKind( + "TorchVision[backend=video_reader]", TorchVision, {"backend": "video_reader"} + ), "torchaudio": DecoderKind("TorchAudio", TorchAudioDecoder), } + def in_fbcode() -> bool: return "FB_PAR_RUNTIME_FILES" in os.environ @@ -89,17 +98,19 @@ def main() -> None: "--decoders", help=( "Comma-separated list of decoders to benchmark. " - "Choices are: " + ", ".join(decoder_registry.keys()) + ". " + - "To specify options, append a ':' and then value pairs seperated by a '+'. " + "Choices are: " + + ", ".join(decoder_registry.keys()) + + ". " + + "To specify options, append a ':' and then value pairs seperated by a '+'. " "For example, torchcodec:num_threads=1+color_conversion_library=filtergraph." ), type=str, default=( - "decord,decord_batch," + - "torchvision," + - "torchaudio," + - "torchcodec_core,torchcodec_core:num_threads=1,torchcodec_core_batch,torchcodec_core_nonbatch," + - "torchcodec_public" + "decord,decord_batch," + + "torchvision," + + "torchaudio," + + "torchcodec_core,torchcodec_core:num_threads=1,torchcodec_core_batch,torchcodec_core_nonbatch," + + "torchcodec_public" ), ) parser.add_argument( diff --git a/benchmarks/decoders/benchmark_decoders_library.py b/benchmarks/decoders/benchmark_decoders_library.py index 98b8ef15f..a2634186b 100644 --- a/benchmarks/decoders/benchmark_decoders_library.py +++ b/benchmarks/decoders/benchmark_decoders_library.py @@ -2,7 +2,6 @@ import json import os import subprocess -import timeit from concurrent.futures import ThreadPoolExecutor, wait from itertools import product @@ -147,6 +146,7 @@ def get_consecutive_frames_from_video(self, video_file, numFramesToDecode): return frames + class TorchCodecCoreNonBatch(AbstractDecoder): def __init__(self, num_threads=None, color_conversion_library=None, device="cpu"): self._num_threads = int(num_threads) if num_threads else None diff --git a/benchmarks/decoders/benchmark_readme_data.json b/benchmarks/decoders/benchmark_readme_data.json index 5b3db1048..38a32c6c5 100644 --- a/benchmarks/decoders/benchmark_readme_data.json +++ b/benchmarks/decoders/benchmark_readme_data.json @@ -186,4 +186,4 @@ "python_version": "3.11.10", "system": "Linux" } -] \ No newline at end of file +] From 26c9ccbb36699eb8840303699f3d0aad78e7e84b Mon Sep 17 00:00:00 2001 From: Scott Schneider Date: Tue, 5 Nov 2024 21:39:51 -0800 Subject: [PATCH 3/3] Benchmark code formatting, more refactoring --- benchmarks/decoders/benchmark_decoders.py | 65 ++++++++++--------- .../decoders/benchmark_decoders_library.py | 2 +- 2 files changed, 35 insertions(+), 32 deletions(-) diff --git a/benchmarks/decoders/benchmark_decoders.py b/benchmarks/decoders/benchmark_decoders.py index 74e90c976..81a8c0ea6 100644 --- a/benchmarks/decoders/benchmark_decoders.py +++ b/benchmarks/decoders/benchmark_decoders.py @@ -31,13 +31,13 @@ class DecoderKind: display_name: str kind: typing.Type[AbstractDecoder] - default_options: dict = field(default_factory=dict) + default_options: dict[str, str] = field(default_factory=dict) decoder_registry = { "decord": DecoderKind("DecordAccurate", DecordAccurate), "decord_batch": DecoderKind("DecordAccurateBatch", DecordAccurateBatch), - "torchcodec_core": DecoderKind("TorchCodecCore:", TorchCodecCore), + "torchcodec_core": DecoderKind("TorchCodecCore", TorchCodecCore), "torchcodec_core_batch": DecoderKind("TorchCodecCoreBatch", TorchCodecCoreBatch), "torchcodec_core_nonbatch": DecoderKind( "TorchCodecCoreNonBatch", TorchCodecCoreNonBatch @@ -47,7 +47,11 @@ class DecoderKind: ), "torchcodec_public": DecoderKind("TorchCodecPublic", TorchCodecPublic), "torchvision": DecoderKind( - "TorchVision[backend=video_reader]", TorchVision, {"backend": "video_reader"} + # We don't compare against TorchVision's "pyav" backend because it doesn't support + # accurate seeks. + "TorchVision[backend=video_reader]", + TorchVision, + {"backend": "video_reader"}, ), "torchaudio": DecoderKind("TorchAudio", TorchAudioDecoder), } @@ -66,6 +70,16 @@ def get_test_resource_path(filename: str) -> str: return str(Path(__file__).parent / f"../../test/resources/{filename}") +def parse_options_code(options_code: str) -> dict[str, str]: + options = {} + for item in options_code.split("+"): + if item.strip() == "": + continue + k, v = item.split("=") + options[k] = v + return options + + def main() -> None: """Benchmarks the performance of a few video decoders""" @@ -98,19 +112,17 @@ def main() -> None: "--decoders", help=( "Comma-separated list of decoders to benchmark. " - "Choices are: " - + ", ".join(decoder_registry.keys()) - + ". " - + "To specify options, append a ':' and then value pairs seperated by a '+'. " - "For example, torchcodec:num_threads=1+color_conversion_library=filtergraph." + "Choices are: " + ", ".join(decoder_registry.keys()) + ". " + "To specify options, append a ':' and then value pairs seperated by a '+'. " + "For example, torchcodec_core:num_threads=1+color_conversion_library=filtergraph." ), type=str, default=( "decord,decord_batch," - + "torchvision," - + "torchaudio," - + "torchcodec_core,torchcodec_core:num_threads=1,torchcodec_core_batch,torchcodec_core_nonbatch," - + "torchcodec_public" + "torchvision," + "torchaudio," + "torchcodec_core,torchcodec_core:num_threads=1,torchcodec_core_batch,torchcodec_core_nonbatch," + "torchcodec_public" ), ) parser.add_argument( @@ -135,26 +147,17 @@ def main() -> None: decoders_to_run = {} for decoder in specified_decoders: if ":" in decoder: - decoder_name, _, options = decoder.partition(":") - assert decoder_name in decoder_registry - - kwargs_dict = {} - for item in options.split("+"): - if item.strip() == "": - continue - k, v = item.split("=") - kwargs_dict[k] = v - - display_name = decoder_registry[decoder_name].display_name - kind = decoder_registry[decoder_name].kind - decoders_to_run[display_name + options] = kind(**kwargs_dict) - elif decoder in decoder_registry: - display_name = decoder_registry[decoder].display_name - kind = decoder_registry[decoder].kind - default_options = decoder_registry[decoder].default_options - decoders_to_run[display_name] = kind(**default_options) + decoder, _, options_code = decoder.partition(":") + assert decoder in decoder_registry, f"Unknown decoder: {decoder}" + display = decoder_registry[decoder].display_name + ":" + options_code + options = parse_options_code(options_code) else: - raise ValueError(f"Unknown decoder: {decoder}") + assert decoder in decoder_registry, f"Unknown decoder: {decoder}" + display = decoder_registry[decoder].display_name + options = decoder_registry[decoder].default_options + + kind = decoder_registry[decoder].kind + decoders_to_run[display] = kind(**options) video_paths = args.bm_video_paths.split(",") if args.bm_video_dir: diff --git a/benchmarks/decoders/benchmark_decoders_library.py b/benchmarks/decoders/benchmark_decoders_library.py index a2634186b..f4be7d8e6 100644 --- a/benchmarks/decoders/benchmark_decoders_library.py +++ b/benchmarks/decoders/benchmark_decoders_library.py @@ -580,7 +580,7 @@ def run_benchmarks( "create_torchcodec_decoder_from_file": create_torchcodec_decoder_from_file, }, label=f"video={first_video_file_path} {metadata_label}", - sub_label="TorchCodecCore:", + sub_label="TorchCodecCore", description="create()+next()", ) results.append(