deeplearning4j/deeplearning4j

View on GitHub
.github/workflows/build-deploy-linux-x86_64.yml

Summary

Maintainability
Test Coverage
on:
  workflow_dispatch:
    inputs:
      buildThreads:
        description: 'Build threads for libnd4j. Used to control memory usage of builds.'
        required: true
        default: 2

      deployToReleaseStaging:
        description: 'Whether to deploy to release staging or not.'
        required: false
        default: 0

      releaseVersion:
        description: 'Release version target'
        required: false
        default: 1.0.0-M3

      snapshotVersion:
        description: 'Snapshot version target'
        required: false
        default: 1.0.0-SNAPSHOT

      releaseRepoId:
        description: 'Release repository id'
        required: false
        default:

      serverId:
        description: 'Server id to publish to'
        required: false
        default: ossrh

      mvnFlags:
        description: "Extra maven flags (must escape input yourself if used)"
        required: false
        default:

      libnd4jUrl:
          description: 'Sets a libnd4j download url for this build. LIBND4J_HOME will automatically be set. Should be used when only needing to build other modules.'
          required: false
          default:


      runsOn:
        description: 'System to run on'
        required: false
        default: ubuntu-20.04

      debug_enabled:
        description: 'Run the build with tmate debugging enabled (https://github.com/marketplace/actions/debugging-with-tmate)'
        required: false
        default: false
