blob: 12386e3d8318494938a53e7c5024637ce55ddea4 [file] [log] [blame]
name: Build and test
on:
push:
paths-ignore:
- 'docs/**'
pull_request:
branches:
- main
env:
EMITC: emitc
LLVM: llvm
E2E: emitc-e2e
E2E_VERSION: 1
jobs:
build-llvm:
name: Build LLVM
runs-on: ubuntu-20.04
steps:
- name: Checkout EmitC
uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
with:
path: ${{ env.EMITC }}
submodules: 'true'
- name: Get LLVM hash
id: get-llvm-hash
run: echo "llvm_hash=$(cat ${{ env.EMITC }}/build_tools/llvm_version.txt)" >> $GITHUB_ENV
shell: bash
- name: Cache LLVM
id: cache-llvm
uses: actions/cache@58c146cc91c5b9e778e71775dfe9bf1442ad9a12 # v3.2.3
with:
path: ${{ env.LLVM }}
key: ${{ runner.os }}-llvm-20.04-install-${{ env.llvm_hash }}
- name: Checkout LLVM
if: steps.cache-llvm.outputs.cache-hit != 'true'
uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
with:
repository: llvm/llvm-project
path: ${{ env.LLVM }}
ref: ${{ env.llvm_hash }}
- name: Rebuild and install LLVM
if: steps.cache-llvm.outputs.cache-hit != 'true'
run: |
mkdir -p ${LLVM}/build
mkdir -p ${LLVM}/install
cd ${LLVM}/build
cmake ../llvm \
-DLLVM_INSTALL_UTILS=ON \
-DLLVM_ENABLE_LLD=ON \
-DLLVM_ENABLE_PROJECTS=mlir \
-DLLVM_TARGETS_TO_BUILD="host" \
-DLLVM_INCLUDE_TOOLS=ON \
-DLLVM_BUILD_TOOLS=OFF \
-DLLVM_INCLUDE_TESTS=OFF \
-DCMAKE_INSTALL_PREFIX=../install \
-DCMAKE_BUILD_TYPE=Release \
-DLLVM_ENABLE_ASSERTIONS=On \
-DCMAKE_C_COMPILER=clang \
-DCMAKE_CXX_COMPILER=clang++
cmake --build . --target install -- -j$(nproc)
prepare-e2e-test:
name: Prepare e2e test
runs-on: ubuntu-20.04
steps:
- name: Checkout EmitC
uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
with:
path: ${{ env.EMITC }}
submodules: 'false'
- name: Cache e2e
id: cache-e2e
uses: actions/cache@58c146cc91c5b9e778e71775dfe9bf1442ad9a12 # v3.2.3
with:
path: ${{ env.E2E }}
key: ${{ runner.os }}-e2e-${{ hashFiles('emitc/scripts/*.py', 'emitc/scripts/requirements.txt', 'emitc/scripts/e2e*.sh') }}-${{ env.E2E_VERSION }}
- name: Install TensorFlow
if: steps.cache-e2e.outputs.cache-hit != 'true'
run: python3 -m pip install -r ${EMITC}/scripts/requirements.txt
- name: Prepare model
if: steps.cache-e2e.outputs.cache-hit != 'true'
run: |
mkdir -p ${E2E}
mkdir -p tmp
cd tmp
python3 ../${EMITC}/scripts/get_mobilenet_v2.py
python3 ../${EMITC}/scripts/model_to_savedmodel_with_predict_function.py --batch-size 2 mobilenet_v2.h5 model
python3 ../${EMITC}/scripts/savedmodel_to_tf_dialect.py --exported-names predict model model_tf.mlir
python3 ../${EMITC}/scripts/optimize_tf_dialect.py model_tf.mlir model_tf_opt.mlir
python3 ../${EMITC}/scripts/tf_to_hlo_dialect.py --hlo-dialect mhlo model_tf_opt.mlir model_mhlo.mlir
sed "s/tf._input_shapes =.*]//" model_mhlo.mlir > ../${E2E}/model_mhlo_noattr.mlir
sed -i "s/, }/}/" ../${E2E}/model_mhlo_noattr.mlir
python3 ../${EMITC}/scripts/tf_to_hlo_dialect.py --hlo-dialect stablehlo model_tf_opt.mlir ../${E2E}/model_stablehlo.mlir
python3 ../${EMITC}/scripts/tf_to_tosa_dialect.py model_tf_opt.mlir model_tosa.mlir
sed "s/tf._input_shapes =.*]//" model_tosa.mlir > ../${E2E}/model_tosa_noattr.mlir
sed -i "s/, }/}/" ../${E2E}/model_tosa_noattr.mlir
python3 ../${EMITC}/scripts/generate_testscases.py --file-format cpp --count 1 --batch-size 2 --seed 1234 mobilenet_v2.h5 ../${E2E}/
build-debug:
name: Build and test EmitC (Debug)
needs: build-llvm
runs-on: ubuntu-20.04
steps:
- name: Configure environment
run: echo "$GITHUB_WORKSPACE/${LLVM}/install/bin" >> $GITHUB_PATH
- name: Install dependencies
run: sudo apt-get install -y libeigen3-dev
- name: Checkout EmitC
uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
with:
path: ${{ env.EMITC }}
submodules: 'true'
- name: Get LLVM hash
id: get-llvm-hash
run: echo "llvm_hash=$(cat ${{ env.EMITC }}/build_tools/llvm_version.txt)" >> $GITHUB_ENV
shell: bash
- name: Cache LLVM
id: cache-llvm
uses: actions/cache@58c146cc91c5b9e778e71775dfe9bf1442ad9a12 # v3.2.3
with:
path: ${{ env.LLVM }}
key: ${{ runner.os }}-llvm-20.04-install-${{ env.llvm_hash }}
- name: Build and test EmitC
id: build-emitc-debug
run: |
mkdir -p ${EMITC}/build_debug
cd ${EMITC}/build_debug
cmake .. \
-DCMAKE_BUILD_TYPE=Debug \
-DLLVM_ENABLE_ASSERTIONS=ON \
-DMLIR_DIR=$GITHUB_WORKSPACE/${LLVM}/install/lib/cmake/mlir/ \
-DLLVM_DIR=$GITHUB_WORKSPACE/${LLVM}/install/lib/cmake/llvm/ \
-DCMAKE_LINKER=lld \
-DCMAKE_C_COMPILER=clang \
-DCMAKE_CXX_COMPILER=clang++ \
-DLLVM_EXTERNAL_LIT=`pwd`/../../${LLVM}/build/bin/llvm-lit \
-DEMITC_TOSA_USE_EIGEN=ON
cmake --build . --target check-emitc -- -j$(nproc)
cmake --build . --target MLIREmitCTests -- -j$(nproc)
cmake --build . --target MLIREmitCEigenTests -- -j$(nproc)
./reference-implementation/unittests/MLIREmitCTests
./reference-implementation/unittests/MLIREmitCEigenTests
build-release:
name: Build and test EmitC (Release)
needs: [build-llvm, prepare-e2e-test]
runs-on: ubuntu-20.04
steps:
- name: Configure environment
run: echo "$GITHUB_WORKSPACE/${LLVM}/install/bin" >> $GITHUB_PATH
- name: Install dependencies
run: sudo apt-get install -y libeigen3-dev
- name: Checkout EmitC
uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
with:
path: ${{ env.EMITC }}
submodules: 'true'
- name: Get LLVM hash
id: get-llvm-hash
run: echo "llvm_hash=$(cat ${{ env.EMITC }}/build_tools/llvm_version.txt)" >> $GITHUB_ENV
shell: bash
- name: Cache LLVM
id: cache-llvm
uses: actions/cache@58c146cc91c5b9e778e71775dfe9bf1442ad9a12 # v3.2.3
with:
path: ${{ env.LLVM }}
key: ${{ runner.os }}-llvm-20.04-install-${{ env.llvm_hash }}
- name: Build and test EmitC
id: build-emitc-release
run: |
mkdir -p ${EMITC}/build_release
cd ${EMITC}/build_release
cmake .. \
-DCMAKE_BUILD_TYPE=Release \
-DLLVM_ENABLE_ASSERTIONS=OFF \
-DMLIR_DIR=$GITHUB_WORKSPACE/${LLVM}/install/lib/cmake/mlir/ \
-DLLVM_DIR=$GITHUB_WORKSPACE/${LLVM}/install/lib/cmake/llvm/ \
-DCMAKE_LINKER=lld \
-DCMAKE_C_COMPILER=clang \
-DCMAKE_CXX_COMPILER=clang++ \
-DLLVM_EXTERNAL_LIT=`pwd`/../../${LLVM}/build/bin/llvm-lit \
-DEMITC_TOSA_USE_EIGEN=ON
cmake --build . --target check-emitc -- -j$(nproc)
cmake --build . --target MLIREmitCTests -- -j$(nproc)
cmake --build . --target MLIREmitCEigenTests -- -j$(nproc)
./reference-implementation/unittests/MLIREmitCTests
./reference-implementation/unittests/MLIREmitCEigenTests
- name: Cache e2e
uses: actions/cache@58c146cc91c5b9e778e71775dfe9bf1442ad9a12 # v3.2.3
with:
path: ${{ env.E2E }}
key: ${{ runner.os }}-e2e-${{ hashFiles('emitc/scripts/*.py', 'emitc/scripts/requirements.txt', 'emitc/scripts/e2e*.sh') }}-${{ env.E2E_VERSION }}
- name: Run MHLO e2e test
run: |
mkdir tmp-mhlo
cd tmp-mhlo
../${EMITC}/build_release/bin/emitc-opt --canonicalize --inline --symbol-dce ../${E2E}/model_mhlo_noattr.mlir > model_canon.mlir
FUNCTION_NAME=$(grep -oe "@[^(]*" model_canon.mlir)
FUNCTION_NAME="${FUNCTION_NAME:1}"
sed "s/$FUNCTION_NAME/predict/g" model_canon.mlir > model_fix_name.mlir
../${EMITC}/build_release/bin/emitc-opt \
--insert-emitc-mhlo-include \
--convert-mhlo-region-ops-to-emitc \
--convert-mhlo-to-emitc \
model_fix_name.mlir > model_emitc.mlir
../${EMITC}/build_release/bin/emitc-translate --mlir-to-cpp model_emitc.mlir > model_generated.h
clang++ ../${E2E}/test.cpp -O3 -I `pwd`/../emitc/reference-implementation/include -I `pwd` -o test
./test
# - name: Run StableHLO e2e test
# run: |
# mkdir tmp-stablehlo
# cd tmp-stablehlo
# ../${EMITC}/build_release/bin/emitc-opt --canonicalize --inline --symbol-dce ../${E2E}/model_stablehlo.mlir > model_canon.mlir
# FUNCTION_NAME=$(grep -oe "@[^(]*" model_canon.mlir)
# FUNCTION_NAME="${FUNCTION_NAME:1}"
# sed "s/$FUNCTION_NAME/predict/g" model_canon.mlir > model_fix_name.mlir
# ../${EMITC}/build_release/bin/emitc-opt \
# --insert-emitc-mhlo-include \
# --convert-stablehlo-to-emitc \
# model_fix_name.mlir > model_emitc.mlir
# ../${EMITC}/build_release/bin/emitc-translate --mlir-to-cpp model_emitc.mlir > model_generated.h
# clang++ ../${E2E}/test.cpp -O3 -I `pwd`/../emitc/reference-implementation/include -I `pwd` -o test
# ./test
- name: Run TOSA e2e test
run: |
mkdir -p tmp-tosa
cd tmp-tosa
../${EMITC}/build_release/bin/emitc-opt --canonicalize --inline --symbol-dce ../${E2E}/model_tosa_noattr.mlir > model_canon.mlir
FUNCTION_NAME=$(grep -m 1 -oe "@[^(]*" model_canon.mlir)
FUNCTION_NAME="${FUNCTION_NAME:1}"
sed "s/$FUNCTION_NAME/predict/g" model_canon.mlir > model_fix_name.mlir
../${EMITC}/build_release/bin/emitc-opt \
--insert-emitc-tosa-include \
--convert-tosa-to-emitc \
model_fix_name.mlir > model_emitc.mlir
../${EMITC}/build_release/bin/emitc-translate --mlir-to-cpp model_emitc.mlir > model_generated.h
clang++ ../${E2E}/test.cpp -O3 -I `pwd`/../emitc/reference-implementation/include -I `pwd` -o test
./test
#- name: Run MHLO test
# run: |
# mkdir -p ${EMITC}/test_mhlo
# ./${EMITC}/build_release/bin/emitc-opt \
# --insert-emitc-mhlo-include \
# --convert-mhlo-region-ops-to-emitc \
# --convert-mhlo-to-emitc \
# "${EMITC}"/test/MobileNetV2_FakeWeights_mhlo.mlir > "${EMITC}"/test_mhlo/model_emitc.mlir
# ./${EMITC}/build_release/bin/emitc-translate --mlir-to-cpp ${EMITC}/test_mhlo/model_emitc.mlir > ${EMITC}/test_mhlo/model_generated.h
# cp ${EMITC}/test/MobileNetV2_FakeWeights_test.cpp ${EMITC}/test_mhlo/test.cpp
# cd ${EMITC}/test_mhlo/
# clang++ test.cpp -O3 -I `pwd`/../reference-implementation/include -I `pwd` -o test
# ./test
#- name: Run TOSA test
# run: |
# mkdir -p ${EMITC}/test_tosa
# ./${EMITC}/build_release/bin/emitc-opt \
# --insert-emitc-tosa-include \
# --convert-tosa-to-emitc \
# "${EMITC}"/test/MobileNetV2_FakeWeights_tosa.mlir > "${EMITC}"/test_tosa/model_emitc.mlir
# ./${EMITC}/build_release/bin/emitc-translate --mlir-to-cpp ${EMITC}/test_tosa/model_emitc.mlir > ${EMITC}/test_tosa/model_generated.h
# cp ${EMITC}/test/MobileNetV2_FakeWeights_test.cpp ${EMITC}/test_tosa/test.cpp
# cd ${EMITC}/test_tosa/
# clang++ test.cpp -O3 -I `pwd`/../reference-implementation/include -I `pwd` -o test
# ./test
build-release-no-hlo:
name: Build and test EmitC (Release, HLO disabled)
needs: build-llvm
runs-on: ubuntu-20.04
steps:
- name: Configure environment
run: echo "$GITHUB_WORKSPACE/${LLVM}/install/bin" >> $GITHUB_PATH
- name: Checkout EmitC
uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
with:
path: ${{ env.EMITC }}
submodules: 'true'
- name: Get LLVM hash
id: get-llvm-hash
run: echo "llvm_hash=$(cat ${{ env.EMITC }}/build_tools/llvm_version.txt)" >> $GITHUB_ENV
shell: bash
- name: Cache LLVM
id: cache-llvm
uses: actions/cache@58c146cc91c5b9e778e71775dfe9bf1442ad9a12 # v3.2.3
with:
path: ${{ env.LLVM }}
key: ${{ runner.os }}-llvm-20.04-install-${{ env.llvm_hash }}
- name: Build and test EmitC, HLO disabled
id: build-emitc-release
run: |
mkdir -p ${EMITC}/build_release_hlo_disabled
cd ${EMITC}/build_release_hlo_disabled
cmake .. \
-DCMAKE_BUILD_TYPE=Release \
-DLLVM_ENABLE_ASSERTIONS=OFF \
-DMLIR_DIR=$GITHUB_WORKSPACE/${LLVM}/install/lib/cmake/mlir/ \
-DLLVM_DIR=$GITHUB_WORKSPACE/${LLVM}/install/lib/cmake/llvm/ \
-DCMAKE_LINKER=lld \
-DCMAKE_C_COMPILER=clang \
-DCMAKE_CXX_COMPILER=clang++ \
-DLLVM_EXTERNAL_LIT=`pwd`/../../${LLVM}/build/bin/llvm-lit \
-DEMITC_ENABLE_HLO=OFF
cmake --build . --target check-emitc -- -j$(nproc)