| name: benchmark_test |
|
|
| on: |
| workflow_dispatch: |
| inputs: |
| repo_org: |
| required: false |
| description: 'Tested repository organization name. Default is InternLM' |
| type: string |
| default: 'InternLM/lmdeploy' |
| repo_ref: |
| required: false |
| description: 'Set branch or tag or commit id. Default is "main"' |
| type: string |
| default: 'main' |
| benchmark_type: |
| required: true |
| description: 'Set benchmark type. Default is "["longtext", "throughput", "api_server", "prefixcache"]"' |
| type: string |
| default: "['apiserver', 'mllm_apiserver', 'throughput', 'longtext', 'prefixcache']" |
| backend: |
| required: true |
| description: 'Set backend filter. Default is "["turbomind", "pytorch"]"' |
| type: string |
| default: "['turbomind', 'pytorch']" |
| offline_mode: |
| required: true |
| description: 'Whether start a offline mode, if true, you should prepare code and whl package by yourself' |
| type: boolean |
| default: false |
| docker_tag: |
| required: true |
| description: 'Docker tag' |
| type: string |
| default: 'latest-cu12.8' |
| result_tag: |
| required: true |
| description: 'result_tag if is not none, benchmark results will be uploaded to feishu' |
| type: string |
| default: "default" |
|
|
| env: |
| HOST_PIP_CACHE_DIR: /nvme/github-actions/pip-cache |
| HOST_LOCALTIME: /usr/share/zoneinfo/Asia/Shanghai |
| OUTPUT_FOLDER: cuda12.8_dist_${{ github.run_id }} |
| REPORT_DIR: /nvme/qa_test_models/benchmark_report/${{ inputs.repo_ref }}_${{ github.run_id }} |
| ALLURE_REPORT_DIR: /nvme/qa_test_models/benchmark_report/allure_report/${{ inputs.repo_ref }}_${{ github.run_id }} |
| TEST_CODE_PATH: /nvme/qa_test_models/test_pkg/lmdeploy/${{ inputs.repo_ref }}_${{ github.run_id }} |
| OFFLINE_CODE_PATH: /nvme/qa_test_models/offline_pkg/lmdeploy |
| ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true |
| RUN_ID: ${{ inputs.repo_ref }}_${{ github.run_id }} |
|
|
| jobs: |
| linux-build: |
| if: ${{github.event_name == 'schedule' || (!cancelled() && !inputs.offline_mode)}} |
| strategy: |
| matrix: |
| pyver: [py312] |
| runs-on: ubuntu-latest |
| env: |
| PYTHON_VERSION: ${{ matrix.pyver }} |
| PLAT_NAME: manylinux2014_x86_64 |
| DOCKER_TAG: cuda12.8 |
| steps: |
| - name: Free disk space |
| uses: jlumbroso/free-disk-space@main |
| with: |
| |
| tool-cache: false |
| docker-images: false |
| |
| android: true |
| dotnet: true |
| haskell: true |
| large-packages: true |
| swap-storage: false |
| - name: Checkout repository |
| uses: actions/checkout@v3 |
| with: |
| repository: ${{ github.event.inputs.repo_org || 'InternLM/lmdeploy' }} |
| ref: ${{github.event.inputs.repo_ref || 'main'}} |
| - name: Build |
| run: | |
| echo ${PYTHON_VERSION} |
| echo ${PLAT_NAME} |
| echo ${DOCKER_TAG} |
| echo ${OUTPUT_FOLDER} |
| echo ${GITHUB_RUN_ID} |
| # remove -it |
| sed -i 's/docker run --rm -it/docker run --rm/g' builder/manywheel/build_wheel.sh |
| bash builder/manywheel/build_wheel.sh ${PYTHON_VERSION} ${PLAT_NAME} ${DOCKER_TAG} ${OUTPUT_FOLDER} |
| - name: Upload Artifacts |
| uses: actions/upload-artifact@v4 |
| with: |
| if-no-files-found: error |
| path: builder/manywheel/${{ env.OUTPUT_FOLDER }} |
| retention-days: 1 |
| name: my-artifact-${{ github.run_id }}-${{ matrix.pyver }} |
|
|
| download_pkgs: |
| needs: linux-build |
| if: ${{!cancelled()}} |
| runs-on: [self-hosted, linux-a100] |
| timeout-minutes: 50 |
| container: |
| image: openmmlab/lmdeploy:${{ inputs.docker_tag || 'latest-cu12.8' }} |
| options: "--gpus=all --ipc=host --user root -e PIP_CACHE_DIR=/root/.cache/pip -e NVIDIA_DISABLE_REQUIRE=1 --pull never" |
| volumes: |
| - /nvme/qa_test_models:/nvme/qa_test_models |
| - /mnt/121:/mnt/121 |
| - /mnt/104:/mnt/104 |
| - /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime:ro |
| steps: |
| - name: Clone repository |
| uses: actions/checkout@v2 |
| if: ${{github.event_name == 'schedule' || !inputs.offline_mode}} |
| with: |
| repository: ${{ github.event.inputs.repo_org || 'InternLM/lmdeploy' }} |
| ref: ${{github.event.inputs.repo_ref || 'main'}} |
| - name: Copy repository |
| if: ${{github.event_name == 'schedule' || !inputs.offline_mode}} |
| run: rm -rf ${{env.TEST_CODE_PATH}} && mkdir ${{env.TEST_CODE_PATH}} && chmod 777 ${{env.TEST_CODE_PATH}} && cp -r . ${{env.TEST_CODE_PATH}} |
| - name: Copy repository - offline |
| if: ${{inputs.offline_mode}} |
| run: rm -rf ${{env.TEST_CODE_PATH}} && mkdir ${{env.TEST_CODE_PATH}} && chmod 777 ${{env.TEST_CODE_PATH}} && cp -r ${{env.OFFLINE_CODE_PATH}}/. ${{env.TEST_CODE_PATH}} |
| - name: Download Artifacts |
| if: ${{github.event_name == 'schedule' || !inputs.offline_mode}} |
| uses: actions/download-artifact@v4 |
| with: |
| name: my-artifact-${{ github.run_id }}-py312 |
| - name: Copy Artifacts |
| if: ${{github.event_name == 'schedule' || !inputs.offline_mode}} |
| run: rm ${{env.TEST_CODE_PATH}}/lmdeploy-*.whl -f && cp lmdeploy-*.whl ${{env.TEST_CODE_PATH}} |
| - name: Copy Artifacts - offline |
| if: ${{inputs.offline_mode}} |
| run: rm ${{env.TEST_CODE_PATH}}/lmdeploy-*.whl -f && cp ${{env.OFFLINE_CODE_PATH}}/lmdeploy-*.whl ${{env.TEST_CODE_PATH}} |
| - name: Mark as start |
| run: | |
| chmod -R 777 ${{env.TEST_CODE_PATH}} |
| mkdir ${{env.REPORT_DIR}} -p |
| echo "starttime=$(date +%s)" > ${{env.REPORT_DIR}}/status.txt |
| |
| benchmark: |
| needs: download_pkgs |
| if: ${{github.event_name == 'schedule' || !cancelled()}} |
| runs-on: [self-hosted, linux-a100] |
| strategy: |
| fail-fast: false |
| matrix: |
| benchmark_type: ${{fromJSON(github.event.inputs.benchmark_type)}} |
| gpu_num: ['gpu_num_1', 'gpu_num_2', 'gpu_num_4', 'gpu_num_8'] |
| transformers: ["", "legacy"] |
| include: |
| - n: 8 |
| gpu_num: gpu_num_1 |
| - n: 4 |
| gpu_num: gpu_num_2 |
| - n: 2 |
| gpu_num: gpu_num_4 |
| - n: 1 |
| gpu_num: gpu_num_8 |
| env: |
| TEST_ENV: ${{ matrix.transformers }} |
| timeout-minutes: 480 |
| container: |
| image: openmmlab/lmdeploy:${{ inputs.docker_tag || 'latest-cu12.8' }} |
| options: "--gpus=all --ipc=host --user root -e PIP_CACHE_DIR=/root/.cache/pip -e NVIDIA_DISABLE_REQUIRE=1 --pull never" |
| volumes: |
| - /nvme/github-actions/pip-cache:/root/.cache/pip |
| - /nvme/github-actions/packages:/root/packages |
| - /nvme/qa_test_models:/nvme/qa_test_models |
| - /nvme/huggingface_hub:/nvme/huggingface_hub |
| - /mnt/121:/mnt/121 |
| - /mnt/104:/mnt/104 |
| - /mnt/bigdisk:/mnt/bigdisk |
| - /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime:ro |
| steps: |
| - name: Copy repository and Artifacts |
| run: | |
| cp -r ${{env.TEST_CODE_PATH}}/. . |
| mkdir ${{env.REPORT_DIR}} -p |
| echo "starttime=$(date +%s)" > ${{env.REPORT_DIR}}/status.txt |
| - name: Install lmdeploy - dependency |
| run: | |
| python3 -m pip install -r /nvme/qa_test_models/offline_pkg/requirements.txt |
| - name: Install lmdeploy |
| run: | |
| python3 -m pip uninstall lmdeploy -y && python3 -m pip install lmdeploy-*.whl --no-deps |
| python3 -m pip install -r requirements/test.txt |
| - name: Downgrade transformers |
| if: ${{matrix.transformers == 'legacy'}} |
| run: | |
| pip install transformers==4.57.6 |
| - name: Check env |
| run: | |
| python3 -m pip list |
| lmdeploy check_env |
| - name: Run other benchmark - all |
| if: contains(fromJson(github.event.inputs.backend), 'turbomind') && contains(fromJson(github.event.inputs.backend), 'pytorch') |
| run: | |
| pytest autotest/benchmark/test_${{matrix.benchmark_type}}_performance.py -n ${{matrix.n}} -m '${{matrix.gpu_num}} and not pr_test and not function' --alluredir=${{env.ALLURE_REPORT_DIR}} |
| - name: Run other benchmark - turbomind |
| if: contains(fromJson(github.event.inputs.backend), 'turbomind') && !contains(fromJson(github.event.inputs.backend), 'pytorch') |
| run: | |
| pytest autotest/benchmark/test_${{matrix.benchmark_type}}_performance.py -n ${{matrix.n}} -m '${{matrix.gpu_num}} and not pr_test and not function and turbomind' --alluredir=${{env.ALLURE_REPORT_DIR}} |
| - name: Run other benchmark - pytorch |
| if: contains(fromJson(github.event.inputs.backend), 'pytorch') && !contains(fromJson(github.event.inputs.backend), 'turbomind') |
| run: | |
| pytest autotest/benchmark/test_${{matrix.benchmark_type}}_performance.py -n ${{matrix.n}} -m '${{matrix.gpu_num}} and not pr_test and not function and pytorch' --alluredir=${{env.ALLURE_REPORT_DIR}} |
| - name: Generate result |
| if: always() |
| run: | |
| cd /nvme/qa_test_models/feishu_upload |
| python3 test_benchmark.py --root ${{env.REPORT_DIR}} --output ${{env.REPORT_DIR}}/${{inputs.result_tag}}.txt --hardware A100 --infer-version ${{inputs.result_tag}} |
| - name: Async result |
| if: always() && inputs.result_tag != 'default' |
| env: |
| FEISHU_APP_ID: ${{secrets.FEISHU_APP_ID}} |
| FEISHU_APP_SECRET: ${{secrets.FEISHU_APP_SECRET}} |
| FEISHU_TABLE_TOKEN: ${{secrets.FEISHU_TABLE_TOKEN}} |
| FEISHU_TABLE_ID: ${{secrets.BENCHMARK_FEISHU_TABLE_ID}} |
| run: | |
| cd /nvme/qa_test_models/feishu_upload |
| python3 main.py --skip-duplicates ${{env.REPORT_DIR}}/${{inputs.result_tag}}.txt --config config-benchmark.py |
| - name: Clear workfile |
| if: always() |
| run: | |
| echo "status=done" >> ${{env.REPORT_DIR}}/status.txt |
| export workdir=$(pwd) |
| cd .. |
| rm -rf $workdir |
| mkdir $workdir |
| chmod -R 777 $workdir |
| |