Spaces:
Running
on
L40S
Running
on
L40S
#!/usr/bin/env python3 | |
# Copyright (c) Facebook, Inc. and its affiliates. | |
# All rights reserved. | |
# | |
# This source code is licensed under the BSD-style license found in the | |
# LICENSE file in the root directory of this source tree. | |
""" | |
This script is adapted from the torchvision one. | |
""" | |
import os.path | |
import jinja2 | |
import yaml | |
# The CUDA versions which have pytorch conda packages available for linux for each | |
# version of pytorch. | |
# Pytorch 1.4 also supports cuda 10.0 but we no longer build for cuda 10.0 at all. | |
CONDA_CUDA_VERSIONS = { | |
"1.6.0": ["cu92", "cu101", "cu102"], | |
"1.7.0": ["cu101", "cu102", "cu110"], | |
"1.7.1": ["cu101", "cu102", "cu110"], | |
"1.8.0": ["cu101", "cu102", "cu111"], | |
"1.8.1": ["cu101", "cu102", "cu111"], | |
"1.9.0": ["cu102", "cu111"], | |
"1.9.1": ["cu102", "cu111"], | |
"1.10.0": ["cu102", "cu111", "cu113"], | |
} | |
def conda_docker_image_for_cuda(cuda_version): | |
if cuda_version == "cu113": | |
return "pytorch/conda-builder:cuda113" | |
return None | |
def pytorch_versions_for_python(python_version): | |
if python_version in ["3.6", "3.7", "3.8"]: | |
return list(CONDA_CUDA_VERSIONS) | |
pytorch_without_py39 = ["1.4", "1.5.0", "1.5.1", "1.6.0", "1.7.0"] | |
return [i for i in CONDA_CUDA_VERSIONS if i not in pytorch_without_py39] | |
def workflows(prefix="", filter_branch=None, upload=False, indentation=6): | |
w = [] | |
for btype in ["conda"]: | |
for python_version in ["3.6", "3.7", "3.8", "3.9"]: | |
for pytorch_version in pytorch_versions_for_python(python_version): | |
for cu_version in CONDA_CUDA_VERSIONS[pytorch_version]: | |
w += workflow_pair( | |
btype=btype, | |
python_version=python_version, | |
pytorch_version=pytorch_version, | |
cu_version=cu_version, | |
prefix=prefix, | |
upload=upload, | |
filter_branch=filter_branch, | |
) | |
return indent(indentation, w) | |
def workflow_pair( | |
*, | |
btype, | |
python_version, | |
pytorch_version, | |
cu_version, | |
prefix="", | |
upload=False, | |
filter_branch, | |
): | |
w = [] | |
py = python_version.replace(".", "") | |
pyt = pytorch_version.replace(".", "") | |
base_workflow_name = f"{prefix}linux_{btype}_py{py}_{cu_version}_pyt{pyt}" | |
w.append( | |
generate_base_workflow( | |
base_workflow_name=base_workflow_name, | |
python_version=python_version, | |
pytorch_version=pytorch_version, | |
cu_version=cu_version, | |
btype=btype, | |
filter_branch=filter_branch, | |
) | |
) | |
if upload: | |
w.append( | |
generate_upload_workflow( | |
base_workflow_name=base_workflow_name, | |
btype=btype, | |
cu_version=cu_version, | |
filter_branch=filter_branch, | |
) | |
) | |
return w | |
def generate_base_workflow( | |
*, | |
base_workflow_name, | |
python_version, | |
cu_version, | |
pytorch_version, | |
btype, | |
filter_branch=None, | |
): | |
d = { | |
"name": base_workflow_name, | |
"python_version": python_version, | |
"cu_version": cu_version, | |
"pytorch_version": pytorch_version, | |
"context": "DOCKERHUB_TOKEN", | |
} | |
conda_docker_image = conda_docker_image_for_cuda(cu_version) | |
if conda_docker_image is not None: | |
d["conda_docker_image"] = conda_docker_image | |
if filter_branch is not None: | |
d["filters"] = {"branches": {"only": filter_branch}} | |
return {f"binary_linux_{btype}": d} | |
def generate_upload_workflow(*, base_workflow_name, btype, cu_version, filter_branch): | |
d = { | |
"name": f"{base_workflow_name}_upload", | |
"context": "org-member", | |
"requires": [base_workflow_name], | |
} | |
if btype == "wheel": | |
d["subfolder"] = cu_version + "/" | |
if filter_branch is not None: | |
d["filters"] = {"branches": {"only": filter_branch}} | |
return {f"binary_{btype}_upload": d} | |
def indent(indentation, data_list): | |
if len(data_list) == 0: | |
return "" | |
return ("\n" + " " * indentation).join( | |
yaml.dump(data_list, default_flow_style=False).splitlines() | |
) | |
if __name__ == "__main__": | |
d = os.path.dirname(__file__) | |
env = jinja2.Environment( | |
loader=jinja2.FileSystemLoader(d), | |
lstrip_blocks=True, | |
autoescape=False, | |
keep_trailing_newline=True, | |
) | |
with open(os.path.join(d, "config.yml"), "w") as f: | |
f.write(env.get_template("config.in.yml").render(workflows=workflows)) | |