Build and Test #35
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Build and Test | |
on: | |
workflow_dispatch: | |
inputs: | |
test_mark: | |
description: 'Test mark to run' | |
required: true | |
default: 'push' | |
type: choice | |
options: | |
- push | |
- nightly | |
- nightly_sweeps | |
- push or nightly | |
mlir_override: | |
description: 'Git SHA of commit in tenstorrent/tt-mlir or branch name' | |
required: false | |
type: string | |
workflow_call: | |
inputs: | |
test_mark: | |
description: 'Test mark to run' | |
required: false | |
default: 'push' | |
type: string | |
mlir_override: | |
description: 'Git SHA of commit in tenstorrent/tt-mlir or branch name' | |
required: false | |
type: string | |
jobs: | |
docker-build: | |
uses: ./.github/workflows/build-image.yml | |
secrets: inherit | |
build-and-test: | |
needs: docker-build | |
strategy: | |
fail-fast: false | |
matrix: | |
build: | |
- runs-on: runner | |
test_group_id: [1,2] | |
runs-on: | |
- in-service | |
- ${{ matrix.build.runs-on }} | |
container: | |
image: ${{ needs.docker-build.outputs.docker-image }} | |
options: --device /dev/tenstorrent/0 | |
volumes: | |
- /dev/hugepages:/dev/hugepages | |
- /dev/hugepages-1G:/dev/hugepages-1G | |
- /etc/udev/rules.d:/etc/udev/rules.d | |
- /lib/modules:/lib/modules | |
- /opt/tt_metal_infra/provisioning/provisioning_env:/opt/tt_metal_infra/provisioning/provisioning_env | |
steps: | |
- name: Set reusable strings | |
id: strings | |
shell: bash | |
env: | |
job-name: "${{ github.job }} (${{ matrix.build.runs-on }}, ${{ matrix.test_group_id }})" | |
run: | | |
echo "work-dir=$(pwd)" >> "$GITHUB_OUTPUT" | |
echo "build-output-dir=$(pwd)/build" >> "$GITHUB_OUTPUT" | |
# Github job context unfortunately doesn't contain job_id, this is the workaround how to fetch it using GH API | |
echo "Expected job name: ${{ env.job-name }}" | |
JOB_ID=$(curl -s -H "Authorization: token ${{ secrets.GH_TOKEN }}" \ | |
"https://api.github.com/repos/${{ github.repository }}/actions/runs/${{ github.run_id }}/attempts/${{ github.run_attempt }}/jobs" | \ | |
jq -r '.jobs[] | select(.name | contains("${{ env.job-name }}")) | .id ') | |
echo "Current job id: $JOB_ID" | |
echo "job-id=$JOB_ID" >> "$GITHUB_OUTPUT" | |
echo "test_report_path=reports/report_$JOB_ID.xml" >> "$GITHUB_OUTPUT" | |
- name: Git safe dir | |
run: git config --global --add safe.directory ${{ steps.strings.outputs.work-dir }} | |
- uses: actions/checkout@v4 | |
with: | |
submodules: recursive | |
fetch-depth: 0 # Fetch all history and tags | |
# Clean everything from submodules (needed to avoid issues | |
# with cmake generated files leftover from previous builds) | |
- name: Cleanup submodules | |
run: | | |
git submodule foreach --recursive git clean -ffdx | |
git submodule foreach --recursive git reset --hard | |
- name: Update submodule if mlir_override is set | |
if: ${{ inputs.mlir_override }} | |
run: | | |
cd third_party/tt-mlir | |
git fetch | |
git checkout ${{ inputs.mlir_override }} | |
branch_name=$(git rev-parse --abbrev-ref HEAD) | |
commit_sha=$(git rev-parse HEAD) | |
commit_title=$(git log -1 --pretty=%s) | |
echo "Branch name: $branch_name" | |
echo "Commit SHA: $commit_sha" | |
echo "Commit title: $commit_title" | |
echo "::notice::Using tt-mlir branch: $branch_name, commit: $commit_sha, title: $commit_title" | |
cd ../.. | |
- name: ccache | |
uses: hendrikmuhs/[email protected] | |
with: | |
create-symlink: true | |
key: ${{ matrix.build.runs-on }}-runtime-${{ matrix.build.enable_runtime }}-${{ env.SDK_VERSION }} | |
- name: Build | |
shell: bash | |
run: | | |
source env/activate | |
cmake -G Ninja \ | |
-B ${{ steps.strings.outputs.build-output-dir }} \ | |
-DCMAKE_BUILD_TYPE=Release \ | |
-DCMAKE_C_COMPILER=clang \ | |
-DCMAKE_CXX_COMPILER=clang++ \ | |
-DCMAKE_C_COMPILER_LAUNCHER=ccache \ | |
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache | |
cmake --build ${{ steps.strings.outputs.build-output-dir }} | |
- name: Run Unit Tests | |
shell: bash | |
run: | | |
source env/activate | |
cmake --build ${{ steps.strings.outputs.build-output-dir }} -- run_unit_tests | |
- name: Run Test | |
shell: bash | |
run: | | |
source env/activate | |
apt-get update | |
apt install -y libgl1 libglx-mesa0 | |
set -o pipefail # Ensures that the exit code reflects the first command that fails | |
pip install pytest-split | |
pytest -m push --splits 2 \ | |
--group ${{ matrix.test_group_id }} \ | |
--splitting-algorithm least_duration \ | |
-m "${{ inputs.test_mark }}" \ | |
--junit-xml=${{ steps.strings.outputs.test_report_path }} \ | |
2>&1 | tee pytest.log | |
- name: Upload Test Log | |
uses: actions/upload-artifact@v4 | |
if: success() || failure() | |
with: | |
name: test-log-${{ matrix.build.runs-on }}-${{ matrix.test_group_id }} | |
path: pytest.log | |
- name: Run Perf Benchmark | |
shell: bash | |
run: | | |
source env/activate | |
python forge/test/benchmark/benchmark.py -m mnist_linear -bs 1 -o forge-benchmark-e2e-mnist.json | |
- name: Upload Test Report | |
uses: actions/upload-artifact@v4 | |
if: success() || failure() | |
with: | |
name: test-reports-${{ matrix.build.runs-on }}-${{ matrix.test_group_id }} | |
path: ${{ steps.strings.outputs.test_report_path }} | |
- name: Show Test Report | |
uses: mikepenz/action-junit-report@v4 | |
if: success() || failure() | |
with: | |
report_paths: ${{ steps.strings.outputs.test_report_path }} | |
check_name: TT-Forge-FE Tests |