From ed662429ae7bfc49fdd12a337aa3178b7a613a9d Mon Sep 17 00:00:00 2001 From: yuanjianglong Date: Tue, 22 Sep 2026 15:27:03 +0800 Subject: [PATCH 01/12] ci: add FastPT build and test workflow --- .github/workflows/fastpt-ci.yml | 196 ++++++++++++++++++++++++++++++++ 1 file changed, 196 insertions(+) create mode 100644 .github/workflows/fastpt-ci.yml diff --git a/.github/workflows/fastpt-ci.yml b/.github/workflows/fastpt-ci.yml new file mode 100644 index 0000000..1c0a0fc --- /dev/null +++ b/.github/workflows/fastpt-ci.yml @@ -0,0 +1,196 @@ +# Copyright (c) 2026 Hygon Information Technology Co., Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +name: FastPT CI + +on: + push: + branches: + - ci-fastpt + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: fastpt-ci-${{ github.ref }} + cancel-in-progress: true + +env: + DTK_PKG_URL: ${{ vars.RESOURCE_SERVER_URL }}/dtk-pkg/dtk26.04/DTK-26.04-rc4-centos8-x86_64.tar.gz + TORCH_INDEX_URL: http://10.16.1.201:9929/das_nightly/dtk2604-rc4/+simple/torch/ + PYTORCH_REPOSITORY: https://github.com/HYGON-AI/pytorch-das.git + PYTORCH_REF: 2.12.0-dev + +jobs: + build-and-test: + runs-on: [self-hosted, hcu] + timeout-minutes: 480 + container: + image: ${{ vars.BASE_COMPILE_IMAGE_ROCKY_PY310 }} + options: >- + --device=/dev/kfd --device=/dev/dri/ --group-add video + -v /opt/hyhal/:/opt/hyhal/:ro + --shm-size=80G + --cap-add=SYS_PTRACE + --security-opt seccomp=unconfined + --privileged=true + + steps: + - name: Checkout FastPT + uses: actions/checkout@v4 + with: + submodules: recursive + fetch-depth: 0 + + - name: Prepare log directory + shell: bash + run: mkdir -p logs + + - name: Install DTK + shell: bash + run: | + set -euo pipefail + { + cd /opt + wget -q "${DTK_PKG_URL}" + tar -xzf "$(basename "${DTK_PKG_URL}")" + rm -rf dtk + mv dtk-* dtk + } 2>&1 | tee "${GITHUB_WORKSPACE}/logs/install-dtk.log" + + - name: Install AICC + shell: bash + env: + RESOURCE_SERVER_URL: ${{ vars.RESOURCE_SERVER_URL }} + run: | + set -euo pipefail + { + wget "${RESOURCE_SERVER_URL}/ai_cc/Nightly/hcu_llvm_installer.sh" + bash hcu_llvm_installer.sh --major 1.0.0 + } 2>&1 | tee logs/install-aicc.log + + - name: Select and install latest Torch 2.12 wheel + shell: bash + run: | + set -euo pipefail + source /opt/dtk/cuda/env.sh + + TORCH_WHEEL_URL="$(python3 - <<'PY' + import html + import re + import urllib.parse + import urllib.request + + index_url = "${{ env.TORCH_INDEX_URL }}" + with urllib.request.urlopen(index_url) as response: + page = response.read().decode("utf-8") + + links = [html.unescape(link) for link in re.findall(r'href=["\x27]([^"\x27]+)', page, re.I)] + candidates = [] + for link in links: + url = urllib.parse.urljoin(index_url, link) + filename = urllib.parse.unquote(urllib.parse.urlsplit(url).path.rsplit("/", 1)[-1]) + if not re.fullmatch( + r"torch-2\.12\.0\+.*-cp310-cp310-manylinux_2_28_x86_64\.whl", + filename, + ): + continue + build = re.search(r"\.dtk2604\.(\d+)\.g[0-9a-f]+-", filename) + if build: + candidates.append((int(build.group(1)), filename, url)) + + if not candidates: + raise SystemExit("No Torch 2.12 cp310 manylinux_2_28 wheel found") + + _, filename, url = max(candidates) + print(url) + print(f"Selected {filename}", file=__import__("sys").stderr) + PY + )" + + echo "TORCH_WHEEL_URL=${TORCH_WHEEL_URL}" | tee logs/torch-wheel.log + python3 -m pip install --no-cache-dir wheel setuptools cmake ninja + python3 -m pip install --no-cache-dir "${TORCH_WHEEL_URL}" + python3 -c 'import torch; print(f"torch={torch.__version__}"); print(f"torch.hip={torch.version.hip}")' \ + 2>&1 | tee -a logs/torch-wheel.log + + - name: Checkout matching PyTorch source branch + shell: bash + run: | + set -euo pipefail + git clone --depth 1 --branch "${PYTORCH_REF}" \ + "${PYTORCH_REPOSITORY}" "${RUNNER_TEMP}/pytorch-das" \ + 2>&1 | tee logs/clone-pytorch.log + git -C "${RUNNER_TEMP}/pytorch-das" rev-parse HEAD | tee -a logs/clone-pytorch.log + echo "HIP_TORCH_PATH=${RUNNER_TEMP}/pytorch-das" >> "${GITHUB_ENV}" + + - name: Record build environment + shell: bash + run: | + set -euo pipefail + source /opt/dtk/cuda/env.sh + { + echo "FastPT commit: $(git rev-parse HEAD)" + echo "PyTorch source: $(git -C "${HIP_TORCH_PATH}" rev-parse HEAD)" + python3 --version + python3 -m pip --version + python3 -c 'import torch; print(f"torch={torch.__version__}"); print(f"torch.hip={torch.version.hip}")' + cat /opt/dtk/.info/rocm_version 2>/dev/null || true + cmake --version + make --version | head -n 1 + hipcc --version + } 2>&1 | tee logs/environment.log + + - name: Build FastPT wheel + shell: bash + env: + FASTPT_CTEST: "1" + run: | + set -euo pipefail + source /opt/dtk/cuda/env.sh + export TORCH_PATH="$(python3 -c 'import os, torch; print(os.path.dirname(torch.__file__))')" + echo "TORCH_PATH=${TORCH_PATH}" | tee logs/build.log + echo "HIP_TORCH_PATH=${HIP_TORCH_PATH}" | tee -a logs/build.log + git submodule update --init --recursive 2>&1 | tee -a logs/build.log + rm -rf build dist fastpt.egg-info torch-mocker/build + python3 setup.py bdist_wheel 2>&1 | tee -a logs/build.log + ls -lh dist/*.whl | tee -a logs/build.log + + - name: Install and verify FastPT + shell: bash + run: | + set -euo pipefail + source /opt/dtk/cuda/env.sh + { + python3 -m pip install --no-deps --force-reinstall dist/fastpt-*.whl + python3 -c 'import fastpt; print(fastpt.__version__)' + fastpt.hipify.file --help + } 2>&1 | tee logs/install-verify.log + + - name: Run CTest + shell: bash + run: | + set -euo pipefail + source /opt/dtk/cuda/env.sh + export TORCH_PATH="$(python3 -c 'import os, torch; print(os.path.dirname(torch.__file__))')" + export LD_LIBRARY_PATH="${PWD}/torch-mocker/build:${TORCH_PATH}/lib:${LD_LIBRARY_PATH:-}" + ctest --test-dir torch-mocker/build --output-on-failure -j1 \ + 2>&1 | tee logs/ctest.log + + - name: Upload build records and test logs + if: always() + uses: actions/upload-artifact@v4 + with: + name: fastpt-ci-${{ github.run_id }}-${{ github.run_attempt }} + if-no-files-found: warn + retention-days: 30 + path: | + logs/ + dist/*.whl + torch-mocker/build/Testing/Temporary/ + + - name: Clean workspace + if: always() + shell: bash + run: rm -rf "${GITHUB_WORKSPACE}"/* "${GITHUB_WORKSPACE}"/.[!.]* || true From cb0cd21dff52e1d71dceefc0a343b92710f321d6 Mon Sep 17 00:00:00 2001 From: yuanjianglong Date: Tue, 22 Sep 2026 15:51:01 +0800 Subject: [PATCH 02/12] ci: align FastPT package source and nightly publish --- .github/workflows/fastpt-ci.yml | 101 +++++++++++++++++++------------- 1 file changed, 60 insertions(+), 41 deletions(-) diff --git a/.github/workflows/fastpt-ci.yml b/.github/workflows/fastpt-ci.yml index 1c0a0fc..e2a615a 100644 --- a/.github/workflows/fastpt-ci.yml +++ b/.github/workflows/fastpt-ci.yml @@ -11,6 +11,8 @@ on: permissions: contents: read + pull-requests: read + checks: read concurrency: group: fastpt-ci-${{ github.ref }} @@ -18,7 +20,7 @@ concurrency: env: DTK_PKG_URL: ${{ vars.RESOURCE_SERVER_URL }}/dtk-pkg/dtk26.04/DTK-26.04-rc4-centos8-x86_64.tar.gz - TORCH_INDEX_URL: http://10.16.1.201:9929/das_nightly/dtk2604-rc4/+simple/torch/ + PYPI_URL: ${{ vars.PYPI_URL }} PYTORCH_REPOSITORY: https://github.com/HYGON-AI/pytorch-das.git PYTORCH_REF: 2.12.0-dev @@ -47,6 +49,22 @@ jobs: shell: bash run: mkdir -p logs + - name: Configure nightly pip source + shell: bash + env: + PIP_INDEX: ${{ env.PYPI_URL }}/nightly/dtk2604/+simple/ + run: | + set -euo pipefail + TRUSTED_HOST="${PIP_INDEX#*://}" + TRUSTED_HOST="${TRUSTED_HOST%%/*}" + mkdir -p ~/.pip + printf '%s\n' \ + '[global]' \ + "index-url = ${PIP_INDEX}" \ + "trusted-host = ${TRUSTED_HOST}" \ + > ~/.pip/pip.conf + echo "PIP_INDEX=${PIP_INDEX}" | tee logs/pip-source.log + - name: Install DTK shell: bash run: | @@ -70,50 +88,18 @@ jobs: bash hcu_llvm_installer.sh --major 1.0.0 } 2>&1 | tee logs/install-aicc.log - - name: Select and install latest Torch 2.12 wheel + - name: Install latest Torch 2.12 wheel shell: bash run: | set -euo pipefail source /opt/dtk/cuda/env.sh - - TORCH_WHEEL_URL="$(python3 - <<'PY' - import html - import re - import urllib.parse - import urllib.request - - index_url = "${{ env.TORCH_INDEX_URL }}" - with urllib.request.urlopen(index_url) as response: - page = response.read().decode("utf-8") - - links = [html.unescape(link) for link in re.findall(r'href=["\x27]([^"\x27]+)', page, re.I)] - candidates = [] - for link in links: - url = urllib.parse.urljoin(index_url, link) - filename = urllib.parse.unquote(urllib.parse.urlsplit(url).path.rsplit("/", 1)[-1]) - if not re.fullmatch( - r"torch-2\.12\.0\+.*-cp310-cp310-manylinux_2_28_x86_64\.whl", - filename, - ): - continue - build = re.search(r"\.dtk2604\.(\d+)\.g[0-9a-f]+-", filename) - if build: - candidates.append((int(build.group(1)), filename, url)) - - if not candidates: - raise SystemExit("No Torch 2.12 cp310 manylinux_2_28 wheel found") - - _, filename, url = max(candidates) - print(url) - print(f"Selected {filename}", file=__import__("sys").stderr) - PY - )" - - echo "TORCH_WHEEL_URL=${TORCH_WHEEL_URL}" | tee logs/torch-wheel.log - python3 -m pip install --no-cache-dir wheel setuptools cmake ninja - python3 -m pip install --no-cache-dir "${TORCH_WHEEL_URL}" - python3 -c 'import torch; print(f"torch={torch.__version__}"); print(f"torch.hip={torch.version.hip}")' \ - 2>&1 | tee -a logs/torch-wheel.log + { + python3 -m pip index versions torch + python3 -m pip install --no-cache-dir wheel setuptools cmake ninja + # 未指定 DAS 本地版本,pip 会从该源选择最新的 2.12.0 构建。 + python3 -m pip install --no-cache-dir 'torch==2.12.0' + python3 -c 'import torch; print(f"torch={torch.__version__}"); print(f"torch.hip={torch.version.hip}")' + } 2>&1 | tee logs/torch-wheel.log - name: Checkout matching PyTorch source branch shell: bash @@ -178,6 +164,38 @@ jobs: ctest --test-dir torch-mocker/build --output-on-failure -j1 \ 2>&1 | tee logs/ctest.log + - name: Apply DAS local version to wheel + if: ${{ github.event_name == 'push' }} + shell: bash + run: | + set -euo pipefail + { + python3 -m pip install --no-cache-dir ciupload + DTK_VER="$(echo "${DTK_PKG_URL}" | grep -oP 'dtk\K[0-9]+\.[0-9]+' | tr -d '.')" + TORCH_VERSION="$(python3 -c 'import torch; print(torch.__version__.split("+")[0])')" + WHEEL_COMMIT_SHA="$(git rev-parse HEAD)" + CIUpload REPAIR \ + --dtk_version "${DTK_VER}" \ + --torch_version "${TORCH_VERSION}" \ + --git_commit "${WHEEL_COMMIT_SHA}" \ + --outputdir output \ + -f dist/fastpt-*.whl + } 2>&1 | tee logs/ciupload-repair.log + + - name: Upload NIGHTLY wheel + if: ${{ github.event_name == 'push' }} + shell: bash + env: + GITHUB_TOKEN: ${{ github.token }} + run: | + set -euo pipefail + CIUpload NIGHTLY \ + --devpi_url "${PYPI_URL}" \ + --password "${{ secrets.PYPI_PASSWORD }}" \ + --dtk_pkg_name "$(basename "${DTK_PKG_URL}")" \ + -f output/*.whl \ + --record 2>&1 | tee logs/ciupload-nightly.log + - name: Upload build records and test logs if: always() uses: actions/upload-artifact@v4 @@ -188,6 +206,7 @@ jobs: path: | logs/ dist/*.whl + output/*.whl torch-mocker/build/Testing/Temporary/ - name: Clean workspace From dd5cb5aeafa95ebe6182eb99dbf727d31307cbfe Mon Sep 17 00:00:00 2001 From: yuanjianglong Date: Tue, 22 Sep 2026 16:59:52 +0800 Subject: [PATCH 03/12] ci: split FastPT workflows for v2.12 --- .github/workflows/pr-test.yml | 166 ++++++++++++++++++ .github/workflows/quality-gate.yml | 21 +++ .../{fastpt-ci.yml => release-pypi.yml} | 67 +++---- 3 files changed, 212 insertions(+), 42 deletions(-) create mode 100644 .github/workflows/pr-test.yml create mode 100644 .github/workflows/quality-gate.yml rename .github/workflows/{fastpt-ci.yml => release-pypi.yml} (80%) diff --git a/.github/workflows/pr-test.yml b/.github/workflows/pr-test.yml new file mode 100644 index 0000000..896334d --- /dev/null +++ b/.github/workflows/pr-test.yml @@ -0,0 +1,166 @@ +# Copyright (c) 2026 Hygon Information Technology Co., Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +name: pr-test + +on: + pull_request: + branches: + - v2.12 + types: [opened, synchronize, reopened, ready_for_review] + +permissions: + contents: read + +concurrency: + group: fastpt-pr-test-${{ github.event.pull_request.number }} + cancel-in-progress: true + +env: + DTK_PKG_URL: ${{ vars.RESOURCE_SERVER_URL }}/dtk-pkg/dtk26.04/DTK-26.04-rc4-centos8-x86_64.tar.gz + PYPI_URL: ${{ vars.PYPI_URL }} + PYTORCH_REPOSITORY: https://github.com/HYGON-AI/pytorch-das.git + PYTORCH_REF: 2.12.0-dev + +jobs: + test: + if: ${{ github.event.pull_request.head.repo.full_name == github.repository }} + runs-on: [self-hosted, hcu] + timeout-minutes: 480 + container: + image: ${{ vars.BASE_COMPILE_IMAGE_ROCKY_PY310 }} + options: >- + --device=/dev/kfd --device=/dev/dri/ --group-add video + -v /opt/hyhal/:/opt/hyhal/:ro + --shm-size=80G + --cap-add=SYS_PTRACE + --security-opt seccomp=unconfined + --privileged=true + + steps: + - name: Checkout PR with latest v2.12 + uses: actions/checkout@v4 + with: + fetch-depth: 0 + submodules: recursive + persist-credentials: false + + - name: Prepare logs and pip source + shell: bash + env: + PIP_INDEX: ${{ env.PYPI_URL }}/nightly/dtk2604/+simple/ + run: | + set -euo pipefail + mkdir -p logs ~/.pip + TRUSTED_HOST="${PIP_INDEX#*://}" + TRUSTED_HOST="${TRUSTED_HOST%%/*}" + printf '%s\n' \ + '[global]' \ + "index-url = ${PIP_INDEX}" \ + "trusted-host = ${TRUSTED_HOST}" \ + > ~/.pip/pip.conf + echo "PIP_INDEX=${PIP_INDEX}" | tee logs/pip-source.log + + - name: Install DTK + shell: bash + run: | + set -euo pipefail + { + cd /opt + wget -q "${DTK_PKG_URL}" + tar -xzf "$(basename "${DTK_PKG_URL}")" + rm -rf dtk + mv dtk-* dtk + } 2>&1 | tee "${GITHUB_WORKSPACE}/logs/install-dtk.log" + + - name: Install AICC + shell: bash + env: + RESOURCE_SERVER_URL: ${{ vars.RESOURCE_SERVER_URL }} + run: | + set -euo pipefail + { + wget "${RESOURCE_SERVER_URL}/ai_cc/Nightly/hcu_llvm_installer.sh" + bash hcu_llvm_installer.sh --major 1.0.0 + } 2>&1 | tee logs/install-aicc.log + + - name: Install latest Torch 2.12 wheel + shell: bash + run: | + set -euo pipefail + source /opt/dtk/cuda/env.sh + { + python3 -m pip index versions torch + python3 -m pip install --no-cache-dir wheel setuptools cmake ninja + python3 -m pip install --no-cache-dir --upgrade --force-reinstall 'torch==2.12.0' + python3 -c 'import torch; print(f"torch={torch.__version__}"); print(f"torch.hip={torch.version.hip}")' + } 2>&1 | tee logs/torch-wheel.log + + - name: Checkout PyTorch 2.12 source + shell: bash + run: | + set -euo pipefail + git clone --depth 1 --branch "${PYTORCH_REF}" \ + "${PYTORCH_REPOSITORY}" "${RUNNER_TEMP}/pytorch-das" \ + 2>&1 | tee logs/clone-pytorch.log + git -C "${RUNNER_TEMP}/pytorch-das" rev-parse HEAD | tee -a logs/clone-pytorch.log + echo "HIP_TORCH_PATH=${RUNNER_TEMP}/pytorch-das" >> "${GITHUB_ENV}" + + - name: Build FastPT wheel + shell: bash + env: + FASTPT_CTEST: "1" + run: | + set -euo pipefail + source /opt/dtk/cuda/env.sh + export TORCH_PATH="$(python3 -c 'import os, torch; print(os.path.dirname(torch.__file__))')" + { + echo "FastPT commit: $(git rev-parse HEAD)" + echo "PyTorch source: $(git -C "${HIP_TORCH_PATH}" rev-parse HEAD)" + echo "TORCH_PATH=${TORCH_PATH}" + echo "HIP_TORCH_PATH=${HIP_TORCH_PATH}" + python3 --version + cat /opt/dtk/.info/rocm_version 2>/dev/null || true + git submodule update --init --recursive + rm -rf build dist fastpt.egg-info torch-mocker/build + python3 setup.py bdist_wheel + ls -lh dist/*.whl + } 2>&1 | tee logs/build.log + + - name: Install and verify FastPT + shell: bash + run: | + set -euo pipefail + source /opt/dtk/cuda/env.sh + { + python3 -m pip install --no-deps --force-reinstall dist/fastpt-*.whl + python3 -c 'import fastpt; print(fastpt.__version__)' + fastpt.hipify.file --help + } 2>&1 | tee logs/install-verify.log + + - name: Run CTest + shell: bash + run: | + set -euo pipefail + source /opt/dtk/cuda/env.sh + export TORCH_PATH="$(python3 -c 'import os, torch; print(os.path.dirname(torch.__file__))')" + export LD_LIBRARY_PATH="${PWD}/torch-mocker/build:${TORCH_PATH}/lib:${LD_LIBRARY_PATH:-}" + ctest --test-dir torch-mocker/build --output-on-failure -j1 \ + 2>&1 | tee logs/ctest.log + + - name: Upload build records and test logs + if: always() + uses: actions/upload-artifact@v4 + with: + name: fastpt-pr-${{ github.event.pull_request.number }}-${{ github.run_attempt }} + if-no-files-found: warn + retention-days: 30 + path: | + logs/ + dist/*.whl + torch-mocker/build/Testing/Temporary/ + + - name: Clean workspace + if: always() + shell: bash + run: rm -rf "${GITHUB_WORKSPACE}"/* "${GITHUB_WORKSPACE}"/.[!.]* || true diff --git a/.github/workflows/quality-gate.yml b/.github/workflows/quality-gate.yml new file mode 100644 index 0000000..6ce0aee --- /dev/null +++ b/.github/workflows/quality-gate.yml @@ -0,0 +1,21 @@ +name: Quality Gate + +on: + pull_request: + types: [opened, synchronize, reopened, ready_for_review] + branches: + - v2.12 + +permissions: + contents: read + +concurrency: + group: fastpt-pr-gate-${{ github.event.pull_request.number }} + cancel-in-progress: true + +jobs: + gate: + name: Checks + uses: HYGON-AI/quality-gate/.github/workflows/pr-quality-gate.yml@v2.0.3 + permissions: + contents: read diff --git a/.github/workflows/fastpt-ci.yml b/.github/workflows/release-pypi.yml similarity index 80% rename from .github/workflows/fastpt-ci.yml rename to .github/workflows/release-pypi.yml index e2a615a..a71dba8 100644 --- a/.github/workflows/fastpt-ci.yml +++ b/.github/workflows/release-pypi.yml @@ -1,12 +1,12 @@ # Copyright (c) 2026 Hygon Information Technology Co., Ltd. # SPDX-License-Identifier: BSD-3-Clause -name: FastPT CI +name: release-pypi on: push: branches: - - ci-fastpt + - v2.12 workflow_dispatch: permissions: @@ -14,10 +14,6 @@ permissions: pull-requests: read checks: read -concurrency: - group: fastpt-ci-${{ github.ref }} - cancel-in-progress: true - env: DTK_PKG_URL: ${{ vars.RESOURCE_SERVER_URL }}/dtk-pkg/dtk26.04/DTK-26.04-rc4-centos8-x86_64.tar.gz PYPI_URL: ${{ vars.PYPI_URL }} @@ -25,7 +21,10 @@ env: PYTORCH_REF: 2.12.0-dev jobs: - build-and-test: + compile-test-release: + concurrency: + group: fastpt-release-${{ github.ref }}-torch2.12 + cancel-in-progress: true runs-on: [self-hosted, hcu] timeout-minutes: 480 container: @@ -39,25 +38,21 @@ jobs: --privileged=true steps: - - name: Checkout FastPT + - name: Checkout uses: actions/checkout@v4 with: - submodules: recursive fetch-depth: 0 + submodules: recursive - - name: Prepare log directory - shell: bash - run: mkdir -p logs - - - name: Configure nightly pip source + - name: Prepare logs and pip source shell: bash env: PIP_INDEX: ${{ env.PYPI_URL }}/nightly/dtk2604/+simple/ run: | set -euo pipefail + mkdir -p logs ~/.pip TRUSTED_HOST="${PIP_INDEX#*://}" TRUSTED_HOST="${TRUSTED_HOST%%/*}" - mkdir -p ~/.pip printf '%s\n' \ '[global]' \ "index-url = ${PIP_INDEX}" \ @@ -96,12 +91,11 @@ jobs: { python3 -m pip index versions torch python3 -m pip install --no-cache-dir wheel setuptools cmake ninja - # 未指定 DAS 本地版本,pip 会从该源选择最新的 2.12.0 构建。 - python3 -m pip install --no-cache-dir 'torch==2.12.0' + python3 -m pip install --no-cache-dir --upgrade --force-reinstall 'torch==2.12.0' python3 -c 'import torch; print(f"torch={torch.__version__}"); print(f"torch.hip={torch.version.hip}")' } 2>&1 | tee logs/torch-wheel.log - - name: Checkout matching PyTorch source branch + - name: Checkout PyTorch 2.12 source shell: bash run: | set -euo pipefail @@ -111,37 +105,26 @@ jobs: git -C "${RUNNER_TEMP}/pytorch-das" rev-parse HEAD | tee -a logs/clone-pytorch.log echo "HIP_TORCH_PATH=${RUNNER_TEMP}/pytorch-das" >> "${GITHUB_ENV}" - - name: Record build environment + - name: Build FastPT wheel shell: bash + env: + FASTPT_CTEST: "1" run: | set -euo pipefail source /opt/dtk/cuda/env.sh + export TORCH_PATH="$(python3 -c 'import os, torch; print(os.path.dirname(torch.__file__))')" { echo "FastPT commit: $(git rev-parse HEAD)" echo "PyTorch source: $(git -C "${HIP_TORCH_PATH}" rev-parse HEAD)" + echo "TORCH_PATH=${TORCH_PATH}" + echo "HIP_TORCH_PATH=${HIP_TORCH_PATH}" python3 --version - python3 -m pip --version - python3 -c 'import torch; print(f"torch={torch.__version__}"); print(f"torch.hip={torch.version.hip}")' cat /opt/dtk/.info/rocm_version 2>/dev/null || true - cmake --version - make --version | head -n 1 - hipcc --version - } 2>&1 | tee logs/environment.log - - - name: Build FastPT wheel - shell: bash - env: - FASTPT_CTEST: "1" - run: | - set -euo pipefail - source /opt/dtk/cuda/env.sh - export TORCH_PATH="$(python3 -c 'import os, torch; print(os.path.dirname(torch.__file__))')" - echo "TORCH_PATH=${TORCH_PATH}" | tee logs/build.log - echo "HIP_TORCH_PATH=${HIP_TORCH_PATH}" | tee -a logs/build.log - git submodule update --init --recursive 2>&1 | tee -a logs/build.log - rm -rf build dist fastpt.egg-info torch-mocker/build - python3 setup.py bdist_wheel 2>&1 | tee -a logs/build.log - ls -lh dist/*.whl | tee -a logs/build.log + git submodule update --init --recursive + rm -rf build dist fastpt.egg-info torch-mocker/build + python3 setup.py bdist_wheel + ls -lh dist/*.whl + } 2>&1 | tee logs/build.log - name: Install and verify FastPT shell: bash @@ -182,7 +165,7 @@ jobs: -f dist/fastpt-*.whl } 2>&1 | tee logs/ciupload-repair.log - - name: Upload NIGHTLY wheel + - name: Upload NIGHTLY if: ${{ github.event_name == 'push' }} shell: bash env: @@ -200,7 +183,7 @@ jobs: if: always() uses: actions/upload-artifact@v4 with: - name: fastpt-ci-${{ github.run_id }}-${{ github.run_attempt }} + name: fastpt-release-${{ github.run_id }}-${{ github.run_attempt }} if-no-files-found: warn retention-days: 30 path: | From e84140d583079aa31f60cf2eed0c48209890f65b Mon Sep 17 00:00:00 2001 From: yuanjianglong Date: Tue, 22 Sep 2026 18:10:03 +0800 Subject: [PATCH 04/12] ci: target BW1100 runners --- .github/workflows/pr-test.yml | 2 +- .github/workflows/release-pypi.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pr-test.yml b/.github/workflows/pr-test.yml index 896334d..32ed065 100644 --- a/.github/workflows/pr-test.yml +++ b/.github/workflows/pr-test.yml @@ -25,7 +25,7 @@ env: jobs: test: if: ${{ github.event.pull_request.head.repo.full_name == github.repository }} - runs-on: [self-hosted, hcu] + runs-on: [self-hosted, BW1100] timeout-minutes: 480 container: image: ${{ vars.BASE_COMPILE_IMAGE_ROCKY_PY310 }} diff --git a/.github/workflows/release-pypi.yml b/.github/workflows/release-pypi.yml index a71dba8..cd85bfa 100644 --- a/.github/workflows/release-pypi.yml +++ b/.github/workflows/release-pypi.yml @@ -25,7 +25,7 @@ jobs: concurrency: group: fastpt-release-${{ github.ref }}-torch2.12 cancel-in-progress: true - runs-on: [self-hosted, hcu] + runs-on: [self-hosted, BW1100] timeout-minutes: 480 container: image: ${{ vars.BASE_COMPILE_IMAGE_ROCKY_PY310 }} From 0e7714ad869fe4007cccd3b2728ef669d9248ace Mon Sep 17 00:00:00 2001 From: yuanjianglong Date: Tue, 22 Sep 2026 19:13:27 +0800 Subject: [PATCH 05/12] ci: allow all self-hosted runners --- .github/workflows/pr-test.yml | 2 +- .github/workflows/release-pypi.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pr-test.yml b/.github/workflows/pr-test.yml index 32ed065..2c49784 100644 --- a/.github/workflows/pr-test.yml +++ b/.github/workflows/pr-test.yml @@ -25,7 +25,7 @@ env: jobs: test: if: ${{ github.event.pull_request.head.repo.full_name == github.repository }} - runs-on: [self-hosted, BW1100] + runs-on: self-hosted timeout-minutes: 480 container: image: ${{ vars.BASE_COMPILE_IMAGE_ROCKY_PY310 }} diff --git a/.github/workflows/release-pypi.yml b/.github/workflows/release-pypi.yml index cd85bfa..6d97959 100644 --- a/.github/workflows/release-pypi.yml +++ b/.github/workflows/release-pypi.yml @@ -25,7 +25,7 @@ jobs: concurrency: group: fastpt-release-${{ github.ref }}-torch2.12 cancel-in-progress: true - runs-on: [self-hosted, BW1100] + runs-on: self-hosted timeout-minutes: 480 container: image: ${{ vars.BASE_COMPILE_IMAGE_ROCKY_PY310 }} From 43ee82a9152a364e4c698b9f6623a4a1113e3bec Mon Sep 17 00:00:00 2001 From: yuanjianglong Date: Tue, 22 Sep 2026 19:39:44 +0800 Subject: [PATCH 06/12] ci: set ROCM_PATH before loading DTK --- .github/workflows/pr-test.yml | 4 ++++ .github/workflows/release-pypi.yml | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/.github/workflows/pr-test.yml b/.github/workflows/pr-test.yml index 2c49784..6c6050d 100644 --- a/.github/workflows/pr-test.yml +++ b/.github/workflows/pr-test.yml @@ -88,6 +88,7 @@ jobs: shell: bash run: | set -euo pipefail + export ROCM_PATH=/opt/dtk source /opt/dtk/cuda/env.sh { python3 -m pip index versions torch @@ -112,6 +113,7 @@ jobs: FASTPT_CTEST: "1" run: | set -euo pipefail + export ROCM_PATH=/opt/dtk source /opt/dtk/cuda/env.sh export TORCH_PATH="$(python3 -c 'import os, torch; print(os.path.dirname(torch.__file__))')" { @@ -131,6 +133,7 @@ jobs: shell: bash run: | set -euo pipefail + export ROCM_PATH=/opt/dtk source /opt/dtk/cuda/env.sh { python3 -m pip install --no-deps --force-reinstall dist/fastpt-*.whl @@ -142,6 +145,7 @@ jobs: shell: bash run: | set -euo pipefail + export ROCM_PATH=/opt/dtk source /opt/dtk/cuda/env.sh export TORCH_PATH="$(python3 -c 'import os, torch; print(os.path.dirname(torch.__file__))')" export LD_LIBRARY_PATH="${PWD}/torch-mocker/build:${TORCH_PATH}/lib:${LD_LIBRARY_PATH:-}" diff --git a/.github/workflows/release-pypi.yml b/.github/workflows/release-pypi.yml index 6d97959..2a08f28 100644 --- a/.github/workflows/release-pypi.yml +++ b/.github/workflows/release-pypi.yml @@ -87,6 +87,7 @@ jobs: shell: bash run: | set -euo pipefail + export ROCM_PATH=/opt/dtk source /opt/dtk/cuda/env.sh { python3 -m pip index versions torch @@ -111,6 +112,7 @@ jobs: FASTPT_CTEST: "1" run: | set -euo pipefail + export ROCM_PATH=/opt/dtk source /opt/dtk/cuda/env.sh export TORCH_PATH="$(python3 -c 'import os, torch; print(os.path.dirname(torch.__file__))')" { @@ -130,6 +132,7 @@ jobs: shell: bash run: | set -euo pipefail + export ROCM_PATH=/opt/dtk source /opt/dtk/cuda/env.sh { python3 -m pip install --no-deps --force-reinstall dist/fastpt-*.whl @@ -141,6 +144,7 @@ jobs: shell: bash run: | set -euo pipefail + export ROCM_PATH=/opt/dtk source /opt/dtk/cuda/env.sh export TORCH_PATH="$(python3 -c 'import os, torch; print(os.path.dirname(torch.__file__))')" export LD_LIBRARY_PATH="${PWD}/torch-mocker/build:${TORCH_PATH}/lib:${LD_LIBRARY_PATH:-}" From a545abd9e4e1abda725e5cb1d1f71fd556b806f3 Mon Sep 17 00:00:00 2001 From: yuanjianglong Date: Tue, 22 Sep 2026 19:50:52 +0800 Subject: [PATCH 07/12] ci: load complete DTK environment --- .github/workflows/pr-test.yml | 16 ++++++++++++---- .github/workflows/release-pypi.yml | 16 ++++++++++++---- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/.github/workflows/pr-test.yml b/.github/workflows/pr-test.yml index 6c6050d..2b2890d 100644 --- a/.github/workflows/pr-test.yml +++ b/.github/workflows/pr-test.yml @@ -87,9 +87,11 @@ jobs: - name: Install latest Torch 2.12 wheel shell: bash run: | - set -euo pipefail + set -eo pipefail export ROCM_PATH=/opt/dtk + source /opt/dtk/env.sh source /opt/dtk/cuda/env.sh + set -u { python3 -m pip index versions torch python3 -m pip install --no-cache-dir wheel setuptools cmake ninja @@ -112,9 +114,11 @@ jobs: env: FASTPT_CTEST: "1" run: | - set -euo pipefail + set -eo pipefail export ROCM_PATH=/opt/dtk + source /opt/dtk/env.sh source /opt/dtk/cuda/env.sh + set -u export TORCH_PATH="$(python3 -c 'import os, torch; print(os.path.dirname(torch.__file__))')" { echo "FastPT commit: $(git rev-parse HEAD)" @@ -132,9 +136,11 @@ jobs: - name: Install and verify FastPT shell: bash run: | - set -euo pipefail + set -eo pipefail export ROCM_PATH=/opt/dtk + source /opt/dtk/env.sh source /opt/dtk/cuda/env.sh + set -u { python3 -m pip install --no-deps --force-reinstall dist/fastpt-*.whl python3 -c 'import fastpt; print(fastpt.__version__)' @@ -144,9 +150,11 @@ jobs: - name: Run CTest shell: bash run: | - set -euo pipefail + set -eo pipefail export ROCM_PATH=/opt/dtk + source /opt/dtk/env.sh source /opt/dtk/cuda/env.sh + set -u export TORCH_PATH="$(python3 -c 'import os, torch; print(os.path.dirname(torch.__file__))')" export LD_LIBRARY_PATH="${PWD}/torch-mocker/build:${TORCH_PATH}/lib:${LD_LIBRARY_PATH:-}" ctest --test-dir torch-mocker/build --output-on-failure -j1 \ diff --git a/.github/workflows/release-pypi.yml b/.github/workflows/release-pypi.yml index 2a08f28..ea52403 100644 --- a/.github/workflows/release-pypi.yml +++ b/.github/workflows/release-pypi.yml @@ -86,9 +86,11 @@ jobs: - name: Install latest Torch 2.12 wheel shell: bash run: | - set -euo pipefail + set -eo pipefail export ROCM_PATH=/opt/dtk + source /opt/dtk/env.sh source /opt/dtk/cuda/env.sh + set -u { python3 -m pip index versions torch python3 -m pip install --no-cache-dir wheel setuptools cmake ninja @@ -111,9 +113,11 @@ jobs: env: FASTPT_CTEST: "1" run: | - set -euo pipefail + set -eo pipefail export ROCM_PATH=/opt/dtk + source /opt/dtk/env.sh source /opt/dtk/cuda/env.sh + set -u export TORCH_PATH="$(python3 -c 'import os, torch; print(os.path.dirname(torch.__file__))')" { echo "FastPT commit: $(git rev-parse HEAD)" @@ -131,9 +135,11 @@ jobs: - name: Install and verify FastPT shell: bash run: | - set -euo pipefail + set -eo pipefail export ROCM_PATH=/opt/dtk + source /opt/dtk/env.sh source /opt/dtk/cuda/env.sh + set -u { python3 -m pip install --no-deps --force-reinstall dist/fastpt-*.whl python3 -c 'import fastpt; print(fastpt.__version__)' @@ -143,9 +149,11 @@ jobs: - name: Run CTest shell: bash run: | - set -euo pipefail + set -eo pipefail export ROCM_PATH=/opt/dtk + source /opt/dtk/env.sh source /opt/dtk/cuda/env.sh + set -u export TORCH_PATH="$(python3 -c 'import os, torch; print(os.path.dirname(torch.__file__))')" export LD_LIBRARY_PATH="${PWD}/torch-mocker/build:${TORCH_PATH}/lib:${LD_LIBRARY_PATH:-}" ctest --test-dir torch-mocker/build --output-on-failure -j1 \ From add7f06a435da47f1894489c19443d54e0ad7870 Mon Sep 17 00:00:00 2001 From: yuanjianglong Date: Tue, 22 Sep 2026 20:18:46 +0800 Subject: [PATCH 08/12] ci: authenticate pytorch source checkout --- .github/workflows/pr-test.yml | 18 +++++++++--------- .github/workflows/release-pypi.yml | 18 +++++++++--------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/.github/workflows/pr-test.yml b/.github/workflows/pr-test.yml index 2b2890d..1410f92 100644 --- a/.github/workflows/pr-test.yml +++ b/.github/workflows/pr-test.yml @@ -19,8 +19,8 @@ concurrency: env: DTK_PKG_URL: ${{ vars.RESOURCE_SERVER_URL }}/dtk-pkg/dtk26.04/DTK-26.04-rc4-centos8-x86_64.tar.gz PYPI_URL: ${{ vars.PYPI_URL }} - PYTORCH_REPOSITORY: https://github.com/HYGON-AI/pytorch-das.git PYTORCH_REF: 2.12.0-dev + HIP_TORCH_PATH: ${{ github.workspace }}/pytorch-das jobs: test: @@ -100,14 +100,14 @@ jobs: } 2>&1 | tee logs/torch-wheel.log - name: Checkout PyTorch 2.12 source - shell: bash - run: | - set -euo pipefail - git clone --depth 1 --branch "${PYTORCH_REF}" \ - "${PYTORCH_REPOSITORY}" "${RUNNER_TEMP}/pytorch-das" \ - 2>&1 | tee logs/clone-pytorch.log - git -C "${RUNNER_TEMP}/pytorch-das" rev-parse HEAD | tee -a logs/clone-pytorch.log - echo "HIP_TORCH_PATH=${RUNNER_TEMP}/pytorch-das" >> "${GITHUB_ENV}" + uses: actions/checkout@v4 + with: + repository: HYGON-AI/pytorch-das + ref: ${{ env.PYTORCH_REF }} + path: pytorch-das + fetch-depth: 1 + persist-credentials: false + token: ${{ secrets.PYTORCH_READ_TOKEN }} - name: Build FastPT wheel shell: bash diff --git a/.github/workflows/release-pypi.yml b/.github/workflows/release-pypi.yml index ea52403..55e7806 100644 --- a/.github/workflows/release-pypi.yml +++ b/.github/workflows/release-pypi.yml @@ -17,8 +17,8 @@ permissions: env: DTK_PKG_URL: ${{ vars.RESOURCE_SERVER_URL }}/dtk-pkg/dtk26.04/DTK-26.04-rc4-centos8-x86_64.tar.gz PYPI_URL: ${{ vars.PYPI_URL }} - PYTORCH_REPOSITORY: https://github.com/HYGON-AI/pytorch-das.git PYTORCH_REF: 2.12.0-dev + HIP_TORCH_PATH: ${{ github.workspace }}/pytorch-das jobs: compile-test-release: @@ -99,14 +99,14 @@ jobs: } 2>&1 | tee logs/torch-wheel.log - name: Checkout PyTorch 2.12 source - shell: bash - run: | - set -euo pipefail - git clone --depth 1 --branch "${PYTORCH_REF}" \ - "${PYTORCH_REPOSITORY}" "${RUNNER_TEMP}/pytorch-das" \ - 2>&1 | tee logs/clone-pytorch.log - git -C "${RUNNER_TEMP}/pytorch-das" rev-parse HEAD | tee -a logs/clone-pytorch.log - echo "HIP_TORCH_PATH=${RUNNER_TEMP}/pytorch-das" >> "${GITHUB_ENV}" + uses: actions/checkout@v4 + with: + repository: HYGON-AI/pytorch-das + ref: ${{ env.PYTORCH_REF }} + path: pytorch-das + fetch-depth: 1 + persist-credentials: false + token: ${{ secrets.PYTORCH_READ_TOKEN }} - name: Build FastPT wheel shell: bash From cd72d49cd37f9e19934b9ef974696ca876507519 Mon Sep 17 00:00:00 2001 From: yuanjianglong Date: Tue, 22 Sep 2026 23:18:01 +0800 Subject: [PATCH 09/12] ci: use DTK Ubuntu image and pin numpy --- .github/workflows/pr-test.yml | 4 ++-- .github/workflows/release-pypi.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/pr-test.yml b/.github/workflows/pr-test.yml index 1410f92..7f740d9 100644 --- a/.github/workflows/pr-test.yml +++ b/.github/workflows/pr-test.yml @@ -28,7 +28,7 @@ jobs: runs-on: self-hosted timeout-minutes: 480 container: - image: ${{ vars.BASE_COMPILE_IMAGE_ROCKY_PY310 }} + image: ${{ vars.DTK2604_IMAGE_UBUNTU_PY310 }} options: >- --device=/dev/kfd --device=/dev/dri/ --group-add video -v /opt/hyhal/:/opt/hyhal/:ro @@ -94,7 +94,7 @@ jobs: set -u { python3 -m pip index versions torch - python3 -m pip install --no-cache-dir wheel setuptools cmake ninja + python3 -m pip install --no-cache-dir numpy==1.24.3 wheel setuptools cmake ninja python3 -m pip install --no-cache-dir --upgrade --force-reinstall 'torch==2.12.0' python3 -c 'import torch; print(f"torch={torch.__version__}"); print(f"torch.hip={torch.version.hip}")' } 2>&1 | tee logs/torch-wheel.log diff --git a/.github/workflows/release-pypi.yml b/.github/workflows/release-pypi.yml index 55e7806..38201ba 100644 --- a/.github/workflows/release-pypi.yml +++ b/.github/workflows/release-pypi.yml @@ -28,7 +28,7 @@ jobs: runs-on: self-hosted timeout-minutes: 480 container: - image: ${{ vars.BASE_COMPILE_IMAGE_ROCKY_PY310 }} + image: ${{ vars.DTK2604_IMAGE_UBUNTU_PY310 }} options: >- --device=/dev/kfd --device=/dev/dri/ --group-add video -v /opt/hyhal/:/opt/hyhal/:ro @@ -93,7 +93,7 @@ jobs: set -u { python3 -m pip index versions torch - python3 -m pip install --no-cache-dir wheel setuptools cmake ninja + python3 -m pip install --no-cache-dir numpy==1.24.3 wheel setuptools cmake ninja python3 -m pip install --no-cache-dir --upgrade --force-reinstall 'torch==2.12.0' python3 -c 'import torch; print(f"torch={torch.__version__}"); print(f"torch.hip={torch.version.hip}")' } 2>&1 | tee logs/torch-wheel.log From 42b65d66c90615028b016400d0d5af2b4e7f5f50 Mon Sep 17 00:00:00 2001 From: yuanjianglong Date: Tue, 22 Sep 2026 23:26:14 +0800 Subject: [PATCH 10/12] ci: trust container checkout directories --- .github/workflows/pr-test.yml | 2 ++ .github/workflows/release-pypi.yml | 2 ++ 2 files changed, 4 insertions(+) diff --git a/.github/workflows/pr-test.yml b/.github/workflows/pr-test.yml index 7f740d9..0add7b9 100644 --- a/.github/workflows/pr-test.yml +++ b/.github/workflows/pr-test.yml @@ -119,6 +119,8 @@ jobs: source /opt/dtk/env.sh source /opt/dtk/cuda/env.sh set -u + git config --global --add safe.directory "${GITHUB_WORKSPACE}" + git config --global --add safe.directory "${HIP_TORCH_PATH}" export TORCH_PATH="$(python3 -c 'import os, torch; print(os.path.dirname(torch.__file__))')" { echo "FastPT commit: $(git rev-parse HEAD)" diff --git a/.github/workflows/release-pypi.yml b/.github/workflows/release-pypi.yml index 38201ba..4d8d276 100644 --- a/.github/workflows/release-pypi.yml +++ b/.github/workflows/release-pypi.yml @@ -118,6 +118,8 @@ jobs: source /opt/dtk/env.sh source /opt/dtk/cuda/env.sh set -u + git config --global --add safe.directory "${GITHUB_WORKSPACE}" + git config --global --add safe.directory "${HIP_TORCH_PATH}" export TORCH_PATH="$(python3 -c 'import os, torch; print(os.path.dirname(torch.__file__))')" { echo "FastPT commit: $(git rev-parse HEAD)" From 0fa54909f46b277c0b76ab2c76e42065e8928dc2 Mon Sep 17 00:00:00 2001 From: yuanjianglong Date: Thu, 24 Sep 2026 09:18:36 +0800 Subject: [PATCH 11/12] ci: load DTK environment for wheel repair --- .github/workflows/release-pypi.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release-pypi.yml b/.github/workflows/release-pypi.yml index 4d8d276..8c60991 100644 --- a/.github/workflows/release-pypi.yml +++ b/.github/workflows/release-pypi.yml @@ -165,7 +165,11 @@ jobs: if: ${{ github.event_name == 'push' }} shell: bash run: | - set -euo pipefail + set -eo pipefail + export ROCM_PATH=/opt/dtk + source /opt/dtk/env.sh + source /opt/dtk/cuda/env.sh + set -u { python3 -m pip install --no-cache-dir ciupload DTK_VER="$(echo "${DTK_PKG_URL}" | grep -oP 'dtk\K[0-9]+\.[0-9]+' | tr -d '.')" From e815e442987fdd329589a14efb17a630f024cdc7 Mon Sep 17 00:00:00 2001 From: yuanjianglong Date: Thu, 24 Sep 2026 09:48:36 +0800 Subject: [PATCH 12/12] ci: stop uploading GitHub artifacts --- .github/workflows/pr-test.yml | 12 ------------ .github/workflows/release-pypi.yml | 13 ------------- 2 files changed, 25 deletions(-) diff --git a/.github/workflows/pr-test.yml b/.github/workflows/pr-test.yml index 0add7b9..22f2e7e 100644 --- a/.github/workflows/pr-test.yml +++ b/.github/workflows/pr-test.yml @@ -162,18 +162,6 @@ jobs: ctest --test-dir torch-mocker/build --output-on-failure -j1 \ 2>&1 | tee logs/ctest.log - - name: Upload build records and test logs - if: always() - uses: actions/upload-artifact@v4 - with: - name: fastpt-pr-${{ github.event.pull_request.number }}-${{ github.run_attempt }} - if-no-files-found: warn - retention-days: 30 - path: | - logs/ - dist/*.whl - torch-mocker/build/Testing/Temporary/ - - name: Clean workspace if: always() shell: bash diff --git a/.github/workflows/release-pypi.yml b/.github/workflows/release-pypi.yml index 8c60991..49bffbd 100644 --- a/.github/workflows/release-pypi.yml +++ b/.github/workflows/release-pypi.yml @@ -197,19 +197,6 @@ jobs: -f output/*.whl \ --record 2>&1 | tee logs/ciupload-nightly.log - - name: Upload build records and test logs - if: always() - uses: actions/upload-artifact@v4 - with: - name: fastpt-release-${{ github.run_id }}-${{ github.run_attempt }} - if-no-files-found: warn - retention-days: 30 - path: | - logs/ - dist/*.whl - output/*.whl - torch-mocker/build/Testing/Temporary/ - - name: Clean workspace if: always() shell: bash