From 4d013012d1d5d29d253b95380a39939b162bdc06 Mon Sep 17 00:00:00 2001 From: "Lai, Yejing" Date: Thu, 20 Apr 2023 01:29:31 -0700 Subject: [PATCH] skip unimplemented error; update workflow --- .github/workflows/cpu-inference.yml | 5 ++++- accelerator/abstract_accelerator.py | 4 ++++ accelerator/cpu_accelerator.py | 5 ++++- setup.py | 1 + tests/unit/checkpoint/test_latest_checkpoint.py | 5 +++++ tests/unit/inference/test_inference.py | 4 ++++ tests/unit/inference/test_model_profiling.py | 4 ++++ .../unit/ops/accelerators/test_accelerator_backward.py | 2 ++ .../unit/ops/accelerators/test_accelerator_forward.py | 3 +++ tests/unit/ops/adam/test_adamw.py | 3 +++ tests/unit/ops/quantizer/test_fake_quantization.py | 8 ++++++-- tests/unit/ops/quantizer/test_quantize.py | 10 +++++++--- tests/unit/ops/spatial/test_nhwc_bias_add.py | 5 +++++ .../profiling/flops_profiler/test_flops_profiler.py | 4 ++++ 14 files changed, 56 insertions(+), 7 deletions(-) diff --git a/.github/workflows/cpu-inference.yml b/.github/workflows/cpu-inference.yml index 60c0c5b2b4be..c06126f08253 100644 --- a/.github/workflows/cpu-inference.yml +++ b/.github/workflows/cpu-inference.yml @@ -63,4 +63,7 @@ jobs: unset TORCH_CUDA_ARCH_LIST # only jit compile for current arch if [[ -d ./torch-extensions ]]; then rm -rf ./torch-extensions; fi cd tests - TRANSFORMERS_CACHE=~/tmp/transformers_cache/ TORCH_EXTENSIONS_DIR=./torch-extensions pytest -m 'inference' unit/inference/test_inference_config.py + pytest -v -s unit/autotuning/ unit/checkpoint/ unit/comm/ unit/compression/ unit/elasticity/ unit/launcher/ unit/profiling/ unit/ops + TRANSFORMERS_CACHE=~/tmp/transformers_cache/ TORCH_EXTENSIONS_DIR=./torch-extensions pytest -m 'seq_inference' unit/ + TRANSFORMERS_CACHE=~/tmp/transformers_cache/ TORCH_EXTENSIONS_DIR=./torch-extensions pytest -m 'inference_ops' unit/ + TRANSFORMERS_CACHE=~/tmp/transformers_cache/ TORCH_EXTENSIONS_DIR=./torch-extensions pytest --forked -n 4 -m 'inference' unit/ diff --git a/accelerator/abstract_accelerator.py b/accelerator/abstract_accelerator.py index 261fce536325..fe0e66768d45 100644 --- a/accelerator/abstract_accelerator.py +++ b/accelerator/abstract_accelerator.py @@ -156,6 +156,10 @@ def is_bf16_supported(self): def is_fp16_supported(self): ... + @abc.abstractmethod + def supported_dtypes(self): + ... + # Misc @abc.abstractmethod def amp(self): diff --git a/accelerator/cpu_accelerator.py b/accelerator/cpu_accelerator.py index ef6215c96c0d..db2162f4e19c 100644 --- a/accelerator/cpu_accelerator.py +++ b/accelerator/cpu_accelerator.py @@ -183,7 +183,10 @@ def is_bf16_supported(self): return True def is_fp16_supported(self): - return True + return False + + def supported_dtypes(self): + return [torch.float, torch.bfloat16] # Tensor operations diff --git a/setup.py b/setup.py index b418db59930f..1b0510a8e863 100755 --- a/setup.py +++ b/setup.py @@ -153,6 +153,7 @@ def op_enabled(op_name): for op_name, builder in ALL_OPS.items(): op_compatible = builder.is_compatible() compatible_ops[op_name] = op_compatible + compatible_ops["deepspeed_not_implemented"] = False # If op is requested but not available, throw an error. if op_enabled(op_name) and not op_compatible: diff --git a/tests/unit/checkpoint/test_latest_checkpoint.py b/tests/unit/checkpoint/test_latest_checkpoint.py index e2d2f9db8043..41ce2278680f 100644 --- a/tests/unit/checkpoint/test_latest_checkpoint.py +++ b/tests/unit/checkpoint/test_latest_checkpoint.py @@ -5,10 +5,15 @@ import deepspeed +import pytest from unit.common import DistributedTest from unit.simple_model import * from unit.checkpoint.common import checkpoint_correctness_verification +from deepspeed.ops.op_builder import FusedAdamBuilder + +if not deepspeed.ops.__compatible_ops__[FusedAdamBuilder.NAME]: + pytest.skip("This op had not been implemented on this system.", allow_module_level=True) class TestLatestCheckpoint(DistributedTest): diff --git a/tests/unit/inference/test_inference.py b/tests/unit/inference/test_inference.py index adff8e074974..04cbb04335f4 100644 --- a/tests/unit/inference/test_inference.py +++ b/tests/unit/inference/test_inference.py @@ -20,6 +20,10 @@ from deepspeed.model_implementations import DeepSpeedTransformerInference from torch import nn from deepspeed.accelerator import get_accelerator +from deepspeed.ops.op_builder import InferenceBuilder + +if not deepspeed.ops.__compatible_ops__[InferenceBuilder.NAME]: + pytest.skip("This op had not been implemented on this system.", allow_module_level=True) rocm_version = OpBuilder.installed_rocm_version() if rocm_version != (0, 0): diff --git a/tests/unit/inference/test_model_profiling.py b/tests/unit/inference/test_model_profiling.py index 3a5686d27b9d..892941c0efd3 100644 --- a/tests/unit/inference/test_model_profiling.py +++ b/tests/unit/inference/test_model_profiling.py @@ -11,6 +11,10 @@ from transformers import pipeline from unit.common import DistributedTest from deepspeed.accelerator import get_accelerator +from deepspeed.ops.op_builder import InferenceBuilder + +if not deepspeed.ops.__compatible_ops__[InferenceBuilder.NAME]: + pytest.skip("This op had not been implemented on this system.", allow_module_level=True) @pytest.fixture diff --git a/tests/unit/ops/accelerators/test_accelerator_backward.py b/tests/unit/ops/accelerators/test_accelerator_backward.py index 4c5719bb9c1e..b7505f5c08da 100644 --- a/tests/unit/ops/accelerators/test_accelerator_backward.py +++ b/tests/unit/ops/accelerators/test_accelerator_backward.py @@ -19,6 +19,8 @@ #pytest.skip( # "transformer kernels are temporarily disabled because of unexplained failures", # allow_module_level=True) +if torch.half not in get_accelerator().supported_dtypes(): + pytest.skip(f"fp16 not supported, valid dtype: {get_accelerator().supported_dtypes()}", allow_module_level=True) def check_equal(first, second, atol=1e-2, verbose=False): diff --git a/tests/unit/ops/accelerators/test_accelerator_forward.py b/tests/unit/ops/accelerators/test_accelerator_forward.py index 7c5580e4676a..716f27d1b3ca 100644 --- a/tests/unit/ops/accelerators/test_accelerator_forward.py +++ b/tests/unit/ops/accelerators/test_accelerator_forward.py @@ -15,6 +15,9 @@ from deepspeed.accelerator import get_accelerator from unit.common import DistributedTest +if torch.half not in get_accelerator().supported_dtypes(): + pytest.skip(f"fp16 not supported, valid dtype: {get_accelerator().supported_dtypes()}", allow_module_level=True) + def check_equal(first, second, atol=1e-2, verbose=False): if verbose: diff --git a/tests/unit/ops/adam/test_adamw.py b/tests/unit/ops/adam/test_adamw.py index 8b6f8101cb77..555f47677179 100644 --- a/tests/unit/ops/adam/test_adamw.py +++ b/tests/unit/ops/adam/test_adamw.py @@ -11,7 +11,10 @@ from deepspeed.ops.adam import DeepSpeedCPUAdam from unit.common import DistributedTest from unit.simple_model import SimpleModel +from deepspeed.accelerator import get_accelerator +if torch.half not in get_accelerator().supported_dtypes(): + pytest.skip(f"fp16 not supported, valid dtype: {get_accelerator().supported_dtypes()}", allow_module_level=True) # yapf: disable #'optimizer, zero_offload, torch_adam, adam_w_mode, resulting_optimizer adam_configs = [["AdamW", False, False, False, (FusedAdam, True)], diff --git a/tests/unit/ops/quantizer/test_fake_quantization.py b/tests/unit/ops/quantizer/test_fake_quantization.py index a9c2993ef7c2..2549878ed541 100644 --- a/tests/unit/ops/quantizer/test_fake_quantization.py +++ b/tests/unit/ops/quantizer/test_fake_quantization.py @@ -5,8 +5,12 @@ import torch import pytest +import deepspeed from deepspeed.accelerator import get_accelerator -from deepspeed.ops import op_builder +from deepspeed.ops.op_builder import QuantizerBuilder + +if not deepspeed.ops.__compatible_ops__[QuantizerBuilder.NAME]: + pytest.skip("Inference ops are not available on this system", allow_module_level=True) quantizer_cuda_module = None @@ -36,7 +40,7 @@ def run_quant_dequant(inputs, groups, bits): global quantizer_cuda_module if quantizer_cuda_module is None: - quantizer_cuda_module = op_builder.QuantizerBuilder().load() + quantizer_cuda_module = QuantizerBuilder().load() return quantizer_cuda_module.ds_quantize_fp16(inputs, groups, bits) diff --git a/tests/unit/ops/quantizer/test_quantize.py b/tests/unit/ops/quantizer/test_quantize.py index 6701e9b376a8..1f5e3dc95721 100644 --- a/tests/unit/ops/quantizer/test_quantize.py +++ b/tests/unit/ops/quantizer/test_quantize.py @@ -5,16 +5,20 @@ import pytest import torch -from deepspeed.ops import op_builder +import deepspeed +from deepspeed.ops.op_builder import QuantizerBuilder from deepspeed.accelerator import get_accelerator +if not deepspeed.ops.__compatible_ops__[QuantizerBuilder.NAME]: + pytest.skip("Inference ops are not available on this system", allow_module_level=True) + inference_module = None def run_quantize_ds(activations, num_groups, q_bits, is_symmetric_quant): global inference_module if inference_module is None: - inference_module = op_builder.QuantizerBuilder().load() + inference_module = QuantizerBuilder().load() return inference_module.quantize(activations, num_groups, q_bits, inference_module.Symmetric if is_symmetric_quant else inference_module.Asymmetric) @@ -23,7 +27,7 @@ def run_quantize_ds(activations, num_groups, q_bits, is_symmetric_quant): def run_dequantize_ds(activations, params, num_groups, q_bits, is_symmetric_quant): global inference_module if inference_module is None: - inference_module = op_builder.QuantizerBuilder().load() + inference_module = QuantizerBuilder().load() return inference_module.dequantize( activations, params, diff --git a/tests/unit/ops/spatial/test_nhwc_bias_add.py b/tests/unit/ops/spatial/test_nhwc_bias_add.py index f243e82f6d3b..3787b46e266a 100644 --- a/tests/unit/ops/spatial/test_nhwc_bias_add.py +++ b/tests/unit/ops/spatial/test_nhwc_bias_add.py @@ -5,9 +5,14 @@ import pytest import torch +import deepspeed +from deepspeed.ops.op_builder import SpatialInferenceBuilder from deepspeed.ops.transformer.inference.bias_add import nhwc_bias_add from deepspeed.accelerator import get_accelerator +if not deepspeed.ops.__compatible_ops__[SpatialInferenceBuilder.NAME]: + pytest.skip("Inference ops are not available on this system", allow_module_level=True) + def allclose(x, y): assert x.dtype == y.dtype diff --git a/tests/unit/profiling/flops_profiler/test_flops_profiler.py b/tests/unit/profiling/flops_profiler/test_flops_profiler.py index 04a63195f5a4..13bc80783ecf 100644 --- a/tests/unit/profiling/flops_profiler/test_flops_profiler.py +++ b/tests/unit/profiling/flops_profiler/test_flops_profiler.py @@ -10,6 +10,10 @@ from unit.simple_model import SimpleModel, random_dataloader from unit.common import DistributedTest from unit.util import required_minimum_torch_version +from deepspeed.accelerator import get_accelerator + +if torch.half not in get_accelerator().supported_dtypes(): + pytest.skip(f"fp16 not supported, valid dtype: {get_accelerator().supported_dtypes()}", allow_module_level=True) pytestmark = pytest.mark.skipif(not required_minimum_torch_version(major_version=1, minor_version=3), reason='requires Pytorch version 1.3 or above')