Skip to content

Commit 1d2b21c

Browse files
committed
update
1 parent ea29cbc commit 1d2b21c

File tree

5 files changed

+87
-35
lines changed

5 files changed

+87
-35
lines changed

.circleci/config.yml

Lines changed: 5 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.circleci/config.yml.in

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -654,6 +654,7 @@ jobs:
654654
command: .circleci/unittest/linux/scripts/run_test.sh
655655
environment:
656656
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_CUDA: true
657+
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_HW_ACCEL: true
657658
TORCHAUDIO_TEST_ALLOW_SKIP_IF_ON_PYTHON_310: true
658659
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_AUDIO_OUT_DEVICE: true
659660
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_MACOS: true
@@ -689,11 +690,12 @@ jobs:
689690
- run:
690691
name: Run tests
691692
environment:
693+
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_HW_ACCEL: true
692694
TORCHAUDIO_TEST_ALLOW_SKIP_IF_ON_PYTHON_310: true
693695
TORCHAUDIO_TEST_ALLOW_SKIP_IF_CUDA_SMALL_MEMORY: true
694696
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_MACOS: true
695697
command: |
696-
docker run -t --gpus all -v $PWD:$PWD -w $PWD -e "CI=${CI}" -e TORCHAUDIO_TEST_ALLOW_SKIP_IF_ON_PYTHON_310 -e TORCHAUDIO_TEST_ALLOW_SKIP_IF_CUDA_SMALL_MEMORY -e TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_MACOS "${image_name}" .circleci/unittest/linux/scripts/run_test.sh
698+
docker run -t --gpus all -v $PWD:$PWD -w $PWD -e "CI=${CI}" -e TORCHAUDIO_TEST_ALLOW_SKIP_IF_ON_PYTHON_310 -e TORCHAUDIO_TEST_ALLOW_SKIP_IF_CUDA_SMALL_MEMORY -e TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_MACOS -e TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_HW_ACCEL "${image_name}" .circleci/unittest/linux/scripts/run_test.sh
697699
- store_test_results:
698700
path: test-results
699701
- store_artifacts:
@@ -726,6 +728,7 @@ jobs:
726728
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_CMD_COMPUTE_SPECTROGRAM_FEATS: true
727729
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_CMD_SOX: true
728730
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_CUDA: true
731+
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_HW_ACCEL: true
729732
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_KALDI: true
730733
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_SOX: true
731734
TORCHAUDIO_TEST_ALLOW_SKIP_IF_ON_PYTHON_310: true
@@ -814,6 +817,7 @@ jobs:
814817
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_CMD_COMPUTE_MFCC_FEATS: true
815818
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_CMD_COMPUTE_SPECTROGRAM_FEATS: true
816819
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_CUDA: true
820+
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_HW_ACCEL: true
817821
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_QUANTIZATION: true
818822
TORCHAUDIO_TEST_ALLOW_SKIP_IF_ON_PYTHON_310: true
819823
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_MOD_sentencepiece: true

.github/workflows/unittest-linux-gpu.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ jobs:
7272
export TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_CMD_COMPUTE_MFCC_FEATS=true
7373
export TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_CMD_COMPUTE_SPECTROGRAM_FEATS=true
7474
export TORCHAUDIO_TEST_ALLOW_SKIP_IF_CUDA_SMALL_MEMORY=true
75+
export TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_HW_ACCEL=true
7576
export TORCHAUDIO_TEST_ALLOW_SKIP_IF_ON_PYTHON_310=true
7677
7778
declare -a args=(

test/torchaudio_unittest/common_utils/case_utils.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,17 @@ def skipIfNoModule(module, display_name=None):
268268
reason="This feature is only available for MacOS.",
269269
key="NO_MACOS",
270270
)
271+
def skipIfNoHWAccel(name):
272+
key = "NO_HW_ACCEL"
273+
if not is_ffmpeg_available():
274+
return _skipIf(True, reason="ffmpeg features are not available.", key=key)
275+
if not torch.cuda.is_available():
276+
return _skipIf(True, reason="CUDA is not available.", key=key)
277+
if torchaudio._extension._check_cuda_version() is None:
278+
return _skipIf(True, "Torchaudio is not compiled with CUDA.", key=key)
279+
if name not in get_video_decoders() and name not in get_video_encoders():
280+
return _skipIf(True, f"{name} is not in the list of available decoders or encoders", key=key)
281+
return _pass
271282

