[CI] Use native arm64 worker in GHAction to build M1 wheel (#10225)

* [CI] Use native arm64 worker in GHAction to build M1 wheel

* Set up Conda

* Use mamba

* debug

* fix

* fix

* fix

* fix

* fix

* Temporarily disable other tests

* Fix prefix

* Use micromamba

* Use conda-incubator/setup-miniconda

* Use mambaforge

* Fix

* Fix prefix

* Don't use deprecated set-output

* Add verbose output from build

* verbose

* Specify arch

* Bump setup-miniconda to v3

* Use Python 3.9

* Restore deleted files

* WAR.

---------

Co-authored-by: Jiaming Yuan <jm.yuan@outlook.com>
This commit is contained in:
Philip Hyunsu Cho 2024-04-26 10:16:55 -07:00 committed by GitHub
parent a81b78e56b
commit edb945d59b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 25 additions and 25 deletions

View File

@ -5,6 +5,10 @@ on: [push, pull_request]
permissions: permissions:
contents: read # to fetch code (actions/checkout) contents: read # to fetch code (actions/checkout)
defaults:
run:
shell: bash -l {0}
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true cancel-in-progress: true
@ -16,30 +20,32 @@ jobs:
strategy: strategy:
matrix: matrix:
include: include:
- os: macos-latest - os: macos-13
platform_id: macosx_x86_64 platform_id: macosx_x86_64
- os: macos-latest - os: macos-14
platform_id: macosx_arm64 platform_id: macosx_arm64
steps: steps:
- uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 # v3.0.0 - uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 # v3.0.0
with: with:
submodules: 'true' submodules: 'true'
- name: Setup Python - uses: conda-incubator/setup-miniconda@v3.0.4
uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5.0.0
with: with:
python-version: "3.8" miniforge-variant: Mambaforge
miniforge-version: latest
python-version: 3.9
use-mamba: true
- name: Build wheels - name: Build wheels
run: bash tests/ci_build/build_python_wheels.sh ${{ matrix.platform_id }} ${{ github.sha }} run: bash tests/ci_build/build_python_wheels.sh ${{ matrix.platform_id }} ${{ github.sha }}
- name: Extract branch name - name: Extract branch name
shell: bash run: |
run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})" echo "branch=${GITHUB_REF#refs/heads/}" >> "$GITHUB_OUTPUT"
id: extract_branch id: extract_branch
if: github.ref == 'refs/heads/master' || contains(github.ref, 'refs/heads/release_') if: github.ref == 'refs/heads/master' || contains(github.ref, 'refs/heads/release_')
- name: Upload Python wheel - name: Upload Python wheel
if: github.ref == 'refs/heads/master' || contains(github.ref, 'refs/heads/release_') if: github.ref == 'refs/heads/master' || contains(github.ref, 'refs/heads/release_')
run: | run: |
python -m pip install awscli python -m pip install awscli
python -m awscli s3 cp wheelhouse/*.whl s3://xgboost-nightly-builds/${{ steps.extract_branch.outputs.branch }}/ --acl public-read python -m awscli s3 cp wheelhouse/*.whl s3://xgboost-nightly-builds/${{ steps.extract_branch.outputs.branch }}/ --acl public-read --region us-west-2
env: env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID_IAM_S3_UPLOADER }} AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID_IAM_S3_UPLOADER }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY_IAM_S3_UPLOADER }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY_IAM_S3_UPLOADER }}

View File

@ -53,12 +53,6 @@ def build_libxgboost(
] ]
cmake_cmd.extend(build_config.get_cmake_args()) cmake_cmd.extend(build_config.get_cmake_args())
# Flag for cross-compiling for Apple Silicon
# We use environment variable because it's the only way to pass down custom
# flags through the cibuildwheel package, which calls `pip wheel` command.
if "CIBW_TARGET_OSX_ARM64" in os.environ:
cmake_cmd.append("-DCMAKE_OSX_ARCHITECTURES=arm64")
logger.info("CMake args: %s", str(cmake_cmd)) logger.info("CMake args: %s", str(cmake_cmd))
subprocess.check_call(cmake_cmd, cwd=build_dir) subprocess.check_call(cmake_cmd, cwd=build_dir)

View File

@ -25,16 +25,16 @@ if [[ "$platform_id" == macosx_* ]]; then
# arm64 builds must cross compile because CI is on x64 # arm64 builds must cross compile because CI is on x64
# cibuildwheel will take care of cross-compilation. # cibuildwheel will take care of cross-compilation.
wheel_tag=macosx_12_0_arm64 wheel_tag=macosx_12_0_arm64
cpython_ver=38 cpython_ver=39
setup_env_var='CIBW_TARGET_OSX_ARM64=1' # extra flag to be passed to xgboost.packager backend cibw_archs=arm64
export PYTHON_CROSSENV=1
export MACOSX_DEPLOYMENT_TARGET=12.0 export MACOSX_DEPLOYMENT_TARGET=12.0
#OPENMP_URL="https://anaconda.org/conda-forge/llvm-openmp/11.1.0/download/osx-arm64/llvm-openmp-11.1.0-hf3c4609_1.tar.bz2" #OPENMP_URL="https://anaconda.org/conda-forge/llvm-openmp/11.1.0/download/osx-arm64/llvm-openmp-11.1.0-hf3c4609_1.tar.bz2"
OPENMP_URL="https://xgboost-ci-jenkins-artifacts.s3.us-west-2.amazonaws.com/llvm-openmp-11.1.0-hf3c4609_1-osx-arm64.tar.bz2" OPENMP_URL="https://xgboost-ci-jenkins-artifacts.s3.us-west-2.amazonaws.com/llvm-openmp-11.1.0-hf3c4609_1-osx-arm64.tar.bz2"
elif [[ "$platform_id" == macosx_x86_64 ]]; then elif [[ "$platform_id" == macosx_x86_64 ]]; then
# MacOS, Intel # MacOS, Intel
wheel_tag=macosx_10_15_x86_64.macosx_11_0_x86_64.macosx_12_0_x86_64 wheel_tag=macosx_10_15_x86_64.macosx_11_0_x86_64.macosx_12_0_x86_64
cpython_ver=38 cpython_ver=39
cibw_archs=x86_64
export MACOSX_DEPLOYMENT_TARGET=10.15 export MACOSX_DEPLOYMENT_TARGET=10.15
#OPENMP_URL="https://anaconda.org/conda-forge/llvm-openmp/11.1.0/download/osx-64/llvm-openmp-11.1.0-hda6cdc1_1.tar.bz2" #OPENMP_URL="https://anaconda.org/conda-forge/llvm-openmp/11.1.0/download/osx-64/llvm-openmp-11.1.0-hda6cdc1_1.tar.bz2"
OPENMP_URL="https://xgboost-ci-jenkins-artifacts.s3.us-west-2.amazonaws.com/llvm-openmp-11.1.0-hda6cdc1_1-osx-64.tar.bz2" OPENMP_URL="https://xgboost-ci-jenkins-artifacts.s3.us-west-2.amazonaws.com/llvm-openmp-11.1.0-hda6cdc1_1-osx-64.tar.bz2"
@ -44,13 +44,13 @@ if [[ "$platform_id" == macosx_* ]]; then
fi fi
# Set up environment variables to configure cibuildwheel # Set up environment variables to configure cibuildwheel
export CIBW_BUILD=cp${cpython_ver}-${platform_id} export CIBW_BUILD=cp${cpython_ver}-${platform_id}
export CIBW_ARCHS=all export CIBW_ARCHS=${cibw_archs}
export CIBW_ENVIRONMENT=${setup_env_var} export CIBW_ENVIRONMENT=${setup_env_var}
export CIBW_TEST_SKIP='*-macosx_arm64' export CIBW_TEST_SKIP='*-macosx_arm64'
export CIBW_BUILD_VERBOSITY=3 export CIBW_BUILD_VERBOSITY=3
sudo conda create -n build $OPENMP_URL mamba create -n build $OPENMP_URL
PREFIX="/usr/local/miniconda/envs/build" PREFIX="$HOME/miniconda3/envs/build"
# Set up build flags for cibuildwheel # Set up build flags for cibuildwheel
# This is needed to bundle libomp lib we downloaded earlier # This is needed to bundle libomp lib we downloaded earlier

View File

@ -113,8 +113,8 @@ def run_with_dask_array(DMatrixT: Type, client: Client) -> None:
cp.cuda.runtime.setDevice(0) cp.cuda.runtime.setDevice(0)
X, y, _ = generate_array() X, y, _ = generate_array()
X = X.map_blocks(cp.asarray) X = X.map_blocks(cp.asarray) # type: ignore
y = y.map_blocks(cp.asarray) y = y.map_blocks(cp.asarray) # type: ignore
dtrain = DMatrixT(client, X, y) dtrain = DMatrixT(client, X, y)
out = dxgb.train( out = dxgb.train(
client, client,
@ -648,8 +648,8 @@ async def run_from_dask_array_asyncio(scheduler_address: str) -> dxgb.TrainRetur
import cupy as cp import cupy as cp
X, y, _ = generate_array() X, y, _ = generate_array()
X = X.map_blocks(cp.array) X = X.map_blocks(cp.array) # type: ignore
y = y.map_blocks(cp.array) y = y.map_blocks(cp.array) # type: ignore
m = await xgb.dask.DaskQuantileDMatrix(client, X, y) m = await xgb.dask.DaskQuantileDMatrix(client, X, y)
output = await xgb.dask.train( output = await xgb.dask.train(