diff --git a/.github/workflows/run.yml b/.github/workflows/run.yml new file mode 100644 index 0000000..494002d --- /dev/null +++ b/.github/workflows/run.yml @@ -0,0 +1,303 @@ +name: CI + +on: [push, pull_request] + +jobs: + ubuntu-latest-cmake: + runs-on: ubuntu-latest + + strategy: + matrix: + include: + - build: 'avx' + defines: '-DMINIGPT4_BUILD_EXAMPLES=ON -DMINIGPT4_STATIC=OFF -DMINIGPT4_AVX2=OFF' + - build: 'avx2' + defines: '-DMINIGPT4_BUILD_EXAMPLES=ON -DMINIGPT4_STATIC=OFF -DMINIGPT4_AVX2=ON' + - build: 'opencv_avx' + defines: '-DMINIGPT4_BUILD_EXAMPLES=ON -DMINIGPT4_STATIC=OFF -DMINIGPT4_AVX2=OFF -DMINIGPT4_BUILD_WITH_OPENCV=ON' + - build: 'opencv_avx2' + defines: '-DMINIGPT4_BUILD_EXAMPLES=ON -DMINIGPT4_STATIC=OFF -DMINIGPT4_AVX2=ON -DMINIGPT4_BUILD_WITH_OPENCV=ON' + + steps: + - name: Clone + id: checkout + uses: actions/checkout@v3 + with: + submodules: 'recursive' + + - name: Dependencies + id: depends + run: | + sudo apt-get update + sudo apt-get install build-essential zip cmake + + - name: Cache opencv + uses: actions/cache@v3 + env: + cache-name: cache-opencv + with: + path: | + ./opencv + key: ${{ runner.os }}-build-${{ env.cache-name }} + restore-keys: | + ${{ runner.os }}-build- + ${{ runner.os }}- + + - name: Install prerequisites + shell: bash -l {0} + run: | + if [ ! -d "./opencv" ]; then + git clone https://github.com/opencv/opencv.git --branch 4.6.0 --depth 1 + cmake -S opencv -B opencv/build -D ENABLE_PRECOMPILED_HEADERS=OFF -D WITH_MSMF=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_TESTS=OFF -D BUILD_WITH_DEBUG_INFO=OFF -D BUILD_DOCS=OFF -D WITH_FFMPEG=OFF -D CMAKE_BUILD_TYPE=RELEASE -D WITH_QUIRC=OFF -D BUILD_QUIRC=OFF -D QUIRC=OFF -D BUILD_PROTOBUF=OFF -D BUILD_SHARED_LIBS=ON -D BUILD_LIST=core,imgproc,imgcodecs + cd ./opencv/build + make -j$(($(nproc) / 2)) + else + cd ./opencv/build + fi + sudo make install + + - name: Build + id: cmake_build + run: | + mkdir build + cd build + cmake .. ${{ matrix.defines }} + cmake --build . --config Release --parallel + + - name: Test + id: cmake_test + run: | + cd build + ctest --verbose + + - name: Get commit hash + id: commit + uses: pr-mpt/actions-commit-hash@v2 + + - name: Fetch system info + id: system-info + run: | + echo "CPU_ARCH=`uname -m`" >> "$GITHUB_OUTPUT" + echo "OS_NAME=`lsb_release -s -i`" >> "$GITHUB_OUTPUT" + echo "OS_VERSION=`lsb_release -s -r`" >> "$GITHUB_OUTPUT" + echo "OS_TYPE=`uname -s`" >> "$GITHUB_OUTPUT" + + - name: Pack artifacts + id: pack_artifacts + run: | + zip -j minigpt4-${{ env.BRANCH_NAME }}-${{ steps.commit.outputs.short }}-${{ steps.system-info.outputs.OS_TYPE }}-${{ steps.system-info.outputs.OS_NAME }}-${{ steps.system-info.outputs.OS_VERSION }}-${{ matrix.build }}-${{ steps.system-info.outputs.CPU_ARCH }}.zip ./build/libminigpt4.so ./build/bin/main ./minigpt4/minigpt4_library.py ./minigpt4/webui.py + + - name: Upload artifacts + uses: actions/upload-artifact@v3 + with: + path: | + minigpt4-${{ env.BRANCH_NAME }}-${{ steps.commit.outputs.short }}-${{ steps.system-info.outputs.OS_TYPE }}-${{ steps.system-info.outputs.OS_NAME }}-${{ steps.system-info.outputs.OS_VERSION }}-${{ matrix.build }}-${{ steps.system-info.outputs.CPU_ARCH }}.zip + + macOS-latest-cmake: + runs-on: macOS-latest + + strategy: + matrix: + include: + - build: 'avx' + defines: '-DMINIGPT4_BUILD_EXAMPLES=ON -DMINIGPT4_STATIC=OFF -DMINIGPT4_AVX2=OFF' + # - build: 'avx2' + # defines: '-DMINIGPT4_BUILD_EXAMPLES=ON -DMINIGPT4_STATIC=OFF -DMINIGPT4_AVX2=ON' + - build: 'opencv_avx' + defines: '-DMINIGPT4_BUILD_EXAMPLES=ON -DMINIGPT4_STATIC=OFF -DMINIGPT4_AVX2=OFF -DMINIGPT4_BUILD_WITH_OPENCV=ON' + # - build: 'opencv_avx2' + # defines: '-DMINIGPT4_BUILD_EXAMPLES=ON -DMINIGPT4_STATIC=OFF -DMINIGPT4_AVX2=ON -DMINIGPT4_BUILD_WITH_OPENCV=ON' + + steps: + - name: Clone + id: checkout + uses: actions/checkout@v3 + with: + submodules: 'recursive' + + - name: Dependencies + id: depends + run: | + brew install zip + + - name: Cache opencv + uses: actions/cache@v3 + env: + cache-name: cache-opencv + with: + path: | + ./opencv + key: ${{ runner.os }}-build-${{ env.cache-name }} + restore-keys: | + ${{ runner.os }}-build- + ${{ runner.os }}- + + - name: Install prerequisites + shell: bash -l {0} + run: | + brew install create-dmg + if [ ! -d "./opencv" ]; then + git clone https://github.com/opencv/opencv.git --branch 4.6.0 --depth 1 + cmake -S opencv -B opencv/build -D ENABLE_PRECOMPILED_HEADERS=OFF -D WITH_MSMF=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_TESTS=OFF -D BUILD_WITH_DEBUG_INFO=OFF -D BUILD_DOCS=OFF -D WITH_FFMPEG=OFF -D CMAKE_BUILD_TYPE=RELEASE -D WITH_QUIRC=OFF -D BUILD_QUIRC=OFF -D QUIRC=OFF -D BUILD_PROTOBUF=OFF -D BUILD_SHARED_LIBS=ON -D BUILD_LIST=core,imgproc,imgcodecs -D BUILD_ZLIB=OFF + cd ./opencv/build + make -j + else + cd ./opencv/build + fi + sudo make install + + - name: Build + id: cmake_build + run: | + mkdir build + cd build + cmake .. ${{ matrix.defines }} -DMINIGPT4_FMA=OFF + cmake --build . --config Release --parallel + + - name: Test + id: cmake_test + run: | + cd build + ctest --verbose + + - name: Get commit hash + id: commit + uses: pr-mpt/actions-commit-hash@v2 + + - name: Fetch system info + id: system-info + run: | + echo "CPU_ARCH=`uname -m`" >> "$GITHUB_OUTPUT" + echo "OS_NAME=`sw_vers -productName`" >> "$GITHUB_OUTPUT" + echo "OS_VERSION=`sw_vers -productVersion`" >> "$GITHUB_OUTPUT" + echo "OS_TYPE=`uname -s`" >> "$GITHUB_OUTPUT" + + - name: Pack artifacts + id: pack_artifacts + run: | + zip -j minigpt4-${{ env.BRANCH_NAME }}-${{ steps.commit.outputs.short }}-${{ steps.system-info.outputs.OS_TYPE }}-${{ steps.system-info.outputs.OS_NAME }}-${{ steps.system-info.outputs.OS_VERSION }}-${{ matrix.build }}-${{ steps.system-info.outputs.CPU_ARCH }}.zip ./build/libminigpt4.dylib ./build/bin/main ./minigpt4/minigpt4_library.py ./minigpt4/webui.py + + - name: Upload artifacts + uses: actions/upload-artifact@v3 + with: + path: | + minigpt4-${{ env.BRANCH_NAME }}-${{ steps.commit.outputs.short }}-${{ steps.system-info.outputs.OS_TYPE }}-${{ steps.system-info.outputs.OS_NAME }}-${{ steps.system-info.outputs.OS_VERSION }}-${{ matrix.build }}-${{ steps.system-info.outputs.CPU_ARCH }}.zip + + windows-latest-cmake: + runs-on: windows-latest + + strategy: + matrix: + include: + - build: 'avx' + defines: '-DMINIGPT4_BUILD_EXAMPLES=ON -DMINIGPT4_STATIC=OFF -DMINIGPT4_AVX2=OFF' + - build: 'avx2' + defines: '-DMINIGPT4_BUILD_EXAMPLES=ON -DMINIGPT4_STATIC=OFF -DMINIGPT4_AVX2=ON' + - build: 'avx512' + defines: '-DMINIGPT4_BUILD_EXAMPLES=ON -DMINIGPT4_STATIC=OFF -DMINIGPT4_AVX512=ON' + - build: 'opencv_avx' + defines: '-DMINIGPT4_BUILD_EXAMPLES=ON -DMINIGPT4_STATIC=OFF -DMINIGPT4_AVX2=OFF -DMINIGPT4_BUILD_WITH_OPENCV=ON' + - build: 'opencv_avx2' + defines: '-DMINIGPT4_BUILD_EXAMPLES=ON -DMINIGPT4_STATIC=OFF -DMINIGPT4_AVX2=ON -DMINIGPT4_BUILD_WITH_OPENCV=ON' + - build: 'opencv_avx512' + defines: '-DMINIGPT4_BUILD_EXAMPLES=ON -DMINIGPT4_STATIC=OFF -DMINIGPT4_AVX512=ON -DMINIGPT4_BUILD_WITH_OPENCV=ON' + + steps: + - name: Clone + id: checkout + uses: actions/checkout@v3 + with: + submodules: 'recursive' + + - name: Cache opencv + uses: actions/cache@v3 + env: + cache-name: cache-opencv + with: + path: | + C:/opencv4.6.0 + key: ${{ runner.os }}-build-${{ env.cache-name }} + restore-keys: | + ${{ runner.os }}-build- + ${{ runner.os }}- + + - name: Install prerequisites + run: | + Choco-Install -PackageName innosetup --force + Choco-Install -PackageName cmake --force + $c="C:\opencv4.6.0" + if(-not (Test-Path $c)) + { + git clone https://github.com/opencv/opencv.git --branch 4.6.0 --depth 1 + cmake -S opencv -B opencv/build -D CMAKE_INSTALL_PREFIX=C:/opencv4.6.0 -D ENABLE_PRECOMPILED_HEADERS=OFF -D WITH_MSMF=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_TESTS=OFF -D BUILD_WITH_DEBUG_INFO=OFF -D BUILD_DOCS=OFF -D CMAKE_BUILD_TYPE=RELEASE -D WITH_QUIRC=OFF -D BUILD_QUIRC=OFF -D QUIRC=OFF -D BUILD_PROTOBUF=OFF -D BUILD_SHARED_LIBS=ON -D BUILD_LIST=core,imgproc,imgcodecs + cd ./opencv/build + cmake --build . --config Release --parallel + cmake --install . --config Release + } + + - name: Build + id: cmake_build + run: | + mkdir build + cd build + cmake .. ${{ matrix.defines }} -DOpenCV_DIR=C:\opencv4.6.0 + cmake --build . --config Release --parallel + + - name: Check AVX512F support + id: check_avx512f + if: ${{ matrix.build == 'avx512' || matrix.build == 'opencv_avx512' }} + continue-on-error: true + run: | + cd build + $vcdir = $(vswhere -latest -products * -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath) + $msvc = $(join-path $vcdir $('VC\Tools\MSVC\'+$(gc -raw $(join-path $vcdir 'VC\Auxiliary\Build\Microsoft.VCToolsVersion.default.txt')).Trim())) + $cl = $(join-path $msvc 'bin\Hostx64\x64\cl.exe') + echo 'int main(void){unsigned int a[4];__cpuid(a,7);return !(a[1]&65536);}' >> avx512f.c + & $cl /O2 /GS- /kernel avx512f.c /link /nodefaultlib /entry:main + .\avx512f.exe && echo "AVX512F: YES" && ( echo HAS_AVX512F=1 >> $env:GITHUB_ENV ) || echo "AVX512F: NO" + + - name: Test + id: cmake_test + if: ${{ matrix.build != 'avx512' || env.HAS_AVX512F == '1' }} + run: | + cd build + ctest -C Release --verbose + + - name: Get commit hash + id: commit + uses: pr-mpt/actions-commit-hash@v2 + + - name: Pack artifacts + id: pack_artifacts + run: | + 7z a minigpt4-${{ env.BRANCH_NAME }}-${{ steps.commit.outputs.short }}-win-${{ matrix.build }}-x64.zip .\build\bin\Release\minigpt4.dll .\build\bin\Release\main.exe .\minigpt4\minigpt4_library.py .\minigpt4\webui.py + + - name: Upload artifacts + uses: actions/upload-artifact@v3 + with: + path: | + minigpt4-${{ env.BRANCH_NAME }}-${{ steps.commit.outputs.short }}-win-${{ matrix.build }}-x64.zip + + release: + runs-on: ubuntu-latest + + needs: + - ubuntu-latest-cmake + - macOS-latest-cmake + - windows-latest-cmake + + steps: + - name: Download artifacts + id: download-artifact + uses: actions/download-artifact@v3 + + - name: Get commit hash + id: commit + uses: pr-mpt/actions-commit-hash@v2 + + - name: Create release + id: create_release + uses: ncipollo/release-action@v1 + with: + artifacts: "*.zip" + prerelease: true \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 386abad..087fc8e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -323,6 +323,9 @@ set(PILLOW_RESIZE_INCLUDE_DIRS "") set(PILLOW_RESIZE_LIBS "") if (MINIGPT4_BUILD_WITH_OPENCV) + if (MINIGPT4_STATIC) + set(OpenCV_STATIC ON) + endif() find_package(OpenCV REQUIRED) set(OPENCV_INCLUDE_DIRS ${OpenCV_INCLUDE_DIRS}) set(OPENCV_LIBS ${OpenCV_LIBS})