jobs:
  #Note: no -pl here because we publish everything from this branch and use this as the basis for all uploads.
  linux-x86_64:
    strategy:
      fail-fast: false
      matrix:
        helper: [onednn,""]
        extension: [avx2,avx512,""]
        include:
          - mvn_ext: ${{ github.event.inputs.mvnFlags }}
            experimental: true
            name: Extra maven flags
          - debug_enabled: ${{ github.event.inputs.debug_enabled }}
            experimental: true
            name: Debug enabled

          - runs_on: ${{ github.event.inputs.runsOn }}
            experimental: true
            name: OS to run on

          - libnd4j_file_download: ${{ github.event.inputs.libnd4jUrl }}
            experimental: true
            name: OS to run on

          - deploy_to_release_staging: ${{ github.event.inputs.deployToReleaseStaging }}
            experimental: true
            name: Whether to deploy to release staging or not

          - release_version: ${{ github.event.inputs.releaseVersion }}
            experimental: true
            name: Release version

          - snapshot_version: ${{ github.event.inputs.snapshotVersion }}
            experimental: true
            name: Snapshot version

          - server_id: ${{ github.event.inputs.serverId }}
            experimental: true
            name: Server id

          - release_repo_id: ${{ github.event.inputs.releaseRepoId }}
            experimental: true
            name: The release repository to run on

          - mvn_flags: ${{ github.event.inputs.mvnFlags }}
            experimental: true
            name: Extra maven flags to use as part of the build

          - build_threads: ${{ github.event.inputs.buildThreads }}
            experimental: true
            name: The number of threads to build libnd4j with


    runs-on: ${{ matrix.runs_on }}
    steps:
      - name: Cancel Previous Runs
        uses: styfle/cancel-workflow-action@0.8.0
        with:
          access_token: ${{ github.token }}
      - uses: actions/checkout@v2
      - uses: ./.github/actions/set-linux-distro-version
      - name: Set mvn build command based on matrix
        shell: bash
        run: |
              if  [  "${{ matrix.libnd4j_file_download }}" != '' ]; then
                 modules=':nd4j-native,:nd4j-native-preset'
              else 
               echo "Building libnd4j from source"
               modules=':nd4j-native,:nd4j-native-preset,:libnd4j'
              fi
              command="mvn  ${{ matrix.mvn_ext }} -pl $modules -Pcpu -Dlibnd4j.buildthreads=${{ matrix.build_threads }} -Dhttp.keepAlive=false -Dmaven.wagon.http.pool=false -Dmaven.wagon.http.retryHandler.count=3   -Possrh  -DskipTestResourceEnforcement=true  -Dmaven.javadoc.failOnError=false -Djavacpp.platform=linux-x86_64  -Pcpu  --also-make  --batch-mode deploy -DskipTests"
              if [ "${{ matrix.helper }}" != '' ] && [ "${{ matrix.extension }}" != '' ]; then
                     mvn_ext=" -Dlibnd4j.helper=${{ matrix.helper }} -Dlibnd4j.extension=${{ matrix.extension }} -Djavacpp.platform.extension=-${{ matrix.helper }}-${{ matrix.extension }} -Dlibnd4j.classifier=linux-x86_64-${{ matrix.helper }}-${{matrix.extension}}"
              elif [ "${{ matrix.helper }}" != '' ]; then
                     mvn_ext=" -Dlibnd4j.helper=${{ matrix.helper }} -Dlibnd4j.extension=${{ matrix.helper }} -Djavacpp.platform.extension=-${{ matrix.helper }} -Dlibnd4j.classifier=linux-x86_64-${{ matrix.helper }}"
              elif [ "${{ matrix.extension }}" != '' ]; then
                     mvn_ext=" -Dlibnd4j.extension=${{ matrix.extension }} -Djavacpp.platform.extension=-${{ matrix.extension }} -Dlibnd4j.classifier=linux-x86_64-${{ matrix.extension }}"
               else
                   mvn_ext=""
              fi
              if  [  "${{ matrix.libnd4j_file_download }}" != '' ]; then
                 echo "Adding libnd4j download"
              fi
              command="${command} ${mvn_ext}"
              echo "Setting command for helper ${{ matrix.helper }} and extension ${{ matrix.extension }} to ${command}"
              echo "COMMAND=${command}" >> $GITHUB_ENV

      - uses: ./.github/actions/update-deps-linux
      - name: Cache cmake install
        uses: actions/cache@v2
        id: cache-cmake
        with:
          path: /opt/cmake
          key: ${{ runner.os }}-cmake
          restore-keys: ${{ runner.os }}-cmake
      - name: Cache protobuf install
        uses: actions/cache@v2
        id: cache-protobuf
        with:
          path: /opt/protobuf
          key: ${{ runner.os }}-protobuf
          restore-keys: ${{ runner.os }}-protobuf
      - uses: ./.github/actions/install-protobuf-linux
        if: steps.cache-protobuf.outputs.cache-hit != 'true'
      - uses: ./.github/actions/install-cmake-linux
        if: steps.cache-cmake.outputs.cache-hit != 'true'
      - name: Set up Java for publishing to GitHub Packages
        uses: actions/setup-java@v2
        with:
          java-version: 11
          distribution: 'temurin'
          server-id:  ${{ github.event.inputs.serverId }}
          server-username: MAVEN_USERNAME
          server-password: MAVEN_PASSWORD
          gpg-private-key: ${{ secrets.SONATYPE_GPG_KEY }}
          gpg-passphrase: MAVEN_GPG_PASSPHRASE
          cache: 'maven'

      - name: Setup libnd4j home if a download url is specified
        shell: bash
        run: |
              mkdir "${GITHUB_WORKSPACE}/openblas_home"
              cd "${GITHUB_WORKSPACE}/openblas_home"
              wget https://repo1.maven.org/maven2/org/bytedeco/openblas/0.3.19-1.5.7/openblas-0.3.19-1.5.7-linux-x86_64.jar
              unzip openblas-0.3.19-1.5.7-linux-x86_64.jar
              cd ..
              echo "OPENBLAS_PATH=${GITHUB_WORKSPACE}/openblas_home/org/bytedeco/openblas/linux-x86_64" >> "$GITHUB_ENV"
              cp ${GITHUB_WORKSPACE}/openblas_home/org/bytedeco/openblas/linux-x86_64/libopenblas.so.0  ${GITHUB_WORKSPACE}/openblas_home/org/bytedeco/openblas/linux-x86_64/libopenblas.so
        if: ${{ github.event.inputs.libnd4jUrl != '' }}

      - name: Build on  linux-x86_64
        shell: bash
        env:
          MAVEN_GPG_KEY: ${{ secrets.SONATYPE_GPG_KEY }}
          DEBIAN_FRONTEND: noninteractive
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          PUBLISH_TO: ossrh
          MAVEN_USERNAME: ${{ secrets.SONATYPE_USER_1 }}
          MAVEN_PASSWORD: ${{ secrets.SONATYPE_USER1_PASS }}
          MAVEN_GPG_PASSPHRASE: ${{ secrets.PACKAGES_GPG_PASS }}
          PERFORM_RELEASE: ${{ matrix.deploy_to_release_staging }}
          RELEASE_VERSION: ${{ matrix.release_version }}
          SNAPSHOT_VERSION: ${{ matrix.snapshot_version }}
          RELEASE_REPO_ID: ${{ matrix.release_repo_id }}
          MODULES: ${{ matrix.mvn_flags }}
          HELPER: ${{ matrix.helper }}
          EXTENSION: ${{ matrix.extension }}
          MAVEN_OPTS: -Xmx2g
          LIBND4J_FILE_NAME: ${{ matrix.libnd4j_file_download }}


        run: |
          echo "libnd4j build threads ${{ matrix.build_threads }}"
          echo "deploy to release staging repo or not ${{ matrix.deploy_to_release_staging }}"
          echo "release version ${{ matrix.release_version }}"
          echo "snapshot version ${{ matrix.snapshot_version }}"
          echo "debug enabled ${{ matrix.debug_enabled }}"
          echo "libnd4j url ${{ matrix.libnd4j_file_download }}"
          echo "maven flags ${{ matrix.mvn_flags }}"
          echo "snapshot version ${{ matrix.snapshot_version }}"
          echo "server id ${{ matrix.server_id }}"
          echo "release repo id ${{ matrix.release_repo_id }}"

          export PATH=/opt/protobuf/bin:/opt/cmake/bin:$PATH
          mvn --version
          cmake --version
          protoc --version
          export PATH=/opt/protobuf/bin:/opt/cmake/bin:$PATH
          export LIBGOMP_PATH=/usr/lib/gcc/x86_64-linux-gnu/5.5.0/libgomp.so
          if [ -z "${EXTENSION}" ] || [ -n "${EXTENSION}" ]; then
              export LIBGOMP_PATH=/usr/lib/gcc/x86_64-linux-gnu/7.5.0/libgomp.so
              echo "Extensions specified. This needs a newer version of gcc."
              sudo apt-get install gcc-7 g++-7
              echo "Using newer version of libgomp."
              ls /usr/bin | grep gcc
              ls /usr/bin | grep g++
              sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 90
              sudo update-alternatives --install  /usr/bin/g++ g++ /usr/bin/g++-7  90
              gcc --version
          fi
          # NOTE: Complete hack. Find better way later. This moves libgomp.so to a directory where javacpp can find it.
          # For linux, this can be found here: https://github.com/eclipse/deeplearning4j/blob/master/nd4j/nd4j-backends/nd4j-backend-impls/nd4j-native-preset/src/main/java/org/nd4j/nativeblas/Nd4jCpuPresets.java#L150
          # Note also, that the g++ --version as of this writing (May 3,2021) currently returns 5.5.0. This will need to be changed in other versions if there is an update.
          sudo cp "${LIBGOMP_PATH}" /usr/lib
          sudo apt-get -y autoremove
          sudo apt-get -y clean
          # download libnd4j from a url and set it up if LIBND4J_URL is defined
          bash ./bootstrap-libnd4j-from-url.sh linux x86_64 "${{ matrix.helper }}" "${{ matrix.extension }}"
          export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$OPENBLAS_PATH"
          if [ "$PERFORM_RELEASE" == 1 ]; then
                    bash ${GITHUB_WORKSPACE}/release-specified-component.sh "${RELEASE_VERSION}" "${SNAPSHOT_VERSION}" "${RELEASE_REPO_ID}" "${command}"
                   else
                       echo "Running build and deploying to snapshots"
                       eval "${COMMAND}"
          fi