Added test data URL and checksum arguments to build.py. (#302)

* Added test data arguments to build.py, modified win-ci-pipeline build.

* Updated CI builds to use template tasks, added test data args, removed AZURE_BLOB_KEY uses.

* Fixed up set test data step template.
This commit is contained in:
edgchen1 2019-01-09 22:33:14 -08:00 committed by Changming Sun
parent 55433abecb
commit 34bcc92554
13 changed files with 115 additions and 91 deletions

View file

@ -21,14 +21,20 @@ from os.path import expanduser
logging.basicConfig(format="%(asctime)s %(name)s [%(levelname)s] - %(message)s", level=logging.DEBUG)
log = logging.getLogger("Build")
test_data_url = 'https://onnxruntimetestdata.blob.core.windows.net/models/20181210.zip'
test_data_checksum = 'a966def7447f4ff04f5665bca235b3f3'
class BaseError(Exception):
"""Base class for errors originating from build.py."""
pass
class BuildError(Exception):
class BuildError(BaseError):
"""Error from running build steps."""
def __init__(self, *messages):
super().__init__("\n".join(messages))
class UsageError(BaseError):
"""Usage related error."""
def __init__(self, message):
super().__init__(message)
def parse_arguments():
parser = argparse.ArgumentParser(description="ONNXRuntime CI build driver.",
usage='''
@ -60,6 +66,8 @@ Use the individual flags to only run the specified stages.
parser.add_argument("--pb_home", help="Path to protobuf installation")
parser.add_argument("--download_test_data", action="store_true",
help='''Downloads test data without running the tests''')
parser.add_argument("--test_data_url", help="Test data URL.")
parser.add_argument("--test_data_checksum", help="Test data checksum (MD5 digest).")
# CUDA related
parser.add_argument("--use_cuda", action='store_true', help="Enable CUDA.")
parser.add_argument("--cuda_home", help="Path to CUDA home."
@ -127,7 +135,7 @@ def get_config_build_dir(build_dir, config):
# build directory per configuration
return os.path.join(build_dir, config)
def run_subprocess(args, cwd=None, capture=False, dll_path=None):
def run_subprocess(args, cwd=None, capture=False, dll_path=None, shell=False):
log.debug("Running subprocess in '{0}'\n{1}".format(cwd or os.getcwd(), args))
my_env = os.environ.copy()
if dll_path:
@ -139,12 +147,8 @@ def run_subprocess(args, cwd=None, capture=False, dll_path=None):
else:
my_env["LD_LIBRARY_PATH"] = dll_path
if (capture):
result = subprocess.run(args, cwd=cwd, check=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, env=my_env)
else:
result = subprocess.run(args, cwd=cwd, check=True, env=my_env)
return result
stdout, stderr = (subprocess.PIPE, subprocess.STDOUT) if capture else (None, None)
return subprocess.run(args, cwd=cwd, check=True, stdout=stdout, stderr=stderr, env=my_env, shell=shell)
def update_submodules(source_dir):
run_subprocess(["git", "submodule", "update", "--init", "--recursive"], cwd=source_dir)
@ -216,13 +220,22 @@ def download_test_data(build_dir, src_url, expected_md5, azure_sas_key):
log.info("Downloading test data")
if azure_sas_key:
src_url += azure_sas_key
# try to avoid logging azure_sas_key
if shutil.which('aria2c'):
subprocess.run(['aria2c','-x', '5', '-j',' 5', '-q', src_url, '-d', cache_dir], check=True)
result = subprocess.run(['aria2c','-x', '5', '-j',' 5', '-q', src_url, '-d', cache_dir])
if result.returncode != 0:
raise BuildError("aria2c exited with code {}.".format(result.returncode))
elif shutil.which('curl'):
subprocess.run(['curl', '-s', src_url, '-o', local_zip_file], check=True)
result = subprocess.run(['curl', '-s', src_url, '-o', local_zip_file])
if result.returncode != 0:
raise BuildError("curl exited with code {}.".format(result.returncode))
else:
import urllib.request
urllib.request.urlretrieve(src_url, local_zip_file)
import urllib.error
try:
urllib.request.urlretrieve(src_url, local_zip_file)
except urllib.error.URLError:
raise BuildError("urllib.request.urlretrieve() failed.")
models_dir = os.path.join(build_dir,'models')
if os.path.exists(models_dir):
log.info('deleting %s' % models_dir)
@ -237,12 +250,13 @@ def download_test_data(build_dir, src_url, expected_md5, azure_sas_key):
return False
return True
def generate_build_tree(cmake_path, source_dir, build_dir, cuda_home, cudnn_home, pb_home, configs, cmake_extra_defines, args, cmake_extra_args):
has_test_data = False
if args.enable_onnx_tests or args.download_test_data:
has_test_data = download_test_data(build_dir, test_data_url, test_data_checksum, args.azure_sas_key)
#create a shortcut for test models if there is a 'models' folder in build_dir
if has_test_data and is_windows():
def setup_test_data(build_dir, configs, test_data_url, test_data_checksum, azure_sas_key):
"""Sets up the test data, downloading it if needed."""
if not download_test_data(build_dir, test_data_url, test_data_checksum, azure_sas_key):
raise BuildError("Failed to set up test data.")
# create a shortcut for test models if there is a 'models' folder in build_dir
if is_windows():
src_model_dir = os.path.join(build_dir, 'models')
for config in configs:
config_build_dir = get_config_build_dir(build_dir, config)
@ -250,13 +264,15 @@ def generate_build_tree(cmake_path, source_dir, build_dir, cuda_home, cudnn_home
dest_model_dir = os.path.join(config_build_dir, 'models')
if os.path.exists(src_model_dir) and not os.path.exists(dest_model_dir):
log.debug("creating shortcut %s -> %s" % (src_model_dir, dest_model_dir))
subprocess.run(['mklink', '/D', '/J', dest_model_dir, src_model_dir], shell=True, check=True)
run_subprocess(['mklink', '/D', '/J', dest_model_dir, src_model_dir], shell=True)
def generate_build_tree(cmake_path, source_dir, build_dir, cuda_home, cudnn_home, pb_home, configs, cmake_extra_defines, args, cmake_extra_args):
log.info("Generating CMake build tree")
cmake_dir = os.path.join(source_dir, "cmake")
# TODO: fix jemalloc build so it does not conflict with onnxruntime shared lib builds. (e.g. onnxuntime_pybind)
# for now, disable jemalloc if pybind is also enabled.
cmake_args = [cmake_path, cmake_dir,
"-Donnxruntime_RUN_ONNX_TESTS=" + ("ON" if has_test_data else "OFF"),
"-Donnxruntime_RUN_ONNX_TESTS=" + ("ON" if args.enable_onnx_tests else "OFF"),
"-Donnxruntime_GENERATE_TEST_REPORTS=ON",
"-Donnxruntime_DEV_MODE=ON",
"-DPYTHON_EXECUTABLE=" + sys.executable,
@ -546,6 +562,11 @@ def main():
if (not args.skip_submodule_sync):
update_submodules(source_dir)
if args.enable_onnx_tests or args.download_test_data:
if not args.test_data_url or not args.test_data_checksum:
raise UsageError("The test_data_url and test_data_checksum arguments are required.")
setup_test_data(build_dir, configs, args.test_data_url, args.test_data_checksum, args.azure_sas_key)
generate_build_tree(cmake_path, source_dir, build_dir, cuda_home, cudnn_home, args.pb_home, configs, cmake_extra_defines,
args, cmake_extra_args)
@ -575,6 +596,6 @@ def main():
if __name__ == "__main__":
try:
sys.exit(main())
except BuildError as e:
except BaseError as e:
log.error(str(e))
sys.exit(1)

View file

@ -10,11 +10,13 @@ jobs:
Python37:
python.version: '3.7'
steps:
- template: templates/set-test-data-variables-step.yml
- task: ShellScript@2
displayName: 'Run build script'
inputs:
scriptPath: 'tools/ci_build/github/linux/run_dockerbuild.sh'
args: '-c Release -o ubuntu16.04 -d cpu -r $(Build.BinariesDirectory) -p $(python.version) -x "--build_wheel --use_mkldnn"'
args: '-c Release -o ubuntu16.04 -d cpu -r $(Build.BinariesDirectory) -p $(python.version) -x "--build_wheel --use_mkldnn --test_data_url $(TestDataUrl) --test_data_checksum $(TestDataChecksum)"'
- task: CopyFiles@2
displayName: 'Copy Python Wheel to: $(Build.ArtifactStagingDirectory)'
@ -28,9 +30,7 @@ jobs:
inputs:
ArtifactName: onnxruntime
- script: 'sudo rm -rf $(Agent.BuildDirectory)'
displayName: 'Clean build folders/files'
condition: always()
- template: templates/clean-agent-build-directory-step.yml
- job: Ubuntu1604_py_GPU_Wheels
pool: Linux-GPU
@ -43,11 +43,13 @@ jobs:
Python37:
python.version: '3.7'
steps:
- template: templates/set-test-data-variables-step.yml
- task: ShellScript@2
displayName: 'Run build script'
inputs:
scriptPath: 'tools/ci_build/github/linux/run_dockerbuild.sh'
args: '-c Release -o ubuntu16.04 -d gpu -c cuda9.1-cudnn7.1 -r $(Build.BinariesDirectory) -p $(python.version) -x "--build_wheel --use_mkldnn"'
args: '-c Release -o ubuntu16.04 -d gpu -c cuda9.1-cudnn7.1 -r $(Build.BinariesDirectory) -p $(python.version) -x "--build_wheel --use_mkldnn --test_data_url $(TestDataUrl) --test_data_checksum $(TestDataChecksum)"'
- task: CopyFiles@2
displayName: 'Copy Python Wheel to: $(Build.ArtifactStagingDirectory)'
@ -61,9 +63,7 @@ jobs:
inputs:
ArtifactName: onnxruntime_gpu
- script: 'sudo rm -rf $(Agent.BuildDirectory)'
displayName: 'Clean build folders/files'
condition: always()
- template: templates/clean-agent-build-directory-step.yml
- job: Windows_py_Wheels
pool: Win-CPU
@ -104,14 +104,6 @@ jobs:
inputs:
ArtifactName: onnxruntime
- task: CmdLine@1
displayName: 'Clean build folders/files'
inputs:
filename: rd
arguments: '/s /q $(Agent.BuildDirectory)'
continueOnError: true
condition: always()
- task: CmdLine@1
displayName: 'Deactivating Conda Environment'
inputs:
@ -119,6 +111,8 @@ jobs:
continueOnError: true
condition: always()
- template: templates/clean-agent-build-directory-step.yml
- job: Windows_py_GPU_Wheels
pool: Win-GPU
variables:
@ -172,14 +166,6 @@ jobs:
inputs:
ArtifactName: onnxruntime_gpu
- task: CmdLine@1
displayName: 'Clean build folders/files'
inputs:
filename: rd
arguments: '/s /q $(Agent.BuildDirectory)'
continueOnError: true
condition: always()
- task: CmdLine@1
displayName: 'Deactivating Conda Environment'
inputs:
@ -187,6 +173,8 @@ jobs:
continueOnError: true
condition: always()
- template: templates/clean-agent-build-directory-step.yml
- job: MacOS_py_Wheels
pool:
vmImage: 'macOS-10.13'
@ -224,6 +212,4 @@ jobs:
inputs:
ArtifactName: onnxruntime
- script: 'sudo rm -rf $(Agent.BuildDirectory)'
displayName: 'Clean build folders/files'
condition: always()
- template: templates/clean-agent-build-directory-step.yml

View file

@ -2,10 +2,9 @@ jobs:
- job: Linux_CI_Dev
pool: Linux-CPU
steps:
- script: 'tools/ci_build/github/linux/run_dockerbuild.sh -o ubuntu16.04 -d cpu -r $(Build.BinariesDirectory) -x "--use_mklml"'
- template: templates/set-test-data-variables-step.yml
- script: 'tools/ci_build/github/linux/run_dockerbuild.sh -o ubuntu16.04 -d cpu -r $(Build.BinariesDirectory) -x "--use_mklml --test_data_url $(TestDataUrl) --test_data_checksum $(TestDataChecksum)"'
displayName: 'Command Line Script'
env:
AZURE_BLOB_KEY: $(onnxruntime-storage-key)
- script: 'sudo rm -rf $(Agent.BuildDirectory)'
displayName: 'Clean build folders/files'
condition: always()
- template: templates/clean-agent-build-directory-step.yml

View file

@ -2,9 +2,9 @@ jobs:
- job: Linux_CI_GPU_Dev
pool: Linux-GPU-CUDA10
steps:
- script: 'tools/ci_build/github/linux/run_dockerbuild.sh -o ubuntu16.04 -d gpu -c cuda9.1-cudnn7.1 -r $(Build.BinariesDirectory)'
- template: templates/set-test-data-variables-step.yml
- script: 'tools/ci_build/github/linux/run_dockerbuild.sh -o ubuntu16.04 -d gpu -c cuda9.1-cudnn7.1 -r $(Build.BinariesDirectory) -x "--test_data_url $(TestDataUrl) --test_data_checksum $(TestDataChecksum)"'
displayName: 'Command Line Script'
- script: 'sudo rm -rf $(Agent.BuildDirectory)'
displayName: 'Clean build folders/files'
condition: always()
- template: templates/clean-agent-build-directory-step.yml

View file

@ -2,9 +2,9 @@ jobs:
- job: Linux_CI_GPU_Dev
pool: Linux-GPU-CUDA10
steps:
- script: 'tools/ci_build/github/linux/run_dockerbuild.sh -o ubuntu16.04 -d gpu -r $(Build.BinariesDirectory)'
- template: templates/set-test-data-variables-step.yml
- script: 'tools/ci_build/github/linux/run_dockerbuild.sh -o ubuntu16.04 -d gpu -r $(Build.BinariesDirectory) -x "--test_data_url $(TestDataUrl) --test_data_checksum $(TestDataChecksum)"'
displayName: 'Command Line Script'
- script: 'sudo rm -rf $(Agent.BuildDirectory)'
displayName: 'Clean build folders/files'
condition: always()
- template: templates/clean-agent-build-directory-step.yml

View file

@ -7,6 +7,5 @@ jobs:
sudo xcode-select --switch /Applications/Xcode_10.app/Contents/Developer
./build.sh --skip_submodule_sync --parallel
displayName: 'Command Line Script'
- script: 'sudo rm -rf $(Agent.BuildDirectory)'
displayName: 'Clean build folders/files'
condition: always()
- template: templates/clean-agent-build-directory-step.yml

View file

@ -0,0 +1,9 @@
# cleans $(Agent.BuildDirectory) unconditionally on multiple platforms
steps:
- script: rd /S /Q $(Agent.BuildDirectory)
displayName: Clean build files (Windows)
condition: eq(variables['Agent.OS'], 'Windows_NT') # and always()
- script: sudo rm -rf $(Agent.BuildDirectory)
displayName: Clean build files (POSIX)
condition: not(eq(variables['Agent.OS'], 'Windows_NT')) # and always()

View file

@ -0,0 +1,18 @@
# sets variables $(TestDataUrl) and $(TestDataChecksum)
parameters:
TestDataUrl: https://onnxruntimetestdata.blob.core.windows.net/models/20181210.zip
TestDataChecksum: a966def7447f4ff04f5665bca235b3f3
steps:
- task: CmdLine@1
displayName: 'Set TestDataUrl variable'
inputs:
filename: echo
arguments: '##vso[task.setvariable variable=TestDataUrl;]${{parameters.TestDataUrl}}'
- task: CmdLine@1
displayName: 'Set TestDataChecksum variable'
inputs:
filename: echo
arguments: '##vso[task.setvariable variable=TestDataChecksum;]${{parameters.TestDataChecksum}}'

View file

@ -2,6 +2,8 @@ jobs:
- job: Windows_CI_Dev
pool: Win-CPU
steps:
- template: templates/set-test-data-variables-step.yml
- task: CmdLine@1
displayName: 'Download cmake'
inputs:
@ -11,13 +13,7 @@ jobs:
- task: BatchScript@1
inputs:
filename: build.bat
arguments: ' --skip_submodule_sync --cmake_path $(Build.BinariesDirectory)\cmake\bin\cmake.exe --ctest_path $(Build.BinariesDirectory)\cmake\bin\ctest.exe --config Debug Release --use_tvm --enable_pybind --use_mkldnn --use_mklml --use_openmp --build_shared_lib --build_csharp --enable_onnx_tests'
arguments: ' --skip_submodule_sync --cmake_path $(Build.BinariesDirectory)\cmake\bin\cmake.exe --ctest_path $(Build.BinariesDirectory)\cmake\bin\ctest.exe --config Debug Release --use_tvm --enable_pybind --use_mkldnn --use_mklml --use_openmp --build_shared_lib --build_csharp --enable_onnx_tests --test_data_url $(TestDataUrl) --test_data_checksum $(TestDataChecksum)'
workingFolder: "$(Build.BinariesDirectory)"
- task: CmdLine@1
displayName: 'Clean build folders/files'
inputs:
filename: rd
arguments: '/s /q $(Agent.BuildDirectory)'
continueOnError: true
condition: always()
- template: templates/clean-agent-build-directory-step.yml

View file

@ -9,26 +9,24 @@ jobs:
inputs:
scriptName: 'tools/ci_build/github/windows/set_cuda_path.ps1'
arguments: '-CudaMsbuildPath C:\local\cudaMsbuildIntegration-9.1.85-windows10-x64-0 -CudaVersion $(CUDA_VERSION)'
- task: BatchScript@1
displayName: 'Setup VS2017 env vars'
inputs:
filename: 'C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars64.bat'
arguments: 'amd64 -vcvars_ver=14.11'
modifyEnvironment: true
- task: BatchScript@1
inputs:
filename: build.bat
arguments: ' --skip_submodule_sync --use_cuda --cuda_home="C:\local\cuda-9.1.85-windows10-x64-0" --cudnn_home="C:\local\cudnn-9.1-windows10-x64-v7.1\cuda"'
workingFolder: "$(Build.SourcesDirectory)"
- task: PowerShell@1
displayName: 'Clean up CUDA props files'
inputs:
scriptName: 'tools/ci_build/github/windows/clean_up_cuda_prop_files.ps1'
arguments: '-CudaVersion $(CUDA_VERSION)'
- task: CmdLine@1
displayName: 'Clean build folders/files'
inputs:
filename: rd
arguments: '/s /q $(Agent.BuildDirectory)'
continueOnError: true
condition: always()
- template: templates/clean-agent-build-directory-step.yml

View file

@ -4,6 +4,8 @@ jobs:
variables:
CUDA_VERSION: '10.0'
steps:
- template: templates/set-test-data-variables-step.yml
- task: CmdLine@1
displayName: 'Download cmake'
inputs:
@ -15,26 +17,24 @@ jobs:
inputs:
scriptName: 'tools/ci_build/github/windows/set_cuda_path.ps1'
arguments: '-CudaMsbuildPath C:\local\cudaMsbuildIntegration-10.0.130-win10 -CudaVersion $(CUDA_VERSION)'
- task: BatchScript@1
displayName: 'Setup VS2017 env vars'
inputs:
filename: 'C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars64.bat'
arguments: 'amd64 -vcvars_ver=14.11'
modifyEnvironment: true
- task: BatchScript@1
inputs:
filename: build.bat
arguments: ' --skip_submodule_sync --cmake_path $(Build.BinariesDirectory)\cmake\bin\cmake.exe --ctest_path $(Build.BinariesDirectory)\cmake\bin\ctest.exe --config Debug Release --enable_onnx_tests --use_mkldnn --build_shared_lib --build_csharp --use_cuda --cuda_home="C:\local\cuda_10.0.130_win10" --cudnn_home="C:\local\cudnn-10.0-windows10-x64-v7.3.1.20\cuda"'
arguments: ' --skip_submodule_sync --cmake_path $(Build.BinariesDirectory)\cmake\bin\cmake.exe --ctest_path $(Build.BinariesDirectory)\cmake\bin\ctest.exe --config Debug Release --enable_onnx_tests --test_data_url $(TestDataUrl) --test_data_checksum $(TestDataChecksum) --use_mkldnn --build_shared_lib --build_csharp --use_cuda --cuda_home="C:\local\cuda_10.0.130_win10" --cudnn_home="C:\local\cudnn-10.0-windows10-x64-v7.3.1.20\cuda"'
workingFolder: "$(Build.SourcesDirectory)"
- task: PowerShell@1
displayName: 'Clean up CUDA props files'
inputs:
scriptName: 'tools/ci_build/github/windows/clean_up_cuda_prop_files.ps1'
arguments: '-CudaVersion $(CUDA_VERSION)'
- task: CmdLine@1
displayName: 'Clean build folders/files'
inputs:
filename: rd
arguments: '/s /q $(Agent.BuildDirectory)'
continueOnError: true
condition: always()
- template: templates/clean-agent-build-directory-step.yml

View file

@ -6,6 +6,5 @@ ENV NVIDIA_VISIBLE_DEVICES=all \
NVIDIA_REQUIRE_CUDA="cuda>=9.2" \
PATH="/usr/lib64/ccache:/opt/cmake/bin:${PATH}"
ADD scripts /tmp/scripts
ARG AZURE_BLOB_KEY
RUN cd /tmp/scripts && /tmp/scripts/install_fedora_gpu.sh && /tmp/scripts/install_deps.sh && rm -rf /tmp/scripts

View file

@ -7,7 +7,6 @@ tar -xf /tmp/azcopy/azcopy.tar.gz --strip 1 -C /tmp/azcopy
/bin/cp /tmp/azcopy/azcopy /usr/bin/azcopy
rm -rf /tmp/azcopy
#install cuda 9.2 and cudnn 7
#azcopy --source https://lotus.blob.core.windows.net/cudnn/linux/cuda/9.2/v7.2.1.38.tgz --destination /tmp/cudnn-9.2-linux-x64-v7.2.1.38.tgz --source-key $AZURE_BLOB_KEY
aria2c -q -d /tmp 'http://developer.download.nvidia.com/compute/cuda/repos/fedora27/x86_64/cuda-repo-fedora27-10.0.130-1.x86_64.rpm'
dnf install -y /tmp/cuda-repo-fedora27-10.0.130-1.x86_64.rpm
dnf install -y cuda-10.0.130-1.x86_64