chore: bump version to 9.11.2 (#4909) #7183
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Standalone | |
| on: | |
| push: | |
| branches: | |
| - master | |
| - 'releases/**' | |
| pull_request: | |
| branches: | |
| - '*' | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.head_ref || github.sha }} | |
| cancel-in-progress: true | |
| jobs: | |
| build_vendor_linux: | |
| name: core-cli.${{ matrix.os }}.amd64.${{ matrix.build_type }}.${{ matrix.compiler.cxx }}.standalone | |
| strategy: | |
| matrix: | |
| os: ["ubuntu-22.04"] | |
| build_type: ["Debug", "Release"] | |
| compiler: | |
| - { cc: "gcc", cxx: "g++"} | |
| - { cc: "clang", cxx: "clang++"} | |
| runs-on: ${{matrix.os}} | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| submodules: false | |
| - name: Init submodules with retry | |
| shell: bash | |
| run: | | |
| git config --global --add safe.directory "$(pwd)" | |
| for attempt in 1 2 3 4 5; do | |
| if git submodule update --init --recursive; then | |
| echo "Submodule init succeeded on attempt $attempt" | |
| exit 0 | |
| fi | |
| echo "Attempt $attempt failed, retrying in 15s..." | |
| sleep 15 | |
| done | |
| echo "Submodule init failed after 5 attempts" | |
| exit 1 | |
| - name: Install requirements | |
| run: sudo apt-get install -y ninja-build libboost-test-dev | |
| - name: Cache FetchContent downloads | |
| uses: actions/cache@v4 | |
| with: | |
| path: build/_deps | |
| key: fetchcontent-${{ matrix.os }}-${{ hashFiles('cmake/VowpalWabbitUtils.cmake') }} | |
| - name: Configure | |
| env: | |
| CC: ${{matrix.compiler.cc}} | |
| CXX: ${{matrix.compiler.cxx}} | |
| run: > | |
| cmake -S . -B build -G Ninja | |
| -DCMAKE_BUILD_TYPE=${{matrix.build_type}} | |
| -DVW_FEAT_FLATBUFFERS=Off | |
| -DVW_FEAT_CSV=On | |
| -DVW_FEAT_CB_GRAPH_FEEDBACK=On | |
| -DRAPIDJSON_SYS_DEP=Off | |
| -DFMT_SYS_DEP=Off | |
| -DSPDLOG_SYS_DEP=Off | |
| -DVW_ZLIB_SYS_DEP=Off | |
| -DVW_BOOST_MATH_SYS_DEP=Off | |
| -DVW_INSTALL=Off | |
| -DWARNINGS=On | |
| -DWARNING_AS_ERROR=On | |
| -DVW_CXX_STANDARD=17 | |
| -DVW_SIMD_INV_SQRT=OFF | |
| -DCMAKE_POLICY_VERSION_MINIMUM=3.5 | |
| - name: Build | |
| run: cmake --build build | |
| - name: Upload vw binary | |
| if: matrix.build_type == 'Release' && matrix.compiler.cc == 'gcc' | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: vw-linux-release | |
| path: build/vowpalwabbit/cli/vw | |
| if-no-files-found: error | |
| retention-days: 1 | |
| - name: Unit tests | |
| working-directory: build | |
| run: ctest --output-on-failure --no-tests=error --label-regex VWTestList --parallel 2 | |
| - name: Test | |
| run: python3 test/run_tests.py -f --clean_dirty -E 0.001 | |
| big-tests: | |
| name: big-tests.[${{ matrix.segment }}] | |
| needs: build_vendor_linux | |
| runs-on: ubuntu-latest | |
| strategy: | |
| matrix: | |
| segment: [1, 2] | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| submodules: false | |
| - name: Download vw binary | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: vw-linux-release | |
| - name: Prepare vw binary | |
| run: chmod +x vw | |
| - name: Download and prepare MNIST dataset | |
| if: matrix.segment == 1 | |
| working-directory: big_tests | |
| run: | | |
| mkdir -p dataSets/mnist.dir | |
| cd dataSets/mnist.dir | |
| for f in train-labels-idx1-ubyte.gz train-images-idx3-ubyte.gz \ | |
| t10k-labels-idx1-ubyte.gz t10k-images-idx3-ubyte.gz; do | |
| wget -nv "https://storage.googleapis.com/cvdf-datasets/mnist/$f" | |
| done | |
| cd ../../testCode | |
| g++ -O3 -Wall mnist.extractfeatures.cpp -o mnist.extractfeatures | |
| cd ../dataSets/mnist.dir | |
| export testCodeDir=$(pwd)/../../testCode | |
| $testCodeDir/mnist.munge.sh train-labels-idx1-ubyte.gz train-images-idx3-ubyte.gz \ | |
| | $testCodeDir/shuffle.pl > train.prep | |
| $testCodeDir/mnist.munge.sh t10k-labels-idx1-ubyte.gz t10k-images-idx3-ubyte.gz \ | |
| > test.prep | |
| - name: Download and prepare Covertype dataset | |
| if: matrix.segment == 1 | |
| working-directory: big_tests | |
| run: | | |
| mkdir -p dataSets/covtype.dir | |
| wget -nv -P dataSets/covtype.dir \ | |
| https://archive.ics.uci.edu/ml/machine-learning-databases/covtype/covtype.data.gz | |
| export testCodeDir=$(pwd)/testCode | |
| cd dataSets/covtype.dir | |
| $testCodeDir/covtype.munge.sh covtype.data.gz > prep | |
| - name: Download and prepare URLRep dataset | |
| if: matrix.segment == 1 | |
| working-directory: big_tests | |
| run: | | |
| mkdir -p dataSets/URLRep.dir | |
| wget -nv -P dataSets/URLRep.dir \ | |
| https://archive.ics.uci.edu/ml/machine-learning-databases/url/url_svmlight.tar.gz | |
| export testCodeDir=$(pwd)/testCode | |
| cd dataSets/URLRep.dir | |
| $testCodeDir/URLRep.munge.sh url_svmlight.tar.gz > prep | |
| - name: Download and prepare MovieLens dataset | |
| if: matrix.segment == 2 | |
| working-directory: big_tests | |
| run: | | |
| mkdir -p dataSets/movielens.dir | |
| wget -nv -P dataSets/movielens.dir \ | |
| http://files.grouplens.org/datasets/movielens/ml-1m.zip | |
| cd dataSets/movielens.dir | |
| unzip -ou ml-1m.zip | |
| ../../testCode/movielensRatings2vw.pl pre.train.vw test.prep ml-1m/ratings.dat | |
| perl -ne 'BEGIN { srand 8675309; }; 1; print join "\t", rand (), $_;' \ | |
| pre.train.vw | sort -k1 | cut -f2- > train.prep | |
| - name: Download and prepare OCR dataset | |
| if: matrix.segment == 2 | |
| working-directory: big_tests | |
| run: | | |
| mkdir -p dataSets/OCR.dir | |
| wget -nv -P dataSets/OCR.dir \ | |
| http://ai.stanford.edu/~btaskar/ocr/letter.data.gz \ | |
| http://ai.stanford.edu/~btaskar/ocr/letter.names | |
| python3 testCode/ocr2vw.py \ | |
| dataSets/OCR.dir/letter.data.gz dataSets/OCR.dir/letter.names \ | |
| dataSets/OCR.dir/train.prep dataSets/OCR.dir/test.prep | |
| - name: Run tests | |
| working-directory: big_tests | |
| run: | | |
| VW=${{ github.workspace }}/vw | |
| DIFF="perl testCode/floatingTolerance.pl" | |
| TOL=0.001 | |
| run_test() { | |
| local name="$1" | |
| shift | |
| echo "=== Running test $name ===" | |
| mkdir -p runs/$name.dir | |
| $VW "$@" > runs/$name.dir/raw_out 2> runs/$name.dir/raw_err | |
| grep "average loss" runs/$name.dir/raw_err > runs/$name.dir/err | |
| echo "Result: $(cat runs/$name.dir/err)" | |
| $DIFF $TOL $TOL runs/$name.dir/err expected/$name/err | |
| echo "=== Test $name PASSED ===" | |
| } | |
| if [ "${{ matrix.segment }}" = "1" ]; then | |
| # Test 1a: MNIST train | |
| run_test 1a --oaa 10 -d dataSets/mnist.dir/train.prep \ | |
| -f runs/1a.dir/mnist.model -b 24 --adaptive --invariant --holdout_off \ | |
| -l 0.1 --nn 40 --passes 24 -k --compressed --cache_file runs/1a.dir/mnist.cache | |
| # Test 1b: MNIST predict | |
| run_test 1b -t -d dataSets/mnist.dir/test.prep -i runs/1a.dir/mnist.model | |
| # Test 2: Covertype | |
| run_test 2 --oaa 7 -d dataSets/covtype.dir/prep | |
| # Test 3: URL Reputation | |
| run_test 3 -d dataSets/URLRep.dir/prep | |
| else | |
| # Test 5a: MovieLens train | |
| run_test 5a --loss_function quantile -l 0.45 -b 24 --passes 100 -k \ | |
| --cache_file runs/5a.dir/movielens.cache -d dataSets/movielens.dir/train.prep \ | |
| --holdout_off --lrq um14 --lrqdropout --adaptive --invariant \ | |
| -f runs/5a.dir/movielens.model | |
| # Test 5b: MovieLens predict | |
| run_test 5b --loss_function quantile -t \ | |
| -i runs/5a.dir/movielens.model -d dataSets/movielens.dir/test.prep | |
| # Test 6a: OCR train | |
| run_test 6a -d dataSets/OCR.dir/train.prep \ | |
| -f runs/6a.dir/OCR.model --cache_file runs/6a.dir/OCR.cache -k \ | |
| --oaa 26 --adaptive --invariant --holdout_off --loss_function logistic --passes 14 | |
| # Test 6b: OCR predict | |
| run_test 6b -i runs/6a.dir/OCR.model -d dataSets/OCR.dir/test.prep --testonly | |
| fi | |
| build_vendor_windows: | |
| name: core-cli.${{ matrix.os }}.amd64.${{ matrix.build_type }}.msvc.standalone | |
| runs-on: ${{matrix.os}} | |
| strategy: | |
| matrix: | |
| os: ["windows-latest"] | |
| build_type: ["Debug", "Release"] | |
| env: | |
| CMAKE_BUILD_DIR: ${{ github.workspace }}/vw/build | |
| SOURCE_DIR: ${{ github.workspace }}/vw | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| path: 'vw' | |
| submodules: false | |
| - name: Init submodules with retry | |
| shell: bash | |
| working-directory: vw | |
| run: | | |
| git config --global --add safe.directory "$(pwd)" | |
| for attempt in 1 2 3 4 5; do | |
| if git submodule update --init --recursive; then | |
| echo "Submodule init succeeded on attempt $attempt" | |
| exit 0 | |
| fi | |
| echo "Attempt $attempt failed, retrying in 15s..." | |
| sleep 15 | |
| done | |
| echo "Submodule init failed after 5 attempts" | |
| exit 1 | |
| - uses: ilammy/msvc-dev-cmd@v1 | |
| - name: Cache FetchContent downloads | |
| uses: actions/cache@v4 | |
| with: | |
| path: ${{ env.CMAKE_BUILD_DIR }}/_deps | |
| key: fetchcontent-${{ matrix.os }}-${{ hashFiles('vw/cmake/VowpalWabbitUtils.cmake') }} | |
| - name: Configure | |
| run: > | |
| cmake -S "${{ env.SOURCE_DIR }}" -B "${{ env.CMAKE_BUILD_DIR }}" -A "x64" | |
| -DUSE_LATEST_STD=On | |
| -DVW_FEAT_FLATBUFFERS=Off | |
| -DVW_FEAT_CSV=On | |
| -DVW_FEAT_CB_GRAPH_FEEDBACK=On | |
| -DRAPIDJSON_SYS_DEP=Off | |
| -DFMT_SYS_DEP=Off | |
| -DSPDLOG_SYS_DEP=Off | |
| -DVW_ZLIB_SYS_DEP=Off | |
| -DVW_BOOST_MATH_SYS_DEP=Off | |
| -DVW_INSTALL=Off | |
| -DVW_SIMD_INV_SQRT=OFF | |
| -DCMAKE_POLICY_VERSION_MINIMUM=3.5 | |
| - name: Build | |
| run: cmake --build "${{ env.CMAKE_BUILD_DIR }}" --config ${{ matrix.build_type }} | |
| - name: Test run_tests.py | |
| run: python3 ${{ env.SOURCE_DIR }}/test/run_tests.py -f --clean_dirty -E 0.01 --skip_spanning_tree_tests --vw_bin_path ${{ env.CMAKE_BUILD_DIR }}/vowpalwabbit/cli/${{ matrix.build_type }}/vw.exe | |
| - name: Test unit tests | |
| working-directory: ${{ github.workspace }}/vw/build | |
| run: ctest --output-on-failure --no-tests=error --label-regex VWTestList --build-config ${{ matrix.build_type }} --parallel 2 | |
| build_vendor_macos: | |
| runs-on: ${{matrix.os}} | |
| name: core-cli.${{ matrix.os }}.amd64.${{ matrix.build_type }}.AppleClang.standalone | |
| strategy: | |
| matrix: | |
| os: [macos-14] | |
| build_type: [Debug, Release] | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| submodules: false | |
| - name: Init submodules with retry | |
| shell: bash | |
| run: | | |
| git config --global --add safe.directory "$(pwd)" | |
| for attempt in 1 2 3 4 5; do | |
| if git submodule update --init --recursive; then | |
| echo "Submodule init succeeded on attempt $attempt" | |
| exit 0 | |
| fi | |
| echo "Attempt $attempt failed, retrying in 15s..." | |
| sleep 15 | |
| done | |
| echo "Submodule init failed after 5 attempts" | |
| exit 1 | |
| - name: Install dependencies | |
| run: brew install cmake ninja | |
| - name: Cache FetchContent downloads | |
| uses: actions/cache@v4 | |
| with: | |
| path: build/_deps | |
| key: fetchcontent-${{ matrix.os }}-${{ hashFiles('cmake/VowpalWabbitUtils.cmake') }} | |
| - name: Configure | |
| run: > | |
| cmake -S . -B build -G Ninja | |
| -DCMAKE_BUILD_TYPE=${{matrix.build_type}} | |
| -DVW_FEAT_FLATBUFFERS=Off | |
| -DVW_FEAT_CSV=On | |
| -DVW_FEAT_CB_GRAPH_FEEDBACK=On | |
| -DRAPIDJSON_SYS_DEP=Off | |
| -DFMT_SYS_DEP=Off | |
| -DSPDLOG_SYS_DEP=Off | |
| -DVW_ZLIB_SYS_DEP=Off | |
| -DVW_BOOST_MATH_SYS_DEP=Off | |
| -DVW_INSTALL=Off | |
| -DVW_SIMD_INV_SQRT=OFF | |
| -DCMAKE_POLICY_VERSION_MINIMUM=3.5 | |
| - name: Build | |
| run: cmake --build build | |
| - name: Unit tests | |
| working-directory: build | |
| run: ctest --output-on-failure --no-tests=error --label-regex VWTestList --parallel 2 | |
| - name: Test | |
| run: | | |
| python3 test/run_tests.py -f --clean_dirty -E 0.001 |