From a822a5db4cd1b1b81b679c2d2479fe0459d319ce Mon Sep 17 00:00:00 2001 From: Nicolas Hug Date: Wed, 28 Aug 2024 10:00:12 +0100 Subject: [PATCH 1/7] Revert "Add CI for linux cuda (#187)" This reverts commit cafea819587a4ce3da2af172f58bd64b23d568f9. --- .github/workflows/test_linux_cuda.yaml | 64 -------------------- src/torchcodec/decoders/_core/CMakeLists.txt | 2 +- 2 files changed, 1 insertion(+), 65 deletions(-) delete mode 100644 .github/workflows/test_linux_cuda.yaml diff --git a/.github/workflows/test_linux_cuda.yaml b/.github/workflows/test_linux_cuda.yaml deleted file mode 100644 index 527448bec..000000000 --- a/.github/workflows/test_linux_cuda.yaml +++ /dev/null @@ -1,64 +0,0 @@ - -name: Unit-tests on Linux GPU - -on: - pull_request: - push: - branches: - - nightly - - main - - release/* - workflow_dispatch: - -jobs: - tests: - strategy: - matrix: - python_version: ["3.9"] - # TODO: Add more cuda versions. - cuda_arch_version: ["12.4"] - fail-fast: false - uses: pytorch/test-infra/.github/workflows/linux_job.yml@main - with: - runner: linux.g5.4xlarge.nvidia.gpu - repository: pytorch/torchcodec - gpu-arch-type: cuda - gpu-arch-version: ${{ matrix.cuda_arch_version }} - timeout: 120 - - script: | - nvidia-smi - conda create --yes --name test - conda activate test - conda install --quiet --yes pip cmake pkg-config nasm - - pip install --quiet --pre torch torchvision --index-url https://download.pytorch.org/whl/nightly/cu124 - conda install --quiet --yes nvidia::libnpp - - # Build and install FFMPEG from source with CUDA enabled. - # The one on conda doesn't have CUDA enabled. - # Sub-step: install nvidia headers. Reference this link for details: - # https://docs.nvidia.com/video-technologies/video-codec-sdk/12.1/ffmpeg-with-nvidia-gpu/index.html - git clone --quiet https://git.videolan.org/git/ffmpeg/nv-codec-headers.git - - pushd nv-codec-headers - make --silent PREFIX=$CONDA_PREFIX -j install - popd - - # Now build FFMPEG from source with CUDA enabled. - git clone --quiet https://git.ffmpeg.org/ffmpeg.git ffmpeg/ - pushd ffmpeg - git checkout origin/release/6.1 - which pkg-config - pkg-config --list-all - ./configure --prefix=$CONDA_PREFIX --enable-nonfree --enable-cuda-nvcc --disable-static --enable-shared --optflags=-fno-omit-frame-pointer --disable-stripping --enable-cuvid - make --silent -j install - popd - - CMAKE_BUILD_PARALLEL_LEVEL=8 CXXFLAGS="" LDFLAGS="-Wl,--allow-shlib-undefined -Wl,-rpath,$CONDA_PREFIX/lib -Wl,-rpath-link,$CONDA_PREFIX/lib -L$CONDA_PREFIX/lib" CMAKE_BUILD_TYPE=Release ENABLE_CUDA=1 ENABLE_NVTX=1 pip install -e ".[dev]" --no-build-isolation -vv --debug - - # We skip certain tests because they are not relevant to GPU decoding and they always fail with - # a custom FFMPEG build. - pytest -k "not (test_get_metadata or get_ffmpeg_version)" - python benchmarks/decoders/gpu_benchmark.py - conda deactivate diff --git a/src/torchcodec/decoders/_core/CMakeLists.txt b/src/torchcodec/decoders/_core/CMakeLists.txt index ed8e8ef36..d8554bdaa 100644 --- a/src/torchcodec/decoders/_core/CMakeLists.txt +++ b/src/torchcodec/decoders/_core/CMakeLists.txt @@ -58,7 +58,7 @@ function(make_torchcodec_library library_name ffmpeg_target) set(NEEDED_LIBRARIES ${ffmpeg_target} ${TORCH_LIBRARIES} ${Python3_LIBRARIES}) if(ENABLE_CUDA) - list(APPEND NEEDED_LIBRARIES ${CUDA_CUDA_LIBRARY} ${CUDA_nppi_LIBRARY} ${CUDA_nppicc_LIBRARY} ) + list(APPEND NEEDED_LIBRARIES ${CUDA_CUDA_LIBRARY}) endif() if(ENABLE_NVTX) list(APPEND NEEDED_LIBRARIES nvtx3-cpp) From f7fe8049490c9ecf52196ae3350c3b12f5ea04f7 Mon Sep 17 00:00:00 2001 From: Nicolas Hug Date: Wed, 28 Aug 2024 10:00:13 +0100 Subject: [PATCH 2/7] Revert "[torchcodec] Add a NoDemux suffix to functions that do not demux (#147)" This reverts commit 2d02b8537023cc6b0cb43dff16b92d3d6b9f5447. --- benchmarks/decoders/BenchmarkDecodersMain.cpp | 4 +- .../decoders/_core/VideoDecoder.cpp | 8 ++-- src/torchcodec/decoders/_core/VideoDecoder.h | 19 +++++----- .../decoders/_core/VideoDecoderOps.cpp | 4 +- test/decoders/VideoDecoderTest.cpp | 37 +++++++++---------- 5 files changed, 35 insertions(+), 37 deletions(-) diff --git a/benchmarks/decoders/BenchmarkDecodersMain.cpp b/benchmarks/decoders/BenchmarkDecodersMain.cpp index c1b15bafb..5be64e6d6 100644 --- a/benchmarks/decoders/BenchmarkDecodersMain.cpp +++ b/benchmarks/decoders/BenchmarkDecodersMain.cpp @@ -63,7 +63,7 @@ void runNDecodeIterations( decoder->addVideoStreamDecoder(-1); for (double pts : ptsList) { decoder->setCursorPtsInSeconds(pts); - torch::Tensor tensor = decoder->getNextDecodedOutputNoDemux().frame; + torch::Tensor tensor = decoder->getNextDecodedOutput().frame; } if (i + 1 == warmupIterations) { start = std::chrono::high_resolution_clock::now(); @@ -95,7 +95,7 @@ void runNdecodeIterationsGrabbingConsecutiveFrames( VideoDecoder::createFromFilePath(videoPath); decoder->addVideoStreamDecoder(-1); for (int j = 0; j < consecutiveFrameCount; ++j) { - torch::Tensor tensor = decoder->getNextDecodedOutputNoDemux().frame; + torch::Tensor tensor = decoder->getNextDecodedOutput().frame; } if (i + 1 == warmupIterations) { start = std::chrono::high_resolution_clock::now(); diff --git a/src/torchcodec/decoders/_core/VideoDecoder.cpp b/src/torchcodec/decoders/_core/VideoDecoder.cpp index a5c0fddfb..5079042d2 100644 --- a/src/torchcodec/decoders/_core/VideoDecoder.cpp +++ b/src/torchcodec/decoders/_core/VideoDecoder.cpp @@ -771,7 +771,7 @@ VideoDecoder::DecodedOutput VideoDecoder::getDecodedOutputWithFilter( if (activeStreamIndices_.size() == 0) { throw std::runtime_error("No active streams configured."); } - VLOG(9) << "Starting getNextDecodedOutputNoDemux()"; + VLOG(9) << "Starting getNextDecodedOutput()"; resetDecodeStats(); if (maybeDesiredPts_.has_value()) { VLOG(9) << "maybeDesiredPts_=" << *maybeDesiredPts_; @@ -932,7 +932,7 @@ VideoDecoder::DecodedOutput VideoDecoder::convertAVFrameToDecodedOutput( return output; } -VideoDecoder::DecodedOutput VideoDecoder::getFrameDisplayedAtTimestampNoDemux( +VideoDecoder::DecodedOutput VideoDecoder::getFrameDisplayedAtTimestamp( double seconds) { for (auto& [streamIndex, stream] : streams_) { double frameStartTime = ptsToSeconds(stream.currentPts, stream.timeBase); @@ -1007,7 +1007,7 @@ VideoDecoder::DecodedOutput VideoDecoder::getFrameAtIndex( int64_t pts = stream.allFrames[frameIndex].pts; setCursorPtsInSeconds(ptsToSeconds(pts, stream.timeBase)); - return getNextDecodedOutputNoDemux(); + return getNextDecodedOutput(); } VideoDecoder::BatchDecodedOutput VideoDecoder::getFramesAtIndexes( @@ -1160,7 +1160,7 @@ VideoDecoder::getFramesDisplayedByTimestampInRange( return output; } -VideoDecoder::DecodedOutput VideoDecoder::getNextDecodedOutputNoDemux() { +VideoDecoder::DecodedOutput VideoDecoder::getNextDecodedOutput() { return getDecodedOutputWithFilter( [this](int frameStreamIndex, AVFrame* frame) { StreamInfo& activeStream = streams_[frameStreamIndex]; diff --git a/src/torchcodec/decoders/_core/VideoDecoder.h b/src/torchcodec/decoders/_core/VideoDecoder.h index a84d7da56..17a4f8a7d 100644 --- a/src/torchcodec/decoders/_core/VideoDecoder.h +++ b/src/torchcodec/decoders/_core/VideoDecoder.h @@ -153,8 +153,8 @@ class VideoDecoder { // ---- SINGLE FRAME SEEK AND DECODING API ---- // Places the cursor at the first frame on or after the position in seconds. - // Calling getNextDecodedOutputNoDemux() will return the first frame at or - // after this position. + // Calling getNextFrameAsTensor() will return the first frame at or after this + // position. void setCursorPtsInSeconds(double seconds); struct DecodedOutput { // The actual decoded output as a Tensor. @@ -180,14 +180,13 @@ class VideoDecoder { }; // Decodes the frame where the current cursor position is. It also advances // the cursor to the next frame. - DecodedOutput getNextDecodedOutputNoDemux(); - // Decodes the first frame in any added stream that is visible at a given - // timestamp. Frames in the video have a presentation timestamp and a - // duration. For example, if a frame has presentation timestamp of 5.0s and a - // duration of 1.0s, it will be visible in the timestamp range [5.0, 6.0). - // i.e. it will be returned when this function is called with seconds=5.0 or - // seconds=5.999, etc. - DecodedOutput getFrameDisplayedAtTimestampNoDemux(double seconds); + DecodedOutput getNextDecodedOutput(); + // Decodes the frame that is visible at a given timestamp. Frames in the video + // have a presentation timestamp and a duration. For example, if a frame has + // presentation timestamp of 5.0s and a duration of 1.0s, it will be visible + // in the timestamp range [5.0, 6.0). i.e. it will be returned when this + // function is called with seconds=5.0 or seconds=5.999, etc. + DecodedOutput getFrameDisplayedAtTimestamp(double seconds); DecodedOutput getFrameAtIndex(int streamIndex, int64_t frameIndex); struct BatchDecodedOutput { torch::Tensor frames; diff --git a/src/torchcodec/decoders/_core/VideoDecoderOps.cpp b/src/torchcodec/decoders/_core/VideoDecoderOps.cpp index 073ef658c..9ea81839d 100644 --- a/src/torchcodec/decoders/_core/VideoDecoderOps.cpp +++ b/src/torchcodec/decoders/_core/VideoDecoderOps.cpp @@ -147,7 +147,7 @@ OpsDecodedOutput get_next_frame(at::Tensor& decoder) { auto videoDecoder = unwrapTensorToGetDecoder(decoder); VideoDecoder::DecodedOutput result; try { - result = videoDecoder->getNextDecodedOutputNoDemux(); + result = videoDecoder->getNextDecodedOutput(); } catch (const VideoDecoder::EndOfFileException& e) { throw pybind11::stop_iteration(e.what()); } @@ -161,7 +161,7 @@ OpsDecodedOutput get_next_frame(at::Tensor& decoder) { OpsDecodedOutput get_frame_at_pts(at::Tensor& decoder, double seconds) { auto videoDecoder = unwrapTensorToGetDecoder(decoder); - auto result = videoDecoder->getFrameDisplayedAtTimestampNoDemux(seconds); + auto result = videoDecoder->getFrameDisplayedAtTimestamp(seconds); return makeOpsDecodedOutput(result); } diff --git a/test/decoders/VideoDecoderTest.cpp b/test/decoders/VideoDecoderTest.cpp index 04cbed0a6..1fe19316a 100644 --- a/test/decoders/VideoDecoderTest.cpp +++ b/test/decoders/VideoDecoderTest.cpp @@ -152,7 +152,7 @@ TEST(VideoDecoderTest, RespectsWidthAndHeightFromOptions) { streamOptions.width = 100; streamOptions.height = 120; decoder->addVideoStreamDecoder(-1, streamOptions); - torch::Tensor tensor = decoder->getNextDecodedOutputNoDemux().frame; + torch::Tensor tensor = decoder->getNextDecodedOutput().frame; EXPECT_EQ(tensor.sizes(), std::vector({3, 120, 100})); } @@ -163,7 +163,7 @@ TEST(VideoDecoderTest, RespectsOutputTensorDimensionOrderFromOptions) { VideoDecoder::VideoStreamDecoderOptions streamOptions; streamOptions.dimensionOrder = "NHWC"; decoder->addVideoStreamDecoder(-1, streamOptions); - torch::Tensor tensor = decoder->getNextDecodedOutputNoDemux().frame; + torch::Tensor tensor = decoder->getNextDecodedOutput().frame; EXPECT_EQ(tensor.sizes(), std::vector({270, 480, 3})); } @@ -172,12 +172,12 @@ TEST_P(VideoDecoderTest, ReturnsFirstTwoFramesOfVideo) { std::unique_ptr ourDecoder = createDecoderFromPath(path, GetParam()); ourDecoder->addVideoStreamDecoder(-1); - auto output = ourDecoder->getNextDecodedOutputNoDemux(); + auto output = ourDecoder->getNextDecodedOutput(); torch::Tensor tensor0FromOurDecoder = output.frame; EXPECT_EQ(tensor0FromOurDecoder.sizes(), std::vector({3, 270, 480})); EXPECT_EQ(output.ptsSeconds, 0.0); EXPECT_EQ(output.pts, 0); - output = ourDecoder->getNextDecodedOutputNoDemux(); + output = ourDecoder->getNextDecodedOutput(); torch::Tensor tensor1FromOurDecoder = output.frame; EXPECT_EQ(tensor1FromOurDecoder.sizes(), std::vector({3, 270, 480})); EXPECT_EQ(output.ptsSeconds, 1'001. / 30'000); @@ -219,12 +219,12 @@ TEST(GPUVideoDecoderTest, ReturnsFirstTwoFramesOfVideo) { ASSERT_TRUE(streamOptions.device.is_cuda()); ASSERT_EQ(streamOptions.device.type(), torch::DeviceType::CUDA); ourDecoder->addVideoStreamDecoder(-1, streamOptions); - auto output = ourDecoder->getNextDecodedOutputNoDemux(); + auto output = ourDecoder->getNextDecodedOutput(); torch::Tensor tensor1FromOurDecoder = output.frame; EXPECT_EQ(tensor1FromOurDecoder.sizes(), std::vector({3, 270, 480})); EXPECT_EQ(output.ptsSeconds, 0.0); EXPECT_EQ(output.pts, 0); - output = ourDecoder->getNextDecodedOutputNoDemux(); + output = ourDecoder->getNextDecodedOutput(); torch::Tensor tensor2FromOurDecoder = output.frame; EXPECT_EQ(tensor2FromOurDecoder.sizes(), std::vector({3, 270, 480})); EXPECT_EQ(output.ptsSeconds, 1'001. / 30'000); @@ -306,11 +306,11 @@ TEST_P(VideoDecoderTest, SeeksCloseToEof) { createDecoderFromPath(path, GetParam()); ourDecoder->addVideoStreamDecoder(-1); ourDecoder->setCursorPtsInSeconds(388388. / 30'000); - auto output = ourDecoder->getNextDecodedOutputNoDemux(); + auto output = ourDecoder->getNextDecodedOutput(); EXPECT_EQ(output.ptsSeconds, 388'388. / 30'000); - output = ourDecoder->getNextDecodedOutputNoDemux(); + output = ourDecoder->getNextDecodedOutput(); EXPECT_EQ(output.ptsSeconds, 389'389. / 30'000); - EXPECT_THROW(ourDecoder->getNextDecodedOutputNoDemux(), std::exception); + EXPECT_THROW(ourDecoder->getNextDecodedOutput(), std::exception); } TEST_P(VideoDecoderTest, GetsFrameDisplayedAtTimestamp) { @@ -318,19 +318,18 @@ TEST_P(VideoDecoderTest, GetsFrameDisplayedAtTimestamp) { std::unique_ptr ourDecoder = createDecoderFromPath(path, GetParam()); ourDecoder->addVideoStreamDecoder(-1); - auto output = ourDecoder->getFrameDisplayedAtTimestampNoDemux(6.006); + auto output = ourDecoder->getFrameDisplayedAtTimestamp(6.006); EXPECT_EQ(output.ptsSeconds, 6.006); // The frame's duration is 0.033367 according to ffprobe, // so the next frame is displayed at timestamp=6.039367. const double kNextFramePts = 6.039366666666667; // The frame that is displayed a microsecond before the next frame is still // the previous frame. - output = - ourDecoder->getFrameDisplayedAtTimestampNoDemux(kNextFramePts - 1e-6); + output = ourDecoder->getFrameDisplayedAtTimestamp(kNextFramePts - 1e-6); EXPECT_EQ(output.ptsSeconds, 6.006); // The frame that is displayed at the exact pts of the frame is the next // frame. - output = ourDecoder->getFrameDisplayedAtTimestampNoDemux(kNextFramePts); + output = ourDecoder->getFrameDisplayedAtTimestamp(kNextFramePts); EXPECT_EQ(output.ptsSeconds, kNextFramePts); // This is the timestamp of the last frame in this video. @@ -340,7 +339,7 @@ TEST_P(VideoDecoderTest, GetsFrameDisplayedAtTimestamp) { kPtsOfLastFrameInVideoStream + kDurationOfLastFrameInVideoStream; // Sanity check: make sure duration is strictly positive. EXPECT_GT(kPtsPlusDurationOfLastFrame, kPtsOfLastFrameInVideoStream); - output = ourDecoder->getFrameDisplayedAtTimestampNoDemux( + output = ourDecoder->getFrameDisplayedAtTimestamp( kPtsPlusDurationOfLastFrame - 1e-6); EXPECT_EQ(output.ptsSeconds, kPtsOfLastFrameInVideoStream); } @@ -351,7 +350,7 @@ TEST_P(VideoDecoderTest, SeeksToFrameWithSpecificPts) { createDecoderFromPath(path, GetParam()); ourDecoder->addVideoStreamDecoder(-1); ourDecoder->setCursorPtsInSeconds(6.0); - auto output = ourDecoder->getNextDecodedOutputNoDemux(); + auto output = ourDecoder->getNextDecodedOutput(); torch::Tensor tensor6FromOurDecoder = output.frame; EXPECT_EQ(output.ptsSeconds, 180'180. / 30'000); torch::Tensor tensor6FromFFMPEG = @@ -367,7 +366,7 @@ TEST_P(VideoDecoderTest, SeeksToFrameWithSpecificPts) { EXPECT_GT(ourDecoder->getDecodeStats().numPacketsSentToDecoder, 180); ourDecoder->setCursorPtsInSeconds(6.1); - output = ourDecoder->getNextDecodedOutputNoDemux(); + output = ourDecoder->getNextDecodedOutput(); torch::Tensor tensor61FromOurDecoder = output.frame; EXPECT_EQ(output.ptsSeconds, 183'183. / 30'000); torch::Tensor tensor61FromFFMPEG = @@ -387,7 +386,7 @@ TEST_P(VideoDecoderTest, SeeksToFrameWithSpecificPts) { EXPECT_LT(ourDecoder->getDecodeStats().numPacketsSentToDecoder, 10); ourDecoder->setCursorPtsInSeconds(10.0); - output = ourDecoder->getNextDecodedOutputNoDemux(); + output = ourDecoder->getNextDecodedOutput(); torch::Tensor tensor10FromOurDecoder = output.frame; EXPECT_EQ(output.ptsSeconds, 300'300. / 30'000); torch::Tensor tensor10FromFFMPEG = @@ -404,7 +403,7 @@ TEST_P(VideoDecoderTest, SeeksToFrameWithSpecificPts) { EXPECT_GT(ourDecoder->getDecodeStats().numPacketsSentToDecoder, 60); ourDecoder->setCursorPtsInSeconds(6.0); - output = ourDecoder->getNextDecodedOutputNoDemux(); + output = ourDecoder->getNextDecodedOutput(); tensor6FromOurDecoder = output.frame; EXPECT_EQ(output.ptsSeconds, 180'180. / 30'000); EXPECT_TRUE(torch::equal(tensor6FromOurDecoder, tensor6FromFFMPEG)); @@ -419,7 +418,7 @@ TEST_P(VideoDecoderTest, SeeksToFrameWithSpecificPts) { constexpr double kPtsOfLastFrameInVideoStream = 389'389. / 30'000; // ~12.9 ourDecoder->setCursorPtsInSeconds(kPtsOfLastFrameInVideoStream); - output = ourDecoder->getNextDecodedOutputNoDemux(); + output = ourDecoder->getNextDecodedOutput(); torch::Tensor tensor7FromOurDecoder = output.frame; EXPECT_EQ(output.ptsSeconds, 389'389. / 30'000); torch::Tensor tensor7FromFFMPEG = From 9e11baf76087fa79e2e039bb8e6e4d88aeb71fc4 Mon Sep 17 00:00:00 2001 From: Nicolas Hug Date: Wed, 28 Aug 2024 10:00:15 +0100 Subject: [PATCH 3/7] Revert "[torchcodec] Improve GPU benchmark (#157)" This reverts commit 272228811a8dc5cf66f0d2b3396dccb4e0147411. --- benchmarks/decoders/gpu_benchmark.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/benchmarks/decoders/gpu_benchmark.py b/benchmarks/decoders/gpu_benchmark.py index 4fd7c8ad6..daa397159 100644 --- a/benchmarks/decoders/gpu_benchmark.py +++ b/benchmarks/decoders/gpu_benchmark.py @@ -5,16 +5,16 @@ import torch.utils.benchmark as benchmark import torchcodec -import torchvision.transforms.v2.functional as F +from torchvision.transforms import Resize RESIZED_WIDTH = 256 RESIZED_HEIGHT = 256 def transfer_and_resize_frame(frame, resize_device_string): - # This should be a no-op if the frame is already on the target device. + # This should be a no-op if the frame is already on the GPU. frame = frame.to(resize_device_string) - frame = F.resize(frame, (RESIZED_HEIGHT, RESIZED_WIDTH)) + frame = Resize((RESIZED_HEIGHT, RESIZED_WIDTH))(frame) return frame @@ -129,8 +129,8 @@ def main(): "resize_device_string": resize_device_string, }, label=label, - description=f"video={os.path.basename(video_path)}", - sub_label=f"D={decode_label} R={resize_label}", + sub_label=f"video={os.path.basename(video_path)}", + description=f"D={decode_label},R={resize_label}", ).blocked_autorange() results.append(t) compare = benchmark.Compare(results) From ddff9a187a7b103a1122bd57dbe4b44809ddef21 Mon Sep 17 00:00:00 2001 From: Nicolas Hug Date: Wed, 28 Aug 2024 10:00:16 +0100 Subject: [PATCH 4/7] Revert "[torchcodec] Improve benchmark to test all combinations" This reverts commit 1025e82f781bf1ad8e7326418c4983058e639386. --- benchmarks/decoders/gpu_benchmark.py | 120 +++++++++------------------ 1 file changed, 41 insertions(+), 79 deletions(-) diff --git a/benchmarks/decoders/gpu_benchmark.py b/benchmarks/decoders/gpu_benchmark.py index daa397159..6e19220c8 100644 --- a/benchmarks/decoders/gpu_benchmark.py +++ b/benchmarks/decoders/gpu_benchmark.py @@ -7,57 +7,31 @@ import torchcodec from torchvision.transforms import Resize -RESIZED_WIDTH = 256 -RESIZED_HEIGHT = 256 - -def transfer_and_resize_frame(frame, resize_device_string): +def transfer_and_resize_frame(frame): # This should be a no-op if the frame is already on the GPU. - frame = frame.to(resize_device_string) - frame = Resize((RESIZED_HEIGHT, RESIZED_WIDTH))(frame) + frame = frame.to("cuda:0") + frame = Resize((256, 256))(frame) return frame -def decode_full_video(video_path, decode_device_string, resize_device_string): - # We use the core API instead of SimpleVideoDecoder because the core API - # allows us to natively resize as part of the decode step. - print(f"{decode_device_string=} {resize_device_string=}") - decoder = torchcodec.decoders._core.create_from_file(video_path) - num_threads = None - if "cuda" in decode_device_string: - num_threads = 1 - width = None - height = None - if "native" in resize_device_string: - width = RESIZED_WIDTH - height = RESIZED_HEIGHT - torchcodec.decoders._core.add_video_stream( - decoder, - stream_index=-1, - device_string=decode_device_string, - num_threads=num_threads, - width=width, - height=height, +def decode_full_video(video_path, device_string, do_gpu_preproc): + decoder = torchcodec.decoders.SimpleVideoDecoder( + video_path, device=torch.device(device_string) ) - start_time = time.time() frame_count = 0 - while True: - try: - frame, *_ = torchcodec.decoders._core.get_next_frame(decoder) - if resize_device_string != "none" and "native" not in resize_device_string: - frame = transfer_and_resize_frame(frame, resize_device_string) - - frame_count += 1 - except Exception as e: - print("EXCEPTION", e) - break - + for frame in decoder: + # You can do a resize to simulate extra preproc work that happens + # on the GPU by uncommenting the following line: + if do_gpu_preproc: + frame = transfer_and_resize_frame(frame) + frame_count += 1 end_time = time.time() elapsed = end_time - start_time fps = frame_count / (end_time - start_time) print( - f"****** DECODED full video {decode_device_string=} {frame_count=} {elapsed=} {fps=}" + f"****** DECODED full video {device_string=} {frame_count=} {elapsed=} {fps=}" ) return frame_count, end_time - start_time @@ -70,12 +44,6 @@ def main(): type=str, help="Comma-separated devices to test decoding on.", ) - parser.add_argument( - "--resize_devices", - default="cuda:0,cpu,native,none", - type=str, - help="Comma-separated devices to test preroc (resize) on. Use 'none' to specify no resize.", - ) parser.add_argument( "--video", type=str, @@ -91,6 +59,15 @@ def main(): "to measure the cold start time." ), ) + parser.add_argument( + "--do_gpu_preproc", + action=argparse.BooleanOptionalAction, + default=True, + help=( + "Do a transfer to GPU and resize operation after the decode to " + "simulate a real-world transform." + ), + ) args = parser.parse_args() video_path = args.video @@ -100,44 +77,29 @@ def main(): decode_full_video(video_path, device) return - resize_devices = args.resize_devices.split(",") - resize_devices = [d for d in resize_devices if d != ""] - if len(resize_devices) == 0: - resize_devices.append("none") - - label = "Decode+Resize Time" + label = "Decode" + if args.do_gpu_preproc: + label += " + GPU Preproc" + label += " Time" results = [] - for decode_device_string in args.devices.split(","): - for resize_device_string in resize_devices: - decode_label = decode_device_string - if "cuda" in decode_label: - # Shorten "cuda:0" to "cuda" - decode_label = "cuda" - resize_label = resize_device_string - if "cuda" in resize_device_string: - # Shorten "cuda:0" to "cuda" - resize_label = "cuda" - print("decode_device", decode_device_string) - print("resize_device", resize_device_string) - t = benchmark.Timer( - stmt="decode_full_video(video_path, decode_device_string, resize_device_string)", - globals={ - "decode_device_string": decode_device_string, - "video_path": video_path, - "decode_full_video": decode_full_video, - "resize_device_string": resize_device_string, - }, - label=label, - sub_label=f"video={os.path.basename(video_path)}", - description=f"D={decode_label},R={resize_label}", - ).blocked_autorange() - results.append(t) + for device in args.devices.split(","): + print("device", device) + t = benchmark.Timer( + stmt="decode_full_video(video_path, device, do_gpu_preproc)", + globals={ + "device": device, + "video_path": video_path, + "decode_full_video": decode_full_video, + "do_gpu_preproc": args.do_gpu_preproc, + }, + label=label, + sub_label=f"video={os.path.basename(video_path)}", + description=f"decode_device={device}", + ).blocked_autorange() + results.append(t) compare = benchmark.Compare(results) compare.print() - print("Key: D=Decode, R=Resize") - print("Native resize is done as part of the decode step") - print("none resize means there is no resize step -- native or otherwise") if __name__ == "__main__": From da81f47b9081433f92067a1665c1bcf3770c571a Mon Sep 17 00:00:00 2001 From: Nicolas Hug Date: Wed, 28 Aug 2024 10:01:10 +0100 Subject: [PATCH 5/7] Revert "[torchcodec] Add CUDA support to SimpleVideoDecoder (#146)" This reverts commit ec5e63a84a94b68c961236e8fb171ecc562eb2c6. --- benchmarks/decoders/gpu_benchmark.py | 55 +++++++++---------- examples/basic_example.py | 11 ---- .../decoders/_simple_video_decoder.py | 26 +-------- test/decoders/test_simple_video_decoder.py | 28 ---------- 4 files changed, 27 insertions(+), 93 deletions(-) diff --git a/benchmarks/decoders/gpu_benchmark.py b/benchmarks/decoders/gpu_benchmark.py index 6e19220c8..a19c1d431 100644 --- a/benchmarks/decoders/gpu_benchmark.py +++ b/benchmarks/decoders/gpu_benchmark.py @@ -8,30 +8,40 @@ from torchvision.transforms import Resize -def transfer_and_resize_frame(frame): - # This should be a no-op if the frame is already on the GPU. - frame = frame.to("cuda:0") +def transfer_and_resize_frame(frame, device): + # This should be a no-op if the frame is already on the device. + frame = frame.to(device) frame = Resize((256, 256))(frame) return frame -def decode_full_video(video_path, device_string, do_gpu_preproc): - decoder = torchcodec.decoders.SimpleVideoDecoder( - video_path, device=torch.device(device_string) +def decode_full_video(video_path, decode_device): + decoder = torchcodec.decoders._core.create_from_file(video_path) + num_threads = None + if "cuda" in decode_device: + num_threads = 1 + torchcodec.decoders._core.add_video_stream( + decoder, stream_index=0, device_string=decode_device, num_threads=num_threads ) start_time = time.time() frame_count = 0 - for frame in decoder: - # You can do a resize to simulate extra preproc work that happens - # on the GPU by uncommenting the following line: - if do_gpu_preproc: - frame = transfer_and_resize_frame(frame) - frame_count += 1 + while True: + try: + frame, *_ = torchcodec.decoders._core.get_next_frame(decoder) + # You can do a resize to simulate extra preproc work that happens + # on the GPU by uncommenting the following line: + # frame = transfer_and_resize_frame(frame, decode_device) + + frame_count += 1 + except Exception as e: + print("EXCEPTION", e) + break + # print(f"current {frame_count=}", flush=True) end_time = time.time() elapsed = end_time - start_time fps = frame_count / (end_time - start_time) print( - f"****** DECODED full video {device_string=} {frame_count=} {elapsed=} {fps=}" + f"****** DECODED full video {decode_device=} {frame_count=} {elapsed=} {fps=}" ) return frame_count, end_time - start_time @@ -59,15 +69,6 @@ def main(): "to measure the cold start time." ), ) - parser.add_argument( - "--do_gpu_preproc", - action=argparse.BooleanOptionalAction, - default=True, - help=( - "Do a transfer to GPU and resize operation after the decode to " - "simulate a real-world transform." - ), - ) args = parser.parse_args() video_path = args.video @@ -77,23 +78,17 @@ def main(): decode_full_video(video_path, device) return - label = "Decode" - if args.do_gpu_preproc: - label += " + GPU Preproc" - label += " Time" - results = [] for device in args.devices.split(","): print("device", device) t = benchmark.Timer( - stmt="decode_full_video(video_path, device, do_gpu_preproc)", + stmt="decode_full_video(video_path, device)", globals={ "device": device, "video_path": video_path, "decode_full_video": decode_full_video, - "do_gpu_preproc": args.do_gpu_preproc, }, - label=label, + label="Decode+Resize Time", sub_label=f"video={os.path.basename(video_path)}", description=f"decode_device={device}", ).blocked_autorange() diff --git a/examples/basic_example.py b/examples/basic_example.py index 693c8c47d..abbc1b469 100644 --- a/examples/basic_example.py +++ b/examples/basic_example.py @@ -171,14 +171,3 @@ def plot(frames: torch.Tensor, title : Optional[str] = None): # %% plot(frame_at_2_seconds.data, "Frame displayed at 2 seconds") plot(first_two_seconds.data, "Frames displayed during [0, 2) seconds") - -# %% -# Using a CUDA GPU to accelerate decoding -# --------------------------------------- -# -# If you have a CUDA GPU that has NVDEC, you can decode on the GPU. -if torch.cuda.is_available(): - cuda_decoder = SimpleVideoDecoder(raw_video_bytes, device="cuda:0") - cuda_frame = cuda_decoder.get_frame_displayed_at(seconds=2) - print(cuda_frame.data.device) # should be cuda:0 - plot(cuda_frame.data.to("cpu"), "Frame displayed at 2 seconds on CUDA") diff --git a/src/torchcodec/decoders/_simple_video_decoder.py b/src/torchcodec/decoders/_simple_video_decoder.py index f189f36fa..b04411b8d 100644 --- a/src/torchcodec/decoders/_simple_video_decoder.py +++ b/src/torchcodec/decoders/_simple_video_decoder.py @@ -9,7 +9,7 @@ from pathlib import Path from typing import Iterable, Iterator, Literal, Tuple, Union -from torch import device as torch_device, Tensor +from torch import Tensor from torchcodec.decoders import _core as core @@ -89,14 +89,6 @@ class SimpleVideoDecoder: This can be either "NCHW" (default) or "NHWC", where N is the batch size, C is the number of channels, H is the height, and W is the width of the frames. - device (torch.device, optional): The device to use for decoding. - Currently we only support CPU and CUDA devices. If CUDA is used, - we use NVDEC and CUDA to do decoding and color-conversion - respectively. The resulting frame is left on the GPU for further - processing. - You can either pass in a string like "cpu" or "cuda:0" or a - torch.device like torch.device("cuda:0"). - Default: ``torch.device("cpu")``. .. note:: @@ -114,7 +106,6 @@ def __init__( self, source: Union[str, Path, bytes, Tensor], dimension_order: Literal["NCHW", "NHWC"] = "NCHW", - device: Union[str, torch_device] = torch_device("cpu"), ): if isinstance(source, str): self._decoder = core.create_from_file(source) @@ -138,20 +129,7 @@ def __init__( ) core.scan_all_streams_to_update_metadata(self._decoder) - num_threads = None - if isinstance(device, str): - device = torch_device(device) - if device.type == "cuda": - # Using multiple CPU threads seems to slow down decoding on CUDA. - # CUDA internally uses dedicated hardware to do decoding so we - # don't need CPU software threads here. - num_threads = 1 - core.add_video_stream( - self._decoder, - dimension_order=dimension_order, - device_string=str(device), - num_threads=num_threads, - ) + core.add_video_stream(self._decoder, dimension_order=dimension_order) self.metadata, self._stream_index = _get_and_validate_stream_metadata( self._decoder diff --git a/test/decoders/test_simple_video_decoder.py b/test/decoders/test_simple_video_decoder.py index 1187efbf1..e064b904d 100644 --- a/test/decoders/test_simple_video_decoder.py +++ b/test/decoders/test_simple_video_decoder.py @@ -45,34 +45,6 @@ def test_create_fails(self): with pytest.raises(TypeError, match="Unknown source type"): decoder = SimpleVideoDecoder(123) # noqa - def test_can_accept_devices(self): - # You can pass a CPU device as a string... - decoder = SimpleVideoDecoder(NASA_VIDEO.path, device="cpu") - assert_tensor_equal(decoder[0], NASA_VIDEO.get_frame_data_by_index(0)) - - # ...or as a torch.device. - decoder = SimpleVideoDecoder(NASA_VIDEO.path, device=torch.device("cpu")) - assert_tensor_equal(decoder[0], NASA_VIDEO.get_frame_data_by_index(0)) - - if torch.cuda.is_available(): - # You can pass a CUDA device as a string... - decoder = SimpleVideoDecoder(NASA_VIDEO.path, device="cuda") - frame = decoder[0] - assert frame.device.type == "cuda" - assert frame.shape == torch.Size( - [NASA_VIDEO.num_color_channels, NASA_VIDEO.height, NASA_VIDEO.width] - ) - - # ...or as a torch.device. - decoder = SimpleVideoDecoder(NASA_VIDEO.path, device=torch.device("cuda")) - frame = decoder[0] - assert frame.device.type == "cuda" - assert frame.shape == torch.Size( - [NASA_VIDEO.num_color_channels, NASA_VIDEO.height, NASA_VIDEO.width] - ) - # TODO: compare tensor values too. We don't compare values because - # the exact values are hardware-dependent. - def test_getitem_int(self): decoder = SimpleVideoDecoder(NASA_VIDEO.path) From 49fcc9335f05953250309d7e571bd6f6f84e41eb Mon Sep 17 00:00:00 2001 From: Nicolas Hug Date: Wed, 28 Aug 2024 10:01:12 +0100 Subject: [PATCH 6/7] Revert "[torchcodec] Allow sampler to use GPU decoding (#136)" This reverts commit 33677b8c177c01478080c61c12945cd19eafb8e7. --- src/torchcodec/_samplers/video_clip_sampler.py | 2 -- test/samplers/test_video_clip_sampler.py | 10 ++-------- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/torchcodec/_samplers/video_clip_sampler.py b/src/torchcodec/_samplers/video_clip_sampler.py index 384dd135e..1440edaeb 100644 --- a/src/torchcodec/_samplers/video_clip_sampler.py +++ b/src/torchcodec/_samplers/video_clip_sampler.py @@ -31,7 +31,6 @@ class VideoTooShortException(Exception): @dataclass class DecoderArgs: num_threads: int = 0 - device: torch.device = torch.device("cpu") @dataclass @@ -164,7 +163,6 @@ def forward(self, video_data: Tensor) -> Union[List[Any]]: width=target_width, height=target_height, num_threads=self.decoder_args.num_threads, - device_string=str(self.decoder_args.device), ) clips: List[Any] = [] diff --git a/test/samplers/test_video_clip_sampler.py b/test/samplers/test_video_clip_sampler.py index 4768f37cd..963a1c9ad 100644 --- a/test/samplers/test_video_clip_sampler.py +++ b/test/samplers/test_video_clip_sampler.py @@ -4,7 +4,6 @@ import pytest import torch from torchcodec._samplers import ( - DecoderArgs, IndexBasedSamplerArgs, TimeBasedSamplerArgs, VideoArgs, @@ -31,16 +30,11 @@ ), ], ) -@pytest.mark.parametrize(("device"), [torch.device("cpu"), torch.device("cuda:0")]) -def test_sampler(sampler_args, device): - if device.type == "cuda" and not torch.cuda.is_available(): - pytest.skip("GPU not available") - +def test_sampler(sampler_args): torch.manual_seed(0) desired_width, desired_height = 320, 240 video_args = VideoArgs(desired_width=desired_width, desired_height=desired_height) - decoder_args = DecoderArgs(device=device) - sampler = VideoClipSampler(video_args, sampler_args, decoder_args) + sampler = VideoClipSampler(video_args, sampler_args) clips = sampler(NASA_VIDEO.to_tensor()) assert_tensor_equal(len(clips), sampler_args.clips_per_video) clip = clips[0] From fd0378f8868ea03e31559a1e411ff6fce80df657 Mon Sep 17 00:00:00 2001 From: Nicolas Hug Date: Wed, 28 Aug 2024 10:02:28 +0100 Subject: [PATCH 7/7] Revert "[torchcodec] Add support for Nvidia GPU Decoding (#137)" This reverts commit 8fee167862e6dee8945e0c079f2ae786e6cf863e. --- CMakeLists.txt | 3 - README.md | 4 - benchmarks/decoders/BenchmarkDecodersMain.cpp | 3 +- benchmarks/decoders/gpu_benchmark.py | 101 ----------- setup.py | 4 - src/torchcodec/decoders/_core/CMakeLists.txt | 39 +---- src/torchcodec/decoders/_core/FFMPEGCommon.h | 2 - .../decoders/_core/VideoDecoder.cpp | 160 ++---------------- src/torchcodec/decoders/_core/VideoDecoder.h | 5 - .../decoders/_core/VideoDecoderOps.cpp | 9 +- .../decoders/_core/VideoDecoderOps.h | 3 +- .../decoders/_core/video_decoder_ops.py | 1 - test/decoders/CMakeLists.txt | 4 - test/decoders/VideoDecoderTest.cpp | 52 ------ test/decoders/manual_smoke_test.py | 37 +--- test/generate_reference_resources.sh | 2 - .../nasa_13013.mp4.frame000001.cuda.pt | Bin 389980 -> 0 bytes .../nasa_13013.mp4.frame000002.cuda.pt | Bin 389980 -> 0 bytes 18 files changed, 26 insertions(+), 403 deletions(-) delete mode 100644 benchmarks/decoders/gpu_benchmark.py delete mode 100644 test/resources/nasa_13013.mp4.frame000001.cuda.pt delete mode 100644 test/resources/nasa_13013.mp4.frame000002.cuda.pt diff --git a/CMakeLists.txt b/CMakeLists.txt index fc8d17c26..4dfeb0609 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,9 +1,6 @@ cmake_minimum_required(VERSION 3.18) project(TorchCodec) -option(ENABLE_CUDA "Enable CUDA decoding using NVDEC" OFF) -option(ENABLE_NVTX "Enable NVTX annotations for profiling" OFF) - add_subdirectory(src/torchcodec/decoders/_core) diff --git a/README.md b/README.md index 4640ad3e9..183120598 100644 --- a/README.md +++ b/README.md @@ -140,7 +140,3 @@ guide](CONTRIBUTING.md) for more details. ## License TorchCodec is released under the [BSD 3 license](./LICENSE). - - -If you are building with ENABLE_CUDA and/or ENABLE_NVTX please review -[Nvidia licenses](https://docs.nvidia.com/cuda/eula/index.html). diff --git a/benchmarks/decoders/BenchmarkDecodersMain.cpp b/benchmarks/decoders/BenchmarkDecodersMain.cpp index 5be64e6d6..a9762a0b5 100644 --- a/benchmarks/decoders/BenchmarkDecodersMain.cpp +++ b/benchmarks/decoders/BenchmarkDecodersMain.cpp @@ -145,8 +145,7 @@ void runNDecodeIterationsWithCustomOps( /*height=*/std::nullopt, /*thread_count=*/std::nullopt, /*dimension_order=*/std::nullopt, - /*stream_index=*/std::nullopt, - /*device_string=*/std::nullopt); + /*stream_index=*/std::nullopt); for (double pts : ptsList) { seekFrameOp.call(decoderTensor, pts); diff --git a/benchmarks/decoders/gpu_benchmark.py b/benchmarks/decoders/gpu_benchmark.py deleted file mode 100644 index a19c1d431..000000000 --- a/benchmarks/decoders/gpu_benchmark.py +++ /dev/null @@ -1,101 +0,0 @@ -import argparse -import os -import time - -import torch.utils.benchmark as benchmark - -import torchcodec -from torchvision.transforms import Resize - - -def transfer_and_resize_frame(frame, device): - # This should be a no-op if the frame is already on the device. - frame = frame.to(device) - frame = Resize((256, 256))(frame) - return frame - - -def decode_full_video(video_path, decode_device): - decoder = torchcodec.decoders._core.create_from_file(video_path) - num_threads = None - if "cuda" in decode_device: - num_threads = 1 - torchcodec.decoders._core.add_video_stream( - decoder, stream_index=0, device_string=decode_device, num_threads=num_threads - ) - start_time = time.time() - frame_count = 0 - while True: - try: - frame, *_ = torchcodec.decoders._core.get_next_frame(decoder) - # You can do a resize to simulate extra preproc work that happens - # on the GPU by uncommenting the following line: - # frame = transfer_and_resize_frame(frame, decode_device) - - frame_count += 1 - except Exception as e: - print("EXCEPTION", e) - break - # print(f"current {frame_count=}", flush=True) - end_time = time.time() - elapsed = end_time - start_time - fps = frame_count / (end_time - start_time) - print( - f"****** DECODED full video {decode_device=} {frame_count=} {elapsed=} {fps=}" - ) - return frame_count, end_time - start_time - - -def main(): - parser = argparse.ArgumentParser() - parser.add_argument( - "--devices", - default="cuda:0,cpu", - type=str, - help="Comma-separated devices to test decoding on.", - ) - parser.add_argument( - "--video", - type=str, - default=os.path.dirname(__file__) + "/../../test/resources/nasa_13013.mp4", - ) - parser.add_argument( - "--use_torch_benchmark", - action=argparse.BooleanOptionalAction, - default=True, - help=( - "Use pytorch benchmark to measure decode time with warmup and " - "autorange. Without this we just run one iteration without warmup " - "to measure the cold start time." - ), - ) - args = parser.parse_args() - video_path = args.video - - if not args.use_torch_benchmark: - for device in args.devices.split(","): - print("Testing on", device) - decode_full_video(video_path, device) - return - - results = [] - for device in args.devices.split(","): - print("device", device) - t = benchmark.Timer( - stmt="decode_full_video(video_path, device)", - globals={ - "device": device, - "video_path": video_path, - "decode_full_video": decode_full_video, - }, - label="Decode+Resize Time", - sub_label=f"video={os.path.basename(video_path)}", - description=f"decode_device={device}", - ).blocked_autorange() - results.append(t) - compare = benchmark.Compare(results) - compare.print() - - -if __name__ == "__main__": - main() diff --git a/setup.py b/setup.py index 75310ceab..fb5d0278c 100644 --- a/setup.py +++ b/setup.py @@ -112,16 +112,12 @@ def _build_all_extensions_with_cmake(self): torch_dir = Path(torch.utils.cmake_prefix_path) / "Torch" cmake_build_type = os.environ.get("CMAKE_BUILD_TYPE", "Release") python_version = sys.version_info - enable_cuda = os.environ.get("ENABLE_CUDA", "") - enable_nvtx = os.environ.get("ENABLE_NVTX", "") cmake_args = [ f"-DCMAKE_INSTALL_PREFIX={self._install_prefix}", f"-DTorch_DIR={torch_dir}", "-DCMAKE_VERBOSE_MAKEFILE=ON", f"-DCMAKE_BUILD_TYPE={cmake_build_type}", f"-DPYTHON_VERSION={python_version.major}.{python_version.minor}", - f"-DENABLE_CUDA={enable_cuda}", - f"-DENABLE_NVTX={enable_nvtx}", ] Path(self.build_temp).mkdir(parents=True, exist_ok=True) diff --git a/src/torchcodec/decoders/_core/CMakeLists.txt b/src/torchcodec/decoders/_core/CMakeLists.txt index d8554bdaa..0fe8f2433 100644 --- a/src/torchcodec/decoders/_core/CMakeLists.txt +++ b/src/torchcodec/decoders/_core/CMakeLists.txt @@ -4,28 +4,6 @@ set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(Torch REQUIRED) - -if(ENABLE_CUDA) - find_package(CUDA REQUIRED) - - if(ENABLE_NVTX) - # We only need CPM for NVTX: - # https://github.com/NVIDIA/NVTX#cmake - file( - DOWNLOAD - https://github.com/cpm-cmake/CPM.cmake/releases/download/v0.38.3/CPM.cmake - ${CMAKE_CURRENT_BINARY_DIR}/cmake/CPM.cmake - EXPECTED_HASH SHA256=cc155ce02e7945e7b8967ddfaff0b050e958a723ef7aad3766d368940cb15494 - ) - include(${CMAKE_CURRENT_BINARY_DIR}/cmake/CPM.cmake) - CPMAddPackage( - NAME NVTX - GITHUB_REPOSITORY NVIDIA/NVTX - GIT_TAG v3.1.0-c-cpp - GIT_SHALLOW TRUE) - endif() -endif() - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TORCH_CXX_FLAGS}") find_package(Python3 ${PYTHON_VERSION} EXACT COMPONENTS Development) @@ -41,12 +19,6 @@ function(make_torchcodec_library library_name ffmpeg_target) ) add_library(${library_name} SHARED ${sources}) set_property(TARGET ${library_name} PROPERTY CXX_STANDARD 17) - if(ENABLE_CUDA) - target_compile_definitions(${library_name} PRIVATE ENABLE_CUDA=1) - endif() - if(ENABLE_NVTX) - target_compile_definitions(${library_name} PRIVATE ENABLE_NVTX=1) - endif() target_include_directories( ${library_name} @@ -56,17 +28,12 @@ function(make_torchcodec_library library_name ffmpeg_target) ${Python3_INCLUDE_DIRS} ) - set(NEEDED_LIBRARIES ${ffmpeg_target} ${TORCH_LIBRARIES} ${Python3_LIBRARIES}) - if(ENABLE_CUDA) - list(APPEND NEEDED_LIBRARIES ${CUDA_CUDA_LIBRARY}) - endif() - if(ENABLE_NVTX) - list(APPEND NEEDED_LIBRARIES nvtx3-cpp) - endif() target_link_libraries( ${library_name} PUBLIC - ${NEEDED_LIBRARIES} + ${ffmpeg_target} + ${TORCH_LIBRARIES} + ${Python3_LIBRARIES} ) # We already set the library_name to be libtorchcodecN, so we don't want diff --git a/src/torchcodec/decoders/_core/FFMPEGCommon.h b/src/torchcodec/decoders/_core/FFMPEGCommon.h index b5ad4e039..7bb61cefc 100644 --- a/src/torchcodec/decoders/_core/FFMPEGCommon.h +++ b/src/torchcodec/decoders/_core/FFMPEGCommon.h @@ -57,8 +57,6 @@ using UniqueAVFilterInOut = std::unique_ptr< Deleterp>; using UniqueAVIOContext = std:: unique_ptr>; -using UniqueAVBufferRef = - std::unique_ptr>; // av_find_best_stream is not const-correct before commit: // https://github.com/FFmpeg/FFmpeg/commit/46dac8cf3d250184ab4247809bc03f60e14f4c0c diff --git a/src/torchcodec/decoders/_core/VideoDecoder.cpp b/src/torchcodec/decoders/_core/VideoDecoder.cpp index 5079042d2..c4bb1520f 100644 --- a/src/torchcodec/decoders/_core/VideoDecoder.cpp +++ b/src/torchcodec/decoders/_core/VideoDecoder.cpp @@ -5,22 +5,11 @@ // LICENSE file in the root directory of this source tree. #include "src/torchcodec/decoders/_core/VideoDecoder.h" -#include -#include #include #include -#include #include #include - -#ifdef ENABLE_CUDA -#include -#include -#include -#ifdef ENABLE_NVTX -#include -#endif -#endif +#include "torch/types.h" extern "C" { #include @@ -29,9 +18,6 @@ extern "C" { #include #include #include -#ifdef ENABLE_CUDA -#include -#endif } namespace facebook::torchcodec { @@ -107,87 +93,6 @@ std::vector splitStringWithDelimiters( return result; } -#ifdef ENABLE_CUDA - -AVBufferRef* getCudaContext() { - enum AVHWDeviceType type = av_hwdevice_find_type_by_name("cuda"); - TORCH_CHECK(type != AV_HWDEVICE_TYPE_NONE, "Failed to find cuda device"); - int err = 0; - AVBufferRef* hw_device_ctx; - err = av_hwdevice_ctx_create( - &hw_device_ctx, - type, - nullptr, - nullptr, - // Introduced in 58.26.100: - // https://github.com/FFmpeg/FFmpeg/blob/4acb9b7d1046944345ae506165fb55883d04d8a6/doc/APIchanges#L265 -#if LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(58, 26, 100) - AV_CUDA_USE_CURRENT_CONTEXT -#else - 0 -#endif - ); - if (err < 0) { - TORCH_CHECK( - false, - "Failed to create specified HW device", - getFFMPEGErrorStringFromErrorCode(err)); - } - return hw_device_ctx; -} - -torch::Tensor allocateDeviceTensor( - at::IntArrayRef shape, - torch::Device device, - const torch::Dtype dtype = torch::kUInt8) { - return torch::empty( - shape, - torch::TensorOptions() - .dtype(dtype) - .layout(torch::kStrided) - .device(device)); -} - -torch::Tensor convertFrameToTensorUsingCUDA( - const AVCodecContext* codecContext, - const VideoDecoder::VideoStreamDecoderOptions& options, - const AVFrame* src) { - TORCH_CHECK( - src->format == AV_PIX_FMT_CUDA, - "Expected format to be AV_PIX_FMT_CUDA, got " + - std::string(av_get_pix_fmt_name((AVPixelFormat)src->format))); - int width = options.width.value_or(codecContext->width); - int height = options.height.value_or(codecContext->height); - NppStatus status; - NppiSize oSizeROI; - oSizeROI.width = width; - oSizeROI.height = height; - Npp8u* input[2]; - input[0] = (Npp8u*)src->data[0]; - input[1] = (Npp8u*)src->data[1]; - torch::Tensor dst = allocateDeviceTensor({height, width, 3}, options.device); - auto start = std::chrono::high_resolution_clock::now(); - status = nppiNV12ToRGB_8u_P2C3R( - input, - src->linesize[0], - static_cast(dst.data_ptr()), - dst.stride(0), - oSizeROI); - TORCH_CHECK(status == NPP_SUCCESS, "Failed to convert NV12 frame."); - auto end = std::chrono::high_resolution_clock::now(); - std::chrono::duration duration = end - start; - VLOG(9) << "NPP Conversion of frame height=" << height << " width=" << width - << " took: " << duration.count() << "us" << std::endl; - if (options.dimensionOrder == "NCHW") { - // The docs guaranty this to return a view: - // https://pytorch.org/docs/stable/generated/torch.permute.html - dst = dst.permute({2, 0, 1}); - } - return dst; -} - -#endif - } // namespace VideoDecoder::VideoStreamDecoderOptions::VideoStreamDecoderOptions( @@ -433,13 +338,13 @@ void VideoDecoder::initializeFilterGraphForStream( inputs.reset(inputsTmp); if (ffmpegStatus < 0) { throw std::runtime_error( - "Failed to parse filter description: " + std::string(description) + - "; " + getFFMPEGErrorStringFromErrorCode(ffmpegStatus)); + "Failed to parse filter description: " + + getFFMPEGErrorStringFromErrorCode(ffmpegStatus)); } ffmpegStatus = avfilter_graph_config(filterState.filterGraph.get(), nullptr); if (ffmpegStatus < 0) { throw std::runtime_error( - "Failed to configure filter graph: " + std::string(description) + "; " + + "Failed to configure filter graph: " + getFFMPEGErrorStringFromErrorCode(ffmpegStatus)); } } @@ -488,37 +393,15 @@ void VideoDecoder::addVideoStreamDecoder( int retVal = avcodec_parameters_to_context( streamInfo.codecContext.get(), streamInfo.stream->codecpar); TORCH_CHECK_EQ(retVal, AVSUCCESS); - - if (options.device.type() == torch::DeviceType::CUDA) { -#ifdef ENABLE_CUDA - // We create a small tensor using pytorch to initialize the cuda context. - torch::Tensor dummyTensorForCudaInitialization = torch::zeros( - {1}, - torch::TensorOptions().dtype(torch::kUInt8).device(options.device)); - codecContext->hw_device_ctx = av_buffer_ref(getCudaContext()); - - TORCH_INTERNAL_ASSERT( - codecContext->hw_device_ctx, - "Failed to create/reference the CUDA HW device context for index=" + - std::to_string(options.device.index()) + "."); -#else - throw std::runtime_error( - "CUDA support is not enabled in this build of TorchCodec."); -#endif - } - retVal = avcodec_open2(streamInfo.codecContext.get(), codec, nullptr); if (retVal < AVSUCCESS) { throw std::invalid_argument(getFFMPEGErrorStringFromErrorCode(retVal)); } - codecContext->time_base = streamInfo.stream->time_base; activeStreamIndices_.insert(streamNumber); updateMetadataWithCodecContext(streamInfo.streamIndex, codecContext); streamInfo.options = options; - if (options.device.is_cpu()) { - initializeFilterGraphForStream(streamNumber, options); - } + initializeFilterGraphForStream(streamNumber, options); } void VideoDecoder::updateMetadataWithCodecContext( @@ -765,9 +648,6 @@ void VideoDecoder::maybeSeekToBeforeDesiredPts() { VideoDecoder::DecodedOutput VideoDecoder::getDecodedOutputWithFilter( std::function filterFunction) { -#ifdef ENABLE_NVTX - nvtx3::scoped_range loop{"decodeOneFrame"}; -#endif if (activeStreamIndices_.size() == 0) { throw std::runtime_error("No active streams configured."); } @@ -855,13 +735,8 @@ VideoDecoder::DecodedOutput VideoDecoder::getDecodedOutputWithFilter( // This packet is not for any of the active streams. continue; } - { -#ifdef ENABLE_NVTX - nvtx3::scoped_range loop{"avcodec_send_packet"}; -#endif - ffmpegStatus = avcodec_send_packet( - streams_[packet->stream_index].codecContext.get(), packet.get()); - } + ffmpegStatus = avcodec_send_packet( + streams_[packet->stream_index].codecContext.get(), packet.get()); decodeStats_.numPacketsSentToDecoder++; if (ffmpegStatus < AVSUCCESS) { throw std::runtime_error( @@ -898,9 +773,8 @@ VideoDecoder::DecodedOutput VideoDecoder::convertAVFrameToDecodedOutput( UniqueAVFrame frame) { // Convert the frame to tensor. DecodedOutput output; - auto& streamInfo = streams_[streamIndex]; output.streamIndex = streamIndex; - output.streamType = streamInfo.stream->codecpar->codec_type; + output.streamType = streams_[streamIndex].stream->codecpar->codec_type; output.pts = frame->pts; output.ptsSeconds = ptsToSeconds(frame->pts, formatContext_->streams[streamIndex]->time_base); @@ -908,22 +782,8 @@ VideoDecoder::DecodedOutput VideoDecoder::convertAVFrameToDecodedOutput( output.durationSeconds = ptsToSeconds( getDuration(frame), formatContext_->streams[streamIndex]->time_base); if (output.streamType == AVMEDIA_TYPE_VIDEO) { - if (streamInfo.options.device.is_cpu()) { - output.frame = - convertFrameToTensorUsingFilterGraph(streamIndex, frame.get()); - } else if (streamInfo.options.device.is_cuda()) { -#ifdef ENABLE_CUDA - { -#ifdef ENABLE_NVTX - nvtx3::scoped_range loop{"convertFrameUsingCuda"}; -#endif - output.frame = convertFrameToTensorUsingCUDA( - streamInfo.codecContext.get(), streamInfo.options, frame.get()); - } -#else - throw std::runtime_error("CUDA is not enabled in this build."); -#endif // ENABLE_CUDA - } + output.frame = + convertFrameToTensorUsingFilterGraph(streamIndex, frame.get()); } else if (output.streamType == AVMEDIA_TYPE_AUDIO) { // TODO: https://github.com/pytorch-labs/torchcodec/issues/85 implement // audio decoding. diff --git a/src/torchcodec/decoders/_core/VideoDecoder.h b/src/torchcodec/decoders/_core/VideoDecoder.h index 17a4f8a7d..e54731554 100644 --- a/src/torchcodec/decoders/_core/VideoDecoder.h +++ b/src/torchcodec/decoders/_core/VideoDecoder.h @@ -12,7 +12,6 @@ #include #include -#include "c10/core/Device.h" #include "src/torchcodec/decoders/_core/FFMPEGCommon.h" namespace facebook::torchcodec { @@ -140,8 +139,6 @@ class VideoDecoder { // is the same as the original video. std::optional width; std::optional height; - // Set the device to torch::kGPU for GPU decoding. - torch::Device device = torch::kCPU; }; struct AudioStreamDecoderOptions {}; void addVideoStreamDecoder( @@ -280,8 +277,6 @@ class VideoDecoder { FilterState filterState; std::vector keyFrames; std::vector allFrames; - AVPixelFormat hwPixelFormat = AV_PIX_FMT_NONE; - UniqueAVBufferRef hwDeviceContext; }; VideoDecoder(); // Returns the key frame index of the presentation timestamp using FFMPEG's diff --git a/src/torchcodec/decoders/_core/VideoDecoderOps.cpp b/src/torchcodec/decoders/_core/VideoDecoderOps.cpp index 9ea81839d..4b271f2eb 100644 --- a/src/torchcodec/decoders/_core/VideoDecoderOps.cpp +++ b/src/torchcodec/decoders/_core/VideoDecoderOps.cpp @@ -29,7 +29,7 @@ TORCH_LIBRARY(torchcodec_ns, m) { m.def("create_from_file(str filename) -> Tensor"); m.def("create_from_tensor(Tensor video_tensor) -> Tensor"); m.def( - "add_video_stream(Tensor(a!) decoder, *, int? width=None, int? height=None, int? num_threads=None, str? dimension_order=None, int? stream_index=None, str? device_string=None) -> ()"); + "add_video_stream(Tensor(a!) decoder, *, int? width=None, int? height=None, int? num_threads=None, str? dimension_order=None, int? stream_index=None) -> ()"); m.def("seek_to_pts(Tensor(a!) decoder, float seconds) -> ()"); m.def("get_next_frame(Tensor(a!) decoder) -> (Tensor, Tensor, Tensor)"); m.def( @@ -117,8 +117,7 @@ void add_video_stream( std::optional height, std::optional num_threads, std::optional dimension_order, - std::optional stream_index, - std::optional device_string) { + std::optional stream_index) { VideoDecoder::VideoStreamDecoderOptions options; options.width = width; options.height = height; @@ -129,10 +128,6 @@ void add_video_stream( TORCH_CHECK(stdDimensionOrder == "NHWC" || stdDimensionOrder == "NCHW"); options.dimensionOrder = stdDimensionOrder; } - if (device_string.has_value()) { - std::string deviceString{device_string.value()}; - options.device = torch::Device(deviceString); - } auto videoDecoder = unwrapTensorToGetDecoder(decoder); videoDecoder->addVideoStreamDecoder(stream_index.value_or(-1), options); diff --git a/src/torchcodec/decoders/_core/VideoDecoderOps.h b/src/torchcodec/decoders/_core/VideoDecoderOps.h index b391f710a..f3df2ada7 100644 --- a/src/torchcodec/decoders/_core/VideoDecoderOps.h +++ b/src/torchcodec/decoders/_core/VideoDecoderOps.h @@ -35,8 +35,7 @@ void add_video_stream( std::optional height = std::nullopt, std::optional num_threads = std::nullopt, std::optional dimension_order = std::nullopt, - std::optional stream_index = std::nullopt, - std::optional device_string = std::nullopt); + std::optional stream_index = std::nullopt); // Seek to a particular presentation timestamp in the video in seconds. void seek_to_pts(at::Tensor& decoder, double seconds); diff --git a/src/torchcodec/decoders/_core/video_decoder_ops.py b/src/torchcodec/decoders/_core/video_decoder_ops.py index 518803a70..1d6460ba8 100644 --- a/src/torchcodec/decoders/_core/video_decoder_ops.py +++ b/src/torchcodec/decoders/_core/video_decoder_ops.py @@ -116,7 +116,6 @@ def add_video_stream_abstract( num_threads: Optional[int] = None, dimension_order: Optional[str] = None, stream_index: Optional[int] = None, - device_string: Optional[str] = None, ) -> None: return diff --git a/test/decoders/CMakeLists.txt b/test/decoders/CMakeLists.txt index a5a26704d..21791dde3 100644 --- a/test/decoders/CMakeLists.txt +++ b/test/decoders/CMakeLists.txt @@ -26,10 +26,6 @@ add_executable( VideoDecoderOpsTest.cpp ) -if(ENABLE_CUDA) - target_compile_definitions(VideoDecoderTest PRIVATE ENABLE_CUDA=1) -endif() - target_include_directories(VideoDecoderTest SYSTEM PRIVATE ${TORCH_INCLUDE_DIRS}) target_include_directories(VideoDecoderTest PRIVATE ../../) target_include_directories(VideoDecoderOpsTest SYSTEM PRIVATE ${TORCH_INCLUDE_DIRS}) diff --git a/test/decoders/VideoDecoderTest.cpp b/test/decoders/VideoDecoderTest.cpp index 1fe19316a..057148b36 100644 --- a/test/decoders/VideoDecoderTest.cpp +++ b/test/decoders/VideoDecoderTest.cpp @@ -17,10 +17,6 @@ #include "tools/cxx/Resources.h" #endif -#ifdef ENABLE_CUDA -#include -#endif - using namespace ::testing; C10_DEFINE_bool( @@ -205,54 +201,6 @@ TEST_P(VideoDecoderTest, ReturnsFirstTwoFramesOfVideo) { } } -#ifdef ENABLE_CUDA -TEST(GPUVideoDecoderTest, ReturnsFirstTwoFramesOfVideo) { - if (!torch::cuda::is_available()) { - return; - } - at::cuda::getDefaultCUDAStream(); - std::string path = getResourcePath("nasa_13013.mp4"); - std::unique_ptr ourDecoder = - VideoDecoder::createFromFilePath(path); - VideoDecoder::VideoStreamDecoderOptions streamOptions; - streamOptions.device = torch::Device("cuda"); - ASSERT_TRUE(streamOptions.device.is_cuda()); - ASSERT_EQ(streamOptions.device.type(), torch::DeviceType::CUDA); - ourDecoder->addVideoStreamDecoder(-1, streamOptions); - auto output = ourDecoder->getNextDecodedOutput(); - torch::Tensor tensor1FromOurDecoder = output.frame; - EXPECT_EQ(tensor1FromOurDecoder.sizes(), std::vector({3, 270, 480})); - EXPECT_EQ(output.ptsSeconds, 0.0); - EXPECT_EQ(output.pts, 0); - output = ourDecoder->getNextDecodedOutput(); - torch::Tensor tensor2FromOurDecoder = output.frame; - EXPECT_EQ(tensor2FromOurDecoder.sizes(), std::vector({3, 270, 480})); - EXPECT_EQ(output.ptsSeconds, 1'001. / 30'000); - EXPECT_EQ(output.pts, 1001); - - torch::Tensor tensor1FromFFMPEG = - readTensorFromDisk("nasa_13013.mp4.frame000001.cuda.pt"); - torch::Tensor tensor2FromFFMPEG = - readTensorFromDisk("nasa_13013.mp4.frame000002.cuda.pt"); - - EXPECT_EQ(tensor1FromFFMPEG.sizes(), std::vector({3, 270, 480})); - EXPECT_EQ(tensor2FromFFMPEG.sizes(), std::vector({3, 270, 480})); - EXPECT_EQ(tensor1FromOurDecoder.device().type(), torch::DeviceType::CUDA); - EXPECT_EQ(tensor2FromOurDecoder.device().type(), torch::DeviceType::CUDA); - torch::Tensor tensor1FromOurDecoderCPU = tensor1FromOurDecoder.cpu(); - torch::Tensor tensor2FromOurDecoderCPU = tensor1FromOurDecoder.cpu(); - EXPECT_TRUE(torch::equal(tensor1FromOurDecoderCPU, tensor1FromFFMPEG)); - EXPECT_TRUE(torch::equal(tensor2FromOurDecoderCPU, tensor2FromFFMPEG)); - - if (FLAGS_dump_frames_for_debugging) { - dumpTensorToDisk(tensor1FromFFMPEG, "tensor1FromFFMPEG.pt"); - dumpTensorToDisk(tensor2FromFFMPEG, "tensor2FromFFMPEG.pt"); - dumpTensorToDisk(tensor1FromOurDecoderCPU, "tensor1FromOurDecoder.pt"); - dumpTensorToDisk(tensor2FromOurDecoderCPU, "tensor2FromOurDecoder.pt"); - } -} -#endif - TEST_P(VideoDecoderTest, DecodesFramesInABatchInNCHW) { std::string path = getResourcePath("nasa_13013.mp4"); std::unique_ptr ourDecoder = diff --git a/test/decoders/manual_smoke_test.py b/test/decoders/manual_smoke_test.py index 389aa5f4e..7351155c1 100644 --- a/test/decoders/manual_smoke_test.py +++ b/test/decoders/manual_smoke_test.py @@ -4,36 +4,17 @@ # This source code is licensed under the BSD-style license found in the # LICENSE file in the root directory of this source tree. -import argparse import os import torchcodec from torchvision.io.image import write_png - -def main(): - parser = argparse.ArgumentParser() - parser.add_argument( - "--device", default="cpu", type=str, help="Specify 'cuda:0' for CUDA decoding" - ) - args = parser.parse_args() - - decoder = torchcodec.decoders._core.create_from_file( - os.path.dirname(__file__) + "/../resources/nasa_13013.mp4" - ) - torchcodec.decoders._core.scan_all_streams_to_update_metadata(decoder) - torchcodec.decoders._core.add_video_stream( - decoder, stream_index=3, device_string=args.device - ) - frame, _, _ = torchcodec.decoders._core.get_frame_at_index( - decoder, stream_index=3, frame_index=180 - ) - if "cuda" in args.device: - output_name = "frame180.cuda.png" - else: - output_name = "frame180.cpu.png" - write_png(frame.cpu(), output_name) - - -if __name__ == "__main__": - main() +decoder = torchcodec.decoders._core.create_from_file( + os.path.dirname(__file__) + "/../resources/nasa_13013.mp4" +) +torchcodec.decoders._core.scan_all_streams_to_update_metadata(decoder) +torchcodec.decoders._core.add_video_stream(decoder, stream_index=3) +frame, _, _ = torchcodec.decoders._core.get_frame_at_index( + decoder, stream_index=3, frame_index=180 +) +write_png(frame, "frame180.png") diff --git a/test/generate_reference_resources.sh b/test/generate_reference_resources.sh index ccc7262e1..e90e26ae8 100755 --- a/test/generate_reference_resources.sh +++ b/test/generate_reference_resources.sh @@ -40,8 +40,6 @@ ffmpeg -y -ss 12.979633 -i "$VIDEO_PATH" -frames:v 1 "$VIDEO_PATH.time12.979633. # Audio generation in the form of an mp3. ffmpeg -y -i "$VIDEO_PATH" -b:a 192K -vn "$VIDEO_PATH.audio.mp3" -# TODO: Add frames decoded by Nvidia's NVDEC. - # This video was generated by running the following: # conda install -c conda-forge x265 # ./configure --enable-nonfree --enable-gpl --prefix=$(readlink -f ../bin) --enable-libx265 --enable-rpath --extra-ldflags=-Wl,-rpath=$CONDA_PREFIX/lib --enable-filter=drawtext --enable-libfontconfig --enable-libfreetype --enable-libharfbuzz diff --git a/test/resources/nasa_13013.mp4.frame000001.cuda.pt b/test/resources/nasa_13013.mp4.frame000001.cuda.pt deleted file mode 100644 index 17c59fd4fd605422991ee6b2071d501f14cf7ea8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 389980 zcmeFa=UW?Dy7t@W>@Ynxpjf4x69^DF=bTKACI=IYiN?kT3^v9&r*>#}x83fXr_=Pz z>^-Sx=AFII?AdQR=lyc7_v`sP&b?|$MM)}Qu)(3NzMf0HR0siO)lawX^@N6+fB47O zUVHuZ*Mk0wdQJJ-z`>!h{qw^K`vwjTBqWv>OJC~@_)i-C?}^TUEYyEeg={M!ktsw& zDr2`4GPx>5Xk>DckSnyJAya6#7kx80gVLa2jJU-k$w8T#hD53g4*siH z(0?YWTq7D1nOZcq^dcb-mMgauTY52*2Xp@gTv8H=B;ZK+ZukuB=otuw=dHe;Md6Ht zTfOc=z!}gMfin(@!Wjp*2xmM#B(k3Qm)7~rlNpO(GSedge5P;)he2bCXi8=t&UgTM zOo+fA8}KC|pEpBh`Y#gd{EI>x2Sfk6i@#rQ3C?)%R$tGeeBRM3G5qA=GZ1_R!hH6T zue zf$idR$m=ESKX2JNA^rx>=TNo=f1KCP3WbTnnHtU%%fV#cn9txgZ#z>mN5RJ?_BGMZ z0ay<3mnfNkdVCJ6Xi;>84?cr45azQ_(Y=WJnTIf4C|Fy-5!|JG2At(`BLp)qo`qx< zD(8*)O!YJMoI~-MYGxsvg=Bs{$}O@cOjJJ$X$&}r;~k;x2Fsa_({A+W$*5Zjy7K~p=FX6k{^ zTTy?5H#gvH0M1l7(_3CSW5JUdD5jqCPmj-X?mxdPg1ZxN`GoI=&%lnJf#6r5_ehw} zTlOU$qrin*ZyT;n;Ioj-L?m-?7V>$0t-!XRH7ZI=1AGRYp``(5pqNKA4`-IOB7}Tq zRAvNqHh^fnl?dTXRW#3M9?l?hFqZivJMBNqm27ZOMJ*~7wyK}QeBM#)gr9tqXW)79 zd8_$U__Qt>G$$eWc0&M)W|whP1Q`8;Siw&h0Z;hYyVS3cEA0x#Arh=b!G)YLBVB((PlB?=uMQl(zT7!Y#S zNEgAkq5jNJCsUaFvAMPQeqyNCm0YG2jgZ_9d0~VzIyQ-x@WZy@41|0c?y!CibsdE| zE(&LAu?E8#M_vU!Q#ecH2JksbVn93%oGDQOXQaRZ&RpmM_$(wd;QVUx8JEm9TzKK9 z2%mvXoPjW(eIyT5&OTnfK>At9I(hL7ID^byILlBiXhcY5CV0_M;0$ZuAV^A{zq+P> zEQB}U%!y}`v*Cra3~3=KW<*K}To)qR>F>b*CiGyyEu^?;gwoZU)6BwJ(e2UC5Y^%m zI^>1n{lX@$t?)y_XW(hiK**P2SU+<{N2t%^n?KGINt9P22f2D}5od#O@OU#uI zI^>11{)MN#_QKyEJ_CdP(DVe<39m^Lj=X55DU#`0&SL{l6ua> z*5LSzy9A+}at3>WWj;jtjDx&>_J_0A!RE=#!P%yO8P07`DpmG?;5RM<7ovX}@wdf4 zr|=t#n_Pq{W(oQF3E@8rO=&+w2V4#z?mq7F3V%I(2A=8+gm~S-V%ypNNTIHyP{+f3 zrivPHrp^Y1vyjiQH7J}_YA4TU(FNr*-Y){+OtDP27x4kX2YiTd_$sylGC$@n=bwna zC5a+>lUU{-wiA5z^EyIa7=d4Ss>?6@&EYe!;TZ^gwek1EeBNGvgA=zjH{)@)cA{5B zlQ$TLL=M~86eUB>1_`Xu<_^iy)YAZs0cT-sz-Mq05C)B@cTMeU>XQh`%&J@nSS#WY zq^P~z_V>4Wxh_g4+Sg%5PW*A53Qyp4;4jgAocb>cp!=!a`^kn?YYZ(+cS zhE#494Vl8Wr2ujRLR2}^$KWSMNzF7QG7ADn@Fgf)AXKG}ropPCN%+u8z64!O!iLHe zTC_sz!4)VoB!!1Y1pkEi{qZ~CIT=+9A4)b_G#HgDIEd2bbakL94U+_K4b))wzYR$L zSic)GRZ_hF(pGh~XfX>8Zq?tT*V`)woA95zpUx`{7Je;u* zg)I@D;itzpPx!UZ&pQz$iEGhKk)qg4X=3ihcgiE$m&MxX~0L8p`rk)0` zoWW-*o_Rh)KO;1TIGZ&ESdMq+Sd0k(wNhc%>)nZo`AJE6F)?ZR`PIe6by{t7WTY-K z3RU4|f@O7_QWXnC^Gx0$K7-pK5G@90lA#@{mCDZU4^lGow~ya06kKX_xycJQ{IFN* z33|oW3nZE^%0q2Z_ zLMGCfk_`Mj^6NN}>;#R4*%5TRFc{7>=Z%Lm&t$dMO#?>^`go@!JuN<8v0D#5PYoUJ z@0rTYs)qS&u_SPCPBEK3CR6;Ls?NHa?!2tp#JIxToQAB-+RW@avo&3%iAMm=JIZG< z6}>%tRwy+z0ut>))uo2Yuj7?7zj%y<4!Ypzfmakmul%1K;^h$f@Fw`ozZAKJxX&zV zKI330{p^2TXo9ku1CNC2V@3sY@NICeo%cwnJUS)j>xr~h6V0Qe#Tw#Y3X%WJyATk- z)Qg}_g-qcH2ymDxX9{O7hYd$a&ITu*?NL&g8&J`91bMJ8t%91v*v?bxVi8gU35si2 z&5Y8K8keV2*qxTRuC{@aqAI674#)zp%zATndUknkp+%+Zsi@dnQc{+klb@1Wl$g>| zQr=wK9BE78|psMoXqwXohhIwYk-TzRiNs9w<%5aQ(!`tU2p=TQCSsICr1bg+IF#WH`8 zayZm2h4Th{=HX1mGj$2TF7TOyGm2mA6wXvm6Owa$UI!rZEByIPYEn2pdz=}`?i?L! zahPM(tP!C%SnUpXN zov(Up_Kdm6M+8v{YxL4mZ_jdoq%pR6Kic8MS9U zGzm;VXyX|KHK>DC^yc+5r>MonGnt1g?t6sN&k9D*hu@4Xg|K(@`dV}|g*(V7uYMM)YcHjJeBPvx z_Nm;*bm5@pGj}VV=S=ZSO$?v2vCe0F)t4Ya#4|#pi+8xPtj6Tit8eVzchsy)Kq{TZ zoTSyGiV)o`jOa!pRcaAgahdJaZC!Ppy^TFp#dV4ZHLEh~^p4cDe7nPAvBeoo(OSJj zqqCchmZXGao5^F+5k3cyncfW)&ptlWokS$#1q3Z)6y6g11qwfeuHG*FtYi%|0#r0Q z1RJmbDBAnS`I$`WPGM(Mer^7 z48hFFW`0)@{X7Yr!DNbPETErp&|*u|vhMntzO|JbD!CJ$GqIgjRxS$#<4$xkMi(Vl z#~R&3ZG(FXY7%V;8Hu?%jPqtqDm6Nh8bN7RZQ*Bj>oj^s!P?CU$(}q>IFp0mc0lMn zEP^I`ym)*DrFle?MTq{TN`+c9KxRHfU5-FRhq&^dFD1f1{dt{%5HE+&hhK6&i#Dkv zb6}sye-@J2>qsjs!4Tfy$P@567|WceL3B0U4MeIlo)%&oMl`-e;Y?*Sg)`x^E|$^9 z+3e{ib8>oeIkJ~gEl7fta+q*JfM2EB$ZE}QQ}l4>P<>@fjMbyjIMiypQe#7CG^Cv! zQjXD>R4F52&{{Lo@@DqUH+yfoZbfAeR?&1`Ot1?r>OaHZ;PrEWiry-pl?oQYBl__|I>eRty!a6QxzG0u zgm^iGJ{;!rhWeTBejKm}h3Kc}Gxaol%9&(qfX}cv0B0@<%`2V*_^dK|H0DH&Hcl$D zMeQ;wBsP=>3i%8~1I}@Y>2VhKV0%CK>@vrptQ$4mT2qWdZB-~NNQb6{)vUs*Qrgsv zp}nR1!pgOZoZ9Eh=U_?;XBrAAy;VLdLr7>*@ys0z^ZEG_?&bLDA%VLI-U_!cg69Kn zrDMi=db58%vx>iqxz8a&CzX3crqByQd@eS1gGFuydv*a9vH0B(`Om@1Irs=S#u}5X zHw1tfG_e7f5f-B?}UP}ZIvo9D158Fg+}gXw`*=x3CB zqof5QR<3a=w9z(8d`VI5OxILh)*hod5nnP}QuKxds*N?8L=&ynFKA$qy3GAaCnlhA=GnrLZ!tl-RfoF!q1n$p}s?|ks}S2#`b zmn%g}T7=h{-&$}1zZ}E~|CU=h1A>2E|K-#1dHppOy0k>J@!A z8V<9=Xe-GrsxNIzbLW~3acahnVTE`*fVlw)4LBnukI}nXL##pPG8tm#dS}nfp2{z5 z(CA{376Sj|S@N0o$_wT*%?alWAJQ<2#8dD&7|~%qZ-qwT#|EAOe<%y?Jq4fF;S4db z!+aJaGez|C;WLzZuwV{2@)+eDT36$FHmRQ}oQbEw4G^TZGl4TYV5mGQHL}{gMb^A> z7COC@&vJz$-czVnxm9co<+DZ~gVJeEDibTI})Y-M&$S8Z=)cCATf*J)$TCa=S+RVO0E#WO^8kaDI+wyK}Ei_bne zZBVGZi5%33#`!@!0iRKKDU>39*N#9-2W}Vgm#6TO4ZOI+_h0%mAo%C?U-B=2%`JF; zBk%>bV|=D{wP8Mc8)*uf@bhpc72F)3>7F2MPXst)KTZKw`}!2AbqO>Gq5)Nn8{(OG zBXT=bu0|b8{S9oDvKlg23VlS;=NWwVM8}sGHD{%kLn?F5wo9w`nDvP|RV>xvfHMN^ zIN*4sxiXg~SE_RA%yI`jZ7o`ia_oJUeD>=&O=kpzs0W8pLqcs15oD8;Q3-@QQ8_~Te`3Umw=ahbE$*Gr z&r*pMa&cFbGE!kt8{+_B7}OSnJ1r@{BD1t6x6*A(Fl!tt)`jkNs3X0%1I}2W!zY0=22pX{IV4i6l5xR&hJKEesUoB-_^dU1bcO^NASPXO zR$6gwesx1pZJZ+sS#}P48Y0G?X%)a3l%{-EYhr-tOm|+iHeRiYj*KwCqX1?%*3Y7F z#=#ev&q5Xb1bl{s4pz}&{rpoU@Wy|aKa>Ucw#a93IBy@H#mM~P^7+Xm^wa2PVn>h) z6p}|r8`EJy;H-?L2^(JV?9XTFIfKkpJj_Bab9I&d~RG!rrel>U=67VwLTdEq7vA0 z{t3TFB^Hl+n{g*q*=k-^kd_9AX9u&T4h3hb%LGKOx4GL$FnT8k6P|jR7-8!6oeCEka z^)v3mk(S7vyP{0c&pe;eB1tB-!QVh)MubF*F9EPRV=6)m32jcEZfqH=u5HLKIyo~p z&^?-(kR2PHVYehIOvwnqS!GPq7*Y^a@oF)0#hgSdWul~ZSmMu;&%SyVGX2mS!S z2eTeFMjbjd7Di)1r6dU-qJvxx@w#u}Yn!gU7ln_{0V%YvkuJH-YwB1BvK>!5sVX388k*h8cSDncN{cN;kXmzO!o6u2GKR+

vP@-w7fAA%TwD6F>6(Ab84uNQn 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

+3eN<=gU#|@xcf_S1gx(L-=f3E~Vl(@fjof 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�y-qQ>k|KQ#8{_((2N+M>J&AV3IRMaps%YywR2H$XIq z;ARvK`V9gvL>;;=3MH`9@_?G~*(i0G-^~^wDIA*5fJl-zgwM` zn)S=-XMiSAulGrWMt=e{WyMJ5MpT8p;y%h7 z)XADxk`5juQR6?~xnn?k^`;n2%W89$blp((&=6C4O+Q0sxm2NvN1^CKW3Y^bw#p6s z4e~cgpMF#Lydd+I&+C|bWAFJU@p)&L33|)|*gS<+->(<&c?svm9uP=TNq5T{5cR=~ zSiw9UGq>gG~ zGEE(*hg@fBXD{Dlhd>Jsa27&T%#xLEzs85tCpIK=>Gwg}-faNhFy zjb+<6;fdeG=lHpJ@tAAb(Hq)9>mJe9z2(h4Y+pA2nYqT28qJJjojCWZi=}SV0#Y{e zG_=`ABQz#U0b2ty+fI)l=M87T z!0V36E?ARgL68x#G1%b4Gbg01hNB2+v2ei-*Y8Ng{RCKu^^FS+v}LcBI&@Az`n;pADRK=0f1a0%L_5C3nnVsx zg5UeDVHW9WIxJ=D44kc!@klO5WL%(uu_+|yd6D@Xsc5;{ieGS%nxe8(D8osYjC`e# zvsiG?ibWRttGmkEkMEDfbNH{XH+&XIe%2qHwMBAco^$-Od2Rho0Mhn%xb_OXDSW0r zWoI`_L?49B`-8C$&Wk-D#^*RI*08L{65YmUC5fX1kEMiG4z|EqfT{fl?&M1Z7Au62 z;tSz3wg6a$v6{NVWVso!S9L-b6vI0GNV!Lj>wMCRk2ZGl>da=HPSku9e&=!e@MpIG>?(oX=?B$W;gcwe*!*T#rPq5o?JRKFi6G z=M!1S3i7CHI-mkxPBCIK%Tdla{C2!_oZ49M7(fl5sZ7bGYvaL1&FaGELc-4BMenK0 zBKS;|_lxj3l_+RLLuvS2EL2(O3$C?4uvg`?RHm$9SrdE9=WDR~7T$PM_>2xImQabz z_{gk%OkRw}*DDRxH;MSHF{KwT%V%V>gxa%39uUbB?1>z0;-H-8hwXuylB3)T_Y@wM^T? zWy0KG;s9I5l35o&>c1kvFCtmsED~B&bS^{h>#O`9{ZE#QSK_lS8{G2wTL|74{FUDn zKBJtQt*~J5F}!(>;W~kDy(iA7`1*_S88W~YfddN_8M?}=LJUEQEaVXZ-w|^-+{Jkzs$7=*vH0&Ol$PT%H$#D%HDc{uXMX}u%!?o91K8id5q=*p zkACv+=0Ee)say&G7Xbu{eRTWet=w_*mnY9X_gqR$Xz^KNAvrfL!7h!HhtEv#$61k` ziFXHlCM6NGN;RhN#;@~A(#l-5kZy`R+qmerwlAML{egTn>oZd; zQ?i&=@f?9Jzn*z!e`*z zKY*!21RX|;w_$eI(^yUdJUp+wF7q#2Lb>q4p6MS{x1jip@zz9i0iQ)qO3!CJuE2Ss z#ysGGOF|Ps^Z2FG+s|*kU4e3NPo0C}b7V*dMDK;q>gB{>mH=lEO{Zsdbar%vd93Ce z6DuGZGE>e^Z!OJ+xwxV6OoOQdSB%dn)DWK6Xsp&7OVx=va(hO(am{2-g zU@{P!_zKw0w!~l)4#$09Yzr5~#lmDSx-Hb`&VcBUf64htfO81RC{4m=#+XbumfN9}oo7SVWA#RHj6p4b~9=QFPq+Es*4Q3NIJ;y`XD>W3Z8{z~PM945cA6g7FNW zr|TuzP%n zfrrXrMdV5E1or>p?8&XQcX_jL70i3cmEyOVZmd$`ipN%G01LvKWntlDmB|u^$#)$L zX|RmQqV{d6Ro^$CvvBV4`FMhNk5~Pw@Huj8*yC`B_zcRt{VYD?+}I1B<$q4`S^a~8 zGkn9GrUntHDYZz+PbTU^q%!I&Y}(I)SgwDAw+wK`u>gv3IE&JN3!!tcQD5FzIlDN! z#f*UjZYlQ4}+OE9d8PZXZRev9OFx@51jcruqmrjlqNO-EuM$*_^ znmI}Oj>W~(Iwi=A>}+1zTs^s^9w=b@)o;`Kyz0J*c=jXSV zmrpn9^W_qg5sa!^5Ks%ztxWc9&l+TlVh*~Lk_+b!pZ7?rW4l@lqLYQa+>PAeOe&K( zATmn9d}_Yk%3rPM=>EP^N(TCeC4&RyzTTnKuh#X0;-9G^`&rbA*%jsZHJYVppf6|w zeJyl>xUwiwTOF*Gho%tXyGjG0Gy&1U=@EU=d!v`mtp1@%q7DX!rz%X$0CU0f0Nvz#+Bo<&8#NQ4Hl8Rfx7 zh^Fgr)W=uHt80~!r8paNNN`sp;;u9>SsPoVqmX=Y%tA$0PZD3u&7PW{JB^TIA0ZDj zsW6t8&N1M6ZS}(X+Qp6aOAvd0fzj&>U7zC{VRP#e#D=|Z4_4nA7%TOTSBTjtO*cm7 zcvB$wJ&3y?FEknLuyS!q+|ay3mfllZJuRD!=1}l&wlXvN4LNF;^A+8b^q3l zZ@&2C{*7y2-?)DFvyZ<1B?F;i171O319zBl>0Y zS#XBT37knpUk@_ah@?qoAv%}O0oQ|d@p-6BdWRMGJOP=5|2gI}>lkU9N;L1D8J|HJ zsv&W7MD%_^x0)26F*q@pjnDG^irB!8-*$&(59H*Fkq_qGz}^ zGEg5c&s;k7!P?9=FFQuc&}qn9gLKg6&V97AbNP!ezPWSfci(*T-S6-H{?Xk>kM7*Q zbMwZNZ@&BX%ZK-V^ZSQ)p4_?hEr|Zr^>1!|bXR=7{=vWe=>0E0xP0qEAoJ(Qd+*-3 zaQ5S^^$R;&mtivH#_D;@ern+J(!xo;8fGS!LG&PQjh^AH_0!Xn3-Wa&UJg%Y=|44} zR#>I1A zTsr?(7th@|clzUvRcL$}AY(bNES|xCPW%aubc|caH!+<0$& z^e-!uJ@wi^eWAJt{~)Vs#8#tgUoLGr3 zodzD8FowNnJh*NKYkUWBA9zVI&7vmo8t5(Ki^hb;FfcyTGIK%wviaPEbH~4NY=E4) z&>}wf75ppmKYN?m=YsY&gV%lArtu5Tl;X3M2I@-}-yf|^^mGrTT+rUIG>4y#<`Inw-7~|DZVZ)9mBa6J9(MV;GK~v=ortV z)wz&rX=EB-F2Tm$ie_=DK3}ciMX!P;`PgAEghb>32`EnDsKfn9Qnu=b^Vz~p4iasm zQvMSiNWGj~7YdZd!Or;y<2-WC4EK(gdaCoKxwCU;&d;1$8l1uB%&o(C#(O`|H;-Js z{MF-!fA`z3|L*Z`|NiSQpL~4v_We75`{n1~U48G%chBC~Ir-t{#+9Y{GqY3MjoLbi zIP{_%9GDsCCw0^7Ir_KgYJT6s>7|2FTLG zaN}rF6+<+OR4Vq>m?N@5o&cZ3{xmqFwBa*kCWHe4$ncpmNy{1AsO&R!AmH2$P6x&Z zhbQ4Po(;UvFP6_bD9}c!O)k@oh>qQhUzZ^yglzyoN=S&YN_UuyMqID)Hv)d(C|5sa zgvx08MMJa&kS9tE>Li}o0-I4lqTVL(8P^SPjv`D#f)PfYb7z2awKUb}ovd|DoUU)~ zkUq4+c=<5>0Vz!e`xm<3o|>+m-CDi2Jp19&%+AUbq$hS5V&kYUn1tidF$WvntfSso#RQDOG6!`Tc5loX0{7d?}` z?wRcM_Iysmxx?pU1LV|&zF0nc%Q?2F3;fS&t7^%wd@sE$lApo8Jt5X|0jG38t|H8pTpH1=>t4?ji2YUC{e z&WuLKj~xkf95g0tOT@ep;78Bk`s&$B7p@ZphhXvI2ImD~hwJJl=f<>RD*D(nDV6#w zh;XW2JpHQZ<>m>8_eki`NTdb73d~S|y>>;87bW9L0_2)`=Y0Dt(mj*C?wRcMHhj*3 zbBE6mMum*4rgp;34^<_Epg1o?&WB7GfeZ+gtG^Al%ay3Sd-1Mz!4NJ zqDbsl2x&rhByL`M{SZRw5a5ZR;Ai04?V^CBE=}G5U&b!nC`YLGKMT}0Ns781Igq9{ zs8;3~ zY*#&fTM{9n$#6siXyG zA~aASp#+2iXKn%)<(m;Xd$j%!*WsjVVZhR!}^CecxJAl&tYQb6E~7e9r`%x{H0 zHMN06i-FG&8%vv03h^X){%tDd>&W>vGn-X6<}uPYlq=SF)Q~({O}BO0D7JD+>G1hT z@$sN9rVXEEN;7S@;B1KA%}#EPVexB<#^$>~d1gNIMC3gMc&wm4QN-5%VaLkU9c0OPe4hPFN%BtZB?D_2Lr57=|s9sxv zKCmf)gjmiZwt7XepR)qA5$ah-cgae>l~z;V9Q$YIU|+DMQb%DTstXrBF|!#m!(=MK zvW$5)(VE%QP>qs1WlP?|8DaWhlaT?&Iwg`Dp^*Y?LF-Ce(b=t3)8X?$Bkf2X-}o$R zc_8|iI63-R8XPD|0JT_c9*A zSREn?3hZaC$;!%>X_QW3*%piVjPXqPnJin#sb~jSo#k**O%aEEz28=}$G8=uRSJd? zKjXj^W3MT?WbjMOo(Z=|j(U5wv0AidAT!QnJQZRuor7|rz+Ng>R^EZeh@n{FaGZlg zRyRktSEpCP5c@pQ->bD8FAbZFm4=%#RH9=7-xt~H(m@)&nPr+*8qTcX*Y|pd&qs=n z2YoTd=h#{npj|mM$e2FHS;ufTD>@g>RC*?RUHyQb((UbMYxD9A+M+3`hbZ=rCK=js zam0uYE{<5phsner_$o;&>Obd!Efk8mRDzjJx3k%1iIv!r_nr+6$SKA1nfV7zFrEo- zko_!*qT?v`MD@C-u5|xvR`=_e9nNavvxg!4#MR(=>v;%85xJ?ME+V?(jzI8QLu}hN za*_m_oPA;y7$a)=NU=tMd9vSnqI2?}E&iD-F*?-Bf3 zCIQGMDMMOK$Xb+FtaT;PAR#Qoui*6-S9WhEBTZD(@jo9l>R!p?XZbuhIOy;k+s`RJ zn=d*`Y0qS@7xB5JZM)b!OdXyko`Td0_FUK#lsskWxihkS7Mw{b-_=vrm^gJpfmsaW zpP0{pRCM*MF5<1HbaowIlgnp7ZB!Hwv7ccneg-BVQ9?P8yB9tiGd-vyR>$*yiR2i} z(d62pXAt3798q~eX0!J~+XIqPuz7g6cvAG>*t5fG{_$~7ToIqEgQZydnVe;SDL;n0n1wbB zE)G#-O)^K0Xa(k3*v8AVpFN*FR1LPC$zHb=a+Ta&v8G69_A`s}6^G!r`ZAOTyu0!_ zqV7D|o7u`sRKvt5@!VAeY}Bet2ntp=aK@0vx+eJ&k}{aVvb-W#+InB;l|g8S7e(l$ z%G&q>a5npStjf3;dU!=5vP zb>@E#N+ztXh|GK8b1K3aP`9-0JuKRDVPuw)@^9GUz|ffS8689udBs<==>m;SkT96?rr8V}M!aUP0>P%kY_cxJ}O>+s4q2)=6l* z#!n=3cCtejebPiLnLj1tYnXL~!7PMKx92l(=C7vVCn{+hzQLI8Tb(L>4Z5wl7o}y} z4xbML*N)0L7@vW&{cF!>Zxu`T#LoUo4J)KLZ=1BV?Y4Z5pOn6VFi^4ATQZu>uvugK zWHrxN9$vZ*<(ih|EI30X5DlC|)iI* z>D9$kq|jfU-9|`}7X&gdouMRmH0epnO3ExJO(uioL?&wU2=l;VB+F)&x7l0Ej5N`Z zlV}`Dlgz%gSldAH^>26e>wAq#egf=Tv+M018gO?P*~CIKHpy-0p)&8^QK3cWIu76t zs6iQ=Q9Pg3APZY#lzr41ElTd1-YcRNY`6Y-X|Kmm(~ICU;0mU4VmZrrmSOC9jxLl* zVJqkd_dKOjShhu6+{R}ZC^)}tJ_FL(IVN4jAdja;Md1>JW$7xpB3?rvS`)Qk!v`OA zG!r6-hSegojUtyqsenMu;lg_dThY)4PpYBRw#H{eajqghT|i}ZXt-9cG)6|JloXEK-OQ~p*grHhP^ykpk+J^rWO=+%sm+d0 zZLDmqFK;d{ZX=Au#E$`xr=~ZVb%pe#jI6{O#|>`5A$o7(O`@}a)3(2n{RyZMpYdkU z8;B73tU=shR^at;M)z%uMXlqRj7~`2aJh=`>qvRDGBP$=smjJ^-_AXsj}|04S96ee z07SR3pL3C$s%+nGY1_GcCg{jNFYWag#b@ZGPkX^x55As#4LlUSR2t1ve8^?8ul$Mm z3_^kP(#q+nX_A+QSBYd-KEq_WEO?2?xj~KitQQ9*{D;p7E`Ps{?A< z?bzrz&07sP<)%wL1;*!te3(1OK8klB&utdf70jRF<2iF$Y3o*pgwGzlQSeoq6)nk- z6a3i1n!(u?Q6g(C9{J*Rk7d(e6rZzpa&C>;)jDC7I!SciMCe`J@zqho1Lo#`D-{t%A*29vv%> zA=SakL}_fiT&<7R#zrPaO0ktIy!*TvvF^r|bHbdqUYfj8>Hd@JhLhJKmtehtSk8n! z%Y=@`54Pj8Cv(bpW)VKK0&ot2(@F3@d^QsrceD%=Yx&K`;V8nPb4>?+2M&bKH1GB{ zv;Xz^?Pt$tV3Kt42M4B!$i|w6IMGathF_tN(rQx5Vc;|8%vo_Q@EMe$Q_9IhrTC2d z_srQ3Wkpj;LP$3Aza)qjpYcf3vss&56raH$BhskC_vj}DdVVVuC$n57LGHV63H*F$Hr_5%vpHqCMCC7+9@F%%*0!Q%< zylg(3?IDxHnztu#dp&-{o}+)z^EnsJP#Pu(#gyWM7TMO*SU>q1Fyh7Y8SgGW1l+s` zh{F(tcxDC*gJuAy6kDymVq4kCOW~9_bC{gVXDSJq0MX{zXv1fj(1dM}LWK3{PbBaI z9ork%F}+LI}s`2(#-3vlb@PCmYs@`YTgpW-%sq)Zb^XOB6O_ zx|3Rc0U*;w2$RvZNJPi<%yNB_xQ;L-3anN*hwNuVv@uzxGT@b>Qoqvn@E?mnk)!L1fT|=?md=d^1}uXW*<3M_Jb@M=Euw z%V0p1`s89`YI(A;L?DMijS{_gMp^B&B@9l9Bz8dqTf|0o%g^iyEIv~M zpS7k3yYU%iyo!Upq8i!NDm#2W3NOM@mcTi97-Btdewhf)q5IE7<}L^&j*h`8go|@&q>92MCgOr9 zI9wB~%)1E}#Kzj0#raM80qYatxQyCdZO^&s4xTyZw`ONqiOCstj2_f&q{oRf`u$TTWN@d&gl35LA zYI*@UvjVM%_9IHuZjI0M6|y*78bL6mMQMKZZT^rvvz^m8R(Bu=(T9xBJWys@3(k5H zi});XWy>N~r~C%Cm}@+T$|#RLXu^K>e8zbG$@q-T%mo4~tWB;9aAmL8fSFO6{dWdu z6h@9PU<547Fs9_|Kzt_XPSl;9UR{{m0MUEkbF+(3N8#4V2*5jm%Q)#qAYZ4%RZpGh&SgJ~OCLp&E+f5QiZ%LD9zNj{SVB zNO)*3HjU^*#%B*_vyo7aC!Zk|Kn7W$jP5gNM$NwXoY=R4pPtVQ?!#aP%e;3G6y84K zGqKRDjH3fG&(E$;))vB?hEbCL4E)2IUgRDL2Z|!M=>)`h#VGB#xsW&pXKO?uf<)v@+B&(ttCzjxfA>1jCMw5DGJ-*ZH{w;WQnYXMIEvxMxoBw z&mdZEI!Xk$29iVRW59vVB_7&4&_wj%ook|4jn#AglJ6$L7Bp`E#ldbPTK&{8k~ZHNeqNRF^KN)`OtEyb7FP} zVniP@KAT;Hk`UNXoU0stJ~ttp7?wFT`{c9jLD(0l>9F%YkpAAv=tu)Z4-JI$+K9R! zy_dr?ADuzs+5=dYivxx6gF-ZvR&2AFoGL?apvJr;A4DvAJ{z3d@R{HZjAsmH8V@DD z4lT+;rWBuLJa_D8qd`YGgm)ky`VjMZZ-{>Bd{#)X`UmMmBZMO)ST5)v%=K5O(p(UJ z9k1I8L1}~H+@JQt=U_`GJCQ*yN(bEqEL2Kuj&<5uYpAR9Fj`k_ZD&FHY#wK*;|5BTG zcXv~xwaCBZ57FGTi1QjJm?^!TysO^Ek0B#1Tl#nm|0^aLPrc|wteTXlCMWJLY#3$o z=j&cQXpmW=T+>8HTY$9IWY&O4fK{2sKY~9pHQ_Az~rtE1V z*Vvm<@M#Fe!MTzAqa`bcSeUb-uTOKpr5b!^v2zDr(jD;d-1QJin{E03>{f@F&sk!q z#oKobAc!7MzRHipjo@d|0h2;*Pvrl@b=4Ic3=j3zl>Aeg- z^Wm8*xwdp0`?-i7p3l+~o&-A+CVM_d#$MB&6ieehYqqQ?2u+BF%!tC$`0pf!1(tQqI?j6ogEBt?c#6M;)Wv*RZG z3?5_r8zkGGncFn~hF0_EV;iOv&u4Up=oimtf3N&$U_5IP#joRazkaLUbn@G$3W{FJ z^w}Arp|Js(KeXwrz-sWBXbtrV8m0HhX9jK~P&!EGU*`@Sf;;eReD)`v-9tMp+i&~i za~8sFYTEGGv%>58FwX-^Few3r%(>``J2;|kTZ4?Stdz^>wn$D1AzGDf_)Ih!X*wpS zR_PzK-R@CI@!28zVEAnJGo{#l%P36`lIJt8;9Nw@eony|K3hzk!8uWO?;pg!fiNn=q-##m!xkMqnsByBNF#uR{iNU- zecdDa@(8=EBjwP zev9h;IxYG>`TRWojn?OVcRshWrO9WR(8=Cf_$-gB@mVzXe3nkVM!m^xf}bSC=Xzsh zVQJ^BE3k7`E z^WsMY#38Afi0Gc28CBdc-u})E|jE zP=w@``nG(|QaYw_mb!`IlzOiBy?$FhXAzwXXDSE!Mi6mWl=fu`&M7{72IlHT@C^0E zeAW=Z6s5&{9YtjJ?(yt_{Q21X;u-i{#O?H-FZr{2CVO4$XDOY*vKi7HJ|79VbS~n# z??4NOix&34XHV&U^EONJ_V)H}d`=;{h|j8*c`Qo%(#&R4JoiM!_MFU;Gp=!b_N-2s z(?;nmncE-NpC`H@dcXGbi{i6bouzb#&(Hn%c6M;Y??4ffTk7}BXHmMlw?9{k?5=(D zd=Gr~h;GkkSndx9KC4&hm+4)N_Y5t z#NpDpycc>0TA1t?4v5b%Hdnk|*Xkopug@C+EbN8PqI8zkzTUWJU`zpXkBcdrdDq3F z-P&oiQS6*i%#cng{(kOFcYOzmb3?b6K`{<7kR_@<@ zdUyG6e*gH&#d9Zq^IZS_?a%H#eZpRszxu<|M~{De^Q#{oeDjA#kMDo=^uc#OKKbFR zKd!&|{fXJxTfg9Zeq_zN4;L1mYp*|@z5buxxc2(B*Pj0Sd-t9^e*ECx(??If`|-_B zez^bOhX?mBKf3qy&F_CccjM`e?|-ozZcgLoKMwsz_89&vzB%0|rtRkZ@xc#2vd=3Q z>wCC28*he#{P#aU{QPGeApBQ+klqvL?I7Q9?N7ovU%7Z@4~HrI8$EvX^y%XV;T-)Si4;oqs%&5fh{)7$z#aZk&3J^$+syV|79r?>WhyY7~)m;QHi>$p**H}*HZw`Jr1;5N2D zc6xJvN2)EG5B;C!vGe~@Ynxpjf4x69^DF=bTKACI=IYiN?kT3^v9&r*>#}x83fXr_=Pz z>^-Sx=AFII?AdQR=lyc7_v`sP&b?|$MM)}Qu)(3NzMf0HR0siO)lawX^@N6+fB47O zUVHuZ*Mk0wdQJJ-z`>!h{qw^K`vwjTBqWv>OJC~@_)i-C?}^TUEYyEeg={M!ktsw& zDr2`4GPx>5Xk>DckSnyJAya6#7kx80gVLa2jJU-k$w8T#hD53g4*siH z(0?YWTq7D1nOZcq^dcb-mMgauTY52*2Xp@gTv8H=B;ZK+ZukuB=otuw=dHe;Md6Ht zTfOc=z!}gMfin(@!Wjp*2xmM#B(k3Qm)7~rlNpO(GSedge5P;)he2bCXi8=t&UgTM zOo+fA8}KC|pEpBh`Y#gd{EI>x2Sfk6i@#rQ3C?)%R$tGeeBRM3G5qA=GZ1_R!hH6T zue zf$idR$m=ESKX2JNA^rx>=TNo=f1KCP3WbTnnHtU%%fV#cn9txgZ#z>mN5RJ?_BGMZ z0ay<3mnfNkdVCJ6Xi;>84?cr45azQ_(Y=WJnTIf4C|Fy-5!|JG2At(`BLp)qo`qx< zD(8*)O!YJMoI~-MYGxsvg=Bs{$}O@cOjJJ$X$&}r;~k;x2Fsa_({A+W$*5Zjy7K~p=FX6k{^ zTTy?5H#gvH0M1l7(_3CSW5JUdD5jqCPmj-X?mxdPg1ZxN`GoI=&%lnJf#6r5_ehw} zTlOU$qrin*ZyT;n;Ioj-L?m-?7V>$0t-!XRH7ZI=1AGRYp``(5pqNKA4`-IOB7}Tq zRAvNqHh^fnl?dTXRW#3M9?l?hFqZivJMBNqm27ZOMJ*~7wyK}QeBM#)gr9tqXW)79 zd8_$U__Qt>G$$eWc0&M)W|whP1Q`8;Siw&h0Z;hYyVS3cEA0x#Arh=b!G)YLBVB((PlB?=uMQl(zT7!Y#S zNEgAkq5jNJCsUaFvAMPQeqyNCm0YG2jgZ_9d0~VzIyQ-x@WZy@41|0c?y!CibsdE| zE(&LAu?E8#M_vU!Q#ecH2JksbVn93%oGDQOXQaRZ&RpmM_$(wd;QVUx8JEm9TzKK9 z2%mvXoPjW(eIyT5&OTnfK>At9I(hL7ID^byILlBiXhcY5CV0_M;0$ZuAV^A{zq+P> zEQB}U%!y}`v*Cra3~3=KW<*K}To)qR>F>b*CiGyyEu^?;gwoZU)6BwJ(e2UC5Y^%m zI^>1n{lX@$t?)y_XW(hiK**P2SU+<{N2t%^n?KGINt9P22f2D}5od#O@OU#uI zI^>11{)MN#_QKyEJ_CdP(DVe<39m^Lj=X55DU#`0&SL{l6ua> z*5LSzy9A+}at3>WWj;jtjDx&>_J_0A!RE=#!P%yO8P07`DpmG?;5RM<7ovX}@wdf4 zr|=t#n_Pq{W(oQF3E@8rO=&+w2V4#z?mq7F3V%I(2A=8+gm~S-V%ypNNTIHyP{+f3 zrivPHrp^Y1vyjiQH7J}_YA4TU(FNr*-Y){+OtDP27x4kX2YiTd_$sylGC$@n=bwna zC5a+>lUU{-wiA5z^EyIa7=d4Ss>?6@&EYe!;TZ^gwek1EeBNGvgA=zjH{)@)cA{5B zlQ$TLL=M~86eUB>1_`Xu<_^iy)YAZs0cT-sz-Mq05C)B@cTMeU>XQh`%&J@nSS#WY zq^P~z_V>4Wxh_g4+Sg%5PW*A53Qyp4;4jgAocb>cp!=!a`^kn?YYZ(+cS zhE#494Vl8Wr2ujRLR2}^$KWSMNzF7QG7ADn@Fgf)AXKG}ropPCN%+u8z64!O!iLHe zTC_sz!4)VoB!!1Y1pkEi{qZ~CIT=+9A4)b_G#HgDIEd2bbakL94U+_K4b))wzYR$L zSic)GRZ_hF(pGh~XfX>8Zq?tT*V`)woA95zpUx`{7Je;u* zg)I@D;itzpPx!UZ&pQz$iEGhKk)qg4X=3ihcgiE$m&MxX~0L8p`rk)0` zoWW-*o_Rh)KO;1TIGZ&ESdMq+Sd0k(wNhc%>)nZo`AJE6F)?ZR`PIe6by{t7WTY-K z3RU4|f@O7_QWXnC^Gx0$K7-pK5G@90lA#@{mCDZU4^lGow~ya06kKX_xycJQ{IFN* z33|oW3nZE^%0q2Z_ zLMGCfk_`Mj^6NN}>;#R4*%5TRFc{7>=Z%Lm&t$dMO#?>^`go@!JuN<8v0D#5PYoUJ z@0rTYs)qS&u_SPCPBEK3CR6;Ls?NHa?!2tp#JIxToQAB-+RW@avo&3%iAMm=JIZG< z6}>%tRwy+z0ut>))uo2Yuj7?7zj%y<4!Ypzfmakmul%1K;^h$f@Fw`ozZAKJxX&zV zKI330{p^2TXo9ku1CNC2V@3sY@NICeo%cwnJUS)j>xr~h6V0Qe#Tw#Y3X%WJyATk- z)Qg}_g-qcH2ymDxX9{O7hYd$a&ITu*?NL&g8&J`91bMJ8t%91v*v?bxVi8gU35si2 z&5Y8K8keV2*qxTRuC{@aqAI674#)zp%zATndUknkp+%+Zsi@dnQc{+klb@1Wl$g>| zQr=wK9BE78|psMoXqwXohhIwYk-TzRiNs9w<%5aQ(!`tU2p=TQCSsICr1bg+IF#WH`8 zayZm2h4Th{=HX1mGj$2TF7TOyGm2mA6wXvm6Owa$UI!rZEByIPYEn2pdz=}`?i?L! zahPM(tP!C%SnUpXN zov(Up_Kdm6M+8v{YxL4mZ_jdoq%pR6Kic8MS9U zGzm;VXyX|KHK>DC^yc+5r>MonGnt1g?t6sN&k9D*hu@4Xg|K(@`dV}|g*(V7uYMM)YcHjJeBPvx z_Nm;*bm5@pGj}VV=S=ZSO$?v2vCe0F)t4Ya#4|#pi+8xPtj6Tit8eVzchsy)Kq{TZ zoTSyGiV)o`jOa!pRcaAgahdJaZC!Ppy^TFp#dV4ZHLEh~^p4cDe7nPAvBeoo(OSJj zqqCchmZXGao5^F+5k3cyncfW)&ptlWokS$#1q3Z)6y6g11qwfeuHG*FtYi%|0#r0Q z1RJmbDBAnS`I$`WPGM(Mer^7 z48hFFW`0)@{X7Yr!DNbPETErp&|*u|vhMntzO|JbD!CJ$GqIgjRxS$#<4$xkMi(Vl z#~R&3ZG(FXY7%V;8Hu?%jPqtqDm6Nh8bN7RZQ*Bj>oj^s!P?CU$(}q>IFp0mc0lMn zEP^I`ym)*DrFle?MTq{TN`+c9KxRHfU5-FRhq&^dFD1f1{dt{%5HE+&hhK6&i#Dkv zb6}sye-@J2>qsjs!4Tfy$P@567|WceL3B0U4MeIlo)%&oMl`-e;Y?*Sg)`x^E|$^9 z+3e{ib8>oeIkJ~gEl7fta+q*JfM2EB$ZE}QQ}l4>P<>@fjMbyjIMiypQe#7CG^Cv! zQjXD>R4F52&{{Lo@@DqUH+yfoZbfAeR?&1`Ot1?r>OaHZ;PrEWiry-pl?oQYBl__|I>eRty!a6QxzG0u zgm^iGJ{;!rhWeTBejKm}h3Kc}Gxaol%9&(qfX}cv0B0@<%`2V*_^dK|H0DH&Hcl$D zMeQ;wBsP=>3i%8~1I}@Y>2VhKV0%CK>@vrptQ$4mT2qWdZB-~NNQb6{)vUs*Qrgsv zp}nR1!pgOZoZ9Eh=U_?;XBrAAy;VLdLr7>*@ys0z^ZEG_?&bLDA%VLI-U_!cg69Kn zrDMi=db58%vx>iqxz8a&CzX3crqByQd@eS1gGFuydv*a9vH0B(`Om@1Irs=S#u}5X zHw1tfG_e7f5f-B?}UP}ZIvo9D158Fg+}gXw`*=x3CB zqof5QR<3a=w9z(8d`VI5OxILh)*hod5nnP}QuKxds*N?8L=&ynFKA$qy3GAaCnlhA=GnrLZ!tl-RfoF!q1n$p}s?|ks}S2#`b zmn%g}T7=h{-&$}1zZ}E~|CU=h1A>2E|K-#1dHppOy0k>J@!A z8V<9=Xe-GrsxNIzbLW~3acahnVTE`*fVlw)4LBnukI}nXL##pPG8tm#dS}nfp2{z5 z(CA{376Sj|S@N0o$_wT*%?alWAJQ<2#8dD&7|~%qZ-qwT#|EAOe<%y?Jq4fF;S4db z!+aJaGez|C;WLzZuwV{2@)+eDT36$FHmRQ}oQbEw4G^TZGl4TYV5mGQHL}{gMb^A> z7COC@&vJz$-czVnxm9co<+DZ~gVJeEDibTI})Y-M&$S8Z=)cCATf*J)$TCa=S+RVO0E#WO^8kaDI+wyK}Ei_bne zZBVGZi5%33#`!@!0iRKKDU>39*N#9-2W}Vgm#6TO4ZOI+_h0%mAo%C?U-B=2%`JF; zBk%>bV|=D{wP8Mc8)*uf@bhpc72F)3>7F2MPXst)KTZKw`}!2AbqO>Gq5)Nn8{(OG zBXT=bu0|b8{S9oDvKlg23VlS;=NWwVM8}sGHD{%kLn?F5wo9w`nDvP|RV>xvfHMN^ zIN*4sxiXg~SE_RA%yI`jZ7o`ia_oJUeD>=&O=kpzs0W8pLqcs15oD8;Q3-@QQ8_~Te`3Umw=ahbE$*Gr z&r*pMa&cFbGE!kt8{+_B7}OSnJ1r@{BD1t6x6*A(Fl!tt)`jkNs3X0%1I}2W!zY0=22pX{IV4i6l5xR&hJKEesUoB-_^dU1bcO^NASPXO zR$6gwesx1pZJZ+sS#}P48Y0G?X%)a3l%{-EYhr-tOm|+iHeRiYj*KwCqX1?%*3Y7F z#=#ev&q5Xb1bl{s4pz}&{rpoU@Wy|aKa>Ucw#a93IBy@H#mM~P^7+Xm^wa2PVn>h) z6p}|r8`EJy;H-?L2^(JV?9XTFIfKkpJj_Bab9I&d~RG!rrel>U=67VwLTdEq7vA0 z{t3TFB^Hl+n{g*q*=k-^kd_9AX9u&T4h3hb%LGKOx4GL$FnT8k6P|jR7-8!6oeCEka z^)v3mk(S7vyP{0c&pe;eB1tB-!QVh)MubF*F9EPRV=6)m32jcEZfqH=u5HLKIyo~p z&^?-(kR2PHVYehIOvwnqS!GPq7*Y^a@oF)0#hgSdWul~ZSmMu;&%SyVGX2mS!S z2eTeFMjbjd7Di)1r6dU-qJvxx@w#u}Yn!gU7ln_{0V%YvkuJH-YwB1BvK>!5sVX388k*h8cSDncN{cN;kXmzO!o6u2GKR+

vP@-w7fAA%TwD6F>6(Ab84uNQn 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

+3eN<=gU#|@xcf_S1gx(L-=f3E~Vl(@fjof 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�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