xref: /aosp_15_r20/external/executorch/.ci/scripts/utils.sh (revision 523fa7a60841cd1ecfb9cc4201f1ca8b03ed023a)
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