272283

273284
def zip_equal(*iterables):

test/torchaudio_unittest/io/stream_reader_test.py

Lines changed: 65 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1054,10 +1054,10 @@ def test_png_yuv_read_out(self):
10541054
self.assertEqual(chunks[10], bgra, atol=0, rtol=0)
10551055

10561056

1057-
@skipIfNoFFmpeg
10581057
@skipIfNoHWAccel("h264_cuvid")
10591058
class CuvidHWAccelInterfaceTest(TorchaudioTestCase):
10601059
def test_dup_hw_acel(self):
1060+
"""Specifying the same source stream with and without HW accel should fail (instead of segfault later)"""
10611061
src = get_asset_path("nasa_13013.mp4")
10621062
r = StreamReader(src)
10631063
r.add_video_stream(-1, decoder="h264_cuvid")
@@ -1070,55 +1070,87 @@ def test_dup_hw_acel(self):
10701070
r.add_video_stream(-1, decoder="h264_cuvid")
10711071

10721072

1073-
@skipIfNoFFmpeg
1074-
@skipIfNoHWAccel("h264_cuvid")
10751073
@_media_source
1076-
class H264CuvidDecoderTest(_MediaSourceMixin, TempDirMixin, TorchaudioTestCase):
1074+
class CudaDecoderTest(_MediaSourceMixin, TempDirMixin, TorchaudioTestCase):
1075+
@skipIfNoHWAccel("h264_cuvid")
10771076
def test_h264_cuvid(self):
1077+
"""GPU decoder works for H264"""
10781078
src = self.get_src(get_asset_path("nasa_13013.mp4"))
10791079
r = StreamReader(src)
1080-
r.add_video_stream(-1, decoder="h264_cuvid")
1081-
r.process_all_packets()
1082-
(chunk,) = r.pop_chunks()
1080+
r.add_video_stream(10, decoder="h264_cuvid")
10831081

1084-
self.assertEqual(chunk.device, torch.device("cpu"))
1085-
self.assertEqual(chunk.dtype, torch.uint8)
1086-
self.assertEqual(chunk.shape, torch.Size([390, 3, 270, 480]))
1082+
num_frames = 0
1083+
for (chunk,) in r.stream():
1084+
self.assertEqual(chunk.device, torch.device("cpu"))
1085+
self.assertEqual(chunk.dtype, torch.uint8)
1086+
self.assertEqual(chunk.shape, torch.Size([10, 3, 270, 480]))
1087+
num_frames += chunk.size(0)
1088+
assert num_frames == 390
10871089

1090+
@skipIfNoHWAccel("h264_cuvid")
10881091
def test_h264_cuvid_hw_accel(self):
1092+
"""GPU decoder works for H264 with HW acceleration, and put the frames on CUDA tensor"""
10891093
src = self.get_src(get_asset_path("nasa_13013.mp4"))
10901094
r = StreamReader(src)
1091-
r.add_video_stream(-1, decoder="h264_cuvid", hw_accel="cuda")
1092-
r.process_all_packets()
1093-
(chunk,) = r.pop_chunks()
1094-
1095-
self.assertEqual(chunk.device, torch.device("cuda:0"))
1096-
self.assertEqual(chunk.dtype, torch.uint8)
1097-
self.assertEqual(chunk.shape, torch.Size([390, 3, 270, 480]))
1095+
r.add_video_stream(10, decoder="h264_cuvid", hw_accel="cuda")
10981096

1097+
num_frames = 0
1098+
for (chunk,) in r.stream():
1099+
self.assertEqual(chunk.device, torch.device("cuda:0"))
1100+
self.assertEqual(chunk.dtype, torch.uint8)
1101+
self.assertEqual(chunk.shape, torch.Size([10, 3, 270, 480]))
1102+
num_frames += chunk.size(0)
1103+
assert num_frames == 390
10991104

