Test support for alternative conv layout (#25617)
* add bool cwhn = true to conv_2d test cases * add layout check at graph building time * extend layout checks for conv2d.cu kernel * in CPU back-end kernel needs to be stored contiguously to prevent test failures with cwhn=1 * trim white space * do op support check in vulkan backend * fix CI failure and vulkan run-time assert failure by introducing new graph build-time check in ggml_backend_vk_device_supports_op * add additional check in support_op function for Vulkan to fix run-time assert failure
This commit is contained in:
@@ -469,6 +469,8 @@ static bool ggml_backend_cpu_device_supports_op(ggml_backend_dev_t dev, const st
|
|||||||
return (src0->type == GGML_TYPE_F32 ||
|
return (src0->type == GGML_TYPE_F32 ||
|
||||||
((src0->type == GGML_TYPE_F16 || ggml_is_quantized(src0->type)) && src0->ne[2] == src1->ne[2] && src0->ne[3] == src1->ne[3])) &&
|
((src0->type == GGML_TYPE_F16 || ggml_is_quantized(src0->type)) && src0->ne[2] == src1->ne[2] && src0->ne[3] == src1->ne[3])) &&
|
||||||
src1->type == GGML_TYPE_F32 && op->type == GGML_TYPE_F32;
|
src1->type == GGML_TYPE_F32 && op->type == GGML_TYPE_F32;
|
||||||
|
case GGML_OP_CONV_2D:
|
||||||
|
return ggml_is_contiguous(op->src[0]);
|
||||||
default:
|
default:
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -126,6 +126,7 @@ void ggml_cuda_op_conv2d(ggml_backend_cuda_context & ctx, ggml_tensor * dst) {
|
|||||||
const float * X_D = (const float *) input->data;
|
const float * X_D = (const float *) input->data;
|
||||||
float * Y_D = (float *) dst->data;
|
float * Y_D = (float *) dst->data;
|
||||||
|
|
||||||
|
GGML_ASSERT(ggml_is_contiguous(input));
|
||||||
GGML_ASSERT(ggml_is_contiguous(kernel));
|
GGML_ASSERT(ggml_is_contiguous(kernel));
|
||||||
GGML_ASSERT(kernel->type == GGML_TYPE_F16 || kernel->type == GGML_TYPE_F32);
|
GGML_ASSERT(kernel->type == GGML_TYPE_F16 || kernel->type == GGML_TYPE_F32);
|
||||||
|
|
||||||
|
|||||||
@@ -5105,7 +5105,7 @@ static bool ggml_backend_cuda_device_supports_op(ggml_backend_dev_t dev, const g
|
|||||||
case GGML_OP_IM2COL:
|
case GGML_OP_IM2COL:
|
||||||
case GGML_OP_IM2COL_3D:
|
case GGML_OP_IM2COL_3D:
|
||||||
case GGML_OP_CONV_2D:
|
case GGML_OP_CONV_2D:
|
||||||
return true;
|
return (ggml_is_contiguous(op->src[0]) && ggml_is_contiguous(op->src[1]));
|
||||||
case GGML_OP_CONV_2D_DW:
|
case GGML_OP_CONV_2D_DW:
|
||||||
return op->src[0]->type == GGML_TYPE_F32;
|
return op->src[0]->type == GGML_TYPE_F32;
|
||||||
case GGML_OP_CONV_TRANSPOSE_2D:
|
case GGML_OP_CONV_TRANSPOSE_2D:
|
||||||
|
|||||||
@@ -18016,10 +18016,17 @@ static bool ggml_backend_vk_device_supports_op(ggml_backend_dev_t dev, const ggm
|
|||||||
case GGML_OP_CONV_2D:
|
case GGML_OP_CONV_2D:
|
||||||
case GGML_OP_CONV_TRANSPOSE_2D:
|
case GGML_OP_CONV_TRANSPOSE_2D:
|
||||||
{
|
{
|
||||||
|
const bool transpose = op->op == GGML_OP_CONV_TRANSPOSE_2D;
|
||||||
|
const int64_t cout = !transpose ? op->src[0]->ne[3] : op->src[0]->ne[2];
|
||||||
|
const int64_t cin = !transpose ? op->src[0]->ne[2] : op->src[0]->ne[3];
|
||||||
|
|
||||||
// Channel-contiguous format is not supported yet.
|
// Channel-contiguous format is not supported yet.
|
||||||
return ((op->src[0]->type == GGML_TYPE_F32 || op->src[0]->type == GGML_TYPE_F16) &&
|
return ((op->src[0]->type == GGML_TYPE_F32 || op->src[0]->type == GGML_TYPE_F16) &&
|
||||||
|
(op->src[0]->nb[0] == sizeof(float) || op->src[0]->nb[0] == sizeof(ggml_fp16_t) ) &&
|
||||||
op->src[1]->type == GGML_TYPE_F32 &&
|
op->src[1]->type == GGML_TYPE_F32 &&
|
||||||
op->type == GGML_TYPE_F32 &&
|
op->type == GGML_TYPE_F32 &&
|
||||||
|
cout == op->ne[2] &&
|
||||||
|
cin == op->src[1]->ne[2] &&
|
||||||
ggml_is_contiguous(op->src[0]) &&
|
ggml_is_contiguous(op->src[0]) &&
|
||||||
ggml_is_contiguous(op->src[1]) &&
|
ggml_is_contiguous(op->src[1]) &&
|
||||||
ggml_is_contiguous(op));
|
ggml_is_contiguous(op));
|
||||||
|
|||||||
@@ -8329,7 +8329,11 @@ static std::vector<std::unique_ptr<test_case>> make_test_cases_eval() {
|
|||||||
test_cases.emplace_back(new test_conv_2d(
|
test_cases.emplace_back(new test_conv_2d(
|
||||||
{ act_case[iwh_idx], act_case[iwh_idx], act_case[Cin_idx], act_case[B_idx] },
|
{ act_case[iwh_idx], act_case[iwh_idx], act_case[Cin_idx], act_case[B_idx] },
|
||||||
{ act_case[kwh_idx], act_case[kwh_idx], act_case[Cin_idx], act_case[Cout_idx] },
|
{ act_case[kwh_idx], act_case[kwh_idx], act_case[Cin_idx], act_case[Cout_idx] },
|
||||||
kernel_type, 1, 1, 0, 0, 1, 1, false));
|
kernel_type, 1, 1, 0, 0, 1, 1, false)); // bool cwhn = false
|
||||||
|
test_cases.emplace_back(new test_conv_2d(
|
||||||
|
{ act_case[iwh_idx], act_case[iwh_idx], act_case[Cin_idx], act_case[B_idx] },
|
||||||
|
{ act_case[kwh_idx], act_case[kwh_idx], act_case[Cin_idx], act_case[Cout_idx] },
|
||||||
|
kernel_type, 1, 1, 0, 0, 1, 1, true)); // bool cwhn = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -8358,7 +8362,9 @@ static std::vector<std::unique_ptr<test_case>> make_test_cases_eval() {
|
|||||||
calc_conv_output_size(H, KH, s1, p1, d1) > 0) {
|
calc_conv_output_size(H, KH, s1, p1, d1) > 0) {
|
||||||
for (auto kernel_type : {GGML_TYPE_F32, GGML_TYPE_F16}) {
|
for (auto kernel_type : {GGML_TYPE_F32, GGML_TYPE_F16}) {
|
||||||
test_cases.emplace_back(new test_conv_2d(
|
test_cases.emplace_back(new test_conv_2d(
|
||||||
{ W, H, Cin, 2 }, { KW, KH, Cin, Cout }, kernel_type, s0, s1, p0, p1, d0, d1, false));
|
{ W, H, Cin, 2 }, { KW, KH, Cin, Cout }, kernel_type, s0, s1, p0, p1, d0, d1, false)); // bool cwhn = false
|
||||||
|
test_cases.emplace_back(new test_conv_2d(
|
||||||
|
{ W, H, Cin, 2 }, { KW, KH, Cin, Cout }, kernel_type, s0, s1, p0, p1, d0, d1, true)); // bool cwhn = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -8370,7 +8376,8 @@ static std::vector<std::unique_ptr<test_case>> make_test_cases_eval() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (auto kernel_type : {GGML_TYPE_F32, GGML_TYPE_F16}) {
|
for (auto kernel_type : {GGML_TYPE_F32, GGML_TYPE_F16}) {
|
||||||
test_cases.emplace_back(new test_conv_2d({ 256, 256, 192, 1 }, { 3, 3, 192, 96 }, kernel_type, 1, 1, 1, 1, 1, 1, false));
|
test_cases.emplace_back(new test_conv_2d({ 256, 256, 192, 1 }, { 3, 3, 192, 96 }, kernel_type, 1, 1, 1, 1, 1, 1, false)); // bool cwhn = false
|
||||||
|
test_cases.emplace_back(new test_conv_2d({ 256, 256, 192, 1 }, { 3, 3, 192, 96 }, kernel_type, 1, 1, 1, 1, 1, 1, true)); // bool cwhn = true
|
||||||
}
|
}
|
||||||
|
|
||||||
// sycl backend will limit task global_range < MAX_INT
|
// sycl backend will limit task global_range < MAX_INT
|
||||||
@@ -9757,7 +9764,11 @@ static std::vector<std::unique_ptr<test_case>> make_test_cases_perf() {
|
|||||||
test_cases.emplace_back(new test_conv_2d(
|
test_cases.emplace_back(new test_conv_2d(
|
||||||
{ act_case[iwh_idx], act_case[iwh_idx], act_case[Cin_idx], act_case[B_idx] },
|
{ act_case[iwh_idx], act_case[iwh_idx], act_case[Cin_idx], act_case[B_idx] },
|
||||||
{ act_case[kwh_idx], act_case[kwh_idx], act_case[Cin_idx], act_case[Cout_idx] },
|
{ act_case[kwh_idx], act_case[kwh_idx], act_case[Cin_idx], act_case[Cout_idx] },
|
||||||
kernel_type, 1, 1, 0, 0, 1, 1, false));
|
kernel_type, 1, 1, 0, 0, 1, 1, false)); // bool cwhn = false
|
||||||
|
test_cases.emplace_back(new test_conv_2d(
|
||||||
|
{ act_case[iwh_idx], act_case[iwh_idx], act_case[Cin_idx], act_case[B_idx] },
|
||||||
|
{ act_case[kwh_idx], act_case[kwh_idx], act_case[Cin_idx], act_case[Cout_idx] },
|
||||||
|
kernel_type, 1, 1, 0, 0, 1, 1, true)); // bool cwhn = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user