You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tvm.apache.org by mo...@apache.org on 2022/05/11 08:45:02 UTC
[tvm] branch main updated: [ci] Use r5.large nodes for builds and lint (#11258)
This is an automated email from the ASF dual-hosted git repository.
mousius pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tvm.git
The following commit(s) were added to refs/heads/main by this push:
new 025c3a3f69 [ci] Use r5.large nodes for builds and lint (#11258)
025c3a3f69 is described below
commit 025c3a3f69bce7abbf332cd53452c0abc48468f4
Author: driazati <94...@users.noreply.github.com>
AuthorDate: Wed May 11 01:44:52 2022 -0700
[ci] Use r5.large nodes for builds and lint (#11258)
This uses `r5.large` for linting and build steps and splits lint into 2 to keep runtime down. This is a subset split off of #11120. Once `task_cpp_unittest.sh` is fixed so it picks up sccache we can enable these smaller nodes there as well.
---
Jenkinsfile | 173 +++++++++++++++++++++++++++++++--------------
jenkins/Jenkinsfile.j2 | 91 ++++++++++--------------
jenkins/macros.j2 | 19 +++++
tests/scripts/task_lint.sh | 85 +++++++++++++---------
4 files changed, 231 insertions(+), 137 deletions(-)
diff --git a/Jenkinsfile b/Jenkinsfile
index a541f1688c..5d07e9563b 100755
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -45,7 +45,7 @@
// 'python3 jenkins/generate.py'
// Note: This timestamp is here to ensure that updates to the Jenkinsfile are
// always rebased on main before merging:
-// Generated at 2022-05-05T13:07:33.276898
+// Generated at 2022-05-09T16:19:42.885533
import org.jenkinsci.plugins.pipeline.modeldefinition.Utils
// NOTE: these lines are scanned by docker/dev_common.sh. Please update the regex as needed. -->
@@ -189,59 +189,126 @@ cancel_previous_build()
def lint() {
stage('Lint') {
- node('CPU') {
- timeout(time: max_time, unit: 'MINUTES') {
- ci_lint = params.ci_lint_param ?: ci_lint
- ci_cpu = params.ci_cpu_param ?: ci_cpu
- ci_gpu = params.ci_gpu_param ?: ci_gpu
- ci_wasm = params.ci_wasm_param ?: ci_wasm
- ci_i386 = params.ci_i386_param ?: ci_i386
- ci_qemu = params.ci_qemu_param ?: ci_qemu
- ci_arm = params.ci_arm_param ?: ci_arm
- ci_hexagon = params.ci_hexagon_param ?: ci_hexagon
+ parallel(
+ 'Lint 1 of 2': {
+ node('CPU-SMALL') {
+ ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/lint") {
+ init_git()
+ timeout(time: max_time, unit: 'MINUTES') {
+ withEnv([
+ 'TVM_NUM_SHARDS=2',
+ 'TVM_SHARD_INDEX=0'], {
+ ci_arm = params.ci_arm_param ?: ci_arm
+ ci_cpu = params.ci_cpu_param ?: ci_cpu
+ ci_gpu = params.ci_gpu_param ?: ci_gpu
+ ci_hexagon = params.ci_hexagon_param ?: ci_hexagon
+ ci_i386 = params.ci_i386_param ?: ci_i386
+ ci_lint = params.ci_lint_param ?: ci_lint
+ ci_qemu = params.ci_qemu_param ?: ci_qemu
+ ci_wasm = params.ci_wasm_param ?: ci_wasm
- sh (script: """
- echo "Docker images being used in this build:"
- echo " ci_lint = ${ci_lint}"
- echo " ci_cpu = ${ci_cpu}"
- echo " ci_gpu = ${ci_gpu}"
- echo " ci_wasm = ${ci_wasm}"
- echo " ci_i386 = ${ci_i386}"
- echo " ci_qemu = ${ci_qemu}"
- echo " ci_arm = ${ci_arm}"
- echo " ci_hexagon = ${ci_hexagon}"
- """, label: 'Docker image names')
+ sh (script: """
+ echo "Docker images being used in this build:"
+ echo " ci_arm = ${ci_arm}"
+ echo " ci_cpu = ${ci_cpu}"
+ echo " ci_gpu = ${ci_gpu}"
+ echo " ci_hexagon = ${ci_hexagon}"
+ echo " ci_i386 = ${ci_i386}"
+ echo " ci_lint = ${ci_lint}"
+ echo " ci_qemu = ${ci_qemu}"
+ echo " ci_wasm = ${ci_wasm}"
+ """, label: 'Docker image names')
- ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/sanity") {
- init_git()
- is_docs_only_build = sh (
- returnStatus: true,
- script: './tests/scripts/git_change_docs.sh',
- label: 'Check for docs only changes',
- )
- skip_ci = should_skip_ci(env.CHANGE_ID)
- skip_slow_tests = should_skip_slow_tests(env.CHANGE_ID)
- rebuild_docker_images = sh (
- returnStatus: true,
- script: './tests/scripts/git_change_docker.sh',
- label: 'Check for any docker changes',
- )
- if (skip_ci) {
- // Don't rebuild when skipping CI
- rebuild_docker_images = false
+ is_docs_only_build = sh (
+ returnStatus: true,
+ script: './tests/scripts/git_change_docs.sh',
+ label: 'Check for docs only changes',
+ )
+ skip_ci = should_skip_ci(env.CHANGE_ID)
+ skip_slow_tests = should_skip_slow_tests(env.CHANGE_ID)
+ rebuild_docker_images = sh (
+ returnStatus: true,
+ script: './tests/scripts/git_change_docker.sh',
+ label: 'Check for any docker changes',
+ )
+ if (skip_ci) {
+ // Don't rebuild when skipping CI
+ rebuild_docker_images = false
+ }
+ if (rebuild_docker_images) {
+ // Exit before linting so we can use the newly created Docker images
+ // to run the lint
+ return
+ }
+ sh (
+ script: "${docker_run} ${ci_lint} ./tests/scripts/task_lint.sh",
+ label: 'Run lint',
+ )
+ })
}
- if (rebuild_docker_images) {
- // Exit before linting so we can use the newly created Docker images
- // to run the lint
- return
+ }
+ }
+ },
+ 'Lint 2 of 2': {
+ node('CPU-SMALL') {
+ ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/lint") {
+ init_git()
+ timeout(time: max_time, unit: 'MINUTES') {
+ withEnv([
+ 'TVM_NUM_SHARDS=2',
+ 'TVM_SHARD_INDEX=1'], {
+ ci_arm = params.ci_arm_param ?: ci_arm
+ ci_cpu = params.ci_cpu_param ?: ci_cpu
+ ci_gpu = params.ci_gpu_param ?: ci_gpu
+ ci_hexagon = params.ci_hexagon_param ?: ci_hexagon
+ ci_i386 = params.ci_i386_param ?: ci_i386
+ ci_lint = params.ci_lint_param ?: ci_lint
+ ci_qemu = params.ci_qemu_param ?: ci_qemu
+ ci_wasm = params.ci_wasm_param ?: ci_wasm
+
+ sh (script: """
+ echo "Docker images being used in this build:"
+ echo " ci_arm = ${ci_arm}"
+ echo " ci_cpu = ${ci_cpu}"
+ echo " ci_gpu = ${ci_gpu}"
+ echo " ci_hexagon = ${ci_hexagon}"
+ echo " ci_i386 = ${ci_i386}"
+ echo " ci_lint = ${ci_lint}"
+ echo " ci_qemu = ${ci_qemu}"
+ echo " ci_wasm = ${ci_wasm}"
+ """, label: 'Docker image names')
+
+ is_docs_only_build = sh (
+ returnStatus: true,
+ script: './tests/scripts/git_change_docs.sh',
+ label: 'Check for docs only changes',
+ )
+ skip_ci = should_skip_ci(env.CHANGE_ID)
+ skip_slow_tests = should_skip_slow_tests(env.CHANGE_ID)
+ rebuild_docker_images = sh (
+ returnStatus: true,
+ script: './tests/scripts/git_change_docker.sh',
+ label: 'Check for any docker changes',
+ )
+ if (skip_ci) {
+ // Don't rebuild when skipping CI
+ rebuild_docker_images = false
+ }
+ if (rebuild_docker_images) {
+ // Exit before linting so we can use the newly created Docker images
+ // to run the lint
+ return
+ }
+ sh (
+ script: "${docker_run} ${ci_lint} ./tests/scripts/task_lint.sh",
+ label: 'Run lint',
+ )
+ })
}
- sh (
- script: "${docker_run} ${ci_lint} ./tests/scripts/task_lint.sh",
- label: 'Run lint',
- )
}
}
- }
+ },
+ )
}
}
@@ -499,7 +566,7 @@ stage('Build') {
}
parallel 'BUILD: GPU': {
if (!skip_ci) {
- node('CPU') {
+ node('CPU-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/build-gpu") {
init_git()
sh "${docker_run} --no-gpu ${ci_gpu} ./tests/scripts/task_config_build_gpu.sh build"
@@ -516,7 +583,7 @@ stage('Build') {
},
'BUILD: CPU': {
if (!skip_ci && is_docs_only_build != 1) {
- node('CPU') {
+ node('CPU-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/build-cpu") {
init_git()
sh (
@@ -539,7 +606,7 @@ stage('Build') {
},
'BUILD: WASM': {
if (!skip_ci && is_docs_only_build != 1) {
- node('CPU') {
+ node('CPU-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/build-wasm") {
init_git()
sh (
@@ -563,7 +630,7 @@ stage('Build') {
},
'BUILD: i386': {
if (!skip_ci && is_docs_only_build != 1) {
- node('CPU') {
+ node('CPU-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/build-i386") {
init_git()
sh (
@@ -597,7 +664,7 @@ stage('Build') {
},
'BUILD: QEMU': {
if (!skip_ci && is_docs_only_build != 1) {
- node('CPU') {
+ node('CPU-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/build-qemu") {
init_git()
sh (
diff --git a/jenkins/Jenkinsfile.j2 b/jenkins/Jenkinsfile.j2
index b961b61468..a9f8f7accb 100644
--- a/jenkins/Jenkinsfile.j2
+++ b/jenkins/Jenkinsfile.j2
@@ -186,59 +186,46 @@ cancel_previous_build()
def lint() {
stage('Lint') {
- node('CPU') {
- timeout(time: max_time, unit: 'MINUTES') {
- ci_lint = params.ci_lint_param ?: ci_lint
- ci_cpu = params.ci_cpu_param ?: ci_cpu
- ci_gpu = params.ci_gpu_param ?: ci_gpu
- ci_wasm = params.ci_wasm_param ?: ci_wasm
- ci_i386 = params.ci_i386_param ?: ci_i386
- ci_qemu = params.ci_qemu_param ?: ci_qemu
- ci_arm = params.ci_arm_param ?: ci_arm
- ci_hexagon = params.ci_hexagon_param ?: ci_hexagon
+ parallel(
+ {% call m.sharded_lint_step(name='Lint', num_shards=2, node='CPU-SMALL', ws='tvm/lint') %}
+ {% for image in images %}
+ {{ image.name }} = params.{{ image.name }}_param ?: {{ image.name }}
+ {% endfor %}
sh (script: """
echo "Docker images being used in this build:"
- echo " ci_lint = ${ci_lint}"
- echo " ci_cpu = ${ci_cpu}"
- echo " ci_gpu = ${ci_gpu}"
- echo " ci_wasm = ${ci_wasm}"
- echo " ci_i386 = ${ci_i386}"
- echo " ci_qemu = ${ci_qemu}"
- echo " ci_arm = ${ci_arm}"
- echo " ci_hexagon = ${ci_hexagon}"
+ {% for image in images %}
+ echo " {{ image.name }} = ${ {{- image.name -}} }"
+ {% endfor %}
""", label: 'Docker image names')
- ws({{ m.per_exec_ws('tvm/sanity') }}) {
- init_git()
- is_docs_only_build = sh (
- returnStatus: true,
- script: './tests/scripts/git_change_docs.sh',
- label: 'Check for docs only changes',
- )
- skip_ci = should_skip_ci(env.CHANGE_ID)
- skip_slow_tests = should_skip_slow_tests(env.CHANGE_ID)
- rebuild_docker_images = sh (
- returnStatus: true,
- script: './tests/scripts/git_change_docker.sh',
- label: 'Check for any docker changes',
- )
- if (skip_ci) {
- // Don't rebuild when skipping CI
- rebuild_docker_images = false
- }
- if (rebuild_docker_images) {
- // Exit before linting so we can use the newly created Docker images
- // to run the lint
- return
- }
- sh (
- script: "${docker_run} ${ci_lint} ./tests/scripts/task_lint.sh",
- label: 'Run lint',
- )
+ is_docs_only_build = sh (
+ returnStatus: true,
+ script: './tests/scripts/git_change_docs.sh',
+ label: 'Check for docs only changes',
+ )
+ skip_ci = should_skip_ci(env.CHANGE_ID)
+ skip_slow_tests = should_skip_slow_tests(env.CHANGE_ID)
+ rebuild_docker_images = sh (
+ returnStatus: true,
+ script: './tests/scripts/git_change_docker.sh',
+ label: 'Check for any docker changes',
+ )
+ if (skip_ci) {
+ // Don't rebuild when skipping CI
+ rebuild_docker_images = false
}
- }
- }
+ if (rebuild_docker_images) {
+ // Exit before linting so we can use the newly created Docker images
+ // to run the lint
+ return
+ }
+ sh (
+ script: "${docker_run} ${ci_lint} ./tests/scripts/task_lint.sh",
+ label: 'Run lint',
+ )
+ {% endcall %}
+ )
}
}
@@ -496,7 +483,7 @@ stage('Build') {
}
parallel 'BUILD: GPU': {
if (!skip_ci) {
- node('CPU') {
+ node('CPU-SMALL') {
ws({{ m.per_exec_ws('tvm/build-gpu') }}) {
init_git()
sh "${docker_run} --no-gpu ${ci_gpu} ./tests/scripts/task_config_build_gpu.sh build"
@@ -513,7 +500,7 @@ stage('Build') {
},
'BUILD: CPU': {
if (!skip_ci && is_docs_only_build != 1) {
- node('CPU') {
+ node('CPU-SMALL') {
ws({{ m.per_exec_ws('tvm/build-cpu') }}) {
init_git()
sh (
@@ -536,7 +523,7 @@ stage('Build') {
},
'BUILD: WASM': {
if (!skip_ci && is_docs_only_build != 1) {
- node('CPU') {
+ node('CPU-SMALL') {
ws({{ m.per_exec_ws('tvm/build-wasm') }}) {
init_git()
sh (
@@ -560,7 +547,7 @@ stage('Build') {
},
'BUILD: i386': {
if (!skip_ci && is_docs_only_build != 1) {
- node('CPU') {
+ node('CPU-SMALL') {
ws({{ m.per_exec_ws('tvm/build-i386') }}) {
init_git()
sh (
@@ -594,7 +581,7 @@ stage('Build') {
},
'BUILD: QEMU': {
if (!skip_ci && is_docs_only_build != 1) {
- node('CPU') {
+ node('CPU-SMALL') {
ws({{ m.per_exec_ws('tvm/build-qemu') }}) {
init_git()
sh (
diff --git a/jenkins/macros.j2 b/jenkins/macros.j2
index 97e6eee68c..cbb36545ff 100644
--- a/jenkins/macros.j2
+++ b/jenkins/macros.j2
@@ -47,6 +47,25 @@
{% endfor %}
{% endmacro %}
+{% macro sharded_lint_step(name, num_shards, node, ws) %}
+{% for shard_index in range(1, num_shards + 1) %}
+ '{{ name }} {{ shard_index }} of {{ num_shards }}': {
+ node('{{ node }}') {
+ ws({{ per_exec_ws(ws) }}) {
+ init_git()
+ timeout(time: max_time, unit: 'MINUTES') {
+ withEnv([
+ 'TVM_NUM_SHARDS={{ num_shards }}',
+ 'TVM_SHARD_INDEX={{ shard_index - 1 }}'], {
+ {{ caller() | trim | indent(width=6) }}
+ })
+ }
+ }
+ }
+ },
+{% endfor %}
+{% endmacro %}
+
{% macro test_step(name, node, ws, platform) %}
'{{ name }}': {
diff --git a/tests/scripts/task_lint.sh b/tests/scripts/task_lint.sh
index 79e86f0c49..e0c953d618 100755
--- a/tests/scripts/task_lint.sh
+++ b/tests/scripts/task_lint.sh
@@ -25,48 +25,69 @@ cleanup()
trap cleanup 0
-echo "Convert scripts to Python..."
-tests/scripts/task_convert_scripts_to_python.sh
+# These shards are solely for CI to enable the lint job to have some parallelism.
-# TODO: Remove this ad-hoc pip install once https://github.com/apache/tvm/pull/10741
-# is added to the ci_lint Docker image
-python3 -m pip install --user -r jenkins/requirements.txt
-echo "Check Jenkinsfile generation"
-python3 jenkins/generate.py --check
+function shard1 {
+ echo "Convert scripts to Python..."
+ tests/scripts/task_convert_scripts_to_python.sh
-echo "Checking file types..."
-python3 tests/lint/check_file_type.py
+ # TODO: Remove this ad-hoc pip install once https://github.com/apache/tvm/pull/11265
+ # is added to the ci_lint Docker image
+ python3 -m pip install --user -r jenkins/requirements.txt
+ echo "Check Jenkinsfile generation"
+ python3 jenkins/generate.py --check
-echo "Checking CMake <-> LibInfo options mirroring"
-python3 tests/lint/check_cmake_options.py
+ echo "Checking file types..."
+ python3 tests/lint/check_file_type.py
-echo "Checking ASF license headers..."
-tests/lint/check_asf_header.sh --local
+ echo "Checking CMake <-> LibInfo options mirroring"
+ python3 tests/lint/check_cmake_options.py
-echo "Linting the C++ code..."
-tests/lint/cpplint.sh
+ echo "black check..."
+ tests/lint/git-black.sh
-echo "clang-format check..."
-tests/lint/git-clang-format.sh
+ echo "Linting the Python code with flake8..."
+ tests/lint/flake8.sh
-echo "Rust check..."
-tests/lint/rust_format.sh
+ echo "Type checking with MyPy ..."
+ tests/scripts/task_mypy.sh
-echo "black check..."
-tests/lint/git-black.sh
+ echo "Checking for non-inclusive language with blocklint..."
+ tests/lint/blocklint.sh
-echo "Linting the Python code..."
-tests/lint/pylint.sh
-tests/lint/flake8.sh
+ echo "Linting the JNI code..."
+ tests/lint/jnilint.sh
+}
+
+function shard2 {
+ echo "Linting the Python code with pylint..."
+ tests/lint/pylint.sh
+
+ echo "Checking C++ documentation..."
+ tests/lint/cppdocs.sh
+
+ echo "Checking ASF license headers..."
+ tests/lint/check_asf_header.sh --local
-echo "Linting the JNI code..."
-tests/lint/jnilint.sh
+ echo "Linting the C++ code..."
+ tests/lint/cpplint.sh
+
+ echo "clang-format check..."
+ tests/lint/git-clang-format.sh
+
+ echo "Rust check..."
+ tests/lint/rust_format.sh
+}
-echo "Checking C++ documentation..."
-tests/lint/cppdocs.sh
-echo "Type checking with MyPy ..."
-tests/scripts/task_mypy.sh
+if [[ -n ${TVM_SHARD_INDEX+x} ]]; then
+ if [[ "$TVM_SHARD_INDEX" == "0" ]]; then
+ shard1
+ else
+ shard2
+ fi
+else
+ shard1
+ shard2
+fi
-echo "Checking for non-inclusive language with blocklint..."
-tests/lint/blocklint.sh
\ No newline at end of file