blob: 723b4eaa62249beaacc09d870c4c9c34c28db30f [file] [log] [blame]
from collections import OrderedDict
import conf_tree
import miniutils
import make_build_configs
class Conf:
def __init__(self, os, cuda_version, pydistro, parms, smoke=False, libtorch_variant=None):
self.os = os
self.cuda_version = cuda_version
self.pydistro = pydistro
self.parms = parms
self.smoke = smoke
self.libtorch_variant = libtorch_variant
def genBuildEnvParms(self):
return [self.pydistro] + self.parms + [make_build_configs.get_processor_arch_name(self.cuda_version)]
def genDockerImage(self):
docker_word_substitution = {
"manywheel": "manylinux",
"libtorch": "manylinux",
}
docker_distro_prefix = miniutils.override(self.pydistro, docker_word_substitution)
alt_docker_suffix = self.cuda_version or "80"
docker_distro_suffix = "" if self.pydistro == "conda" else alt_docker_suffix
return miniutils.quote("soumith/" + docker_distro_prefix + "-cuda" + docker_distro_suffix)
def getNamePrefix(self):
return "smoke" if self.smoke else "binary"
def genBuildName(self, build_or_test):
parts = [self.getNamePrefix(), self.os] + self.genBuildEnvParms()
if self.smoke:
if self.libtorch_variant:
parts.append(self.libtorch_variant)
else:
parts.append(build_or_test)
return "_".join(parts)
def genYamlTree(self, build_or_test):
env_dict = OrderedDict({
"BUILD_ENVIRONMENT": miniutils.quote(" ".join(self.genBuildEnvParms())),
})
if self.libtorch_variant:
env_dict["LIBTORCH_VARIANT"] = miniutils.quote(self.libtorch_variant)
os_word_substitution = {
"macos": "mac",
}
os_name = miniutils.override(self.os, os_word_substitution)
d = {
"environment": env_dict,
"<<": "*" + "_".join([self.getNamePrefix(), os_name, build_or_test]),
}
if build_or_test == "test":
tuples = []
if self.cuda_version:
tuples.append(("USE_CUDA_DOCKER_RUNTIME", miniutils.quote("1")))
if not (self.smoke and self.os == "macos"):
tuples.append(("DOCKER_IMAGE", self.genDockerImage()))
if self.smoke:
# TODO: Fix this discrepancy upstream
tuples.reverse()
for (k, v) in tuples:
env_dict[k] = v
else:
if self.os == "linux" and build_or_test != "upload":
d["docker"] = [{"image": self.genDockerImage()}]
if build_or_test == "test":
if self.cuda_version:
d["resource_class"] = "gpu.medium"
return d
def gen_build_env_list(smoke):
root = make_build_configs.TopLevelNode(
"Builds",
make_build_configs.CONFIG_TREE_DATA,
smoke,
)
config_list, dot = conf_tree.dfs(root)
newlist = []
for c in config_list:
conf = Conf(
c.find_prop("os_name"),
c.find_prop("cu"),
c.find_prop("package_format"),
[c.find_prop("pyver")],
c.find_prop("smoke"),
c.find_prop("libtorch_variant")
)
newlist.append(conf)
return newlist, dot
def add_build_entries(jobs_dict, phase, smoke):
configs, _ = gen_build_env_list(smoke)
for conf_options in configs:
jobs_dict[conf_options.genBuildName(phase)] = conf_options.genYamlTree(phase)
def add_binary_build_specs(jobs_dict):
add_build_entries(jobs_dict, "build", False)
def add_binary_build_uploads(jobs_dict):
add_build_entries(jobs_dict, "upload", False)
def add_smoke_test_specs(jobs_dict):
add_build_entries(jobs_dict, "test", True)
def add_binary_build_tests(jobs_dict):
def testable_binary_predicate(x):
return x.os == "linux" and (x.smoke or x.pydistro != "libtorch")
configs, _ = gen_build_env_list(False)
filtered_configs = filter(testable_binary_predicate, configs)
for conf_options in filtered_configs:
jobs_dict[conf_options.genBuildName("test")] = conf_options.genYamlTree("test")
def gen_schedule_tree(cron_timing):
return [{
"schedule": {
"cron": miniutils.quote(cron_timing),
"filters": {
"branches": {
"only": ["master"],
},
},
},
}]
def add_jobs_and_render(jobs_dict, toplevel_key, smoke, cron_schedule):
jobs_list = []
configs, graph = gen_build_env_list(smoke)
for build_config in configs:
build_name = build_config.genBuildName("build")
jobs_list.append(build_name)
d = OrderedDict(
triggers=gen_schedule_tree(cron_schedule),
jobs=jobs_list,
)
jobs_dict[toplevel_key] = d
graph.draw(toplevel_key + "-config-dimensions.png", prog="twopi")
def add_binary_build_jobs(jobs_dict):
add_jobs_and_render(jobs_dict, "binarybuilds", False, "5 5 * * *")
def add_binary_smoke_test_jobs(jobs_dict):
add_jobs_and_render(jobs_dict, "binarysmoketests", True, "15 16 * * *")