Files
wehub-resource-sync 8a852e4b4e
cffconvert / validate (push) Has been skipped
License Check / license-check (push) Failing after 2s
chore: import upstream snapshot with attribution
2026-07-13 12:14:16 +08:00

175 lines
5.5 KiB
Python

"""Helpers for defining multi-platform DTensor test targets."""
load("//tensorflow:tensorflow.bzl", "py_test")
# LINT.IfChange
ALL_BACKENDS = [
"cpu", # 1 physical CPU,
"gpu", # 1 physical GPU,
"tpu", # 2 physical TPU devices
]
TPU_V3_DONUT_BACKEND = "tpu_v3_2x2" # 8 TPU devices
TPU_V4_DONUT_BACKEND = "tpu_v4_2x2" # 8 TPU devices for non-Megacore targets and 4 for Megacore targets
GPU_2DEVS_BACKEND = "2gpus" # 2 Physical GPUs.
# LINT.ThenChange(
# python/tests/test_backend_name.py:backend_name,
# python/tests/test_backend_name.oss.py:backend_name
# )
# FIXME(feyu): Gradually increase the coverage of OSS tests.
# LINT.IfChange
def _get_configurations(
disable,
enable,
disable_tfrt,
backend_tags,
backend_deps,
additional_backends, # buildifier: disable=unused-variable
shard_count):
"""Returns a list of dtensor_test configurations."""
disabled_tags = ["manual", "disabled"]
disabled_tfrt_configs = [d + "_tfrt" for d in disable_tfrt]
disabled_backends = [backend for backend in disable if backend not in enable]
backend_variant_deps = {
"gpu": [],
"tpu": [
],
TPU_V3_DONUT_BACKEND: [
],
TPU_V4_DONUT_BACKEND: [
],
}
configurations = [
dict(suffix = "cpu", backend = "cpu", tags = [], flags = [], env = {}, deps = []),
dict(
suffix = "gpu",
backend = "gpu",
tags = ["requires-gpu", "gpu"],
flags = [],
env = {},
deps = [],
),
]
if GPU_2DEVS_BACKEND in additional_backends:
configurations = configurations + [
dict(
suffix = GPU_2DEVS_BACKEND,
backend = GPU_2DEVS_BACKEND,
tags = ["requires-gpu:2", "gpu"],
flags = [],
env = {
},
deps = [],
),
]
# Post processing configurations.
for config in configurations:
config["tags"] = config["tags"] + backend_tags.get(config["backend"], [])
config["env"]["DTENSOR_TEST_UTIL_BACKEND"] = config["suffix"]
if config["backend"] in disabled_backends or config["suffix"] in disabled_tfrt_configs:
config["tags"] += disabled_tags
config["deps"] = (
config["deps"] +
backend_variant_deps.get(config["backend"], []) +
backend_deps.get(config["backend"], [])
)
config["shard_count"] = shard_count.get(config["backend"], None) if shard_count else None
return configurations
# LINT.ThenChange(build_defs.bzl)
def dtensor_test(
name,
srcs,
deps = [],
args = [],
env = {},
disable = [],
enable = [],
disable_tfrt = [],
data = [],
tags = [],
backend_tags = {},
backend_deps = {},
additional_backends = [],
main = None,
shard_count = None,
size = None,
get_configurations = _get_configurations,
test_rule = py_test):
"""Defines a set of per-platform DTensor test targets.
Generates test targets named:
:name # test suite that tests all backends
:name_cpu
:name_cpu_tfrt
:name_gpu # must run with --config=cuda
:name_tpu # recommend to be run with -c opt
Args:
name: test name
srcs: source files
deps: dependencies
args: arguments to pass to the test
env: environment variables to set when the test is executed
disable: list of backends on which the test should be disabled, e.g., ["cpu"]
enable: list of specific configs on which the test should be enabled,
e.g., ["tpu"]. This overrides 'disable'.
disable_tfrt: list of backends that are disabled for tfrt. This overrides 'enable'.
data: data dependencies
tags: test tags
backend_tags: a dictionary keyed by backend name of per-backend tags.
backend_deps: a dictionary keyed by backend name of per-backend deps.
additional_backends: list of backends in addition to common cpu/tpu/gpu.
main: the Python main file.
shard_count: a dictionary keyed by backend name of per-backend shard counts.
size: the test size.
get_configurations: a function that returns the list of configurations. Used to generate non-OSS test targets.
test_rule: test rule
"""
configurations = get_configurations(
disable = disable,
enable = enable,
disable_tfrt = disable_tfrt,
backend_tags = backend_tags,
backend_deps = backend_deps,
additional_backends = additional_backends,
shard_count = shard_count,
)
if main == None:
if len(srcs) == 1:
main = srcs[0]
else:
fail("Only one test source file is currently supported.")
all_tests = []
for config in configurations:
config_name = name + "_" + config["suffix"]
all_tests.append(config_name)
python_version = "PY3"
test_env = {}
test_env.update(config["env"])
test_env.update(env)
test_rule(
env = test_env,
name = config_name,
main = main,
srcs = srcs,
data = data,
args = config["flags"] + args,
deps = config["deps"] + deps,
tags = config["tags"] + tags,
python_version = python_version,
shard_count = config["shard_count"],
size = size,
)
native.test_suite(name = name, tests = all_tests, tags = ["-manual"])