message: avoid CHECK in op_level_cost_estimator, silently fallback.
diff: @@ -139,8 +139,9 @@ bool IsTraining(const OpInfo& op_info) {
  std::vector<int64> GetStrides(const OpInfo& op_info) {
  if (op_info.attr().find("strides") != op_info.attr().end()) {
  const auto strides = op_info.attr().at("strides").list().i();
  - CHECK(strides.size() == 4)
  + DCHECK(strides.size() == 4)
  << "Attr strides is not a length-4 vector: " << op_info.DebugString();
  + if (strides.size() != 4) return {1, 1, 1, 1};
  return {strides[0], strides[1], strides[2], strides[3]};
  }
  return {1, 1, 1, 1};
  @@ -149,8 +150,9 @@ std::vector<int64> GetStrides(const OpInfo& op_info) {
  std::vector<int64> GetKernelSize(const OpInfo& op_info) {
  if (op_info.attr().find("ksize") != op_info.attr().end()) {
  const auto ksize = op_info.attr().at("ksize").list().i();
  - CHECK(ksize.size() == 4)
  + DCHECK(ksize.size() == 4)
  << "Attr ksize is not a length-4 vector: " << op_info.DebugString();
  + if (ksize.size() != 4) return {1, 1, 1, 1};
  return {ksize[0], ksize[1], ksize[2], ksize[3]};
  }
  // Note that FusedBatchNorm doesn't have ksize attr, but GetKernelSize returns
  @@ -741,9 +743,12 @@ OpLevelCostEstimator::ConvolutionDimensionsFromInputs(
  // Only check equality when both sizes are known (in other words, when
  // neither is set to a minimum dimension size of 1).
  if (iz != 1 && kz != 1) {
  - CHECK_EQ(iz % kz, 0) << "Input channel " << iz
  + DCHECK_EQ(iz % kz, 0) << "Input channel " << iz
  << " is not a multiple of filter channel " << kz
  << ".";
  + if (iz % kz) {
  + *found_unknown_shapes = true;
  + }
  } else {
  iz = kz = std::max<int64>(iz, kz);
  }
  