name: Nvidia CI (job definitions) # Note that each job's dependencies go into a corresponding docker file. # # For example for `run_torch_cuda_extensions_gpu` the docker image is # `huggingface/transformers-pytorch-deepspeed-latest-gpu`, which can be found at # `docker/transformers-pytorch-deepspeed-latest-gpu/Dockerfile` on: workflow_call: inputs: job: required: true type: string slack_report_channel: required: true type: string docker: required: true type: string ci_event: required: true type: string working-directory-prefix: default: '' required: false type: string report_repo_id: required: true type: string commit_sha: required: false type: string runner_type: required: false type: string subdirs: default: "" required: false type: string pytest_marker: required: false type: string pr_number: required: false type: string outputs: is_infrastructure_ok: description: "Whether the CI infrastructure (slack reporting and failure checking) succeeded" value: ${{ jobs.send_results.outputs.is_slack_reporting_job_ok == 'true' && jobs.check_new_failures.outputs.is_check_failures_ok == 'true' }} env: HF_HOME: /mnt/cache TRANSFORMERS_IS_CI: yes OMP_NUM_THREADS: 8 MKL_NUM_THREADS: 8 RUN_SLOW: yes # For gated repositories, we still need to agree to share information on the Hub repo. page in order to get access. # This token is created under the bot `hf-transformers-bot`. HF_TOKEN: ${{ secrets.HF_HUB_READ_TOKEN }} TF_FORCE_GPU_ALLOW_GROWTH: true CUDA_VISIBLE_DEVICES: 0,1 permissions: contents: read jobs: setup: name: Setup if: contains(fromJSON('["run_models_gpu", "run_trainer_and_fsdp_gpu", "run_quantization_torch_gpu"]'), inputs.job) strategy: matrix: machine_type: [aws-g5-4xlarge-cache, aws-g5-12xlarge-cache] runs-on: group: '${{ matrix.machine_type }}' container: image: huggingface/transformers-all-latest-gpu options: --gpus all --shm-size "16gb" --ipc host -v /mnt/cache/.cache/huggingface:/mnt/cache/ outputs: folder_slices: ${{ steps.set-matrix.outputs.folder_slices }} slice_ids: ${{ steps.set-matrix.outputs.slice_ids }} quantization_matrix: ${{ steps.set-matrix-quantization.outputs.quantization_matrix }} steps: - name: Update clone working-directory: /transformers env: commit_sha: ${{ inputs.commit_sha || github.sha }} run: | git fetch origin $commit_sha git fetch && git checkout $commit_sha - name: Cleanup working-directory: /transformers run: | rm -rf tests/__pycache__ rm -rf tests/models/__pycache__ rm -rf reports - name: Show installed libraries and their versions working-directory: /transformers run: pip freeze - id: set-matrix if: contains(fromJSON('["run_models_gpu", "run_trainer_and_fsdp_gpu"]'), inputs.job) name: Identify models to test working-directory: /transformers/tests env: job: ${{ inputs.job }} subdirs: ${{ inputs.subdirs }} NUM_SLICES: 2 run: | if [ "$job" = "run_models_gpu" ]; then python3 ../utils/split_model_tests.py --subdirs "$subdirs" --num_splits "$NUM_SLICES" > folder_slices.txt echo "folder_slices=$(cat folder_slices.txt)" >> $GITHUB_OUTPUT python3 -c "import ast; folder_slices = ast.literal_eval(open('folder_slices.txt').read()); open('slice_ids.txt', 'w').write(str(list(range(len(folder_slices)))))" echo "slice_ids=$(cat slice_ids.txt)" >> $GITHUB_OUTPUT elif [ "$job" = "run_trainer_and_fsdp_gpu" ]; then echo "folder_slices=[['trainer'], ['fsdp'], ['ddp']]" >> $GITHUB_OUTPUT echo "slice_ids=[0, 1, 2]" >> $GITHUB_OUTPUT fi - id: set-matrix-quantization if: ${{ inputs.job == 'run_quantization_torch_gpu' }} name: Identify quantization method to test working-directory: /transformers/tests env: subdirs: ${{ inputs.subdirs || 'None' }} run: | echo "quantization_matrix=$(python3 -c 'import ast; import os; tests = os.getcwd(); quantization_tests = os.listdir(os.path.join(tests, "quantization")); subdirs = ast.literal_eval(os.environ["subdirs"]); quantization_tests = [x.removeprefix("quantization/") for x in subdirs] if subdirs is not None else quantization_tests; d = sorted(list(filter(os.path.isdir, [f"quantization/{x}" for x in quantization_tests]))); print(d)')" >> $GITHUB_OUTPUT - name: NVIDIA-SMI run: | nvidia-smi run_models_gpu: if: ${{ inputs.job == 'run_models_gpu' }} name: " " needs: setup strategy: fail-fast: false matrix: machine_type: [aws-g5-4xlarge-cache, aws-g5-12xlarge-cache] slice_id: ${{ fromJSON(needs.setup.outputs.slice_ids) }} uses: ./.github/workflows/model_jobs.yml with: folder_slices: ${{ needs.setup.outputs.folder_slices }} machine_type: ${{ matrix.machine_type }} slice_id: ${{ matrix.slice_id }} docker: ${{ inputs.docker }} commit_sha: ${{ inputs.commit_sha || github.sha }} runner_type: ${{ inputs.runner_type }} report_repo_id: ${{ inputs.report_repo_id }} pytest_marker: ${{ inputs.pytest_marker }} secrets: inherit run_trainer_and_fsdp_gpu: if: ${{ inputs.job == 'run_trainer_and_fsdp_gpu' }} name: " " needs: setup strategy: fail-fast: false matrix: machine_type: [aws-g5-4xlarge-cache, aws-g5-12xlarge-cache] slice_id: [0, 1, 2] uses: ./.github/workflows/model_jobs.yml with: folder_slices: ${{ needs.setup.outputs.folder_slices }} machine_type: ${{ matrix.machine_type }} slice_id: ${{ matrix.slice_id }} docker: ${{ inputs.docker }} commit_sha: ${{ inputs.commit_sha || github.sha }} runner_type: ${{ inputs.runner_type }} report_repo_id: ${{ inputs.report_repo_id }} report_name_prefix: run_trainer_and_fsdp_gpu secrets: inherit run_pipelines_torch_gpu: if: ${{ inputs.job == 'run_pipelines_torch_gpu' }} name: PyTorch pipelines strategy: fail-fast: false matrix: machine_type: [aws-g5-4xlarge-cache, aws-g5-12xlarge-cache] runs-on: group: '${{ matrix.machine_type }}' container: image: huggingface/transformers-all-latest-gpu options: --gpus all --shm-size "16gb" --ipc host -v /mnt/cache/.cache/huggingface:/mnt/cache/ steps: - name: Update clone working-directory: /transformers env: commit_sha: ${{ inputs.commit_sha || github.sha }} run: git fetch && git checkout "$commit_sha" - name: Reinstall transformers in edit mode (remove the one installed during docker image build) working-directory: /transformers run: python3 -m pip uninstall -y transformers && python3 -m pip install -e . - name: NVIDIA-SMI run: | nvidia-smi - name: Environment working-directory: /transformers run: | python3 utils/print_env.py - name: Show installed libraries and their versions working-directory: /transformers run: pip freeze - name: Set `machine_type` for report and artifact names working-directory: /transformers shell: bash env: matrix_machine_type: ${{ matrix.machine_type }} run: | echo "$matrix_machine_type" if [ "$matrix_machine_type" = "aws-g5-4xlarge-cache" ]; then machine_type=single-gpu elif [ "$matrix_machine_type" = "aws-g5-12xlarge-cache" ]; then machine_type=multi-gpu else machine_type="$matrix_machine_type" fi echo "$machine_type" echo "machine_type=$machine_type" >> $GITHUB_ENV - name: Run all pipeline tests on GPU working-directory: /transformers run: | python3 -m pytest -n 1 -v --dist=loadfile --make-reports="${machine_type}_run_pipelines_torch_gpu_test_reports" tests/pipelines - name: Failure short reports if: ${{ failure() }} continue-on-error: true run: cat "/transformers/reports/${machine_type}_run_pipelines_torch_gpu_test_reports/failures_short.txt" - name: "Test suite reports artifacts: ${{ env.machine_type }}_run_pipelines_torch_gpu_test_reports" if: ${{ always() }} uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: ${{ env.machine_type }}_run_pipelines_torch_gpu_test_reports path: /transformers/reports/${{ env.machine_type }}_run_pipelines_torch_gpu_test_reports run_examples_gpu: if: ${{ inputs.job == 'run_examples_gpu' }} name: Examples directory strategy: fail-fast: false matrix: machine_type: [aws-g5-4xlarge-cache] runs-on: group: '${{ matrix.machine_type }}' container: image: huggingface/transformers-all-latest-gpu options: --gpus all --shm-size "16gb" --ipc host -v /mnt/cache/.cache/huggingface:/mnt/cache/ steps: - name: Update clone working-directory: /transformers env: commit_sha: ${{ inputs.commit_sha || github.sha }} run: git fetch && git checkout "$commit_sha" - name: Reinstall transformers in edit mode (remove the one installed during docker image build) working-directory: /transformers run: python3 -m pip uninstall -y transformers && python3 -m pip install -e . - name: NVIDIA-SMI run: | nvidia-smi - name: Environment working-directory: /transformers run: | python3 utils/print_env.py - name: Show installed libraries and their versions working-directory: /transformers run: pip freeze - name: Set `machine_type` for report and artifact names working-directory: /transformers shell: bash env: matrix_machine_type: ${{ matrix.machine_type }} run: | echo "$matrix_machine_type" if [ "$matrix_machine_type" = "aws-g5-4xlarge-cache" ]; then machine_type=single-gpu elif [ "$matrix_machine_type" = "aws-g5-12xlarge-cache" ]; then machine_type=multi-gpu else machine_type="$matrix_machine_type" fi echo "$machine_type" echo "machine_type=$machine_type" >> $GITHUB_ENV - name: Run examples tests on GPU working-directory: /transformers run: | pip install -r examples/pytorch/_tests_requirements.txt python3 -m pytest -v --make-reports="${machine_type}_run_examples_gpu_test_reports" examples/pytorch - name: Failure short reports if: ${{ failure() }} continue-on-error: true run: cat "/transformers/reports/${machine_type}_run_examples_gpu_test_reports/failures_short.txt" - name: "Test suite reports artifacts: ${{ env.machine_type }}_run_examples_gpu_test_reports" if: ${{ always() }} uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: ${{ env.machine_type }}_run_examples_gpu_test_reports path: /transformers/reports/${{ env.machine_type }}_run_examples_gpu_test_reports run_torch_cuda_extensions_gpu: if: ${{ inputs.job == 'run_torch_cuda_extensions_gpu' }} name: Torch CUDA extension tests strategy: fail-fast: false matrix: machine_type: [aws-g5-4xlarge-cache, aws-g5-12xlarge-cache] runs-on: group: '${{ matrix.machine_type }}' container: image: ${{ inputs.docker }} options: --gpus all --shm-size "16gb" --ipc host -v /mnt/cache/.cache/huggingface:/mnt/cache/ steps: - name: Update clone working-directory: ${{ inputs.working-directory-prefix }}/transformers env: commit_sha: ${{ inputs.commit_sha || github.sha }} run: git fetch && git checkout "$commit_sha" - name: Reinstall transformers in edit mode (remove the one installed during docker image build) working-directory: ${{ inputs.working-directory-prefix }}/transformers run: python3 -m pip uninstall -y transformers && python3 -m pip install -e . - name: Update / Install some packages (for Past CI) if: ${{ contains(inputs.docker, '-past-') && contains(inputs.docker, '-pytorch-') }} working-directory: ${{ inputs.working-directory-prefix }}/transformers run: | python3 -m pip install -U datasets python3 -m pip install --no-cache-dir git+https://github.com/huggingface/accelerate@main#egg=accelerate - name: Remove cached torch extensions run: rm -rf /github/home/.cache/torch_extensions/ # To avoid unknown test failures - name: Pre build DeepSpeed *again* (for daily CI) if: ${{ contains(inputs.ci_event, 'Daily CI') }} working-directory: ${{ inputs.working-directory-prefix }}/ run: | python3 -m pip uninstall -y deepspeed DS_DISABLE_NINJA=1 DS_BUILD_CPU_ADAM=1 DS_BUILD_FUSED_ADAM=1 python3 -m pip install deepspeed --no-build-isolation --config-settings="--build-option=build_ext" --config-settings="--build-option=-j8" --no-cache -v --disable-pip-version-check # To avoid unknown test failures - name: Pre build DeepSpeed *again* (for nightly & Past CI) if: ${{ contains(inputs.ci_event, 'Nightly CI') || contains(inputs.ci_event, 'Past CI') }} working-directory: ${{ inputs.working-directory-prefix }}/ run: | python3 -m pip uninstall -y deepspeed rm -rf DeepSpeed git clone https://github.com/deepspeedai/DeepSpeed && cd DeepSpeed && rm -rf build DS_BUILD_CPU_ADAM=1 DS_BUILD_FUSED_ADAM=1 python3 -m pip install . --no-build-isolation --config-settings="--build-option=build_ext" --config-settings="--build-option=-j8" --no-cache -v --disable-pip-version-check - name: NVIDIA-SMI run: | nvidia-smi - name: Environment working-directory: ${{ inputs.working-directory-prefix }}/transformers run: | python3 utils/print_env.py - name: Show installed libraries and their versions working-directory: ${{ inputs.working-directory-prefix }}/transformers run: pip freeze - name: Set `machine_type` for report and artifact names working-directory: ${{ inputs.working-directory-prefix }}/transformers shell: bash env: matrix_machine_type: ${{ matrix.machine_type }} run: | echo "$matrix_machine_type" if [ "$matrix_machine_type" = "aws-g5-4xlarge-cache" ]; then machine_type=single-gpu elif [ "$matrix_machine_type" = "aws-g5-12xlarge-cache" ]; then machine_type=multi-gpu else machine_type="$matrix_machine_type" fi echo "$machine_type" echo "machine_type=$machine_type" >> $GITHUB_ENV - name: Run all tests on GPU working-directory: ${{ inputs.working-directory-prefix }}/transformers run: | script -q -c "python3 -m pytest -v -rsfE --make-reports=${machine_type}_run_torch_cuda_extensions_gpu_test_reports tests/trainer/distributed/test_trainer_distributed_deepspeed.py" test_outputs.txt - name: Failure short reports if: ${{ failure() }} continue-on-error: true env: working_directory_prefix: ${{ inputs.working-directory-prefix }} run: cat "${working_directory_prefix}/transformers/reports/${machine_type}_run_torch_cuda_extensions_gpu_test_reports/failures_short.txt" - name: "Test suite reports artifacts: ${{ env.machine_type }}_run_torch_cuda_extensions_gpu_test_reports" if: ${{ always() }} uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: ${{ env.machine_type }}_run_torch_cuda_extensions_gpu_test_reports path: ${{ inputs.working-directory-prefix }}/transformers/reports/${{ env.machine_type }}_run_torch_cuda_extensions_gpu_test_reports run_quantization_torch_gpu: if: ${{ inputs.job == 'run_quantization_torch_gpu' }} name: " " needs: setup strategy: max-parallel: 4 fail-fast: false matrix: folders: ${{ fromJson(needs.setup.outputs.quantization_matrix) }} machine_type: [aws-g5-4xlarge-cache, aws-g5-12xlarge-cache] runs-on: group: '${{ matrix.machine_type }}' container: image: huggingface/transformers-quantization-latest-gpu options: --gpus all --shm-size "16gb" --ipc host -v /mnt/cache/.cache/huggingface:/mnt/cache/ steps: - name: Echo folder ${{ matrix.folders }} shell: bash env: matrix_folders_raw: ${{ matrix.folders }} run: | echo "$matrix_folders_raw" matrix_folders="${matrix_folders_raw/'quantization/'/'quantization_'}" echo "$matrix_folders" echo "matrix_folders=$matrix_folders" >> $GITHUB_ENV - name: Update clone working-directory: /transformers env: commit_sha: ${{ inputs.commit_sha || github.sha }} run: git fetch origin "$commit_sha" && git checkout "$commit_sha" - name: Reinstall transformers in edit mode (remove the one installed during docker image build) working-directory: /transformers run: python3 -m pip uninstall -y transformers && python3 -m pip install -e . - name: NVIDIA-SMI run: | nvidia-smi - name: Environment working-directory: /transformers run: | python3 utils/print_env.py - name: Show installed libraries and their versions working-directory: /transformers run: pip freeze - name: Set `machine_type` for report and artifact names working-directory: /transformers shell: bash env: matrix_machine_type: ${{ matrix.machine_type }} run: | echo "$matrix_machine_type" if [ "$matrix_machine_type" = "aws-g5-4xlarge-cache" ]; then machine_type=single-gpu elif [ "$matrix_machine_type" = "aws-g5-12xlarge-cache" ]; then machine_type=multi-gpu else machine_type="$matrix_machine_type" fi echo "$machine_type" echo "machine_type=$machine_type" >> $GITHUB_ENV - name: Run quantization tests on GPU working-directory: /transformers env: folders: ${{ matrix.folders }} run: | python3 -m pytest -v --make-reports="${machine_type}_run_quantization_torch_gpu_${matrix_folders}_test_reports" tests/${folders} - name: Failure short reports if: ${{ failure() }} continue-on-error: true run: cat "/transformers/reports/${machine_type}_run_quantization_torch_gpu_${matrix_folders}_test_reports/failures_short.txt" - name: "Test suite reports artifacts: ${{ env.machine_type }}_run_quantization_torch_gpu_${{ env.matrix_folders }}_test_reports" if: ${{ always() }} uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: ${{ env.machine_type }}_run_quantization_torch_gpu_${{ env.matrix_folders }}_test_reports path: /transformers/reports/${{ env.machine_type }}_run_quantization_torch_gpu_${{ env.matrix_folders }}_test_reports run_kernels_gpu: if: ${{ inputs.job == 'run_kernels_gpu' }} name: Kernel tests strategy: fail-fast: false matrix: machine_type: [aws-g5-4xlarge-cache] runs-on: group: '${{ matrix.machine_type }}' container: image: ${{ inputs.docker }} options: --gpus all --shm-size "16gb" --ipc host -v /mnt/cache/.cache/huggingface:/mnt/cache/ steps: - name: Update clone working-directory: /transformers env: commit_sha: ${{ inputs.commit_sha || github.sha }} run: git fetch && git checkout "$commit_sha" - name: Reinstall transformers in edit mode working-directory: /transformers run: python3 -m pip uninstall -y transformers && python3 -m pip install -e .[testing] - name: Install kernels working-directory: /transformers run: python3 -m pip install -U kernels - name: NVIDIA-SMI run: nvidia-smi - name: Environment working-directory: /transformers run: python3 utils/print_env.py - name: Show installed libraries and their versions working-directory: /transformers run: pip freeze - name: Set `machine_type` for report and artifact names working-directory: /transformers shell: bash env: matrix_machine_type: ${{ matrix.machine_type }} run: | echo "$matrix_machine_type" if [ "$matrix_machine_type" = "aws-g5-4xlarge-cache" ]; then machine_type=single-gpu elif [ "$matrix_machine_type" = "aws-g5-12xlarge-cache" ]; then machine_type=multi-gpu else machine_type="$matrix_machine_type" fi echo "$machine_type" echo "machine_type=$machine_type" >> $GITHUB_ENV - name: Run kernel tests on GPU working-directory: /transformers run: | python3 -m pytest -v --make-reports="${machine_type}_run_kernels_gpu_test_reports" tests/kernels/test_kernels.py - name: Failure short reports if: ${{ failure() }} continue-on-error: true run: cat "/transformers/reports/${machine_type}_run_kernels_gpu_test_reports/failures_short.txt" - name: "Test suite reports artifacts: ${{ env.machine_type }}_run_kernels_gpu_test_reports" if: ${{ always() }} uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: ${{ env.machine_type }}_run_kernels_gpu_test_reports path: /transformers/reports/${{ env.machine_type }}_run_kernels_gpu_test_reports run_extract_warnings: # Let's only do this for the job `run_models_gpu` to simplify the (already complex) logic. if: ${{ always() && inputs.job == 'run_models_gpu' }} name: Extract warnings in CI artifacts runs-on: ubuntu-22.04 needs: [setup, run_models_gpu] steps: # Checkout in order to run `utils/extract_warnings.py`. Avoid **explicit** checkout (i.e. don't specify `ref`) for # security reason. - name: Checkout transformers uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 with: persist-credentials: false - name: Install transformers run: pip install transformers - name: Show installed libraries and their versions run: pip freeze - name: Create output directory run: mkdir warnings_in_ci - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 env: ACTIONS_ARTIFACT_MAX_ARTIFACT_COUNT: 2000 with: path: warnings_in_ci github-token: ${{ secrets.GITHUB_TOKEN }} - name: Show artifacts run: echo "$(python3 -c 'import os; d = os.listdir(); print(d)')" working-directory: warnings_in_ci - name: Extract warnings in CI artifacts env: github_run_id: ${{ github.run_id }} access_token: ${{ secrets.ACCESS_REPO_INFO_TOKEN }} run: | python3 utils/extract_warnings.py --workflow_run_id "$github_run_id" --output_dir warnings_in_ci --token "$access_token" --from_gh echo "$(python3 -c 'import os; import json; fp = open("warnings_in_ci/selected_warnings.json"); d = json.load(fp); d = "\n".join(d); print(d)')" - name: Upload artifact if: ${{ always() }} uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: warnings_in_ci path: warnings_in_ci/selected_warnings.json send_results: name: Slack Report needs: [ setup, run_models_gpu, run_trainer_and_fsdp_gpu, run_pipelines_torch_gpu, run_examples_gpu, run_torch_cuda_extensions_gpu, run_quantization_torch_gpu, run_kernels_gpu, run_extract_warnings ] if: always() && !cancelled() uses: ./.github/workflows/slack-report.yml with: job: ${{ inputs.job }} # This would be `skipped` if `setup` is skipped. setup_status: ${{ needs.setup.result }} slack_report_channel: ${{ inputs.slack_report_channel }} # This would be an empty string if `setup` is skipped. folder_slices: ${{ needs.setup.outputs.folder_slices }} quantization_matrix: ${{ needs.setup.outputs.quantization_matrix }} ci_event: ${{ inputs.ci_event }} report_repo_id: ${{ inputs.report_repo_id }} commit_sha: ${{ inputs.commit_sha || github.sha }} secrets: inherit check_new_failures: if: ${{ always() && needs.send_results.result == 'success' }} name: Check new failures needs: send_results uses: ./.github/workflows/check_failed_tests.yml with: docker: ${{ inputs.docker }} commit_sha: ${{ inputs.commit_sha || github.sha }} job: ${{ inputs.job }} slack_report_channel: ${{ inputs.slack_report_channel }} ci_event: ${{ inputs.ci_event }} report_repo_id: ${{ inputs.report_repo_id }} pr_number: ${{ inputs.pr_number }} secrets: inherit