1*523fa7a6SAndroid Build Coastguard Worker#!/bin/bash 2*523fa7a6SAndroid Build Coastguard Worker# Copyright (c) Meta Platforms, Inc. and affiliates. 3*523fa7a6SAndroid Build Coastguard Worker# All rights reserved. 4*523fa7a6SAndroid Build Coastguard Worker# Copyright 2024 Arm Limited and/or its affiliates. 5*523fa7a6SAndroid Build Coastguard Worker# 6*523fa7a6SAndroid Build Coastguard Worker# This source code is licensed under the BSD-style license found in the 7*523fa7a6SAndroid Build Coastguard Worker# LICENSE file in the root directory of this source tree. 8*523fa7a6SAndroid Build Coastguard Worker 9*523fa7a6SAndroid Build Coastguard Workerreset_buck() { 10*523fa7a6SAndroid Build Coastguard Worker # On MacOS, buck2 daemon can get into a weird non-responsive state 11*523fa7a6SAndroid Build Coastguard Worker buck2 kill && buck2 clean 12*523fa7a6SAndroid Build Coastguard Worker rm -rf ~/.buck/buckd 13*523fa7a6SAndroid Build Coastguard Worker} 14*523fa7a6SAndroid Build Coastguard Worker 15*523fa7a6SAndroid Build Coastguard Workerretry () { 16*523fa7a6SAndroid Build Coastguard Worker "$@" || (sleep 30 && reset_buck && "$@") || (sleep 60 && reset_buck && "$@") 17*523fa7a6SAndroid Build Coastguard Worker} 18*523fa7a6SAndroid Build Coastguard Worker 19*523fa7a6SAndroid Build Coastguard Workerinstall_executorch() { 20*523fa7a6SAndroid Build Coastguard Worker which pip 21*523fa7a6SAndroid Build Coastguard Worker # Install executorch, this assumes that Executorch is checked out in the 22*523fa7a6SAndroid Build Coastguard Worker # current directory. 23*523fa7a6SAndroid Build Coastguard Worker if [[ "${1:-}" == "use-pt-pinned-commit" ]]; then 24*523fa7a6SAndroid Build Coastguard Worker ./install_requirements.sh --pybind xnnpack --use-pt-pinned-commit 25*523fa7a6SAndroid Build Coastguard Worker else 26*523fa7a6SAndroid Build Coastguard Worker ./install_requirements.sh --pybind xnnpack 27*523fa7a6SAndroid Build Coastguard Worker fi 28*523fa7a6SAndroid Build Coastguard Worker # Just print out the list of packages for debugging 29*523fa7a6SAndroid Build Coastguard Worker pip list 30*523fa7a6SAndroid Build Coastguard Worker} 31*523fa7a6SAndroid Build Coastguard Worker 32*523fa7a6SAndroid Build Coastguard Workerinstall_pip_dependencies() { 33*523fa7a6SAndroid Build Coastguard Worker pushd .ci/docker || return 34*523fa7a6SAndroid Build Coastguard Worker # Install all Python dependencies, including PyTorch 35*523fa7a6SAndroid Build Coastguard Worker pip install --progress-bar off -r requirements-ci.txt 36*523fa7a6SAndroid Build Coastguard Worker popd || return 37*523fa7a6SAndroid Build Coastguard Worker} 38*523fa7a6SAndroid Build Coastguard Worker 39*523fa7a6SAndroid Build Coastguard Workerinstall_flatc_from_source() { 40*523fa7a6SAndroid Build Coastguard Worker # NB: This function could be used to install flatbuffer from source 41*523fa7a6SAndroid Build Coastguard Worker pushd third-party/flatbuffers || return 42*523fa7a6SAndroid Build Coastguard Worker 43*523fa7a6SAndroid Build Coastguard Worker cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release 44*523fa7a6SAndroid Build Coastguard Worker if [ "$(uname)" == "Darwin" ]; then 45*523fa7a6SAndroid Build Coastguard Worker CMAKE_JOBS=$(( $(sysctl -n hw.ncpu) - 1 )) 46*523fa7a6SAndroid Build Coastguard Worker else 47*523fa7a6SAndroid Build Coastguard Worker CMAKE_JOBS=$(( $(nproc) - 1 )) 48*523fa7a6SAndroid Build Coastguard Worker fi 49*523fa7a6SAndroid Build Coastguard Worker cmake --build . -j "${CMAKE_JOBS}" 50*523fa7a6SAndroid Build Coastguard Worker 51*523fa7a6SAndroid Build Coastguard Worker # Copy the flatc binary to conda path 52*523fa7a6SAndroid Build Coastguard Worker EXEC_PATH=$(dirname "$(which python)") 53*523fa7a6SAndroid Build Coastguard Worker cp flatc "${EXEC_PATH}" 54*523fa7a6SAndroid Build Coastguard Worker 55*523fa7a6SAndroid Build Coastguard Worker popd || return 56*523fa7a6SAndroid Build Coastguard Worker} 57*523fa7a6SAndroid Build Coastguard Worker 58*523fa7a6SAndroid Build Coastguard Workerinstall_arm() { 59*523fa7a6SAndroid Build Coastguard Worker # NB: This function could be used to install Arm dependencies 60*523fa7a6SAndroid Build Coastguard Worker # Setup arm example environment (including TOSA tools) 61*523fa7a6SAndroid Build Coastguard Worker git config --global user.email "[email protected]" 62*523fa7a6SAndroid Build Coastguard Worker git config --global user.name "Github Executorch" 63*523fa7a6SAndroid Build Coastguard Worker bash examples/arm/setup.sh --i-agree-to-the-contained-eula 64*523fa7a6SAndroid Build Coastguard Worker 65*523fa7a6SAndroid Build Coastguard Worker # Test tosa_reference flow 66*523fa7a6SAndroid Build Coastguard Worker source examples/arm/ethos-u-scratch/setup_path.sh 67*523fa7a6SAndroid Build Coastguard Worker} 68*523fa7a6SAndroid Build Coastguard Worker 69*523fa7a6SAndroid Build Coastguard Workerbuild_executorch_runner_buck2() { 70*523fa7a6SAndroid Build Coastguard Worker # Build executorch runtime with retry as this step is flaky on macos CI 71*523fa7a6SAndroid Build Coastguard Worker retry buck2 build //examples/portable/executor_runner:executor_runner 72*523fa7a6SAndroid Build Coastguard Worker} 73*523fa7a6SAndroid Build Coastguard Worker 74*523fa7a6SAndroid Build Coastguard Workerbuild_executorch_runner_cmake() { 75*523fa7a6SAndroid Build Coastguard Worker CMAKE_OUTPUT_DIR=cmake-out 76*523fa7a6SAndroid Build Coastguard Worker # Build executorch runtime using cmake 77*523fa7a6SAndroid Build Coastguard Worker rm -rf "${CMAKE_OUTPUT_DIR}" && mkdir "${CMAKE_OUTPUT_DIR}" 78*523fa7a6SAndroid Build Coastguard Worker 79*523fa7a6SAndroid Build Coastguard Worker pushd "${CMAKE_OUTPUT_DIR}" || return 80*523fa7a6SAndroid Build Coastguard Worker # This command uses buck2 to gather source files and buck2 could crash flakily 81*523fa7a6SAndroid Build Coastguard Worker # on MacOS 82*523fa7a6SAndroid Build Coastguard Worker retry cmake -DPYTHON_EXECUTABLE="${PYTHON_EXECUTABLE}" -DCMAKE_BUILD_TYPE=Release .. 83*523fa7a6SAndroid Build Coastguard Worker popd || return 84*523fa7a6SAndroid Build Coastguard Worker 85*523fa7a6SAndroid Build Coastguard Worker if [ "$(uname)" == "Darwin" ]; then 86*523fa7a6SAndroid Build Coastguard Worker CMAKE_JOBS=$(( $(sysctl -n hw.ncpu) - 1 )) 87*523fa7a6SAndroid Build Coastguard Worker else 88*523fa7a6SAndroid Build Coastguard Worker CMAKE_JOBS=$(( $(nproc) - 1 )) 89*523fa7a6SAndroid Build Coastguard Worker fi 90*523fa7a6SAndroid Build Coastguard Worker cmake --build "${CMAKE_OUTPUT_DIR}" -j "${CMAKE_JOBS}" 91*523fa7a6SAndroid Build Coastguard Worker} 92*523fa7a6SAndroid Build Coastguard Worker 93*523fa7a6SAndroid Build Coastguard Workerbuild_executorch_runner() { 94*523fa7a6SAndroid Build Coastguard Worker if [[ $1 == "buck2" ]]; then 95*523fa7a6SAndroid Build Coastguard Worker build_executorch_runner_buck2 96*523fa7a6SAndroid Build Coastguard Worker elif [[ $1 == "cmake" ]]; then 97*523fa7a6SAndroid Build Coastguard Worker build_executorch_runner_cmake 98*523fa7a6SAndroid Build Coastguard Worker else 99*523fa7a6SAndroid Build Coastguard Worker echo "Invalid build tool $1. Only buck2 and cmake are supported atm" 100*523fa7a6SAndroid Build Coastguard Worker exit 1 101*523fa7a6SAndroid Build Coastguard Worker fi 102*523fa7a6SAndroid Build Coastguard Worker} 103*523fa7a6SAndroid Build Coastguard Worker 104*523fa7a6SAndroid Build Coastguard Workercmake_install_executorch_lib() { 105*523fa7a6SAndroid Build Coastguard Worker echo "Installing libexecutorch.a and libportable_kernels.a" 106*523fa7a6SAndroid Build Coastguard Worker rm -rf cmake-out 107*523fa7a6SAndroid Build Coastguard Worker retry cmake -DBUCK2="$BUCK" \ 108*523fa7a6SAndroid Build Coastguard Worker -DCMAKE_INSTALL_PREFIX=cmake-out \ 109*523fa7a6SAndroid Build Coastguard Worker -DCMAKE_BUILD_TYPE=Release \ 110*523fa7a6SAndroid Build Coastguard Worker -DPYTHON_EXECUTABLE="$PYTHON_EXECUTABLE" \ 111*523fa7a6SAndroid Build Coastguard Worker -Bcmake-out . 112*523fa7a6SAndroid Build Coastguard Worker cmake --build cmake-out -j9 --target install --config Release 113*523fa7a6SAndroid Build Coastguard Worker} 114*523fa7a6SAndroid Build Coastguard Worker 115*523fa7a6SAndroid Build Coastguard Workerdownload_stories_model_artifacts() { 116*523fa7a6SAndroid Build Coastguard Worker # Download stories110M.pt and tokenizer from Github 117*523fa7a6SAndroid Build Coastguard Worker curl -Ls "https://huggingface.co/karpathy/tinyllamas/resolve/main/stories110M.pt" --output stories110M.pt 118*523fa7a6SAndroid Build Coastguard Worker curl -Ls "https://raw.githubusercontent.com/karpathy/llama2.c/master/tokenizer.model" --output tokenizer.model 119*523fa7a6SAndroid Build Coastguard Worker # Create params.json file 120*523fa7a6SAndroid Build Coastguard Worker touch params.json 121*523fa7a6SAndroid Build Coastguard Worker echo '{"dim": 768, "multiple_of": 32, "n_heads": 12, "n_layers": 12, "norm_eps": 1e-05, "vocab_size": 32000}' > params.json 122*523fa7a6SAndroid Build Coastguard Worker} 123*523fa7a6SAndroid Build Coastguard Worker 124*523fa7a6SAndroid Build Coastguard Workerdo_not_use_nightly_on_ci() { 125*523fa7a6SAndroid Build Coastguard Worker # An assert to make sure that we are not using PyTorch nightly on CI to prevent 126*523fa7a6SAndroid Build Coastguard Worker # regression as documented in https://github.com/pytorch/executorch/pull/6564 127*523fa7a6SAndroid Build Coastguard Worker TORCH_VERSION=$(pip list | grep -w 'torch ' | awk -F ' ' {'print $2'} | tr -d '\n') 128*523fa7a6SAndroid Build Coastguard Worker 129*523fa7a6SAndroid Build Coastguard Worker # The version of PyTorch building from source looks like 2.6.0a0+gitc8a648d that 130*523fa7a6SAndroid Build Coastguard Worker # includes the commit while nightly (2.6.0.dev20241019+cpu) or release (2.6.0) 131*523fa7a6SAndroid Build Coastguard Worker # won't have that. Note that we couldn't check for the exact commit from the pin 132*523fa7a6SAndroid Build Coastguard Worker # ci_commit_pins/pytorch.txt here because the value will be different when running 133*523fa7a6SAndroid Build Coastguard Worker # this on PyTorch CI 134*523fa7a6SAndroid Build Coastguard Worker if [[ "${TORCH_VERSION}" != *"+git"* ]]; then 135*523fa7a6SAndroid Build Coastguard Worker echo "Unexpected torch version. Expected binary built from source, got ${TORCH_VERSION}" 136*523fa7a6SAndroid Build Coastguard Worker exit 1 137*523fa7a6SAndroid Build Coastguard Worker fi 138*523fa7a6SAndroid Build Coastguard Worker} 139