Automated testing in XGBoost project — xgboost 2.1.1 documentation (original) (raw)

This document collects tips for using the Continuous Integration (CI) service of the XGBoost project.

Contents

GitHub Actions

The configuration files are located under the directory.github/workflows.

Most of the tests listed in the configuration files run automatically for every incoming pull requests and every update to branches. A few tests however require manual activation:

GitHub Actions is also used to build Python wheels targeting MacOS Intel and Apple Silicon. See.github/workflows/python_wheels.yml. Thepython_wheels pipeline sets up environment variables prefixed CIBW_* to indicate the target OS and processor. The pipeline then invokes the script build_python_wheels.sh, which in turns calls cibuildwheel to build the wheel. The cibuildwheel is a library that sets up a suitable Python environment for each OS and processor target. Since we don’t have Apple Silicon machine in GitHub Actions, cross-compilation is needed; cibuildwheel takes care of the complex task of cross-compiling a Python wheel. (Note that cibuildwheel will callpip wheel. Since XGBoost has a native library component, we created a customized build backend that hooks into pip. The customized backend contains the glue code to compile the native library on the fly.)

Reproduce CI testing environments using Docker containers

In our CI pipelines, we use Docker containers extensively to package many software packages together. You can reproduce the same testing environment as the CI pipelines by running Docker locally.

Prerequisites

  1. Install Docker: https://docs.docker.com/engine/install/ubuntu/
  2. Install NVIDIA Docker runtime: https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#installing-on-ubuntu-and-debianThe runtime lets you access NVIDIA GPUs inside a Docker container.

Building and Running Docker containers locally

For your convenience, we provide the wrapper script tests/ci_build/ci_build.sh. You can use it as follows:

tests/ci_build/ci_build.sh --use-gpus --build-arg
...

where:

Optionally, you can set the environment variable CI_DOCKER_EXTRA_PARAMS_INIT to pass extra arguments to Docker. For example:

Allocate extra space in /dev/shm to enable NCCL

export CI_DOCKER_EXTRA_PARAMS_INIT='--shm-size=4g'

Run multi-GPU test suite

tests/ci_build/ci_build.sh gpu --use-gpus --build-arg CUDA_VERSION_ARG=11.0
tests/ci_build/test_python.sh mgpu

To pass multiple extra arguments:

export CI_DOCKER_EXTRA_PARAMS_INIT='-e VAR1=VAL1 -e VAR2=VAL2 -e VAR3=VAL3'

Update pipeline definitions for BuildKite CI

BuildKite is a SaaS (Software as a Service) platform that orchestrates cloud machines to host CI pipelines. The BuildKite platform allows us to define CI pipelines as a declarative YAML file.

The pipeline definitions are found in tests/buildkite/:

Managing Elastic CI Stack with BuildKite

BuildKite allows us to define cloud resources in a declarative fashion. Every configuration step is now documented explicitly as code.

Prerequisite: You should have some knowledge of CloudFormation. CloudFormation lets us define a stack of cloud resources (EC2 machines, Lambda functions, S3 etc) using a single YAML file.

Prerequisite: Gain access to the XGBoost project’s AWS account (admin@xgboost-ci.net), and then set up a credential pair in order to provision resources on AWS. SeeCreating an IAM user in your AWS account.

Worker Image Pipeline

Building images for worker machines used to be a chore: you’d provision an EC2 machine, SSH into it, and manually install the necessary packages. This process is not only laborious but also error-prone. You may forget to install a package or change a system configuration.

No more. Now we have an automated pipeline for building images for worker machines.

EC2 Autoscaling Groups

In EC2, you can create auto-scaling groups, where you can dynamically adjust the number of worker instances according to workload. When a pull request is submitted, the following steps take place:

  1. GitHub sends a signal to the registered webhook, which connects to the BuildKite server.
  2. BuildKite sends a signal to a Lambda function named Autoscaling.
  3. The Lambda function sends a signal to the auto-scaling group. The group scales up and adds additional worker instances.
  4. New worker instances run the test jobs. Test results are reported back to BuildKite.
  5. When the test jobs complete, BuildKite sends a signal to Autoscaling, which in turn requests the autoscaling group to scale down. Idle worker instances are shut down.

To set up the auto-scaling group, run the script tests/buildkite/infrastructure/aws-stack-creator/create_stack.py. Check the CloudFormation web console to verify successful provision of auto-scaling groups.