1100-
@skipIfNoFFmpeg
1101-
@skipIfNoHWAccel("hevc_cuvid")
1102-
@_media_source
1103-
class HevcCuvidDecoderTest(_MediaSourceMixin, TempDirMixin, TorchaudioTestCase):
1105+
@skipIfNoHWAccel("hevc_cuvid")
11041106
def test_hevc_cuvid(self):
1107+
"""GPU decoder works for H265/HEVC"""
11051108
src = self.get_src(get_asset_path("testsrc.hevc"))
11061109
r = StreamReader(src)
1107-
r.add_video_stream(-1, decoder="hevc_cuvid")
1108-
r.process_all_packets()
1109-
(chunk,) = r.pop_chunks()
1110+
r.add_video_stream(10, decoder="hevc_cuvid")
11101111

1111-
self.assertEqual(chunk.device, torch.device("cpu"))
1112-
self.assertEqual(chunk.dtype, torch.uint8)
1113-
self.assertEqual(chunk.shape, torch.Size([300, 3, 144, 256]))
1112+
num_frames = 0
1113+
for (chunk,) in r.stream():
1114+
self.assertEqual(chunk.device, torch.device("cpu"))
1115+
self.assertEqual(chunk.dtype, torch.uint8)
1116+
self.assertEqual(chunk.shape, torch.Size([10, 3, 144, 256]))
1117+
num_frames += chunk.size(0)
1118+
assert num_frames == 300
11141119

1120+
@skipIfNoHWAccel("hevc_cuvid")
11151121
def test_hevc_cuvid_hw_accel(self):
1122+
"""GPU decoder works for H265/HEVC with HW acceleration, and put the frames on CUDA tensor"""
11161123
src = self.get_src(get_asset_path("testsrc.hevc"))
11171124
r = StreamReader(src)
1118-
r.add_video_stream(-1, decoder="hevc_cuvid", hw_accel="cuda")
1119-
r.process_all_packets()
1120-
(chunk,) = r.pop_chunks()
1125+
r.add_video_stream(10, decoder="hevc_cuvid", hw_accel="cuda")
11211126

1122-
self.assertEqual(chunk.device, torch.device("cuda:0"))
1123-
self.assertEqual(chunk.dtype, torch.int16)
1124-
self.assertEqual(chunk.shape, torch.Size([300, 3, 144, 256]))
1127+
num_frames = 0
1128+
for (chunk,) in r.stream():
1129+
self.assertEqual(chunk.device, torch.device("cuda:0"))
1130+
self.assertEqual(chunk.dtype, torch.int16)
1131+
self.assertEqual(chunk.shape, torch.Size([10, 3, 144, 256]))
1132+
num_frames += chunk.size(0)
1133+
assert num_frames == 300
1134+
1135+
1136+
@skipIfNoHWAccel("h264_cuvid")
1137+
class FilterGraphWithCudaAccel(TorchaudioTestCase):
1138+
def test_sclae_cuda_change_size(self):
1139+
"""scale_cuda filter can be used when HW accel is on"""
1140+
src = get_asset_path("nasa_13013.mp4")
1141+
r = StreamReader(src)
1142+
r.add_video_stream(10, decoder="h264_cuvid", hw_accel="cuda", filter_desc="scale_cuda=iw/2:ih/2")
1143+
num_frames = 0
1144+
for (chunk,) in r.stream():
1145+
self.assertEqual(chunk.device, torch.device("cuda:0"))
1146+
self.assertEqual(chunk.dtype, torch.uint8)
1147+
self.assertEqual(chunk.shape, torch.Size([10, 3, 135, 240]))
1148+
num_frames += chunk.size(0)
1149+
assert num_frames == 390
1150+
1151+
def test_scale_cuda_format(self):
1152+
"""yuv444p format conversion does not work (yet)"""
1153+
src = get_asset_path("nasa_13013.mp4")
1154+
r = StreamReader(src)
1155+
with self.assertRaises(RuntimeError):
1156+
r.add_video_stream(10, decoder="h264_cuvid", hw_accel="cuda", filter_desc="scale_cuda=format=yuv444p")

0 commit comments

Comments
 (0)