Skip to content
Permalink
Browse files

Register backend-parameterized tests inside lib/Backends (#3476)

Summary:
This diff shows a possible approach to moving our backend parameterization of tests into lib/Backends.

The basic problem we're trying to solve is that vendors maintaining private backends may want to use, e.g., the OperatorTest suite to verify conformance, but currently the "ENABLED_BACKENDS" mechanism requires us to list each supported backend, for each test, in the source code.  Obviously, MyStealthModeStartup is not going to want that name appearing in the open-source operator test, so they've got to maintain a private, forked version of OperatorTest that enables all the tests relevant to their architecture.

By moving the parameterization into lib/Backends/*, we just have a test consisting of a simple source file listing the instantiated test cases, e.g.,
```
INSTANTIATE_GLOW_BACKEND_TEST(MyStealthModeStartup, OperatorTest, Conv2D);
```

Obviously the provided test `NewTest` is just a sample that wouldn't land; I ripped one of the cases out of OperatorTest for ease of editing.

I'll say:
- There's a bit more ceremony involved than I'd strictly like (mostly because the CMake lib list is pretty unwieldy).
- It feels odd to define all the tests in a header file, and put just the instantiates in a .cpp file.  I couldn't see a good way around this, though, since gtest requires you to instantiate entire test suites, rather than individual tests, and we need finer-grain control over test enablement.
- I don't love making the include path start with "tests/", maybe there's some way around this.
Pull Request resolved: #3476

Test Plan: eventually, run all the tests.

Reviewed By: rdzhabarov

Differential Revision: D17215560

Pulled By: bertmaher

fbshipit-source-id: 5562b9725e6489d624508eb68594af289eacfe7f
  • Loading branch information...
bertmaher authored and facebook-github-bot committed Sep 11, 2019
1 parent fc9d1b1 commit d12d6d09b6ab994df271231f5c4a5bab44c3dae5
Showing with 2,253 additions and 566 deletions.
  1. +2 −0 CMakeLists.txt
  2. +11 −0 cmake/modules/FindBackends.cmake
  3. +30 −0 cmake/modules/GlowTestSupport.cmake
  4. +26 −1 docs/Backends.md
  5. +20 −0 lib/Backends/CPU/tests/CPUBackendCorrectnessTest.cpp
  6. +20 −0 lib/Backends/CPU/tests/CPUBackendTest.cpp
  7. +20 −0 lib/Backends/CPU/tests/CPUDeviceManagerTest.cpp
  8. +23 −0 lib/Backends/CPU/tests/CPUGradCheckTest.cpp
  9. +20 −0 lib/Backends/CPU/tests/CPUGraphOptzTest.cpp
  10. +20 −0 lib/Backends/CPU/tests/CPUMLTest.cpp
  11. +20 −0 lib/Backends/CPU/tests/CPUOperatorGradTest.cpp
  12. +153 −0 lib/Backends/CPU/tests/CPUOperatorTest.cpp
  13. +20 −0 lib/Backends/CPU/tests/CPUQuantizationTest.cpp
  14. +33 −0 lib/Backends/CPU/tests/CPURecommendationSystemTest.cpp
  15. +20 −0 lib/Backends/CPU/tests/CPUTraceEventsTest.cpp
  16. +20 −0 lib/Backends/CPU/tests/CPUTypeAToTypeBFunctionConverterTest.cpp
  17. +29 −0 lib/Backends/Habana/tests/HabanaBackendCorrectnessTest.cpp
  18. +20 −0 lib/Backends/Habana/tests/HabanaBackendTest.cpp
  19. +20 −0 lib/Backends/Habana/tests/HabanaDeviceManagerTest.cpp
  20. +30 −0 lib/Backends/Habana/tests/HabanaGradCheckTest.cpp
  21. +20 −0 lib/Backends/Habana/tests/HabanaGraphOptzTest.cpp
  22. +39 −0 lib/Backends/Habana/tests/HabanaMLTest.cpp
  23. +22 −0 lib/Backends/Habana/tests/HabanaOperatorGradTest.cpp
  24. +292 −0 lib/Backends/Habana/tests/HabanaOperatorTest.cpp
  25. +20 −0 lib/Backends/Habana/tests/HabanaQuantizationTest.cpp
  26. +36 −0 lib/Backends/Habana/tests/HabanaRecommendationSystemTest.cpp
  27. +31 −0 lib/Backends/Habana/tests/HabanaTraceEventsTest.cpp
  28. +20 −0 lib/Backends/Habana/tests/HabanaTypeAToTypeBFunctionConverterTest.cpp
  29. +20 −0 lib/Backends/Interpreter/tests/InterpreterBackendCorrectnessTest.cpp
  30. +20 −0 lib/Backends/Interpreter/tests/InterpreterBackendTest.cpp
  31. +20 −0 lib/Backends/Interpreter/tests/InterpreterDeviceManagerTest.cpp
  32. +20 −0 lib/Backends/Interpreter/tests/InterpreterGradCheckTest.cpp
  33. +20 −0 lib/Backends/Interpreter/tests/InterpreterGraphOptzTest.cpp
  34. +20 −0 lib/Backends/Interpreter/tests/InterpreterMLTest.cpp
  35. +20 −0 lib/Backends/Interpreter/tests/InterpreterOperatorGradTest.cpp
  36. +20 −0 lib/Backends/Interpreter/tests/InterpreterOperatorTest.cpp
  37. +20 −0 lib/Backends/Interpreter/tests/InterpreterQuantizationTest.cpp
  38. +20 −0 lib/Backends/Interpreter/tests/InterpreterRecommendationSystemTest.cpp
  39. +20 −0 lib/Backends/Interpreter/tests/InterpreterTraceEventsTest.cpp
  40. +20 −0 lib/Backends/Interpreter/tests/InterpreterTypeAToTypeBFunctionConverterTest.cpp
  41. +25 −0 lib/Backends/OpenCL/tests/OpenCLBackendCorrectnessTest.cpp
  42. +20 −0 lib/Backends/OpenCL/tests/OpenCLBackendTest.cpp
  43. +20 −0 lib/Backends/OpenCL/tests/OpenCLDeviceManagerTest.cpp
  44. +24 −0 lib/Backends/OpenCL/tests/OpenCLGradCheckTest.cpp
  45. +20 −0 lib/Backends/OpenCL/tests/OpenCLGraphOptzTest.cpp
  46. +22 −0 lib/Backends/OpenCL/tests/OpenCLMLTest.cpp
  47. +20 −0 lib/Backends/OpenCL/tests/OpenCLOperatorGradTest.cpp
  48. +250 −0 lib/Backends/OpenCL/tests/OpenCLOperatorTest.cpp
  49. +20 −0 lib/Backends/OpenCL/tests/OpenCLQuantizationTest.cpp
  50. +40 −0 lib/Backends/OpenCL/tests/OpenCLRecommendationSystemTest.cpp
  51. +20 −0 lib/Backends/OpenCL/tests/OpenCLTraceEventsTest.cpp
  52. +20 −0 lib/Backends/OpenCL/tests/OpenCLTypeAToTypeBFunctionConverterTest.cpp
  53. +1 −0 tests/Testing/CMakeLists.txt
  54. +38 −25 tests/unittests/BackendCorrectnessTest.cpp
  55. +14 −22 tests/unittests/BackendTest.cpp
  56. +22 −0 tests/unittests/BackendTestUtils.h
  57. +22 −147 tests/unittests/CMakeLists.txt
  58. +2 −14 tests/unittests/DeviceManagerTest.cpp
  59. +41 −30 tests/unittests/GradCheckTest.cpp
  60. 0 tests/unittests/{HabanaBackendTest.cpp → HabanaGlowTest.cpp}
  61. +32 −20 tests/unittests/MLTest.cpp
  62. +4 −4 tests/unittests/OperatorGradTest.cpp
  63. +259 −260 tests/unittests/OperatorTest.cpp
  64. +22 −22 tests/unittests/RecommendationSystemTest.cpp
  65. +15 −10 tests/unittests/TraceEventsTest.cpp
  66. +3 −11 tests/unittests/TypeAToTypeBFunctionConverterTest.cpp
@@ -53,6 +53,8 @@ include(GlowExternalBackends)
include(SanitizerSupport)
include(CoverageSupport)
include(DoxygenSupport)
include(FindBackends)

configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules/CMakeGraphVizOptions.cmake
${CMAKE_CURRENT_BINARY_DIR}/CMakeGraphVizOptions.cmake COPYONLY)

@@ -0,0 +1,11 @@
set(GLOW_BACKENDS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/lib/Backends")
file(GLOB subdirs RELATIVE "${GLOW_BACKENDS_DIR}" "${GLOW_BACKENDS_DIR}/*")
foreach(object ${subdirs})
if(IS_DIRECTORY "${GLOW_BACKENDS_DIR}/${object}")
set(backendEnabled "GLOW_WITH_${object}")
string(TOUPPER "${backendEnabled}" backendEnabled)
if(NOT DEFINED ${backendEnabled} OR ${backendEnabled})
list(APPEND GLOW_BACKENDS "${object}")
endif()
endif()
endforeach()
@@ -54,3 +54,33 @@ function(add_glow_test)
set_property(TEST ${ARG_NAME} PROPERTY LABELS EXPENSIVE)
endif()
endfunction()

# Adds a backend-parameterized test. These tests can be instantiated for any
# backend present in lib/Backends, and allow similar functionality to easily be
# tested across all defined backends.
function(add_backend_test)
set(options UNOPT EXPENSIVE)
set(oneValueArgs BACKEND TEST)
set(multiValueArgs PRIVATE)
cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
set(test "${ARG_BACKEND}${ARG_TEST}")
set(SOURCES "${ARG_TEST}.cpp")
set(BLACKLIST_SOURCE "${GLOW_BACKENDS_DIR}/${ARG_BACKEND}/tests/${test}.cpp")
if(NOT EXISTS ${BLACKLIST_SOURCE})
return()
endif()
list(APPEND SOURCES ${BLACKLIST_SOURCE})
add_executable("${test}" ${SOURCES})
target_compile_definitions("${test}" PRIVATE -DGLOW_TEST_BACKEND=${ARG_BACKEND})
target_link_libraries("${test}"
PRIVATE BackendTestUtils TestMain ${ARG_PRIVATE})
if(${ARG_EXPENSIVE})
set(ARG_EXPENSIVE EXPENSIVE)
else()
set(ARG_EXPENSIVE)
endif()
add_glow_test("${test}" ${ARG_EXPENSIVE} ${GLOW_BINARY_DIR}/tests/${test} --gtest_output=xml:${test}.xml )
if(${ARG_UNOPT})
list(APPEND UNOPT_TESTS ./tests/${test} -optimize-ir=false &&)
endif()
endfunction()
@@ -214,6 +214,31 @@ The `tools/ClassGen/Backends/CPU/CPUSpecificNodes.h` and
`tools/ClassGen/Backends/CPU/CPUSpecificInstrs.h` files are included in
`tools/ClassGen/NodeGen.cpp` and `tools/ClassGen/InstrGen.cpp`, respectively.

#### Backend Parameterized Tests

Glow provides several test suites that are parameterized by backend. An
example of such a suite is `tests/unittests/OperatorTest.cpp`, which defines
small tests of Glow operators. These tests can be executed against any backend
to check compliance.

These tests will only be run for a backend if a corresponding
`lib/Backends/$BACKEND/tests` directory is found and contains a corresponding
`${BACKEND}${TEST}.cpp` file containing a blacklist definition, e.g.:
```
std::set<std::string> glow::backendTestBlacklist = {};
```

This blacklist can be used to exclude any unsupported tests while a backend is
a work-in-progress. See the Interpreter and CPU backends for examples of
setting up and using these tests. To bootstrap a blacklist, we recommend using
a simple shell script to check which tests already work:
```
for test in $(tests/ExampleBackendOperatorTest --gtest_list_tests); do
if ! tests/ExampleBackendOperatorTest --gtest_filter="$test" >& /dev/null; then
echo $test
fi
done
```

#### External backends

@@ -223,4 +248,4 @@ An external backend is provided as a single source directory. It can then be dev

The external backend mechanism is for instance convenient for adding closed source backends to Glow.

The structure of external backends is defined [here](https://github.com/pytorch/glow/blob/master/docs/ExternalBackend.md).
The structure of external backends is defined [here](https://github.com/pytorch/glow/blob/master/docs/ExternalBackend.md).
@@ -0,0 +1,20 @@
/**
* Copyright (c) 2017-present, Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "tests/unittests/BackendTestUtils.h"

using namespace glow;

std::set<std::string> glow::backendTestBlacklist = {};
@@ -0,0 +1,20 @@
/**
* Copyright (c) 2017-present, Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "tests/unittests/BackendTestUtils.h"

using namespace glow;

std::set<std::string> glow::backendTestBlacklist = {};
@@ -0,0 +1,20 @@
/**
* Copyright (c) 2017-present, Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "tests/unittests/BackendTestUtils.h"

using namespace glow;

std::set<std::string> glow::backendTestBlacklist = {};
@@ -0,0 +1,23 @@
/**
* Copyright (c) 2017-present, Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "tests/unittests/BackendTestUtils.h"

using namespace glow;

std::set<std::string> glow::backendTestBlacklist = {
"gradientCheckAdaptiveAvgPool/0",
"gradientCheckCrossEntropyLoss/0",
};
@@ -0,0 +1,20 @@
/**
* Copyright (c) 2017-present, Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "tests/unittests/BackendTestUtils.h"

using namespace glow;

std::set<std::string> glow::backendTestBlacklist = {};
@@ -0,0 +1,20 @@
/**
* Copyright (c) 2017-present, Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "tests/unittests/BackendTestUtils.h"

using namespace glow;

std::set<std::string> glow::backendTestBlacklist = {};
@@ -0,0 +1,20 @@
/**
* Copyright (c) 2017-present, Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "tests/unittests/BackendTestUtils.h"

using namespace glow;

std::set<std::string> glow::backendTestBlacklist = {};
@@ -0,0 +1,153 @@
/**
* Copyright (c) 2017-present, Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "tests/unittests/BackendTestUtils.h"

using namespace glow;

std::set<std::string> glow::backendTestBlacklist = {
"less_float16Cases/0",
"less_int64Cases/0",
"ResizeNearest_Float/0",
"ResizeNearest_Float16/0",
"ResizeNearest_Int8/0",
"ResizeNearest_Int16/0",
"ResizeNearest_Int32/0",
"replaceNaN_Float16/0",
"Logit_Float16/0",
"FP16Add/0",
"FP16Matmul/0",
"batchedReduceAdd_Float16/0",
"batchedReduceZeroDimResult_Float16/0",
"batchedReduceAddWithAxis_Float16/0",
"ReluSimple_Float16/0",
"PReluSimple_Float16/0",
"GatherDataFloat16IdxInt32/0",
"GatherDataFloat16IdxInt64/0",
"GatherRangesDataFloat16IdxInt32/0",
"GatherRangesDataFloat16IdxInt64/0",
"FP16Transpose2Dims/0",
"Transpose3Dims_Float16/0",
"ArithAdd_int32_t/0",
"ArithAdd_int64_t/0",
"ArithAdd_float16_t/0",
"ArithSub_int32_t/0",
"ArithSub_int64_t/0",
"ArithSub_float16_t/0",
"ArithMul_int32_t/0",
"ArithMul_int64_t/0",
"ArithMul_float16_t/0",
"ArithMax_int32_t/0",
"ArithMax_int64_t/0",
"ArithMax_float16_t/0",
"ArithMin_int32_t/0",
"ArithMin_int64_t/0",
"ArithMin_float16_t/0",
"convTest_Float16/0",
"FP16Max/0",
"concatVectors_Int32/0",
"concatVectors_Float16/0",
"concatVectorsRepeated_Int32/0",
"concatVectorsRepeated_Float16/0",
"sliceVectors_Float16/0",
"sliceConcatVectors_Float16/0",
"ExpandDims_Float16/0",
"Split_Float16/0",
"Fp16Splat/0",
"GroupConv3D/0",
"NonCubicPaddingConv3D/0",
"FP16AvgPool/0",
"AdaptiveAvgPool/0",
"FP16AdaptiveAvgPool/0",
"Int8AdaptiveAvgPool/0",
"AdaptiveAvgPoolNonSquare/0",
"FP16MaxPool/0",
"NonCubicKernelConv3D/0",
"NonCubicKernelConv3DQuantized/0",
"NonCubicStrideConv3D/0",
"FP16BatchAdd/0",
"Sigmoid_Float16/0",
"testBatchAdd_Float16/0",
"SparseLengthsSum_Float16/0",
"SparseLengthsSumI8/0",
"SparseLengthsWeightedSum_1D_Float16/0",
"SparseLengthsWeightedSum_2D_Float16/0",
"SparseLengthsWeightedSumI8/0",
"RowwiseQuantizedSparseLengthsWeightedSum_Float16_AccumFloat/0",
"RowwiseQuantizedSparseLengthsWeightedSum_Float16_AccumFloat16/0",
"RowwiseQuantizedSparseLengthsSum_Float16_AccumFloat/0",
"RowwiseQuantizedSparseLengthsSum_Float16_AccumFloat16/0",
"FusedRowwiseQuantizedSparseLengthsWeightedSum_Float16_AccumFloat/0",
"FusedRowwiseQuantizedSparseLengthsWeightedSum_Float16_AccumFloat16/0",
"FusedRowwiseQuantizedSparseLengthsWeightedSum_ConvertedFloat16/0",
"FusedRowwiseQuantizedSparseLengthsSum_Float16_AccumFloat/0",
"FusedRowwiseQuantizedSparseLengthsSum_Float16_AccumFloat16/0",
"SparseToDenseMask1/0",
"SparseToDenseMask2/0",
"FP16Reshape/0",
"sliceReshape_Float16/0",
"Flatten_Float16Ty/0",
"Bucketize/0",
"FP16SoftMax/0",
"BatchOneHotDataFloat/0",
"BatchOneHotDataFloat16/0",
"BatchOneHotDataInt64/0",
"BatchOneHotDataInt32/0",
"BatchOneHotDataInt8/0",
"dotProduct1D_Float16/0",
"dotProduct2D_Float16/0",
"BatchBoxCox_Float/0",
"BatchBoxCox_Float16/0",
"ConvertFrom_FloatTy_To_Float16Ty/0",
"ConvertFrom_FloatTy_To_Int32ITy/0",
"ConvertFrom_FloatTy_To_Int64ITy/0",
"ConvertFrom_Float16Ty_To_FloatTy/0",
"ConvertFrom_Float16Ty_To_Float16Ty/0",
"ConvertFrom_Float16Ty_To_Int32ITy/0",
"ConvertFrom_Float16Ty_To_Int64ITy/0",
"ConvertFrom_Int32ITy_To_FloatTy/0",
"ConvertFrom_Int32ITy_To_Float16Ty/0",
"ConvertFrom_Int32ITy_To_Int64ITy/0",
"ConvertFrom_Int64ITy_To_FloatTy/0",
"ConvertFrom_Int64ITy_To_Float16Ty/0",
"ConvertFrom_Int64ITy_To_Int32ITy/0",
"ConvertFrom_FloatTy_To_Float16Ty_AndBack/0",
"ConvertFrom_FloatTy_To_Int32ITy_AndBack/0",
"ConvertFrom_FloatTy_To_Int64ITy_AndBack/0",
"ConvertFrom_Float16Ty_To_FloatTy_AndBack/0",
"ConvertFrom_Float16Ty_To_Float16Ty_AndBack/0",
"ConvertFrom_Float16Ty_To_Int32ITy_AndBack/0",
"ConvertFrom_Float16Ty_To_Int64ITy_AndBack/0",
"ConvertFrom_Int32ITy_To_FloatTy_AndBack/0",
"ConvertFrom_Int32ITy_To_Float16Ty_AndBack/0",
"ConvertFrom_Int64ITy_To_FloatTy_AndBack/0",
"ConvertFrom_Int64ITy_To_Float16Ty_AndBack/0",
"ConvertFrom_Int64ITy_To_Int32ITy_AndBack/0",
"BasicDivNetFloatVsInt8/0",
"BasicAddNetFloatVsFloat16/0",
"BasicSubNetFloatVsFloat16/0",
"BasicMulNetFloatVsFloat16/0",
"BasicDivNetFloatVsFloat16/0",
"BasicMaxNetFloatVsFloat16/0",
"BasicMinNetFloatVsFloat16/0",
"Int16ConvolutionDepth10/0",
"Int16ConvolutionDepth8/0",
"FP16ConvolutionDepth10/0",
"FP16ConvolutionDepth8/0",
"FC_Float16/0",
"Tanh_Float16/0",
"Exp_Float16/0",
"rowwiseQuantizedSLWSTest/0",
};

0 comments on commit d12d6d0

Please sign in to comment.
You can’t perform that action at this time.