diff --git a/.github/actions/check-bypass/action.yml b/.github/actions/check-bypass/action.yml new file mode 100644 index 00000000000..f293d6ba6c4 --- /dev/null +++ b/.github/actions/check-bypass/action.yml @@ -0,0 +1,41 @@ +name: "Check bypass" +description: "A custom action to encapsulate PFCCLab/ci-bypass" +inputs: + github-token: + description: "GitHub token" + required: true + workflow-name: + description: "Workflow name" + required: true +outputs: + can-skip: + description: "Whether the workflow can be skipped." + value: ${{ steps.check-bypass.outputs.can-skip }} + +runs: + using: "composite" + steps: + - id: check-bypass + name: Check Bypass + env: + CI_TEAM_MEMBERS: '["tianshuo78520a", "yongqiangma", "Yuqiang Ge"]' + uses: PFCCLab/ci-bypass@v2 + with: + github-token: ${{ inputs.github-token }} + non-pull-request-event-strategy: 'never-skipped' + type: 'composite' + composite-rule: | + { + "any": [ + { + "type": "labeled", + "label": ["skip-ci: ${{ inputs.workflow-name }}", "skip-ci: all"], + "username": ${{ env.CI_TEAM_MEMBERS }} + }, + { + "type": "commented", + "comment-pattern": [".*/skip-ci ${{ inputs.workflow-name }}.*", ".*/skip-ci all.*"], + "username": ${{ env.CI_TEAM_MEMBERS }} + } + ] + } diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml new file mode 100644 index 00000000000..e1ff7901175 --- /dev/null +++ b/.github/workflows/CI.yml @@ -0,0 +1,63 @@ +name: CI + +on: + pull_request: + types: [opened, synchronize] + branches: [develop, release/**, fleety_*] + +permissions: read-all + +concurrency: + group: ${{ github.event.pull_request.number }}-${{ github.workflow }} + cancel-in-progress: true + +env: + PR_ID: ${{ github.event.pull_request.number }} + COMMIT_ID: ${{ github.event.pull_request.head.sha }} + +jobs: + clone: + name: Clone-linux + uses: ./.github/workflows/_Clone-linux.yml + with: + workflow-name: 'CI' + + Codestyle-Check: + name: Codestyle-Check + uses: ./.github/workflows/_Codestyle-Check.yml + needs: [clone] + + gcu: + name: gcu + uses: ./.github/workflows/_GCU.yml + needs: [Codestyle-Check] + + hpu: + name: hpu + uses: ./.github/workflows/_HPU.yml + needs: [Codestyle-Check] + + mlu: + name: mlu + uses: ./.github/workflows/_MLU.yml + needs: [Codestyle-Check] + + ixuca: + name: ixuca + uses: ./.github/workflows/_IXUCA.yml + needs: [Codestyle-Check] + + sdaa: + name: sdaa + uses: ./.github/workflows/_SDAA.yml + needs: [Codestyle-Check] + + npu-910b-arm: + name: npu-910B-ARM + uses: ./.github/workflows/_910B-ARM.yml + needs: [Codestyle-Check] + + npu-910b-x86: + name: npu-910B-X86 + uses: ./.github/workflows/_910B-X86.yml + needs: [Codestyle-Check] diff --git a/.github/workflows/_910B-ARM.yml b/.github/workflows/_910B-ARM.yml new file mode 100644 index 00000000000..f09a2857e83 --- /dev/null +++ b/.github/workflows/_910B-ARM.yml @@ -0,0 +1,145 @@ +name: PR-CI-910B-ARM + +on: + workflow_call: + inputs: + workflow-name: + type: string + required: false + clone_dir: + type: string + required: false + default: 'PaddlecustomDevice' + is_pr: + type: string + required: false + default: 'true' + +jobs: + check-bypass: + name: Check bypass + if: ${{ inputs.can-skip != 'true' }} + uses: ./.github/workflows/check-bypass.yml + with: + workflow-name: '910b-arm' + secrets: + github-token: ${{ secrets.GITHUB_TOKEN }} + + PR-CI-910B-ARM: + name: PR-CI-910B-ARM + needs: check-bypass + if: ${{ needs.check-bypass.outputs.can-skip != 'true' }} + runs-on: + group: 910B-ARM + env: + PR_ID: ${{ github.event.pull_request.number }} + COMMIT_ID: ${{ github.event.pull_request.head.sha }} + BRANCH: develop + TASK: paddle-CI-${{ github.event.pull_request.number }}-npu + no_proxy: "bcebos.com,apiin.im.baidu.com,gitee.com,aliyun.com,.baidu.com,.tuna.tsinghua.edu.cn" + + steps: + - name: Cleanup + run: | + rm -rf * .[^.]* + + - name: Check docker image and run container + env: + GIT_PR_ID: ${{ github.event.pull_request.number || '0' }} + GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} + RUN_ID: ${{ github.run_id }} + cache_dir: /root/.cache + ccache_dir: /root/.ccache + docker_image: registry.baidubce.com/device/paddle-npu:cann80RC1-ubuntu20-aarch64-gcc84-py39 + run: | + if [[ "${{ runner.name }}" == "IXUCA-2" ]];then + echo "IXUCA-2" + export ASCEND_RT_VISIBLE_DEVICES=4,5,6,7 + elif [[ "${{ runner.name }}" == "IXUCA-3" ]];then + echo "IXUCA-3" + export ASCEND_RT_VISIBLE_DEVICES=8,9,10,11 + elif [[ "${{ runner.name }}" == "IXUCA-4" ]];then + echo "IXUCA-4" + export ASCEND_RT_VISIBLE_DEVICES=12,13,14,15 + else + echo echo "IXUCA-1" + export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3 + fi + echo ${ASCEND_RT_VISIBLE_DEVICES} + + container_name=${TASK}-$(date +%Y%m%d-%H%M%S) + echo "container_name=${container_name}" >> ${{ github.env }} + docker run --shm-size=128G \ + -d -t --name ${container_name} \ + --privileged --network=host \ + -e PR_ID \ + -e COMMIT_ID \ + -e BRANCH \ + -e no_proxy \ + -e USE_910B=1 \ + -e FLAGS_npu_storage_format=0 \ + -e ASCEND_RT_VISIBLE_DEVICES=${ASCEND_RT_VISIBLE_DEVICES} \ + -v ${cache_dir}:/root/.cache \ + -v ${ccache_dir}:/root/.ccache \ + -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ + -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ + -v /usr/local/dcmi:/usr/local/dcmi \ + -v ${{ github.workspace }}/../../..:${{ github.workspace }}/../../.. \ + -v ${{ github.workspace }}:/PaddleCustomDevice -w /PaddleCustomDevice \ + ${docker_image} /bin/bash + + - name: Download Code + run: | + docker exec -t ${{ env.container_name }} /bin/bash -c ' + source ${{ github.workspace }}/../../../proxy + set -x + wget -q --tries=5 --no-proxy https://paddle-github-action.bj.bcebos.com/PaddleCustomDevice/PR/${PR_ID}/${COMMIT_ID}/PaddleCustomDevice.tar.gz --no-check-certificate + echo "Extracting PaddleCustomDevice.tar.gz" + tar -xf PaddleCustomDevice.tar.gz --strip-components=1 + git config --global --add safe.directory "*" + git remote add upstream https://github.com/PaddlePaddle/PaddleCustomDevice.git + git merge ${BRANCH} --no-edit + git --no-pager log --pretty=oneline -5' + + - name: RUN 910B-ARM + run: | + docker exec -t ${{ env.container_name }} /bin/bash -c ' + # !!!!! SKIP IF NO NPU CHANGE !!!! + echo "=========== Checking PR Changes If NPU FULL CI Needed ===========" + change_numbers=$(git diff --name-only remotes/origin/${BRANCH} | wc -l) + change_backend=$(git diff --name-only remotes/origin/${BRANCH} | grep "backends/"| wc -l) + change_npu_only=$(git diff --name-only remotes/origin/${BRANCH} | grep "backends/npu"| wc -l) + git diff --name-only remotes/origin/${BRANCH} + + if [ $change_numbers -ne $change_backend ]; then + echo "Common file changed, continue to run NPU FULL CI test ..." + elif [ $change_npu_only -eq 0 ] ; then + echo "NO NPU backend changes found, skip NPU FULL CI ...." + exit 0 + fi + + echo "============ CANN Version =============" + source ~/.bashrc + echo "============ Install PaddlePaddle CPU =============" + PATH=/usr/local/bin:${PATH} + ln -sf $(which python3.9) /usr/local/bin/python + ln -sf $(which pip3.9) /usr/local/bin/pip + + pip install -U numpy==1.26.4 safetensors + python -m pip install --pre paddlepaddle -i https://www.paddlepaddle.org.cn/packages/nightly/cpu/ + python -c "import paddle; print(paddle.__version__)" + python -c "import paddle; print(paddle.version.commit)" + # Install python packages required for incremental coverage + python -m pip install PyGithub + export LD_PRELOAD=/lib/aarch64-linux-gnu/libgomp.so.1:$LD_PRELOAD + + bash backends/npu/tools/pr_ci_npu.sh' + + - name: Terminate and delete the container + if: always() + run: | + docker exec -t ${{ env.container_name }} /bin/bash -c ' + rm -rf * .[^.]* + ' + docker stop ${container_name} + docker rm ${container_name} diff --git a/.github/workflows/_910B-X86.yml b/.github/workflows/_910B-X86.yml new file mode 100644 index 00000000000..899248a35c5 --- /dev/null +++ b/.github/workflows/_910B-X86.yml @@ -0,0 +1,143 @@ +name: PR-CI-910B-X86 + +on: + workflow_call: + inputs: + workflow-name: + type: string + required: false + clone_dir: + type: string + required: false + default: 'PaddlecustomDevice' + is_pr: + type: string + required: false + default: 'true' + +jobs: + check-bypass: + name: Check bypass + uses: ./.github/workflows/check-bypass.yml + with: + workflow-name: '910b-x86' + secrets: + github-token: ${{ secrets.GITHUB_TOKEN }} + + PR-CI-910B-X86: + name: PR-CI-910B-X86 + needs: check-bypass + if: ${{ needs.check-bypass.outputs.can-skip != 'true' }} + runs-on: + group: NPU + env: + PR_ID: ${{ github.event.pull_request.number }} + COMMIT_ID: ${{ github.event.pull_request.head.sha }} + BRANCH: develop + TASK: paddle-CI-${{ github.event.pull_request.number }}-npu + no_proxy: "bcebos.com,apiin.im.baidu.com,gitee.com,aliyun.com,.baidu.com,.tuna.tsinghua.edu.cn" + + steps: + - name: Cleanup + run: | + rm -rf * .[^.]* + + - name: Check docker image and run container + env: + GIT_PR_ID: ${{ github.event.pull_request.number || '0' }} + GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} + RUN_ID: ${{ github.run_id }} + cache_dir: /root/.cache + ccache_dir: /root/.ccache + docker_image: ccr-2vdh3abv-pub.cnc.bj.baidubce.com/device/paddle-npu:cann80RC2-ubuntu20-npu-base-x86_64-gcc84 + run: | + if [[ "${{ runner.name }}" == "npu-2" ]];then + echo "IXUCA-2" + export ASCEND_RT_VISIBLE_DEVICES=4,5,6,7 + elif [[ "${{ runner.name }}" == "npu-3" ]];then + echo "IXUCA-3" + export ASCEND_RT_VISIBLE_DEVICES=8,9,10,11 + elif [[ "${{ runner.name }}" == "npu-4" ]];then + echo "IXUCA-4" + export ASCEND_RT_VISIBLE_DEVICES=12,13,14,15 + else + echo echo "npu-1" + export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3 + fi + echo ${ASCEND_RT_VISIBLE_DEVICES} + + container_name=${TASK}-$(date +%Y%m%d-%H%M%S) + echo "container_name=${container_name}" >> ${{ github.env }} + docker run --shm-size=128G \ + -d -t --name ${container_name} \ + --privileged --network=host \ + -e PR_ID \ + -e COMMIT_ID \ + -e BRANCH \ + -e no_proxy \ + -e USE_910B=1 \ + -e FLAGS_npu_storage_format=0 \ + -e ASCEND_RT_VISIBLE_DEVICES=${ASCEND_RT_VISIBLE_DEVICES} \ + -v ${cache_dir}:/root/.cache \ + -v ${ccache_dir}:/root/.ccache \ + -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ + -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ + -v /usr/local/dcmi:/usr/local/dcmi \ + -v ${{ github.workspace }}/../../..:${{ github.workspace }}/../../.. \ + -v ${{ github.workspace }}:/PaddleCustomDevice -w /PaddleCustomDevice \ + ${docker_image} /bin/bash + + - name: Download Code + run: | + docker exec -t ${{ env.container_name }} /bin/bash -c ' + source ${{ github.workspace }}/../../../proxy + set -x + wget -q --tries=5 --no-proxy https://paddle-github-action.bj.bcebos.com/PaddleCustomDevice/PR/${PR_ID}/${COMMIT_ID}/PaddleCustomDevice.tar.gz --no-check-certificate + echo "Extracting PaddleCustomDevice.tar.gz" + tar -xf PaddleCustomDevice.tar.gz --strip-components=1 + git config --global --add safe.directory "*" + git remote add upstream https://github.com/PaddlePaddle/PaddleCustomDevice.git + git merge ${BRANCH} --no-edit + git --no-pager log --pretty=oneline -5' + + - name: RUN 910B-X86 + run: | + docker exec -t ${{ env.container_name }} /bin/bash -c ' + # !!!!! SKIP IF NO NPU CHANGE !!!! + echo "=========== Checking PR Changes If NPU FULL CI Needed ===========" + change_numbers=$(git diff --name-only remotes/origin/${BRANCH} | wc -l) + change_backend=$(git diff --name-only remotes/origin/${BRANCH} | grep "backends/"| wc -l) + change_npu_only=$(git diff --name-only remotes/origin/${BRANCH} | grep "backends/npu"| wc -l) + git diff --name-only remotes/origin/${BRANCH} + + if [ $change_numbers -ne $change_backend ]; then + echo "Common file changed, continue to run NPU FULL CI test ..." + elif [ $change_npu_only -eq 0 ] ; then + echo "NO NPU backend changes found, skip NPU FULL CI ...." + exit 0 + fi + + echo "============ CANN Version =============" + source ~/.bashrc + echo "============ Install PaddlePaddle CPU =============" + PATH=/usr/local/bin:${PATH} + ln -sf $(which python3.10) /usr/local/bin/python + ln -sf $(which pip3.10) /usr/local/bin/pip + + pip install -U numpy==1.26.4 safetensors + python -m pip install --pre paddlepaddle -i https://www.paddlepaddle.org.cn/packages/nightly/cpu/ + python -c "import paddle; print(paddle.__version__)" + python -c "import paddle; print(paddle.version.commit)" + # Install python packages required for incremental coverage + python -m pip install PyGithub + + bash backends/npu/tools/pr_ci_npu.sh' + + - name: Terminate and delete the container + if: always() + run: | + docker exec -t ${{ env.container_name }} /bin/bash -c ' + rm -rf * .[^.]* + ' + docker stop ${container_name} + docker rm ${container_name} diff --git a/.github/workflows/_Clone-linux.yml b/.github/workflows/_Clone-linux.yml new file mode 100644 index 00000000000..ace1d9a49c6 --- /dev/null +++ b/.github/workflows/_Clone-linux.yml @@ -0,0 +1,97 @@ +name: Clone-linux + +on: + workflow_call: + inputs: + workflow-name: + type: string + required: false + clone_dir: + type: string + required: false + default: 'PaddlecustomDevice' + is_pr: + type: string + required: false + default: 'true' + outputs: + can-skip: + value: ${{ jobs.clone.outputs.can-skip }} + slice-check: + value: ${{ jobs.clone.outputs.slice-check }} + +permissions: read-all + +defaults: + run: + shell: bash + +env: + PR_ID: ${{ github.event.pull_request.number || '0' }} + COMMIT_ID: ${{ github.event.pull_request.head.sha || github.sha }} + ci_scripts: ${{ github.workspace }}/ci + BRANCH: ${{ github.event.pull_request.base.ref || github.ref_name }} + +jobs: + clone: + name: Clone PaddlecustomDevice + if: ${{ github.repository_owner == 'PaddlePaddle' }} + outputs: + can-skip: ${{ steps.check-bypass.outputs.can-skip }} + slice-check: ${{ steps.check-execution.outputs.slice-check }} + runs-on: + group: HK-Clone + + steps: + - name: Clone PaddleCustomDevice + uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.base.ref }} + submodules: 'recursive' + fetch-depth: 1000 + + - name: Merge PR to test branch + id: check-execution + if: ${{ inputs.is_pr == 'true' }} + run: | + set -x + git config user.name "PaddleCI" + git config user.email "paddle_ci@example.com" + git fetch origin pull/${{ github.event.pull_request.number }}/head + git checkout -b test FETCH_HEAD + git merge --no-edit ${BRANCH} + git submodule sync + git submodule update --init --recursive --force + + - name: Download bos client + env: + home_path: "/home/paddle/actions-runner/" + bos_file: "/home/paddle/actions-runner/bos/BosClient.py" + run: | + if [ ! -f "${bos_file}" ]; then + wget -q --no-proxy -O ${home_path}/bos_new.tar.gz https://xly-devops.bj.bcebos.com/home/bos_new.tar.gz --no-check-certificate + mkdir ${home_path}/bos + tar xf ${home_path}/bos_new.tar.gz -C ${home_path}/bos + fi + + - name: Push paddle-action.tar.gz to bos + env: + AK: paddle + SK: paddle + bos_file: "/home/paddle/actions-runner/bos/BosClient.py" + run: | + set -x + cd .. + pwd + ls + tar -I 'zstd -T0' -cf PaddleCustomDevice.tar.gz PaddleCustomDevice + echo "::group::Install bce-python-sdk" + python -m pip install bce-python-sdk==0.8.74 + echo "::endgroup::" + python ${bos_file} PaddleCustomDevice.tar.gz paddle-github-action/PaddleCustomDevice/PR/${PR_ID}/${COMMIT_ID} + rm PaddleCustomDevice.tar.gz + cd - + git switch ${BRANCH} + set +e + git branch -D test + git gc diff --git a/.github/workflows/_Codestyle-Check.yml b/.github/workflows/_Codestyle-Check.yml new file mode 100644 index 00000000000..ba38f0febdd --- /dev/null +++ b/.github/workflows/_Codestyle-Check.yml @@ -0,0 +1,98 @@ +name: Codestyle-Check + +on: + workflow_call: + inputs: + workflow-name: + type: string + required: false + clone_dir: + type: string + required: false + default: 'PaddlecustomDevice' + is_pr: + type: string + required: false + default: 'true' + +jobs: + pre-commit: + name: Pre Commit + if: ${{ github.repository_owner == 'PaddlePaddle' }} + runs-on: + group: APPROVAL + env: + PR_ID: ${{ github.event.pull_request.number }} + COMMIT_ID: ${{ github.event.pull_request.head.sha }} + BRANCH: develop + TASK: paddle-CI-${{ github.event.pull_request.number }}-cpu + + steps: + - name: Cleanup + run: | + rm -rf * .[^.]* + + - name: Check docker image and run container + env: + python: "python3.10" + GIT_PR_ID: ${{ github.event.pull_request.number || '0' }} + GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} + RUN_ID: ${{ github.run_id }} + docker_image: ccr-2vdh3abv-pub.cnc.bj.baidubce.com/ci/paddle:19d3669ca5ff0b19144a785bb3126d7e + run: | + container_name=${TASK}-${core_index}-$(date +%Y%m%d-%H%M%S) + echo "container_name=${container_name}" >> ${{ github.env }} + docker container ls -a --filter "name=paddle-CI-*-api-benchmark-${core_index}*" --format "{{.ID}}" | xargs -r docker rm -f + docker container ls -a --filter "name=api_benchmark_ci_baseline_" --format "{{.ID}} {{.CreatedAt}}" | awk '$2 <= "'$(date -d '1 day ago' +'%Y-%m-%d')'" {print $1}' | xargs -r docker rm -f + docker run -d -t --name ${container_name} --shm-size=128g \ + -v ${{ github.workspace }}/../../..:${{ github.workspace }}/../../.. \ + -v ${{ github.workspace }}:/paddle \ + -e python \ + -e core_index \ + -e BRANCH \ + -e PR_ID \ + -e COMMIT_ID \ + -e RUN_ID \ + -e wheel_link \ + -e work_dir \ + -e PADDLE_ROOT \ + -e ci_scripts \ + -e GIT_PR_ID \ + -e PADDLE_VERSION \ + -e no_proxy \ + -e CI_name \ + -e GITHUB_API_TOKEN \ + -w /paddle --network host ${docker_image} /bin/bash + + - name: Download Code + run: | + docker exec -t ${{ env.container_name }} /bin/bash -c ' + wget -q --tries=5 --no-proxy https://paddle-github-action.bj.bcebos.com/PaddleCustomDevice/PR/${PR_ID}/${COMMIT_ID}/PaddleCustomDevice.tar.gz --no-check-certificate + echo "Extracting PaddleCustomDevice.tar.gz" + tar -xf PaddleCustomDevice.tar.gz --strip-components=1 + git remote add upstream https://github.com/PaddlePaddle/PaddleCustomDevice.git + git merge ${BRANCH} --no-edit + pip install cpplint==1.6.0 + pre-commit install' + + - name: Check bypass + id: check-bypass + uses: ./.github/actions/check-bypass + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + workflow-name: codestyle + + - name: RUN Codestyle Check + if: steps.check-bypass.outputs.can-skip != 'true' + run: | + docker exec -t ${{ env.container_name }} /bin/bash -c ' + bash tools/codestyle/pre_commit.sh' + + - name: Terminate and delete the container + if: always() + run: | + docker exec -t ${{ env.container_name }} /bin/bash -c ' + rm -rf * .[^.]* + ' + docker stop ${container_name} + docker rm ${container_name} diff --git a/.github/workflows/_GCU.yml b/.github/workflows/_GCU.yml new file mode 100644 index 00000000000..ffbb7f36182 --- /dev/null +++ b/.github/workflows/_GCU.yml @@ -0,0 +1,103 @@ +name: PR-CI-GCU + +on: + workflow_call: + inputs: + workflow-name: + type: string + required: false + clone_dir: + type: string + required: false + default: 'PaddlecustomDevice' + is_pr: + type: string + required: false + default: 'true' + +jobs: + PR-CI-GCU: + name: PR-CI-GCU + if: ${{ github.repository_owner == 'PaddlePaddle' }} + runs-on: + group: GCU + env: + PR_ID: ${{ github.event.pull_request.number }} + COMMIT_ID: ${{ github.event.pull_request.head.sha }} + BRANCH: develop + TASK: paddle-CI-${{ github.event.pull_request.number }}-gcu + no_proxy: "bcebos.com,apiin.im.baidu.com,gitee.com,aliyun.com,.baidu.com,.tuna.tsinghua.edu.cn" + + steps: + - name: Check docker image and run container + env: + GIT_PR_ID: ${{ github.event.pull_request.number || '0' }} + GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} + RUN_ID: ${{ github.run_id }} + cache_dir: /root/.cache + ccache_dir: /root/.ccache + docker_image: ccr-2vdh3abv-pub.cnc.bj.baidubce.com/device/paddle-gcu:topsrider3.5.102-ubuntu20-x86_64-gcc84-ci + run: | + container_name=${TASK}-$(date +%Y%m%d-%H%M%S) + echo "container_name=${container_name}" >> ${{ github.env }} + docker run --shm-size=128G \ + -d -t --name ${container_name} \ + --privileged --network=host \ + -e PR_ID \ + -e COMMIT_ID \ + -e BRANCH \ + -e no_proxy \ + -v ${cache_dir}:/root/.cache \ + -v ${ccache_dir}:/root/.ccache \ + -v ${{ github.workspace }}/../../..:${{ github.workspace }}/../../.. \ + -v ${{ github.workspace }}:/PaddleCustomDevice -w /PaddleCustomDevice \ + ${docker_image} /bin/bash + + - name: Download Code + run: | + docker exec -t ${{ env.container_name }} /bin/bash -c ' + source ${{ github.workspace }}/../../../proxy + rm -rf * .[^.]* + set -x + wget -q --tries=5 --no-proxy https://paddle-github-action.bj.bcebos.com/PaddleCustomDevice/PR/${PR_ID}/${COMMIT_ID}/PaddleCustomDevice.tar.gz --no-check-certificate + echo "Extracting PaddleCustomDevice.tar.gz" + tar -xf PaddleCustomDevice.tar.gz --strip-components=1 + git config --global --add safe.directory "*" + git remote add upstream https://github.com/PaddlePaddle/PaddleCustomDevice.git + git merge ${BRANCH} --no-edit + git --no-pager log --pretty=oneline -5' + + - name: Check bypass + id: check-bypass + uses: ./.github/actions/check-bypass + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + workflow-name: gcu + + - name: RUN GCU + if: steps.check-bypass.outputs.can-skip != 'true' + run: | + docker exec -t ${{ env.container_name }} /bin/bash -c ' + # !!!!! SKIP IF NO GCU CHANGE !!!! + echo "=========== Checking PR Changes If GCU FULL CI Needed ===========" + change_numbers=$(git diff --name-only remotes/origin/${BRANCH} | wc -l) + change_backend=$(git diff --name-only remotes/origin/${BRANCH} | grep "backends/"| wc -l) + change_gcu_only=$(git diff --name-only remotes/origin/${BRANCH} | grep "backends/gcu"| wc -l) + git diff --name-only remotes/origin/${BRANCH} + + if [ $change_numbers -ne $change_backend ]; then + echo "Common file changed, continue to run GCU FULL CI test ..." + elif [ $change_gcu_only -eq 0 ] ; then + echo "NO GCU backend changes found, skip GCU FULL CI ...." + exit 0 + fi + bash backends/gcu/ci_test.sh' + + - name: Terminate and delete the container + if: always() + run: | + docker exec -t ${{ env.container_name }} /bin/bash -c ' + rm -rf * .[^.]* + ' + docker stop ${container_name} + docker rm ${container_name} diff --git a/.github/workflows/_HPU.yml b/.github/workflows/_HPU.yml new file mode 100644 index 00000000000..e7e3277d3e0 --- /dev/null +++ b/.github/workflows/_HPU.yml @@ -0,0 +1,108 @@ +name: PR-CI-HPU + +on: + workflow_call: + inputs: + workflow-name: + type: string + required: false + clone_dir: + type: string + required: false + default: 'PaddlecustomDevice' + is_pr: + type: string + required: false + default: 'true' + +jobs: + check-bypass: + name: Check bypass + if: ${{ inputs.can-skip != 'true' }} + uses: ./.github/workflows/check-bypass.yml + with: + workflow-name: 'hpu' + secrets: + github-token: ${{ secrets.GITHUB_TOKEN }} + + PR-CI-HPU: + name: PR-CI-HPU + needs: check-bypass + if: ${{ needs.check-bypass.outputs.can-skip != 'true' }} + runs-on: + group: HPU + env: + PR_ID: ${{ github.event.pull_request.number }} + COMMIT_ID: ${{ github.event.pull_request.head.sha }} + BRANCH: develop + TASK: paddle-CI-${{ github.event.pull_request.number }}-hpu + no_proxy: "bcebos.com,apiin.im.baidu.com,gitee.com,aliyun.com,.baidu.com,.tuna.tsinghua.edu.cn" + + steps: + - name: Check docker image and run container + env: + GIT_PR_ID: ${{ github.event.pull_request.number || '0' }} + GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} + RUN_ID: ${{ github.run_id }} + cache_dir: /root/.cache + ccache_dir: /root/.ccache + docker_image: ccr-2vdh3abv-pub.cnc.bj.baidubce.com/device/paddle-hpu:ci + run: | + container_name=${TASK}-$(date +%Y%m%d-%H%M%S) + echo "container_name=${container_name}" >> ${{ github.env }} + docker run --shm-size=128G \ + -d -t --name ${container_name} \ + --privileged --network=host \ + -e PR_ID \ + -e COMMIT_ID \ + -e BRANCH \ + -e no_proxy \ + -v ${cache_dir}:/root/.cache \ + -v ${ccache_dir}:/root/.ccache \ + -v ${{ github.workspace }}/../../..:${{ github.workspace }}/../../.. \ + -v ${{ github.workspace }}:/workspace -w /workspace \ + ${docker_image} /bin/bash + + - name: Download Code + run: | + docker exec -t ${{ env.container_name }} /bin/bash -c ' + rm -rf * .[^.]* + source ${{ github.workspace }}/../../../proxy + set -x + wget -q --tries=5 --no-proxy https://paddle-github-action.bj.bcebos.com/PaddleCustomDevice/PR/${PR_ID}/${COMMIT_ID}/PaddleCustomDevice.tar.gz --no-check-certificate + echo "Extracting PaddleCustomDevice.tar.gz" + tar -xf PaddleCustomDevice.tar.gz + cd PaddleCustomDevice + git config --global --add safe.directory "*" + git remote add upstream https://github.com/PaddlePaddle/PaddleCustomDevice.git + git merge ${BRANCH} --no-edit + git --no-pager log --pretty=oneline -5' + + - name: RUN HPU + run: | + docker exec -t ${{ env.container_name }} /bin/bash -c ' + # !!!!! SKIP IF NO HPU CHANGE !!!! + echo "=========== Checking PR Changes If HPU FULL CI Needed ===========" + change_numbers=$(git diff --name-only remotes/origin/${BRANCH} | wc -l) + change_backend=$(git diff --name-only remotes/origin/${BRANCH} | grep "backends/"| wc -l) + change_hpu_only=$(git diff --name-only remotes/origin/${BRANCH} | grep "backends/intel_hpu"| wc -l) + git diff --name-only remotes/origin/${BRANCH} + if [ $change_numbers -ne $change_backend ]; then + echo "Common file changed, continue to run HPU FULL CI test ..." + elif [ $change_hpu_only -eq 0 ] ; then + echo "NO HPU backend changes found, skip HPU FULL CI ...." + exit 0 + fi + mkdir -p /workspace/PaddleCustomDevice/backends/intel_hpu/build/ + export GC_KERNEL_PATH=/workspace/PaddleCustomDevice/backends/intel_hpu/build/libcustom_tpc_perf_lib.so:/usr/lib/habanalabs/libtpc_kernels.so + cd /workspace + bash /workspace/PaddleCustomDevice/backends/intel_hpu/tools/pr_hpu_ci.sh' + + - name: Terminate and delete the container + if: always() + run: | + docker exec -t ${{ env.container_name }} /bin/bash -c ' + rm -rf * .[^.]* + ' + docker stop ${container_name} + docker rm ${container_name} diff --git a/.github/workflows/_IXUCA.yml b/.github/workflows/_IXUCA.yml new file mode 100644 index 00000000000..045437e9fed --- /dev/null +++ b/.github/workflows/_IXUCA.yml @@ -0,0 +1,124 @@ +name: PR-CI-IXUCA + +on: + workflow_call: + inputs: + workflow-name: + type: string + required: false + clone_dir: + type: string + required: false + default: 'PaddlecustomDevice' + is_pr: + type: string + required: false + default: 'true' + +jobs: + PR-CI-HPU: + name: PR-CI-IXUCA + if: ${{ github.repository_owner == 'PaddlePaddle' }} + runs-on: + group: test2 + env: + PR_ID: ${{ github.event.pull_request.number }} + COMMIT_ID: ${{ github.event.pull_request.head.sha }} + BRANCH: develop + TASK: paddle-CI-${{ github.event.pull_request.number }}-ixuca + no_proxy: "bcebos.com,apiin.im.baidu.com,gitee.com,aliyun.com,.baidu.com,.tuna.tsinghua.edu.cn" + + steps: + - name: Cleanup + run: | + rm -rf * .[^.]* + + - name: Check docker image and run container + env: + GIT_PR_ID: ${{ github.event.pull_request.number || '0' }} + GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} + RUN_ID: ${{ github.run_id }} + cache_dir: /root/.cache + ccache_dir: /root/.ccache + docker_image: ccr-2vdh3abv-pub.cnc.bj.baidubce.com/device/paddle-ixuca:latest + run: | + container_name=${TASK}-$(date +%Y%m%d-%H%M%S) + echo "container_name=${container_name}" >> ${{ github.env }} + docker run --shm-size=128G \ + -d -t --name ${container_name} \ + --privileged --network=host \ + -e PR_ID \ + -e COMMIT_ID \ + -e BRANCH \ + -e no_proxy \ + -e LD_LIBRARY_PATH=/usr/local/corex-4.3.0/lib \ + -e LIBRARY_PATH=/usr/local/corex-4.3.0/lib \ + -v ${cache_dir}:/root/.cache \ + -v ${ccache_dir}:/root/.ccache \ + -v ${{ github.workspace }}/../../..:${{ github.workspace }}/../../.. \ + -v ${{ github.workspace }}:/workspace -w /workspace \ + ${docker_image} /bin/bash + + - name: Download Code + run: | + docker exec -t ${{ env.container_name }} /bin/bash -c ' + source ${{ github.workspace }}/../../../proxy + set -x + wget -q --tries=5 --no-proxy https://paddle-github-action.bj.bcebos.com/PaddleCustomDevice/PR/${PR_ID}/${COMMIT_ID}/PaddleCustomDevice.tar.gz --no-check-certificate + echo "Extracting PaddleCustomDevice.tar.gz" + tar -xf PaddleCustomDevice.tar.gz + cd PaddleCustomDevice + git config --global --add safe.directory "*" + git remote add upstream https://github.com/PaddlePaddle/PaddleCustomDevice.git + git merge ${BRANCH} --no-edit + git --no-pager log --pretty=oneline -5' + + - name: Check bypass + id: check-bypass + uses: ./PaddleCustomDevice/.github/actions/check-bypass + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + workflow-name: ixuca + + - name: RUN IXUCA + if: steps.check-bypass.outputs.can-skip != 'true' + run: | + docker exec -t ${{ env.container_name }} /bin/bash -c ' + cd /workspace/PaddleCustomDevice + # !!!!! SKIP IF NO IXUCA CHANGE !!!! + echo "=========== Checking PR Changes If IXUCA FULL CI Needed ===========" + change_numbers=$(git diff --name-only remotes/origin/${BRANCH} | wc -l) + change_backend=$(git diff --name-only remotes/origin/${BRANCH} | grep "backends/"| wc -l) + change_ixuca_only=$(git diff --name-only remotes/origin/${BRANCH} | grep "backends/iluvatar_gpu"| wc -l) + git diff --name-only remotes/origin/${BRANCH} + + if [ $change_numbers -ne $change_backend ]; then + echo "Common file changed, continue to run IXUCA FULL CI test ..." + elif [ $change_ixuca_only -eq 0 ] ; then + echo "NO IXUCA backend changes found, skip IXUCA FULL CI ...." + exit 0 + fi + + export PATH=/usr/local/corex-4.3.0/bin:$PATH + mkdir -p /workspace/PaddleCustomDevice/Paddle/third_party/mklml/Linux + curl -o /workspace/PaddleCustomDevice/Paddle/third_party/mklml/Linux/csrmm_mklml_lnx_2019.0.5.tgz http://paddlepaddledeps.bj.bcebos.com/csrmm_mklml_lnx_2019.0.5.tgz + tar xf /workspace/PaddleCustomDevice/Paddle/third_party/mklml/Linux/csrmm_mklml_lnx_2019.0.5.tgz + python3 -m pip install --pre paddlepaddle -i https://www.paddlepaddle.org.cn/packages/nightly/cpu/ + python3 -m pip install parameterized + # build + cd backends/iluvatar_gpu + bash build_paddle.sh + # Install + bash install_paddle.sh + # Run tests + cd tests + bash run_test.sh' + + - name: Terminate and delete the container + if: always() + run: | + docker exec -t ${{ env.container_name }} /bin/bash -c ' + rm -rf * .[^.]* + ' + docker stop ${container_name} + docker rm ${container_name} diff --git a/.github/workflows/_MLU.yml b/.github/workflows/_MLU.yml new file mode 100644 index 00000000000..28efd999543 --- /dev/null +++ b/.github/workflows/_MLU.yml @@ -0,0 +1,120 @@ +name: PR-CI-MLU + +on: + workflow_call: + inputs: + workflow-name: + type: string + required: false + clone_dir: + type: string + required: false + default: 'PaddlecustomDevice' + is_pr: + type: string + required: false + default: 'true' + +jobs: + check-bypass: + name: Check bypass + if: ${{ inputs.can-skip != 'true' }} + uses: ./.github/workflows/check-bypass.yml + with: + workflow-name: 'mlu' + secrets: + github-token: ${{ secrets.GITHUB_TOKEN }} + + PR-CI-MLU: + name: PR-CI-MLU + needs: check-bypass + if: ${{ needs.check-bypass.outputs.can-skip != 'true' }} + runs-on: + group: MLU + env: + PR_ID: ${{ github.event.pull_request.number }} + COMMIT_ID: ${{ github.event.pull_request.head.sha }} + BRANCH: develop + TASK: paddle-CI-${{ github.event.pull_request.number }}-mlu + no_proxy: "bcebos.com,apiin.im.baidu.com,gitee.com,aliyun.com,.baidu.com,.tuna.tsinghua.edu.cn" + + steps: + - name: Check docker image and run container + env: + GIT_PR_ID: ${{ github.event.pull_request.number || '0' }} + GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} + RUN_ID: ${{ github.run_id }} + cache_dir: /root/.cache + ccache_dir: /root/.ccache + docker_image: registry.baidubce.com/device/paddle-mlu:ctr2.15.0-ubuntu20-gcc84-py310 + run: | + container_name=${TASK}-$(date +%Y%m%d-%H%M%S) + echo "container_name=${container_name}" >> ${{ github.env }} + docker run --shm-size=128G \ + -d -t --name ${container_name} \ + --privileged --network=host \ + -e PR_ID \ + -e COMMIT_ID \ + -e BRANCH \ + -e no_proxy \ + -e PADDLE_PDX_DISABLE_DEV_MODEL_WL=True \ + -v ${cache_dir}:/root/.cache \ + -v ${ccache_dir}:/root/.ccache \ + -v ${{ github.workspace }}/../../..:${{ github.workspace }}/../../.. \ + -v ${{ github.workspace }}:/PaddleCustomDevice -w /PaddleCustomDevice \ + ${docker_image} /bin/bash + + - name: Download Code + run: | + docker exec -t ${{ env.container_name }} /bin/bash -c ' + source ${{ github.workspace }}/../../../proxy + rm -rf * .[^.]* + wget -q --tries=5 --no-proxy https://paddle-github-action.bj.bcebos.com/PaddleCustomDevice/PR/${PR_ID}/${COMMIT_ID}/PaddleCustomDevice.tar.gz --no-check-certificate + echo "Extracting PaddleCustomDevice.tar.gz" + tar -xf PaddleCustomDevice.tar.gz --strip-components=1 + git config --global --add safe.directory "*" + git remote add upstream https://github.com/PaddlePaddle/PaddleCustomDevice.git + git merge ${BRANCH} --no-edit + git --no-pager log --pretty=oneline -5' + + - name: RUN MLU + if: steps.check-bypass.outputs.can-skip != 'true' + run: | + docker exec -t ${{ env.container_name }} /bin/bash -c ' + # !!!!! SKIP IF NO MLU CHANGE !!!! + echo "=========== Checking PR Changes If MLU FULL CI Needed ===========" + change_numbers=$(git diff --name-only remotes/origin/${BRANCH} | wc -l) + change_backend=$(git diff --name-only remotes/origin/${BRANCH} | grep "backends/"| wc -l) + change_mlu_only=$(git diff --name-only remotes/origin/${BRANCH} | grep "backends/mlu"| wc -l) + git diff --name-only remotes/origin/${BRANCH} + + if [ $change_numbers -ne $change_backend ]; then + echo "Common file changed, continue to run MLU FULL CI test ..." + elif [ $change_mlu_only -eq 0 ] ; then + echo "NO MLU backend changes found, skip MLU FULL CI ...." + exit 0 + fi + + echo "============ NeuWare Version Check =============" + dpkg -l | grep cntoolkit + dpkg -l | grep cnnl + dpkg -l | grep cncl + dpkg -l | grep mluops + + echo "============ Install PaddlePaddle CPU =============" + pip install safetensors==0.6.2 + python -m pip install --pre paddlepaddle -i https://www.paddlepaddle.org.cn/packages/nightly/cpu/ + + python -c "import paddle; print(paddle.__version__)" + python -c "import paddle; print(paddle.version.commit)" + + bash backends/mlu/tools/pr_ci_mlu.sh' + + - name: Terminate and delete the container + if: always() + run: | + docker exec -t ${{ env.container_name }} /bin/bash -c ' + rm -rf * .[^.]* + ' + docker stop ${container_name} + docker rm ${container_name} diff --git a/.github/workflows/_SDAA.yml b/.github/workflows/_SDAA.yml new file mode 100644 index 00000000000..82dc544fd25 --- /dev/null +++ b/.github/workflows/_SDAA.yml @@ -0,0 +1,73 @@ +name: PR-CI-SDAA + +on: + workflow_call: + inputs: + workflow-name: + type: string + required: false + clone_dir: + type: string + required: false + default: 'PaddlecustomDevice' + is_pr: + type: string + required: false + default: 'true' + +jobs: + PR-CI-SDAA: + name: PR-CI-SDAA + if: ${{ github.repository_owner == 'PaddlePaddle' }} + runs-on: + group: SDAA + env: + PR_ID: ${{ github.event.pull_request.number }} + COMMIT_ID: ${{ github.event.pull_request.head.sha }} + BRANCH: develop + TASK: paddle-CI-${{ github.event.pull_request.number }}-sdaa + no_proxy: "bcebos.com,apiin.im.baidu.com,gitee.com,aliyun.com,.baidu.com,.tuna.tsinghua.edu.cn" + + steps: + - name: Download Code + env: + GIT_PR_ID: ${{ github.event.pull_request.number || '0' }} + GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} + RUN_ID: ${{ github.run_id }} + cache_dir: /root/.cache + ccache_dir: /root/.ccache + run: | + rm -rf * .[^.]* + set -x + wget -q --tries=5 --no-proxy https://paddle-github-action.bj.bcebos.com/PaddleCustomDevice/PR/${PR_ID}/${COMMIT_ID}/PaddleCustomDevice.tar.gz --no-check-certificate + echo "Extracting PaddleCustomDevice.tar.gz" + tar -xf PaddleCustomDevice.tar.gz --strip-components=1 + git config --global --add safe.directory "*" + git remote add upstream https://github.com/PaddlePaddle/PaddleCustomDevice.git + git merge ${BRANCH} --no-edit + git --no-pager log --pretty=oneline -5 + + - name: Check bypass + id: check-bypass + uses: ./.github/actions/check-bypass + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + workflow-name: sdaa + + - name: RUN SDAA + if: steps.check-bypass.outputs.can-skip != 'true' + run: | + # !!!!! SKIP IF NO SDAA CHANGE !!!! + echo "=========== Checking PR Changes If SDAA FULL CI Needed ===========" + change_numbers=$(git diff --name-only remotes/origin/${BRANCH} | wc -l) + change_backend=$(git diff --name-only remotes/origin/${BRANCH} | grep "backends/"| wc -l) + change_sdaa_only=$(git diff --name-only remotes/origin/${BRANCH} | grep "backends/sdaa"| wc -l) + git diff --name-only remotes/origin/${BRANCH} + + if [ $change_numbers -ne $change_backend ]; then + echo "Common file changed, continue to run SDAA FULL CI test ..." + elif [ $change_sdaa_only -eq 0 ] ; then + echo "NO SDAA backend changes found, skip SDAA FULL CI ...." + exit 0 + fi + cd backends/sdaa/ && bash pr_ci_sdaa.sh diff --git a/.github/workflows/cancel-CI.yml b/.github/workflows/cancel-CI.yml new file mode 100644 index 00000000000..a52ae7ff73d --- /dev/null +++ b/.github/workflows/cancel-CI.yml @@ -0,0 +1,25 @@ +name: CI + +on: + pull_request: + types: [closed] + branches: [develop, release/**] + +permissions: read-all + +concurrency: + group: ${{ github.event.pull_request.number }}-${{ github.workflow }} + cancel-in-progress: true + +env: + PR_ID: ${{ github.event.pull_request.number }} + COMMIT_ID: ${{ github.event.pull_request.head.sha }} + +jobs: + cancel: + name: Cancel CI for ${{ github.event.pull_request.number }} + runs-on: ubuntu-latest + steps: + - name: Cancel CI + run: | + exit 0 diff --git a/backends/gcu/ci_test.sh b/backends/gcu/ci_test.sh index 1b61e22ccce..a8c8ed140c1 100644 --- a/backends/gcu/ci_test.sh +++ b/backends/gcu/ci_test.sh @@ -32,5 +32,4 @@ cmake .. -DWITH_TESTING=ON -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DPY_VERSION=3.10 make -j $(nproc) python -m pip install --force-reinstall -U dist/paddle_custom_gcu*.whl - ctest -j4 --output-on-failure diff --git a/backends/gcu/tools/dockerfile/Dockerfile.gcu.ubuntu20.gcc84 b/backends/gcu/tools/dockerfile/Dockerfile.gcu.ubuntu20.gcc84 index 50fc6332065..280adf07717 100644 --- a/backends/gcu/tools/dockerfile/Dockerfile.gcu.ubuntu20.gcc84 +++ b/backends/gcu/tools/dockerfile/Dockerfile.gcu.ubuntu20.gcc84 @@ -10,7 +10,7 @@ ARG TOPS_RIDER_PACKAGE_LINK # install base packages RUN apt-get update -y && apt-get install -y zlib1g zlib1g-dev libsqlite3-dev openssl libssl-dev libffi-dev libbz2-dev \ libxslt1-dev unzip pciutils net-tools libblas-dev gfortran libblas3 liblapack-dev liblapack3 libopenblas-dev \ - python3.10-dev python3.10-distutils + python3.10-dev python3.10-distutils zstd RUN pip install --upgrade pip setuptools wheel && pip install ddt colorlog diff --git a/backends/intel_hpu/tools/pr_hpu_ci.sh b/backends/intel_hpu/tools/pr_hpu_ci.sh index b0cb0f373ed..4c458583392 100644 --- a/backends/intel_hpu/tools/pr_hpu_ci.sh +++ b/backends/intel_hpu/tools/pr_hpu_ci.sh @@ -32,7 +32,6 @@ echo "custom_ops install" cd ${WORKSPACE}/PaddleCustomDevice/backends/intel_hpu/custom_ops python setup.py install - echo "Start build" cd ${WORKSPACE}/PaddleCustomDevice/backends/intel_hpu mkdir -p build && cd build diff --git a/backends/mlu/tools/dockerfile/Dockerfile.mlu.ubuntu20.gcc84.py310 b/backends/mlu/tools/dockerfile/Dockerfile.mlu.ubuntu20.gcc84.py310 index 08e3965beb4..8542b680b58 100644 --- a/backends/mlu/tools/dockerfile/Dockerfile.mlu.ubuntu20.gcc84.py310 +++ b/backends/mlu/tools/dockerfile/Dockerfile.mlu.ubuntu20.gcc84.py310 @@ -35,7 +35,8 @@ RUN wget -qO - https://www.mellanox.com/downloads/ofed/RPM-GPG-KEY-Mellanox | ap libibverbs-dev \ libibverbs1 \ librdmacm-dev \ - librdmacm1 + librdmacm1 \ + zstd # install cntoolkit RUN cd /tmp && \ diff --git a/backends/npu/tools/dockerfile/Dockerfile.npu.ubuntu20.gcc84 b/backends/npu/tools/dockerfile/Dockerfile.npu.ubuntu20.gcc84 index 733f514b2cc..3502c01b5f1 100644 --- a/backends/npu/tools/dockerfile/Dockerfile.npu.ubuntu20.gcc84 +++ b/backends/npu/tools/dockerfile/Dockerfile.npu.ubuntu20.gcc84 @@ -18,7 +18,7 @@ ARG NPU_VERSION # install CANN requirement # https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/700alpha003/softwareinstall/instg/instg_0026.html RUN apt-get update -y && apt-get install -y zlib1g zlib1g-dev libsqlite3-dev openssl libssl-dev libffi-dev libbz2-dev \ - libxslt1-dev unzip pciutils net-tools libblas-dev gfortran libblas3 liblapack-dev liblapack3 libopenblas-dev + libxslt1-dev unzip pciutils net-tools libblas-dev gfortran libblas3 liblapack-dev liblapack3 libopenblas-dev zstd RUN pip3.8 install --upgrade pip setuptools wheel && \ pip3.9 install --upgrade pip setuptools wheel && \