diff --git a/oneflow/core/framework/user_op_registry.h b/oneflow/core/framework/user_op_registry.h
index 0bd9fd3ff27923688ed4c3d3eeec3831f4605af5..fa91c65370987549988d2a2564a32c153b63e58a 100644
--- a/oneflow/core/framework/user_op_registry.h
+++ b/oneflow/core/framework/user_op_registry.h
@@ -52,7 +52,8 @@ using InputArgModifyFn = std::function<void(GetInputArgModifier, const UserOpCon
 using OutputArgModifier = OutputBlobModifier;
 using GetOutputArgModifier =
     std::function<OutputArgModifier*(const std::string& out_arg_name, int32_t out_arg_index)>;
-using OutputArgModifyFn = std::function<void(GetOutputArgModifier, const UserOpConfWrapper&)>;
+using OutputArgModifyFn =
+    std::function<Maybe<void>(GetOutputArgModifier, const UserOpConfWrapper&)>;
 using OutputBlobTimeShapeInferFn = std::function<Maybe<void>(InferOutputBlobTimeShapeFnContext*)>;
 using ParallelDistributionInferFn = std::function<Maybe<void>(InferParallelDistributionFnContext*)>;
 
diff --git a/oneflow/core/operator/acc_tick_op.cpp b/oneflow/core/operator/acc_tick_op.cpp
index e8afe83eba8b6bc68f99f3bf42bd66801b86b77d..f36b433e6ea74cad89816d4e70986e1300f005b6 100644
--- a/oneflow/core/operator/acc_tick_op.cpp
+++ b/oneflow/core/operator/acc_tick_op.cpp
@@ -27,11 +27,12 @@ Maybe<void> InferBlobDescs(const std::function<BlobDesc*(const std::string&)>& G
 
 }  // namespace
 
-void AccTickOp::InitFromOpConf() {
+Maybe<void> AccTickOp::InitFromOpConf() {
   CHECK(op_conf().has_acc_tick_conf());
 
   EnrollInputBn("one", false);
   EnrollOutputBn("acc", false);
+  return Maybe<void>::Ok();
 }
 
 Maybe<void> AccTickOp::InferLogicalOutBlobDescs(
diff --git a/oneflow/core/operator/acc_tick_op.h b/oneflow/core/operator/acc_tick_op.h
index 27bb3bbe2d488727df858622d88c97c1f7a11c72..1bc1cb16d2582c0296a82562837b89e1202781d0 100644
--- a/oneflow/core/operator/acc_tick_op.h
+++ b/oneflow/core/operator/acc_tick_op.h
@@ -26,7 +26,7 @@ class AccTickOp final : public Operator {
   AccTickOp() = default;
   ~AccTickOp() = default;
 
-  void InitFromOpConf() override;
+  Maybe<void> InitFromOpConf() override;
 
   Maybe<void> InferLogicalOutBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& BlobDesc4BnInOp,
diff --git a/oneflow/core/operator/assign_op.cpp b/oneflow/core/operator/assign_op.cpp
index 927669b9f2640febe740240eb877cb3b5ab2f988..963d09c862b0cdce75aa0fa95fbab3c352ecaf42 100644
--- a/oneflow/core/operator/assign_op.cpp
+++ b/oneflow/core/operator/assign_op.cpp
@@ -23,7 +23,7 @@ class AssignOp final : public Operator {
   AssignOp() = default;
   ~AssignOp() override = default;
 
-  void InitFromOpConf() override;
+  Maybe<void> InitFromOpConf() override;
   Maybe<void> InferLogicalOutBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& BlobDesc4BnInOp,
       const ParallelDesc& parallel_desc) const override;
@@ -37,10 +37,11 @@ class AssignOp final : public Operator {
       cfg::SbpSignatureList* sbp_sig_list) const override;
 };
 
-void AssignOp::InitFromOpConf() {
+Maybe<void> AssignOp::InitFromOpConf() {
   CHECK(op_conf().has_assign_conf());
   EnrollInputBn("ref")->set_is_mutable(true);
   EnrollInputBn("value");
+  return Maybe<void>::Ok();
 }
 
 std::string DebugString(const BlobDesc& blob_desc) {
diff --git a/oneflow/core/operator/boxing_identity_op.cpp b/oneflow/core/operator/boxing_identity_op.cpp
index dd4c44d973f838f85b08b30e138681f5823ba017..9e26e519a1c11fe575a29e4dd75408f0d58a2904 100644
--- a/oneflow/core/operator/boxing_identity_op.cpp
+++ b/oneflow/core/operator/boxing_identity_op.cpp
@@ -25,7 +25,7 @@ class BoxingIdentityOp : public Operator {
   BoxingIdentityOp() = default;
   ~BoxingIdentityOp() override = default;
 
-  void InitFromOpConf() override;
+  Maybe<void> InitFromOpConf() override;
   Maybe<void> InferLogicalOutBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& BlobDesc4BnInOp,
       const ParallelDesc& parallel_desc) const override {
@@ -40,9 +40,10 @@ class BoxingIdentityOp : public Operator {
   LogicalBlobId lbi4obn(const std::string& output_bn) const override;
 };
 
-void BoxingIdentityOp::InitFromOpConf() {
+Maybe<void> BoxingIdentityOp::InitFromOpConf() {
   EnrollInputBn("in", false);
   EnrollOutputBn("out", false);
+  return Maybe<void>::Ok();
 }
 
 LogicalBlobId BoxingIdentityOp::lbi4ibn(const std::string& input_bn) const {
diff --git a/oneflow/core/operator/boxing_op.cpp b/oneflow/core/operator/boxing_op.cpp
index 15c4a343cd746bb644b36826b56db16ffa471b21..b2d74623ed30f8ff0b9c663dab9449750c36d875 100644
--- a/oneflow/core/operator/boxing_op.cpp
+++ b/oneflow/core/operator/boxing_op.cpp
@@ -42,7 +42,7 @@ void BoxingOp::VirtualGenKernelConf(
   EraseEmptyBnInVec(GetBlobDesc4BnInOp, op_attribute->mutable_output_bns());
 }
 
-void BoxingOp::InitFromOpConf() {
+Maybe<void> BoxingOp::InitFromOpConf() {
   CHECK(op_conf().has_boxing_conf());
   const BoxingOpConf& boxing_conf = op_conf().boxing_conf();
 
@@ -56,6 +56,7 @@ void BoxingOp::InitFromOpConf() {
   for (int32_t i = 0; i < boxing_conf.out_num(); ++i) {
     EnrollOutputBn("out_" + std::to_string(i), false);
   }
+  return Maybe<void>::Ok();
 }
 
 LogicalBlobId BoxingOp::lbi4ibn(const std::string& input_bn) const {
diff --git a/oneflow/core/operator/boxing_op.h b/oneflow/core/operator/boxing_op.h
index 271ac9796b70e00f58aba165661f38b501ebde33..64da066c8b09582a15db95c88ff5759603781f3b 100644
--- a/oneflow/core/operator/boxing_op.h
+++ b/oneflow/core/operator/boxing_op.h
@@ -26,7 +26,7 @@ class BoxingOp final : public Operator {
   BoxingOp() = default;
   ~BoxingOp() = default;
 
-  void InitFromOpConf() override;
+  Maybe<void> InitFromOpConf() override;
   Maybe<void> InferLogicalOutBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& BlobDesc4BnInOp,
       const ParallelDesc& parallel_desc) const override;
diff --git a/oneflow/core/operator/boxing_zeros_op.cpp b/oneflow/core/operator/boxing_zeros_op.cpp
index 0bbe62e6742cd58e9204e0b2f3005f36305e372b..c4bc585838afbdc3f85fb633e96f7d7f909bd6ea 100644
--- a/oneflow/core/operator/boxing_zeros_op.cpp
+++ b/oneflow/core/operator/boxing_zeros_op.cpp
@@ -24,7 +24,7 @@ class BoxingZerosOp : public Operator {
   BoxingZerosOp() = default;
   ~BoxingZerosOp() override = default;
 
-  void InitFromOpConf() override;
+  Maybe<void> InitFromOpConf() override;
   Maybe<void> InferLogicalOutBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& BlobDesc4BnInOp,
       const ParallelDesc& parallel_desc) const override {
@@ -39,7 +39,10 @@ class BoxingZerosOp : public Operator {
   LogicalBlobId lbi4obn(const std::string& output_bn) const override;
 };
 
-void BoxingZerosOp::InitFromOpConf() { EnrollOutputBn("out", false); }
+Maybe<void> BoxingZerosOp::InitFromOpConf() {
+  EnrollOutputBn("out", false);
+  return Maybe<void>::Ok();
+}
 
 LogicalBlobId BoxingZerosOp::lbi4ibn(const std::string& input_bn) const {
   return this->op_conf().boxing_zeros_conf().lbi();
diff --git a/oneflow/core/operator/broadcast_to_compatible_with_op.cpp b/oneflow/core/operator/broadcast_to_compatible_with_op.cpp
index 0e802287dbd32ed3d8934ca455675803cd6d52af..bb10f097f98b199d3bc5b11fbf8e97d4b4b8dfc6 100644
--- a/oneflow/core/operator/broadcast_to_compatible_with_op.cpp
+++ b/oneflow/core/operator/broadcast_to_compatible_with_op.cpp
@@ -58,11 +58,12 @@ class BroadcastToCompatibleWithOp final : public Operator {
   BroadcastToCompatibleWithOp() = default;
   ~BroadcastToCompatibleWithOp() override = default;
 
-  void InitFromOpConf() {
+  Maybe<void> InitFromOpConf() {
     CHECK(op_conf().has_broadcast_to_compatible_with_conf());
     EnrollInputBn("x");
     EnrollRepeatedInputBn("compatible", false);
     EnrollOutputBn("y");
+    return Maybe<void>::Ok();
   }
 
   Maybe<void> InferLogicalOutBlobDescs(
diff --git a/oneflow/core/operator/callback_notify_op.cpp b/oneflow/core/operator/callback_notify_op.cpp
index e215a83255a5e86b73c929e4fe4620143c4a6d9b..7f42c9ee723203a7e23c4e1ea6581efd7874af93 100644
--- a/oneflow/core/operator/callback_notify_op.cpp
+++ b/oneflow/core/operator/callback_notify_op.cpp
@@ -18,9 +18,10 @@ limitations under the License.
 
 namespace oneflow {
 
-void CallbackNotifyOp::InitFromOpConf() {
+Maybe<void> CallbackNotifyOp::InitFromOpConf() {
   CHECK(op_conf().has_callback_notify_conf());
   EnrollInputBn("in", false);
+  return Maybe<void>::Ok();
 }
 
 namespace {
diff --git a/oneflow/core/operator/callback_notify_op.h b/oneflow/core/operator/callback_notify_op.h
index b0b3f2bc2f6ed72288f5cd49d44acc3b6aba6a08..834b08472c28957c1f9dbb8086c99ad678c7f983 100644
--- a/oneflow/core/operator/callback_notify_op.h
+++ b/oneflow/core/operator/callback_notify_op.h
@@ -26,7 +26,7 @@ class CallbackNotifyOp final : public Operator {
   CallbackNotifyOp() = default;
   ~CallbackNotifyOp() = default;
 
-  void InitFromOpConf() override;
+  Maybe<void> InitFromOpConf() override;
   Maybe<void> InferLogicalOutBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& BlobDesc4BnInOp,
       const ParallelDesc& parallel_desc) const override;
diff --git a/oneflow/core/operator/case_op.cpp b/oneflow/core/operator/case_op.cpp
index 23218ff2413565df7c527d6ca11947fca788d876..0ab79e05ad2054d6567b33d250b6f533076f9e84 100644
--- a/oneflow/core/operator/case_op.cpp
+++ b/oneflow/core/operator/case_op.cpp
@@ -18,9 +18,10 @@ limitations under the License.
 
 namespace oneflow {
 
-void CaseOp::InitFromOpConf() {
+Maybe<void> CaseOp::InitFromOpConf() {
   EnrollInputBn("in", false);
   EnrollRepeatedOutputBn("out", false);
+  return Maybe<void>::Ok();
 }
 
 namespace {
diff --git a/oneflow/core/operator/case_op.h b/oneflow/core/operator/case_op.h
index 64ce536c258853afac0e04b3a0634d7b36f44264..8248c4e1ec69f4a6139c1603980c0713b5d367b6 100644
--- a/oneflow/core/operator/case_op.h
+++ b/oneflow/core/operator/case_op.h
@@ -26,7 +26,7 @@ class CaseOp final : public Operator {
   CaseOp() = default;
   ~CaseOp() override = default;
 
-  void InitFromOpConf() override;
+  Maybe<void> InitFromOpConf() override;
   Maybe<void> InferLogicalOutBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& BlobDesc4BnInOp,
       const ParallelDesc& parallel_desc) const override;
diff --git a/oneflow/core/operator/collective_boxing_ops.cpp b/oneflow/core/operator/collective_boxing_ops.cpp
index f89446b5096d825daf1f76dfbf42d37910f2f099..791a806a38bdb1eb6f37e786a1d5b4bee418921c 100644
--- a/oneflow/core/operator/collective_boxing_ops.cpp
+++ b/oneflow/core/operator/collective_boxing_ops.cpp
@@ -27,11 +27,12 @@ class CollectiveBoxingGenericOp : public Operator {
   ~CollectiveBoxingGenericOp() override = default;
 
  private:
-  void InitFromOpConf() override {
+  Maybe<void> InitFromOpConf() override {
     CHECK(op_conf().has_collective_boxing_generic_conf());
     const RankDesc& rank_desc = op_conf().collective_boxing_generic_conf().rank_desc();
     if (GenericOpHasInput(rank_desc)) { EnrollInputBn("in", false); }
     if (GenericOpHasOutput(rank_desc)) { EnrollOutputBn("out", false); }
+    return Maybe<void>::Ok();
   }
 
   LogicalBlobId lbi4ibn(const std::string& input_bn) const override {
diff --git a/oneflow/core/operator/collective_boxing_pack_op.cpp b/oneflow/core/operator/collective_boxing_pack_op.cpp
index 43f13ddc967c4c11bb9daefe078fe047a39ea34d..ca80c192aa7ac0e0697a4c6cc213f2ab5df1a94f 100644
--- a/oneflow/core/operator/collective_boxing_pack_op.cpp
+++ b/oneflow/core/operator/collective_boxing_pack_op.cpp
@@ -25,7 +25,7 @@ class CollectiveBoxingPackOp : public Operator {
   CollectiveBoxingPackOp() = default;
   ~CollectiveBoxingPackOp() override = default;
 
-  void InitFromOpConf() override;
+  Maybe<void> InitFromOpConf() override;
 
   Maybe<void> InferLogicalOutBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& BlobDesc4BnInOp,
@@ -41,9 +41,10 @@ class CollectiveBoxingPackOp : public Operator {
   LogicalBlobId lbi4obn(const std::string& output_bn) const override;
 };
 
-void CollectiveBoxingPackOp::InitFromOpConf() {
+Maybe<void> CollectiveBoxingPackOp::InitFromOpConf() {
   EnrollInputBn("in", false);
   EnrollOutputBn("out", false);
+  return Maybe<void>::Ok();
 }
 
 LogicalBlobId CollectiveBoxingPackOp::lbi4ibn(const std::string& input_bn) const {
diff --git a/oneflow/core/operator/collective_boxing_unpack_op.cpp b/oneflow/core/operator/collective_boxing_unpack_op.cpp
index ec3005305b2ad733c535645420cdc7a25cbcda9e..d06923b455ea4b7dc017d4aa419619093126dd1d 100644
--- a/oneflow/core/operator/collective_boxing_unpack_op.cpp
+++ b/oneflow/core/operator/collective_boxing_unpack_op.cpp
@@ -25,7 +25,7 @@ class CollectiveBoxingUnpackOp : public Operator {
   CollectiveBoxingUnpackOp() = default;
   ~CollectiveBoxingUnpackOp() override = default;
 
-  void InitFromOpConf() override;
+  Maybe<void> InitFromOpConf() override;
 
   Maybe<void> InferLogicalOutBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& BlobDesc4BnInOp,
@@ -41,9 +41,10 @@ class CollectiveBoxingUnpackOp : public Operator {
   LogicalBlobId lbi4obn(const std::string& output_bn) const override;
 };
 
-void CollectiveBoxingUnpackOp::InitFromOpConf() {
+Maybe<void> CollectiveBoxingUnpackOp::InitFromOpConf() {
   EnrollInputBn("in", false);
   EnrollOutputBn("out", false);
+  return Maybe<void>::Ok();
 }
 
 LogicalBlobId CollectiveBoxingUnpackOp::lbi4ibn(const std::string& input_bn) const {
diff --git a/oneflow/core/operator/constant_like_op.cpp b/oneflow/core/operator/constant_like_op.cpp
index 1665bee678827455f5563133b1bf2af85e7ce9da..5ca0454375681f94de45433a0e9f3ac8b77c8866 100644
--- a/oneflow/core/operator/constant_like_op.cpp
+++ b/oneflow/core/operator/constant_like_op.cpp
@@ -36,10 +36,11 @@ class ConstantLikeOp final : public Operator {
   ConstantLikeOp() = default;
   ~ConstantLikeOp() = default;
 
-  void InitFromOpConf() override {
+  Maybe<void> InitFromOpConf() override {
     CHECK(op_conf().has_constant_like_conf());
     EnrollInputBn("like", false);
     EnrollOutputBn("out", false);
+    return Maybe<void>::Ok();
   }
 
   Maybe<void> InferLogicalOutBlobDescs(
diff --git a/oneflow/core/operator/copy_comm_net_op.cpp b/oneflow/core/operator/copy_comm_net_op.cpp
index 9af4b120a9322cd40206f61edf2e7cec034a4e90..68a2b393398b6ddcf5fb4239c8186b7685a47abf 100644
--- a/oneflow/core/operator/copy_comm_net_op.cpp
+++ b/oneflow/core/operator/copy_comm_net_op.cpp
@@ -17,9 +17,10 @@ limitations under the License.
 
 namespace oneflow {
 
-void CopyCommNetOp::InitFromOpConf() {
+Maybe<void> CopyCommNetOp::InitFromOpConf() {
   EnrollInputBn("in", false);
   EnrollOutputBn("out", false);
+  return Maybe<void>::Ok();
 }
 
 LogicalBlobId CopyCommNetOp::lbi4obn(const std::string& output_bn) const {
diff --git a/oneflow/core/operator/copy_comm_net_op.h b/oneflow/core/operator/copy_comm_net_op.h
index 929b1f405c214f1868fe87f7dd0cf815866b7279..2b227cd7f4b22e44a0a126dd88febdf55b799bfb 100644
--- a/oneflow/core/operator/copy_comm_net_op.h
+++ b/oneflow/core/operator/copy_comm_net_op.h
@@ -26,7 +26,7 @@ class CopyCommNetOp final : public Operator {
   CopyCommNetOp() = default;
   ~CopyCommNetOp() = default;
 
-  void InitFromOpConf() override;
+  Maybe<void> InitFromOpConf() override;
   Maybe<void> InferLogicalOutBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& BlobDesc4BnInOp,
       const ParallelDesc& parallel_desc) const override {
diff --git a/oneflow/core/operator/copy_hd_op.cpp b/oneflow/core/operator/copy_hd_op.cpp
index 94f726d7bbf6c76118bcc807fc84caebbd7b68f9..fc38c300a6215a4d851c80ebba45101763b0cbb7 100644
--- a/oneflow/core/operator/copy_hd_op.cpp
+++ b/oneflow/core/operator/copy_hd_op.cpp
@@ -23,7 +23,7 @@ class CopyHdOp final : public Operator {
   CopyHdOp() = default;
   ~CopyHdOp() override = default;
 
-  void InitFromOpConf() override;
+  Maybe<void> InitFromOpConf() override;
   Maybe<void> InferLogicalOutBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& BlobDesc4BnInOp,
       const ParallelDesc& parallel_desc) const override {
@@ -50,9 +50,10 @@ class CopyHdOp final : public Operator {
   LogicalBlobId lbi4obn(const std::string& output_bn) const override;
 };
 
-void CopyHdOp::InitFromOpConf() {
+Maybe<void> CopyHdOp::InitFromOpConf() {
   EnrollInputBn("in", false);
   EnrollOutputBn("out", false);
+  return Maybe<void>::Ok();
 }
 
 Maybe<void> CopyHdOp::InferOutBlobDescs(
diff --git a/oneflow/core/operator/cwise_op.cpp b/oneflow/core/operator/cwise_op.cpp
index 0b28a9d0f3146076df050beb7ec085b1bee52c60..c55579f0c6321281c860da01da47c61ffb0268d9 100644
--- a/oneflow/core/operator/cwise_op.cpp
+++ b/oneflow/core/operator/cwise_op.cpp
@@ -17,10 +17,11 @@ limitations under the License.
 
 namespace oneflow {
 
-void CWiseOp::InitFromOpConf() {
+Maybe<void> CWiseOp::InitFromOpConf() {
   EnrollRepeatedInputBn("in");
   EnrollOutputBn("out")->set_mutable_inplace_ibn("in_0");
   VirtualInitFromOpConf();
+  return Maybe<void>::Ok();
 }
 
 Maybe<void> CWiseOp::InferLogicalOutBlobDescs(
diff --git a/oneflow/core/operator/cwise_op.h b/oneflow/core/operator/cwise_op.h
index 0a0327a321417fa7e20aa2c4a99853849dca53dc..f51608b2b66742bab60d7da6b9fb91d7baa7af44 100644
--- a/oneflow/core/operator/cwise_op.h
+++ b/oneflow/core/operator/cwise_op.h
@@ -26,7 +26,7 @@ class CWiseOp : public Operator {
   CWiseOp() = default;
   virtual ~CWiseOp() = default;
 
-  void InitFromOpConf() override;
+  Maybe<void> InitFromOpConf() override;
 
   Maybe<void> InferLogicalOutBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& BlobDesc4BnInOp,
diff --git a/oneflow/core/operator/decode_random_op.cpp b/oneflow/core/operator/decode_random_op.cpp
index debc90012997684a1a38a8a8c6cb6540ff5c9197..63f0e8681c4839eba2e2723d8e57eded28cc843a 100644
--- a/oneflow/core/operator/decode_random_op.cpp
+++ b/oneflow/core/operator/decode_random_op.cpp
@@ -17,10 +17,11 @@ limitations under the License.
 
 namespace oneflow {
 
-void DecodeRandomOp::InitFromOpConf() {
+Maybe<void> DecodeRandomOp::InitFromOpConf() {
   CHECK(op_conf().has_decode_random_conf());
   if (op_conf().decode_random_conf().has_tick()) { EnrollInputBn("tick", false); }
   EnrollOutputBn("out", false);
+  return Maybe<void>::Ok();
 }
 
 void DecodeRandomOp::VirtualGenKernelConf(
diff --git a/oneflow/core/operator/decode_random_op.h b/oneflow/core/operator/decode_random_op.h
index 5940f9e09d347a9fad8d26d07694f648d6772f2d..5093c7547e01c4084621290f59196c40b34b3536 100644
--- a/oneflow/core/operator/decode_random_op.h
+++ b/oneflow/core/operator/decode_random_op.h
@@ -26,7 +26,7 @@ class DecodeRandomOp final : public Operator {
   DecodeRandomOp() = default;
   ~DecodeRandomOp() = default;
 
-  void InitFromOpConf() override;
+  Maybe<void> InitFromOpConf() override;
 
   Maybe<void> InferLogicalOutBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& BlobDesc4BnInOp,
diff --git a/oneflow/core/operator/device_tick_op.cpp b/oneflow/core/operator/device_tick_op.cpp
index 2720e11c03cf5f125acd1d2f451227ab2ab71b72..33342f9bd91af2468ad4a4a96c860c1423ae5261 100644
--- a/oneflow/core/operator/device_tick_op.cpp
+++ b/oneflow/core/operator/device_tick_op.cpp
@@ -18,10 +18,11 @@ limitations under the License.
 
 namespace oneflow {
 
-void DeviceTickOp::InitFromOpConf() {
+Maybe<void> DeviceTickOp::InitFromOpConf() {
   CHECK(op_conf().has_device_tick_conf());
   EnrollRepeatedInputBn("tick", false);
   EnrollOutputBn("out", false);
+  return Maybe<void>::Ok();
 }
 
 namespace {
diff --git a/oneflow/core/operator/device_tick_op.h b/oneflow/core/operator/device_tick_op.h
index 7d58355da9c51d16826a6296d63b43540052009f..0bc901d694b85a760f81fc83467db64ff2b16dfb 100644
--- a/oneflow/core/operator/device_tick_op.h
+++ b/oneflow/core/operator/device_tick_op.h
@@ -26,7 +26,7 @@ class DeviceTickOp final : public Operator {
   DeviceTickOp() = default;
   ~DeviceTickOp() = default;
 
-  void InitFromOpConf() override;
+  Maybe<void> InitFromOpConf() override;
   Maybe<void> InferLogicalOutBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& BlobDesc4BnInOp,
       const ParallelDesc& parallel_desc) const override;
diff --git a/oneflow/core/operator/distribute_add_op.cpp b/oneflow/core/operator/distribute_add_op.cpp
index 4d1833f68cc1859d98019a882d7bf8d862c5584e..5df0d4316e9d9ca53a86bba13849e117cd5a81e4 100644
--- a/oneflow/core/operator/distribute_add_op.cpp
+++ b/oneflow/core/operator/distribute_add_op.cpp
@@ -27,7 +27,7 @@ class DistributeAddOp final : public Operator {
   DistributeAddOp() = default;
   ~DistributeAddOp() = default;
 
-  void InitFromOpConf() override;
+  Maybe<void> InitFromOpConf() override;
 
   Maybe<void> InferLogicalOutBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& BlobDesc4BnInOp,
@@ -45,11 +45,12 @@ class DistributeAddOp final : public Operator {
       const ParallelDesc& parallel_desc) const override;
 };
 
-void DistributeAddOp::InitFromOpConf() {
+Maybe<void> DistributeAddOp::InitFromOpConf() {
   CHECK(op_conf().has_distribute_add_conf());
 
   EnrollRepeatedInputBn("in");
   EnrollOutputBn("out");
+  return Maybe<void>::Ok();
 }
 
 Maybe<void> DistributeAddOp::InferBlobParallelDesc() {
diff --git a/oneflow/core/operator/distribute_clone_op.cpp b/oneflow/core/operator/distribute_clone_op.cpp
index 2a27eecf7217e800d9990cc04db8c4532bf538d4..515842c403f11747316e7e5a8592655d45da108a 100644
--- a/oneflow/core/operator/distribute_clone_op.cpp
+++ b/oneflow/core/operator/distribute_clone_op.cpp
@@ -27,7 +27,7 @@ class DistributeCloneOp final : public Operator {
   DistributeCloneOp() = default;
   ~DistributeCloneOp() = default;
 
-  void InitFromOpConf() override;
+  Maybe<void> InitFromOpConf() override;
 
  private:
   Maybe<void> InferBlobParallelDesc() override;
@@ -44,13 +44,14 @@ class DistributeCloneOp final : public Operator {
       const ParallelContext* parallel_ctx) const override;
 };
 
-void DistributeCloneOp::InitFromOpConf() {
+Maybe<void> DistributeCloneOp::InitFromOpConf() {
   CHECK(op_conf().has_distribute_clone_conf());
 
   EnrollInputBn("in");
   EnrollRepeatedOutputBnWithSetter("out", [&](OutputBlobModifier* ob_modifier) {
     ob_modifier->set_is_mutable(op_conf().distribute_clone_conf().is_variable_ref());
   });
+  return Maybe<void>::Ok();
 }
 
 Maybe<void> DistributeCloneOp::InferLogicalOutBlobDescs(
diff --git a/oneflow/core/operator/distribute_concat_op.cpp b/oneflow/core/operator/distribute_concat_op.cpp
index 077abb4f14bae66177923fc2c417b24ddbe7e406..aeecea897d52bed336c1984a59157074449a33f4 100644
--- a/oneflow/core/operator/distribute_concat_op.cpp
+++ b/oneflow/core/operator/distribute_concat_op.cpp
@@ -27,7 +27,7 @@ class DistributeConcatOp final : public Operator {
   DistributeConcatOp() = default;
   ~DistributeConcatOp() = default;
 
-  void InitFromOpConf() override;
+  Maybe<void> InitFromOpConf() override;
 
   Maybe<void> InferLogicalOutBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& BlobDesc4BnInOp,
@@ -51,11 +51,12 @@ class DistributeConcatOp final : public Operator {
   int32_t FixAxis(const int32_t axis, const int64_t num_axes) const;
 };
 
-void DistributeConcatOp::InitFromOpConf() {
+Maybe<void> DistributeConcatOp::InitFromOpConf() {
   CHECK(op_conf().has_distribute_concat_conf());
 
   EnrollRepeatedInputBn("in");
   EnrollOutputBn("out");
+  return Maybe<void>::Ok();
 }
 
 Maybe<void> DistributeConcatOp::InferLogicalOutBlobDescs(
diff --git a/oneflow/core/operator/distribute_split_op.cpp b/oneflow/core/operator/distribute_split_op.cpp
index d0dc5777d3228d95a77cd87dc60228a5ea191f32..4224e55be8c001e9b5275c593c593e63621d973f 100644
--- a/oneflow/core/operator/distribute_split_op.cpp
+++ b/oneflow/core/operator/distribute_split_op.cpp
@@ -27,7 +27,7 @@ class DistributeSplitOp final : public Operator {
   DistributeSplitOp() = default;
   ~DistributeSplitOp() = default;
 
-  void InitFromOpConf() override;
+  Maybe<void> InitFromOpConf() override;
 
  private:
   Maybe<void> InferBlobParallelDesc() override;
@@ -50,13 +50,14 @@ class DistributeSplitOp final : public Operator {
   int32_t FixAxis(const int32_t axis, const int64_t num_axes) const;
 };
 
-void DistributeSplitOp::InitFromOpConf() {
+Maybe<void> DistributeSplitOp::InitFromOpConf() {
   CHECK(op_conf().has_distribute_split_conf());
   EnrollInputBn("in");
   EnrollRepeatedOutputBnWithSetter("out", [&](OutputBlobModifier* ob_modifier) {
     ob_modifier->set_header_infered_before_compute(false);
     ob_modifier->set_is_mutable(op_conf().distribute_split_conf().is_variable_ref());
   });
+  return Maybe<void>::Ok();
 }
 
 Maybe<void> DistributeSplitOp::InferLogicalOutBlobDescs(
diff --git a/oneflow/core/operator/dst_subset_tick_op.cpp b/oneflow/core/operator/dst_subset_tick_op.cpp
index 183917a8833b2d46806eac14895ba547699ff334..1dbd6d5ba13a7d342613d8c09c86fb1fcd3e7d08 100644
--- a/oneflow/core/operator/dst_subset_tick_op.cpp
+++ b/oneflow/core/operator/dst_subset_tick_op.cpp
@@ -36,7 +36,7 @@ class DstSubsetTickOp final : public Operator {
   DstSubsetTickOp() = default;
   ~DstSubsetTickOp() = default;
 
-  void InitFromOpConf() override;
+  Maybe<void> InitFromOpConf() override;
   Maybe<void> InferLogicalOutBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& BlobDesc4BnInOp,
       const ParallelDesc& parallel_desc) const override;
@@ -48,10 +48,11 @@ class DstSubsetTickOp final : public Operator {
   Maybe<void> GetSbpSignatures(cfg::SbpSignatureList* sbp_sig_list) const override;
 };
 
-void DstSubsetTickOp::InitFromOpConf() {
+Maybe<void> DstSubsetTickOp::InitFromOpConf() {
   CHECK(op_conf().has_dst_subset_tick_conf());
   EnrollRepeatedInputBn("in", false);
   EnrollOutputBn("out", false);
+  return Maybe<void>::Ok();
 }
 
 Maybe<void> DstSubsetTickOp::InferLogicalOutBlobDescs(
diff --git a/oneflow/core/operator/dynamic_reshape_op.cpp b/oneflow/core/operator/dynamic_reshape_op.cpp
index 83337c58f12315502f764725b97b37991ed771ac..bb24b5d402875ffa8087cbb49f92cda5978c2711 100644
--- a/oneflow/core/operator/dynamic_reshape_op.cpp
+++ b/oneflow/core/operator/dynamic_reshape_op.cpp
@@ -19,10 +19,11 @@ namespace oneflow {
 
 class DynamicReshapeOp final : public Operator {
  public:
-  void InitFromOpConf() {
+  Maybe<void> InitFromOpConf() {
     CHECK(op_conf().has_dynamic_reshape_conf());
     EnrollInputBn("in");
     EnrollOutputBn("out")->set_const_inplace_ibn("in");
+    return Maybe<void>::Ok();
   }
 
   Maybe<void> InferLogicalOutBlobDescs(
@@ -116,11 +117,12 @@ REGISTER_OP(OperatorConf::kDynamicReshapeConf, DynamicReshapeOp);
 
 class DynamicReshapeLikeOp final : public Operator {
  public:
-  void InitFromOpConf() {
+  Maybe<void> InitFromOpConf() {
     CHECK(op_conf().has_dynamic_reshape_like_conf());
     EnrollInputBn("x");
     EnrollOutputBn("y");
     EnrollInputBn("like", false);
+    return Maybe<void>::Ok();
   }
   Maybe<void> InferLogicalOutBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& BlobDesc4BnInOp,
diff --git a/oneflow/core/operator/esac_op.cpp b/oneflow/core/operator/esac_op.cpp
index 9cd178be0120679e45f2d1e3ffc344e9e922793b..f13aa7bd798df3117c8e01192ad52944bec07ff7 100644
--- a/oneflow/core/operator/esac_op.cpp
+++ b/oneflow/core/operator/esac_op.cpp
@@ -18,9 +18,10 @@ limitations under the License.
 
 namespace oneflow {
 
-void EsacOp::InitFromOpConf() {
+Maybe<void> EsacOp::InitFromOpConf() {
   EnrollRepeatedInputBn("in", false);
   EnrollOutputBn("out", false);
+  return Maybe<void>::Ok();
 }
 
 namespace {
diff --git a/oneflow/core/operator/esac_op.h b/oneflow/core/operator/esac_op.h
index e6dc4db99f360e7dc9d6e5010137858a6705326c..c40db8f838fe1a2bc0d5b057f602fbfcdfe427a3 100644
--- a/oneflow/core/operator/esac_op.h
+++ b/oneflow/core/operator/esac_op.h
@@ -26,7 +26,7 @@ class EsacOp final : public Operator {
   EsacOp() = default;
   ~EsacOp() override = default;
 
-  void InitFromOpConf() override;
+  Maybe<void> InitFromOpConf() override;
   Maybe<void> InferLogicalOutBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& BlobDesc4BnInOp,
       const ParallelDesc& parallel_desc) const override;
diff --git a/oneflow/core/operator/foreign_input_op.cpp b/oneflow/core/operator/foreign_input_op.cpp
index 88a717b988a60e57e0b92c21be0038e92ced003e..459623771ff7e6a4f463a78b8732edb234040d82 100644
--- a/oneflow/core/operator/foreign_input_op.cpp
+++ b/oneflow/core/operator/foreign_input_op.cpp
@@ -36,10 +36,11 @@ Maybe<void> InferBlobDescs(const OperatorConf& op_conf,
 
 }  // namespace
 
-void ForeignInputOp::InitFromOpConf() {
+Maybe<void> ForeignInputOp::InitFromOpConf() {
   CHECK(op_conf().has_foreign_input_conf());
   if (op_conf().foreign_input_conf().has_tick()) { EnrollInputBn("tick", false); }
   EnrollOutputBn("out", false);
+  return Maybe<void>::Ok();
 }
 
 Maybe<void> ForeignInputOp::InferLogicalOutBlobDescs(
diff --git a/oneflow/core/operator/foreign_input_op.h b/oneflow/core/operator/foreign_input_op.h
index d8c19c4260a398d4488372245e8cfdb9e9d06692..f790d4f0a2fc4e86f18dcca1574f542f7e4d42db 100644
--- a/oneflow/core/operator/foreign_input_op.h
+++ b/oneflow/core/operator/foreign_input_op.h
@@ -26,7 +26,7 @@ class ForeignInputOp final : public Operator {
   ForeignInputOp() : Operator() {}
   ~ForeignInputOp() = default;
 
-  void InitFromOpConf() override;
+  Maybe<void> InitFromOpConf() override;
   Maybe<void> InferLogicalOutBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& BlobDesc4BnInOp,
       const ParallelDesc& parallel_desc) const override;
diff --git a/oneflow/core/operator/foreign_output_op.cpp b/oneflow/core/operator/foreign_output_op.cpp
index a1cbc127484c66c52b05014a43010508a0050aec..e58d87cc98265de19ef727093dcd6257eb3279ac 100644
--- a/oneflow/core/operator/foreign_output_op.cpp
+++ b/oneflow/core/operator/foreign_output_op.cpp
@@ -18,9 +18,10 @@ limitations under the License.
 
 namespace oneflow {
 
-void ForeignOutputOp::InitFromOpConf() {
+Maybe<void> ForeignOutputOp::InitFromOpConf() {
   CHECK(op_conf().has_foreign_output_conf());
   EnrollInputBn("in");
+  return Maybe<void>::Ok();
 }
 
 Maybe<void> ForeignOutputOp::InferLogicalOutBlobDescs(
diff --git a/oneflow/core/operator/foreign_output_op.h b/oneflow/core/operator/foreign_output_op.h
index 9ced84b7f2e1b193997666de61a2b8cc5c85b6ac..099fc4f27635713bbaf65887dd655301a6be9940 100644
--- a/oneflow/core/operator/foreign_output_op.h
+++ b/oneflow/core/operator/foreign_output_op.h
@@ -26,7 +26,7 @@ class ForeignOutputOp final : public Operator {
   ForeignOutputOp() = default;
   ~ForeignOutputOp() override = default;
 
-  void InitFromOpConf() override;
+  Maybe<void> InitFromOpConf() override;
   Maybe<void> InferLogicalOutBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& BlobDesc4BnInOp,
       const ParallelDesc& parallel_desc) const override;
diff --git a/oneflow/core/operator/foreign_watch_op.cpp b/oneflow/core/operator/foreign_watch_op.cpp
index 642c1c12628246c90f98b6e5849471ead6bdb6d2..317370c2ba5b1d380d730433feb1c265837ecdb2 100644
--- a/oneflow/core/operator/foreign_watch_op.cpp
+++ b/oneflow/core/operator/foreign_watch_op.cpp
@@ -18,9 +18,10 @@ limitations under the License.
 
 namespace oneflow {
 
-void ForeignWatchOp::InitFromOpConf() {
+Maybe<void> ForeignWatchOp::InitFromOpConf() {
   CHECK(op_conf().has_foreign_watch_conf());
   EnrollInputBn("in");
+  return Maybe<void>::Ok();
 }
 
 Maybe<void> ForeignWatchOp::InferLogicalOutBlobDescs(
diff --git a/oneflow/core/operator/foreign_watch_op.h b/oneflow/core/operator/foreign_watch_op.h
index 41360b8dc7753eff0d7d843a7b4925a987fa9748..09fdbfd0af4328f6b9f128e511219561f37d56cc 100644
--- a/oneflow/core/operator/foreign_watch_op.h
+++ b/oneflow/core/operator/foreign_watch_op.h
@@ -26,7 +26,7 @@ class ForeignWatchOp final : public Operator {
   ForeignWatchOp() = default;
   ~ForeignWatchOp() override = default;
 
-  void InitFromOpConf() override;
+  Maybe<void> InitFromOpConf() override;
   Maybe<void> InferLogicalOutBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& BlobDesc4BnInOp,
       const ParallelDesc& parallel_desc) const override;
diff --git a/oneflow/core/operator/identity_op.cpp b/oneflow/core/operator/identity_op.cpp
index 2fd72fdf4f23cbaa613ef741060334e35d888f99..1d63c06ae840eeaf0541cbe86a4c0e5db712700c 100644
--- a/oneflow/core/operator/identity_op.cpp
+++ b/oneflow/core/operator/identity_op.cpp
@@ -36,9 +36,10 @@ class IdentityOpTpl final : public Operator {
   IdentityOpTpl() = default;
   ~IdentityOpTpl() override = default;
 
-  void InitFromOpConf() override {
+  Maybe<void> InitFromOpConf() override {
     EnrollInputBn("in");
     EnrollOutputBn("out")->set_const_inplace_ibn("in");
+    return Maybe<void>::Ok();
   }
   Maybe<void> InferLogicalOutBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& BlobDesc4BnInOp,
@@ -75,9 +76,10 @@ class MirroredCastOp : public Operator {
   MirroredCastOp() = default;
   virtual ~MirroredCastOp() override = default;
 
-  void InitFromOpConf() override {
+  Maybe<void> InitFromOpConf() override {
     EnrollInputBn("in");
     EnrollOutputBn("out")->set_const_inplace_ibn("in");
+    return Maybe<void>::Ok();
   }
   Maybe<void> InferLogicalOutBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& BlobDesc4BnInOp,
diff --git a/oneflow/core/operator/image_decoder_random_crop_resize_op.cpp b/oneflow/core/operator/image_decoder_random_crop_resize_op.cpp
index 6a6b0625eb260fe01fbd302a95cd0221e02527b9..4e87537adb754cc038a1c73c35f84d08310b919f 100644
--- a/oneflow/core/operator/image_decoder_random_crop_resize_op.cpp
+++ b/oneflow/core/operator/image_decoder_random_crop_resize_op.cpp
@@ -51,10 +51,11 @@ class ImageDecoderRandomCropResizeOp final : public Operator {
   ~ImageDecoderRandomCropResizeOp() override = default;
 
  private:
-  void InitFromOpConf() override {
+  Maybe<void> InitFromOpConf() override {
     EnrollInputBn("in", false);
     EnrollOutputBn("out", false);
     EnrollTmpBn("tmp");
+    return Maybe<void>::Ok();
   }
 
   Maybe<void> InferLogicalOutBlobDescs(
diff --git a/oneflow/core/operator/input_op.cpp b/oneflow/core/operator/input_op.cpp
index b66b78720906982e2e6e93241fa4c1da4f628d62..ff191a290d38ceecf1b139e2f0d808d11eecb52f 100644
--- a/oneflow/core/operator/input_op.cpp
+++ b/oneflow/core/operator/input_op.cpp
@@ -20,12 +20,13 @@ limitations under the License.
 
 namespace oneflow {
 
-void InputOp::InitFromOpConf() {
+Maybe<void> InputOp::InitFromOpConf() {
   CHECK(op_conf().has_input_conf());
   if (op_conf().input_conf().has_tick()) { EnrollInputBn("tick", false); }
   OutputBlobModifier* modifier = EnrollOutputBn("out", false);
   modifier->set_is_mutable(true);
   modifier->set_header_infered_before_compute(false);
+  return Maybe<void>::Ok();
 }
 
 Maybe<void> InputOp::InferLogicalOutBlobDescs(
diff --git a/oneflow/core/operator/input_op.h b/oneflow/core/operator/input_op.h
index 234632d74ca600755754e0ad118f99363a6f9246..6292f99fa3fc21a6aa2a59844486ac6a80dd6eaf 100644
--- a/oneflow/core/operator/input_op.h
+++ b/oneflow/core/operator/input_op.h
@@ -26,7 +26,7 @@ class InputOp final : public Operator {
   InputOp() : Operator() {}
   ~InputOp() = default;
 
-  void InitFromOpConf() override;
+  Maybe<void> InitFromOpConf() override;
   Maybe<void> InferOutBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& GetBlobDesc4BnInOp,
       const ParallelContext* parallel_ctx) const override;
diff --git a/oneflow/core/operator/learning_rate_schedule_op.cpp b/oneflow/core/operator/learning_rate_schedule_op.cpp
index 3ac3cd854006b804361cfcd86a7f0b7fa88db808..2850b74c1db0fa91d038d9bf0ff783ce3368ca89 100644
--- a/oneflow/core/operator/learning_rate_schedule_op.cpp
+++ b/oneflow/core/operator/learning_rate_schedule_op.cpp
@@ -23,7 +23,7 @@ class LearningRateScheduleOp final : public Operator {
   LearningRateScheduleOp() = default;
   ~LearningRateScheduleOp() override = default;
 
-  void InitFromOpConf() override;
+  Maybe<void> InitFromOpConf() override;
   virtual Maybe<void> InferLogicalOutBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& BlobDesc4BnInOp,
       const ParallelDesc& parallel_desc) const;
@@ -37,10 +37,11 @@ class LearningRateScheduleOp final : public Operator {
       cfg::SbpSignatureList* sbp_sig_list) const override;
 };
 
-void LearningRateScheduleOp::InitFromOpConf() {
+Maybe<void> LearningRateScheduleOp::InitFromOpConf() {
   CHECK(op_conf().has_learning_rate_schedule_conf());
   EnrollInputBn("train_step");
   EnrollOutputBn("out");
+  return Maybe<void>::Ok();
 }
 
 namespace {
diff --git a/oneflow/core/operator/model_init_op.cpp b/oneflow/core/operator/model_init_op.cpp
index 4017ab0e6af46293d71804d1b5413ad3c479a8f3..f720fa532b5d3f31348dd6bb8179b938cf57245e 100644
--- a/oneflow/core/operator/model_init_op.cpp
+++ b/oneflow/core/operator/model_init_op.cpp
@@ -19,7 +19,7 @@ namespace oneflow {
 
 class ModelInitOp : public Operator {
  public:
-  void InitFromOpConf() override;
+  Maybe<void> InitFromOpConf() override;
 
   virtual Maybe<void> InferLogicalOutBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& BlobDesc4BnInOp,
@@ -34,10 +34,11 @@ class ModelInitOp : public Operator {
       cfg::SbpSignatureList* sbp_sig_list) const override;
 };
 
-void ModelInitOp::InitFromOpConf() {
+Maybe<void> ModelInitOp::InitFromOpConf() {
   CHECK(op_conf().has_model_init_conf());
   if (op_conf().model_init_conf().has_tick()) { EnrollInputBn("tick", false); }
   EnrollRepeatedOutputBn("out", false);
+  return Maybe<void>::Ok();
 }
 
 namespace {
diff --git a/oneflow/core/operator/model_io_v2_op.cpp b/oneflow/core/operator/model_io_v2_op.cpp
index 611614f20a2d1212882a29b3f9036d916b0d84d3..dd935ed916adcd79d5bfbe9000fecca532bfe0a7 100644
--- a/oneflow/core/operator/model_io_v2_op.cpp
+++ b/oneflow/core/operator/model_io_v2_op.cpp
@@ -21,11 +21,12 @@ namespace oneflow {
 
 class ModelInitV2Op : public Operator {
  public:
-  void InitFromOpConf() override {
+  Maybe<void> InitFromOpConf() override {
     CHECK(op_conf().has_model_init_v2_conf());
     FOR_RANGE(int64_t, i, 0, op_conf().model_init_v2_conf().ref_size()) {
       EnrollInputBn(GenRepeatedBn("ref", i), false)->set_is_mutable(true);
     }
+    return Maybe<void>::Ok();
   }
 
   Maybe<void> InferLogicalOutBlobDescs(
@@ -59,12 +60,13 @@ REGISTER_OP(OperatorConf::kModelInitV2Conf, ModelInitV2Op);
 
 class ModelLoadV2Op : public Operator {
  public:
-  void InitFromOpConf() override {
+  Maybe<void> InitFromOpConf() override {
     CHECK(op_conf().has_model_load_v2_conf());
     EnrollInputBn("path", false);
     FOR_RANGE(int64_t, i, 0, op_conf().model_load_v2_conf().ref_size()) {
       EnrollInputBn(GenRepeatedBn("ref", i), false)->set_is_mutable(true);
     }
+    return Maybe<void>::Ok();
   }
 
   Maybe<void> InferLogicalOutBlobDescs(
@@ -109,10 +111,11 @@ class ModelSaveV2Op final : public Operator {
   ModelSaveV2Op() = default;
   ~ModelSaveV2Op() override = default;
 
-  void InitFromOpConf() override {
+  Maybe<void> InitFromOpConf() override {
     CHECK(op_conf().has_model_save_v2_conf());
     EnrollInputBn("path", false);
     EnrollRepeatedInputBn("in", false);
+    return Maybe<void>::Ok();
   }
 
   Maybe<void> InferLogicalOutBlobDescs(
diff --git a/oneflow/core/operator/model_load_op.cpp b/oneflow/core/operator/model_load_op.cpp
index 24fc9750a50d1e3cda8481e3cd0c6e34159031aa..cf588d70e67c0184a73162833ef300e53399ffcd 100644
--- a/oneflow/core/operator/model_load_op.cpp
+++ b/oneflow/core/operator/model_load_op.cpp
@@ -19,7 +19,7 @@ namespace oneflow {
 
 class ModelLoadOp : public Operator {
  public:
-  void InitFromOpConf() override;
+  Maybe<void> InitFromOpConf() override;
 
   virtual Maybe<void> InferLogicalOutBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& BlobDesc4BnInOp,
@@ -34,10 +34,11 @@ class ModelLoadOp : public Operator {
       cfg::SbpSignatureList* sbp_sig_list) const override;
 };
 
-void ModelLoadOp::InitFromOpConf() {
+Maybe<void> ModelLoadOp::InitFromOpConf() {
   CHECK(op_conf().has_model_load_conf());
   EnrollInputBn("path", false);
   EnrollRepeatedOutputBn("out", false);
+  return Maybe<void>::Ok();
 }
 
 namespace {
diff --git a/oneflow/core/operator/model_save_op.cpp b/oneflow/core/operator/model_save_op.cpp
index c7b852d6375f67c05cb76e34a1cdd946ce6dcada..80af875c4a707ed483f7b092cdb1c9b5ebd2a236 100644
--- a/oneflow/core/operator/model_save_op.cpp
+++ b/oneflow/core/operator/model_save_op.cpp
@@ -23,7 +23,7 @@ class ModelSaveOp final : public Operator {
   ModelSaveOp() = default;
   ~ModelSaveOp() override = default;
 
-  void InitFromOpConf() override;
+  Maybe<void> InitFromOpConf() override;
   Maybe<void> InferLogicalOutBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& BlobDesc4BnInOp,
       const ParallelDesc& parallel_desc) const override {
@@ -64,10 +64,11 @@ class ModelSaveOp final : public Operator {
   }
 };
 
-void ModelSaveOp::InitFromOpConf() {
+Maybe<void> ModelSaveOp::InitFromOpConf() {
   CHECK(op_conf().has_model_save_conf());
   EnrollInputBn("path", false);
   EnrollRepeatedInputBn("in", false);
+  return Maybe<void>::Ok();
 }
 
 REGISTER_CPU_OP(OperatorConf::kModelSaveConf, ModelSaveOp);
diff --git a/oneflow/core/operator/operator.cpp b/oneflow/core/operator/operator.cpp
index 914d0a47fcc573892374d5f76f416dface8488bc..93ff45c05f85e4a8133b09f5d4d1dc5eac23d4bb 100644
--- a/oneflow/core/operator/operator.cpp
+++ b/oneflow/core/operator/operator.cpp
@@ -45,7 +45,7 @@ std::shared_ptr<Operator> CheckAndConstructOp(std::shared_ptr<const OperatorConf
   Operator* rptr = NewObj<int32_t, Operator>(op_conf->op_type_case(), *op_conf);
   DeviceType device_type = CHECK_JUST(DeviceType4DeviceTag(op_conf->device_tag()));
   if (IsCpuOnly(*op_conf)) { CHECK_EQ(device_type, DeviceType::kCPU); }
-  rptr->Init(op_conf);
+  CHECK_JUST(rptr->Init(op_conf));
   return std::shared_ptr<Operator>(rptr);
 }
 
@@ -53,17 +53,18 @@ std::shared_ptr<Operator> CheckAndConstructOp(std::shared_ptr<const OperatorConf
 
 Operator::Operator() : device_type_(DeviceType::kInvalidDevice) {}
 
-void Operator::Init(const OperatorConf& op_conf) {
-  Init(std::make_shared<const OperatorConf>(op_conf));
+Maybe<void> Operator::Init(const OperatorConf& op_conf) {
+  return Init(std::make_shared<const OperatorConf>(op_conf));
 }
 
-void Operator::Init(std::shared_ptr<const OperatorConf> op_conf) {
+Maybe<void> Operator::Init(std::shared_ptr<const OperatorConf> op_conf) {
   op_conf_ = std::move(op_conf);
-  device_type_ = CHECK_JUST(DeviceType4DeviceTag(op_conf_->device_tag()));
-  InitFromOpConf();
+  device_type_ = JUST(DeviceType4DeviceTag(op_conf_->device_tag()));
+  JUST(InitFromOpConf());
   input_output_bns_.Reserve(input_bns().size() + output_bns().size());
   for (const auto& bn : input_bns()) { *input_output_bns_.Add() = bn; }
   for (const auto& bn : output_bns()) { *input_output_bns_.Add() = bn; }
+  return Maybe<void>::Ok();
 }
 
 const LogicalBlobId& Operator::BnInOp2Lbi(const std::string& bn_in_op) const {
diff --git a/oneflow/core/operator/operator.h b/oneflow/core/operator/operator.h
index 852f17b783c10f5e6853a7e49297c301d1b640c3..63c118288861b78760826150d9261af754996474 100644
--- a/oneflow/core/operator/operator.h
+++ b/oneflow/core/operator/operator.h
@@ -45,9 +45,9 @@ class Operator {
   virtual ~Operator() = default;
 
   //
-  void Init(const OperatorConf& op_conf);
-  void Init(std::shared_ptr<const OperatorConf> op_conf);
-  virtual void InitFromOpConf() = 0;
+  Maybe<void> Init(const OperatorConf& op_conf);
+  Maybe<void> Init(std::shared_ptr<const OperatorConf> op_conf);
+  virtual Maybe<void> InitFromOpConf() = 0;
 
   // bn_in_op <-> lbi
   const LogicalBlobId& BnInOp2Lbi(const std::string& bn_in_op) const;
diff --git a/oneflow/core/operator/output_op.cpp b/oneflow/core/operator/output_op.cpp
index cdc706879bfc652728db0aaf39c21c7ac7dc42ed..f886f3aec7602e54506bfcd7028cd5d6ab349b94 100644
--- a/oneflow/core/operator/output_op.cpp
+++ b/oneflow/core/operator/output_op.cpp
@@ -19,10 +19,11 @@ limitations under the License.
 
 namespace oneflow {
 
-void OutputOp::InitFromOpConf() {
+Maybe<void> OutputOp::InitFromOpConf() {
   CHECK(op_conf().has_output_conf());
   EnrollInputBn("in");
   EnrollOutputBn("out")->set_is_mutable(true);
+  return Maybe<void>::Ok();
 }
 
 Maybe<void> OutputOp::InferLogicalOutBlobDescs(
diff --git a/oneflow/core/operator/output_op.h b/oneflow/core/operator/output_op.h
index 0bf5c8a8396f4e16e699258e2c9979267b6327c8..b49e7cf2c08282c02a9555bbe563df3d3d1a077b 100644
--- a/oneflow/core/operator/output_op.h
+++ b/oneflow/core/operator/output_op.h
@@ -26,7 +26,7 @@ class OutputOp final : public Operator {
   OutputOp() = default;
   ~OutputOp() override = default;
 
-  void InitFromOpConf() override;
+  Maybe<void> InitFromOpConf() override;
   Maybe<void> InferOutBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& GetBlobDesc4BnInOp,
       const ParallelContext* parallel_ctx) const override;
diff --git a/oneflow/core/operator/reentrant_lock_op.cpp b/oneflow/core/operator/reentrant_lock_op.cpp
index 74cce058547dd98516c8533fa53c306f3a0b1ea0..52c47b06608a9dcb67de12dde936d51d289f6988 100644
--- a/oneflow/core/operator/reentrant_lock_op.cpp
+++ b/oneflow/core/operator/reentrant_lock_op.cpp
@@ -18,10 +18,11 @@ limitations under the License.
 
 namespace oneflow {
 
-void ReentrantLockOp::InitFromOpConf() {
+Maybe<void> ReentrantLockOp::InitFromOpConf() {
   EnrollInputBn("start", false);
   if (op_conf().reentrant_lock_conf().has_end()) { EnrollInputBn("end", false); }
   EnrollOutputBn("out", false);
+  return Maybe<void>::Ok();
 }
 
 namespace {
diff --git a/oneflow/core/operator/reentrant_lock_op.h b/oneflow/core/operator/reentrant_lock_op.h
index 6fd4f94c53e287c3d8e87a3c059b420734cd677e..28c40446d2657497d61f7dd0f29ff3148b0cfd4b 100644
--- a/oneflow/core/operator/reentrant_lock_op.h
+++ b/oneflow/core/operator/reentrant_lock_op.h
@@ -26,7 +26,7 @@ class ReentrantLockOp final : public Operator {
   ReentrantLockOp() = default;
   ~ReentrantLockOp() override = default;
 
-  void InitFromOpConf() override;
+  Maybe<void> InitFromOpConf() override;
   Maybe<void> InferLogicalOutBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& BlobDesc4BnInOp,
       const ParallelDesc& parallel_desc) const override;
diff --git a/oneflow/core/operator/return_op.cpp b/oneflow/core/operator/return_op.cpp
index 992ff20a80e23376140cf4b25d5b7c1e67021f48..c9c0a5605a7b73dd6e45f3d03e89b1deb95b997f 100644
--- a/oneflow/core/operator/return_op.cpp
+++ b/oneflow/core/operator/return_op.cpp
@@ -19,10 +19,11 @@ limitations under the License.
 
 namespace oneflow {
 
-void ReturnOp::InitFromOpConf() {
+Maybe<void> ReturnOp::InitFromOpConf() {
   CHECK(op_conf().has_return_conf());
   EnrollInputBn("in");
   EnrollOutputBn("out")->set_is_mutable(true);
+  return Maybe<void>::Ok();
 }
 
 namespace {
diff --git a/oneflow/core/operator/return_op.h b/oneflow/core/operator/return_op.h
index c0a9f4d9c597b19e6a3221d5bd140fb595000a60..8732ad1aa228b65619cdb409db45fc85f346b5f9 100644
--- a/oneflow/core/operator/return_op.h
+++ b/oneflow/core/operator/return_op.h
@@ -26,7 +26,7 @@ class ReturnOp final : public Operator {
   ReturnOp() = default;
   ~ReturnOp() override = default;
 
-  void InitFromOpConf() override;
+  Maybe<void> InitFromOpConf() override;
   Maybe<void> InferLogicalOutBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& BlobDesc4BnInOp,
       const ParallelDesc& parallel_desc) const override;
diff --git a/oneflow/core/operator/scalar_op_base.cpp b/oneflow/core/operator/scalar_op_base.cpp
index bc42898cae39dcf56782f4a27d2172bf2bb3bfa5..faf72eb6b61c6e7b0d0c8f8fabfb0cc24c653a99 100644
--- a/oneflow/core/operator/scalar_op_base.cpp
+++ b/oneflow/core/operator/scalar_op_base.cpp
@@ -18,11 +18,11 @@ limitations under the License.
 
 namespace oneflow {
 
-void ScalarOpBase::InitFromOpConf() {
+Maybe<void> ScalarOpBase::InitFromOpConf() {
   EnrollInputBn("in");
   EnrollInputBn("scalar");
   EnrollOutputBn("out")->set_mutable_inplace_ibn("in");
-  ;
+  return Maybe<void>::Ok();
 }
 
 Maybe<void> ScalarOpBase::InferOutBlobDescs(
diff --git a/oneflow/core/operator/scalar_op_base.h b/oneflow/core/operator/scalar_op_base.h
index 6e2168b374e1da3aaec716a72aab283b4dc11d8d..8faeccd9d0787465664c790f42039de6b156511f 100644
--- a/oneflow/core/operator/scalar_op_base.h
+++ b/oneflow/core/operator/scalar_op_base.h
@@ -26,7 +26,7 @@ class ScalarOpBase : public Operator {
   ScalarOpBase() = default;
   ~ScalarOpBase() override = default;
 
-  void InitFromOpConf() override;
+  Maybe<void> InitFromOpConf() override;
   Maybe<void> InferOutBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& GetBlobDesc4BnInOp,
       const ParallelContext* parallel_ctx) const override;
diff --git a/oneflow/core/operator/shape_elem_cnt_op.cpp b/oneflow/core/operator/shape_elem_cnt_op.cpp
index 4987a0179324977bc7e2e19d37c2db76ee09823c..08d24f7712b2a5a0eaddae172350733a6306c4bc 100644
--- a/oneflow/core/operator/shape_elem_cnt_op.cpp
+++ b/oneflow/core/operator/shape_elem_cnt_op.cpp
@@ -49,9 +49,10 @@ HashSet<int32_t> GetInclusiveAxes(const ShapeElemCntOpConf& conf, int32_t num_ax
 
 }  // namespace
 
-void ShapeElemCntOp::InitFromOpConf() {
+Maybe<void> ShapeElemCntOp::InitFromOpConf() {
   EnrollInputBn("x", false);
   EnrollOutputBn("y", false);
+  return Maybe<void>::Ok();
 }
 
 namespace {
diff --git a/oneflow/core/operator/shape_elem_cnt_op.h b/oneflow/core/operator/shape_elem_cnt_op.h
index f3b39bf5c364e47128f1208bb3ce9b0dd1b5f953..065ea18bcff6b0f781d8c6fff631b78df7a5ddcf 100644
--- a/oneflow/core/operator/shape_elem_cnt_op.h
+++ b/oneflow/core/operator/shape_elem_cnt_op.h
@@ -26,7 +26,7 @@ class ShapeElemCntOp final : public Operator {
   ShapeElemCntOp() = default;
   ~ShapeElemCntOp() override = default;
 
-  void InitFromOpConf() override;
+  Maybe<void> InitFromOpConf() override;
   Maybe<void> InferLogicalOutBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& BlobDesc4BnInOp,
       const ParallelDesc& parallel_desc) const override;
diff --git a/oneflow/core/operator/sink_tick_op.cpp b/oneflow/core/operator/sink_tick_op.cpp
index 0055a82beaee53b85333193618897c3ff202ee09..8245ae8673c3d1aa516508c8791532c30b5e7e51 100644
--- a/oneflow/core/operator/sink_tick_op.cpp
+++ b/oneflow/core/operator/sink_tick_op.cpp
@@ -18,10 +18,11 @@ limitations under the License.
 
 namespace oneflow {
 
-void SinkTickOp::InitFromOpConf() {
+Maybe<void> SinkTickOp::InitFromOpConf() {
   CHECK(op_conf().has_sink_tick_conf());
   EnrollRepeatedInputBn("tick", false);
   EnrollOutputBn("out", false);
+  return Maybe<void>::Ok();
 }
 
 namespace {
diff --git a/oneflow/core/operator/sink_tick_op.h b/oneflow/core/operator/sink_tick_op.h
index 7fecc6ef285049afa8031e321d3556432016b2a6..922b3455f69f14e9f9e41e783cb6ad36dd81b70b 100644
--- a/oneflow/core/operator/sink_tick_op.h
+++ b/oneflow/core/operator/sink_tick_op.h
@@ -26,7 +26,7 @@ class SinkTickOp final : public Operator {
   SinkTickOp() = default;
   ~SinkTickOp() = default;
 
-  void InitFromOpConf() override;
+  Maybe<void> InitFromOpConf() override;
   Maybe<void> InferLogicalOutBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& BlobDesc4BnInOp,
       const ParallelDesc& parallel_desc) const override;
diff --git a/oneflow/core/operator/slice_boxing_op.cpp b/oneflow/core/operator/slice_boxing_op.cpp
index a839370b5e1ed8587b1ed47da0f45162958242c3..c2fc771fa452dea097cc9bfa6760e051752b3bd3 100644
--- a/oneflow/core/operator/slice_boxing_op.cpp
+++ b/oneflow/core/operator/slice_boxing_op.cpp
@@ -25,7 +25,7 @@ class SliceBoxingOp : public Operator {
   SliceBoxingOp() = default;
   ~SliceBoxingOp() override = default;
 
-  void InitFromOpConf() override;
+  Maybe<void> InitFromOpConf() override;
   Maybe<void> InferLogicalOutBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& BlobDesc4BnInOp,
       const ParallelDesc& parallel_desc) const override {
@@ -74,10 +74,11 @@ class SliceBoxingAddOp final : public SliceBoxingOp {
   Symbol<OperatorConf> GetOpConfWithoutOpNameAndLbn() const override;
 };
 
-void SliceBoxingOp::InitFromOpConf() {
+Maybe<void> SliceBoxingOp::InitFromOpConf() {
   EnrollRepeatedInputBn("in", GetCustomizedBoxingConf().in_slice_size(), false);
   EnrollOutputBn("out");
   VirtualInitFromOpConf();
+  return Maybe<void>::Ok();
 }
 
 LogicalBlobId SliceBoxingOp::lbi4ibn(const std::string& input_bn) const {
diff --git a/oneflow/core/operator/source_tick_op.cpp b/oneflow/core/operator/source_tick_op.cpp
index dcf7af10a64fc83e43292c68b0b8940603d75a06..52a1f26b50392c08fa94ee810c5e837aa0d17397 100644
--- a/oneflow/core/operator/source_tick_op.cpp
+++ b/oneflow/core/operator/source_tick_op.cpp
@@ -18,10 +18,11 @@ limitations under the License.
 
 namespace oneflow {
 
-void SourceTickOp::InitFromOpConf() {
+Maybe<void> SourceTickOp::InitFromOpConf() {
   CHECK(op_conf().has_source_tick_conf());
   CHECK(op_conf().ctrl_in_op_name().empty());
   EnrollOutputBn("out", false);
+  return Maybe<void>::Ok();
 }
 
 Maybe<void> SourceTickOp::InferLogicalOutBlobDescs(
diff --git a/oneflow/core/operator/source_tick_op.h b/oneflow/core/operator/source_tick_op.h
index 12c5447a396a97991e5b9e90bb7ba5023d470837..afb13428270e9cdd4204d3464595e8ca9ec3585e 100644
--- a/oneflow/core/operator/source_tick_op.h
+++ b/oneflow/core/operator/source_tick_op.h
@@ -26,7 +26,7 @@ class SourceTickOp final : public Operator {
   SourceTickOp() = default;
   ~SourceTickOp() = default;
 
-  void InitFromOpConf() override;
+  Maybe<void> InitFromOpConf() override;
   Maybe<void> InferLogicalOutBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& BlobDesc4BnInOp,
       const ParallelDesc& parallel_desc) const override;
diff --git a/oneflow/core/operator/src_subset_tick_op.cpp b/oneflow/core/operator/src_subset_tick_op.cpp
index bebfd10fd4226d6a7f189c3e24211dff0940dfa3..5c1f3d9cda2668c8531fd2e9f88aa1984e404d80 100644
--- a/oneflow/core/operator/src_subset_tick_op.cpp
+++ b/oneflow/core/operator/src_subset_tick_op.cpp
@@ -25,7 +25,7 @@ class SrcSubsetTickOp final : public Operator {
   SrcSubsetTickOp() = default;
   ~SrcSubsetTickOp() = default;
 
-  void InitFromOpConf() override;
+  Maybe<void> InitFromOpConf() override;
   Maybe<void> InferLogicalOutBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& BlobDesc4BnInOp,
       const ParallelDesc& parallel_desc) const override;
@@ -37,10 +37,11 @@ class SrcSubsetTickOp final : public Operator {
   Maybe<void> GetSbpSignatures(cfg::SbpSignatureList* sbp_sig_list) const override;
 };
 
-void SrcSubsetTickOp::InitFromOpConf() {
+Maybe<void> SrcSubsetTickOp::InitFromOpConf() {
   CHECK(op_conf().has_src_subset_tick_conf());
   EnrollRepeatedInputBn("in", false);
   EnrollOutputBn("out", false);
+  return Maybe<void>::Ok();
 }
 
 namespace {
diff --git a/oneflow/core/operator/sync_dynamic_resize_op.cpp b/oneflow/core/operator/sync_dynamic_resize_op.cpp
index 7a4f297f81151cd2a49f0ebe9c4515801deab521..40df71437e9f5cd05043a1ae94f1181564fb79ca 100644
--- a/oneflow/core/operator/sync_dynamic_resize_op.cpp
+++ b/oneflow/core/operator/sync_dynamic_resize_op.cpp
@@ -41,10 +41,11 @@ class SyncDynamicResizeOp : public Operator {
   SyncDynamicResizeOp() = default;
   ~SyncDynamicResizeOp() override = default;
 
-  void InitFromOpConf() override {
+  Maybe<void> InitFromOpConf() override {
     EnrollInputBn("in");
     EnrollInputBn("size", false);
     EnrollOutputBn("out")->set_header_infered_before_compute(false);
+    return Maybe<void>::Ok();
   }
 
   Maybe<void> InferLogicalOutBlobDescs(
diff --git a/oneflow/core/operator/tick_op.cpp b/oneflow/core/operator/tick_op.cpp
index e9ec6825a0442e8cd4d730bf10f87fb639b87933..ae614a5474874947ef8777f11d491e8b3dede648 100644
--- a/oneflow/core/operator/tick_op.cpp
+++ b/oneflow/core/operator/tick_op.cpp
@@ -29,10 +29,11 @@ Maybe<void> InferBlobDescs(const std::function<BlobDesc*(const std::string&)>& B
 
 }  // namespace
 
-void TickOp::InitFromOpConf() {
+Maybe<void> TickOp::InitFromOpConf() {
   CHECK(op_conf().has_tick_conf());
   EnrollRepeatedInputBn("tick", false);
   EnrollOutputBn("out", false);
+  return Maybe<void>::Ok();
 }
 
 Maybe<void> TickOp::InferLogicalOutBlobDescs(
diff --git a/oneflow/core/operator/tick_op.h b/oneflow/core/operator/tick_op.h
index e97982634dc56a73aee96c55b43c85775965766e..094a8f87a13088fe4fcf99a63e73e90a83b34f1e 100644
--- a/oneflow/core/operator/tick_op.h
+++ b/oneflow/core/operator/tick_op.h
@@ -26,7 +26,7 @@ class TickOp final : public Operator {
   TickOp() = default;
   ~TickOp() = default;
 
-  void InitFromOpConf() override;
+  Maybe<void> InitFromOpConf() override;
   Maybe<void> InferLogicalOutBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& BlobDesc4BnInOp,
       const ParallelDesc& parallel_desc) const override;
diff --git a/oneflow/core/operator/user_op.cpp b/oneflow/core/operator/user_op.cpp
index 51008e5817146dc1b1235a487c03992635efd918..91a631b420a4efb2418079ca4d7edd281fdd75dd 100644
--- a/oneflow/core/operator/user_op.cpp
+++ b/oneflow/core/operator/user_op.cpp
@@ -488,7 +488,7 @@ class UserOpInferParallelDistributionFnContext
       parallel_distribution_infer_hint4ibn_fn_;
 };
 
-void UserOp::InitFromOpConf() {
+Maybe<void> UserOp::InitFromOpConf() {
   CHECK(op_conf().has_user_conf());
   for (const auto& pair : op_conf().user_conf().input()) {
     EnrollRepeatedInputBn(pair.first, pair.second.s_size());
@@ -528,9 +528,10 @@ void UserOp::InitFromOpConf() {
         }
         return nullptr;
       };
-      val_->output_arg_modify_fn(GetOutputArgModifierFn, *user_op_conf_);
+      JUST(val_->output_arg_modify_fn(GetOutputArgModifierFn, *user_op_conf_));
     }
   }
+  return Maybe<void>::Ok();
 }
 
 Maybe<void> UserOp::InferInternalBlobDescs(
diff --git a/oneflow/core/operator/user_op.h b/oneflow/core/operator/user_op.h
index e49df807764ec15e9373644300d03b812406db4e..691a3b780514ffb3a8f73a72e6757b0d3761669f 100644
--- a/oneflow/core/operator/user_op.h
+++ b/oneflow/core/operator/user_op.h
@@ -29,7 +29,7 @@ class UserOp final : public Operator {
 
   using ArgVec = std::vector<std::pair<std::string, int32_t>>;
 
-  void InitFromOpConf() override;
+  Maybe<void> InitFromOpConf() override;
   Maybe<void> InferInternalBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& GetBlobDesc4BnInOp,
       const ParallelContext* parallel_ctx, const JobDesc* job_desc) const override;
diff --git a/oneflow/core/operator/variable_op.cpp b/oneflow/core/operator/variable_op.cpp
index 5813386137fa6c12adb2f4a9f22d4c6a465b277d..8f9113f7dcde83ff0d9afb7a044fe2e3a7ab0b44 100644
--- a/oneflow/core/operator/variable_op.cpp
+++ b/oneflow/core/operator/variable_op.cpp
@@ -41,11 +41,12 @@ Maybe<void> ParseParallelDistributionFromConf(const VariableOpConf& conf,
 
 }  // namespace
 
-void VariableOp::InitFromOpConf() {
+Maybe<void> VariableOp::InitFromOpConf() {
   CHECK(op_conf().has_variable_conf());
   if (op_conf().variable_conf().has_tick()) { EnrollInputBn("tick", false); }
   bool is_trainable = op_conf().variable_conf().trainable();
   EnrollOutputBn("out", is_trainable)->set_is_mutable(true);
+  return Maybe<void>::Ok();
 }
 
 Maybe<void> VariableOp::InferLogicalOutBlobDescs(
diff --git a/oneflow/core/operator/variable_op.h b/oneflow/core/operator/variable_op.h
index 73959427be0f68ce185d4e6cc4de6b4735bb4369..a11a249501478afafaae0979b2dd62a8eccf9610 100644
--- a/oneflow/core/operator/variable_op.h
+++ b/oneflow/core/operator/variable_op.h
@@ -26,7 +26,7 @@ class VariableOp final : public Operator {
   VariableOp() : Operator() {}
   ~VariableOp() = default;
 
-  void InitFromOpConf() override;
+  Maybe<void> InitFromOpConf() override;
   Maybe<void> InferOutBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& GetBlobDesc4BnInOp,
       const ParallelContext* parallel_ctx) const override;
diff --git a/oneflow/core/operator/wait_and_send_ids_op.cpp b/oneflow/core/operator/wait_and_send_ids_op.cpp
index 76ae63f3ac9ad2b8721836921e2e73fa33f7fdad..3b4c75025ebc0129f01ba8d090edf342969d9663 100644
--- a/oneflow/core/operator/wait_and_send_ids_op.cpp
+++ b/oneflow/core/operator/wait_and_send_ids_op.cpp
@@ -18,9 +18,10 @@ limitations under the License.
 
 namespace oneflow {
 
-void WaitAndSendIdsOp::InitFromOpConf() {
+Maybe<void> WaitAndSendIdsOp::InitFromOpConf() {
   CHECK(op_conf().has_wait_and_send_ids_conf());
   EnrollOutputBn("out", false);
+  return Maybe<void>::Ok();
 }
 
 namespace {
diff --git a/oneflow/core/operator/wait_and_send_ids_op.h b/oneflow/core/operator/wait_and_send_ids_op.h
index 9e9a9ae5920425647a30ba2382981267d89d4989..8aa906fa6e2c1fb434f7db150cef849c9098e104 100644
--- a/oneflow/core/operator/wait_and_send_ids_op.h
+++ b/oneflow/core/operator/wait_and_send_ids_op.h
@@ -26,7 +26,7 @@ class WaitAndSendIdsOp final : public Operator {
   WaitAndSendIdsOp() = default;
   ~WaitAndSendIdsOp() = default;
 
-  void InitFromOpConf() override;
+  Maybe<void> InitFromOpConf() override;
   Maybe<void> InferLogicalOutBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& BlobDesc4BnInOp,
       const ParallelDesc& parallel_desc) const override;
diff --git a/oneflow/user/kernels/stateful_local_opkernel.cpp b/oneflow/user/kernels/stateful_local_opkernel.cpp
index 2a9455034b2f23af699d3b342db37a30c05355db..9a2390c00558f7f430c340ce8948eef18cca9c29 100644
--- a/oneflow/user/kernels/stateful_local_opkernel.cpp
+++ b/oneflow/user/kernels/stateful_local_opkernel.cpp
@@ -313,7 +313,7 @@ Maybe<void> InitTensorTupleIndexes4Bns(const std::shared_ptr<const OperatorConf>
       auto* map = arg_modifier_signature.mutable_obn2output_blob_modifier();
       return &map->at(obn);
     };
-    op_reg_val->output_arg_modify_fn(GetOutputArgModifierFn, op_conf_wrapper);
+    JUST(op_reg_val->output_arg_modify_fn(GetOutputArgModifierFn, op_conf_wrapper));
   }
 
   for (int i = 0; i < indexed_input_pairs.size(); i++) {
diff --git a/oneflow/user/ops/coco_reader_op.cpp b/oneflow/user/ops/coco_reader_op.cpp
index a4ba2a4b61a39e5b5e41c5ff7eb100b45b71badd..71f0b8b720bf3912775bd7ac9fb024f6a3bf3312 100644
--- a/oneflow/user/ops/coco_reader_op.cpp
+++ b/oneflow/user/ops/coco_reader_op.cpp
@@ -91,35 +91,36 @@ REGISTER_NO_GRAD_CPU_ONLY_USER_OP("COCOReader")
       return Maybe<void>::Ok();
     })
     .SetOutputArgModifyFn([](user_op::GetOutputArgModifier GetOutputArgModifierFn,
-                             const user_op::UserOpConfWrapper& conf) {
+                             const user_op::UserOpConfWrapper& conf) -> Maybe<void> {
       user_op::OutputArgModifier* image_modifier = GetOutputArgModifierFn("image", 0);
-      CHECK(image_modifier != nullptr);
+      CHECK_OR_RETURN(image_modifier != nullptr);
       image_modifier->set_header_infered_before_compute(false);
 
       user_op::OutputArgModifier* image_id_modifier = GetOutputArgModifierFn("image_id", 0);
-      CHECK(image_id_modifier != nullptr);
+      CHECK_OR_RETURN(image_id_modifier != nullptr);
       image_id_modifier->set_header_infered_before_compute(false);
 
       user_op::OutputArgModifier* image_size_modifier = GetOutputArgModifierFn("image_size", 0);
-      CHECK(image_size_modifier != nullptr);
+      CHECK_OR_RETURN(image_size_modifier != nullptr);
       image_size_modifier->set_header_infered_before_compute(false);
 
       user_op::OutputArgModifier* gt_bbox_modifier = GetOutputArgModifierFn("gt_bbox", 0);
-      CHECK(gt_bbox_modifier != nullptr);
+      CHECK_OR_RETURN(gt_bbox_modifier != nullptr);
       gt_bbox_modifier->set_header_infered_before_compute(false);
 
       user_op::OutputArgModifier* gt_label_modifier = GetOutputArgModifierFn("gt_label", 0);
-      CHECK(gt_label_modifier != nullptr);
+      CHECK_OR_RETURN(gt_label_modifier != nullptr);
       gt_label_modifier->set_header_infered_before_compute(false);
 
       user_op::OutputArgModifier* gt_segm_modifier = GetOutputArgModifierFn("gt_segm", 0);
-      CHECK(gt_segm_modifier != nullptr);
+      CHECK_OR_RETURN(gt_segm_modifier != nullptr);
       gt_segm_modifier->set_header_infered_before_compute(false);
 
       user_op::OutputArgModifier* gt_segm_index_modifier =
           GetOutputArgModifierFn("gt_segm_index", 0);
-      CHECK(gt_segm_index_modifier != nullptr);
+      CHECK_OR_RETURN(gt_segm_index_modifier != nullptr);
       gt_segm_index_modifier->set_header_infered_before_compute(false);
+      return Maybe<void>::Ok();
     })
     .SetDataTypeInferFn([](user_op::InferContext* ctx) -> Maybe<void> {
       user_op::TensorDesc* image_desc = ctx->OutputTensorDesc("image", 0);
diff --git a/oneflow/user/ops/image_batch_align_op.cpp b/oneflow/user/ops/image_batch_align_op.cpp
index 8a60d65ef311e2da03e81000b325d5f8eecaf5e4..51bc9f8c7c8b646f81bf3c3d93ab9e23dd02127f 100644
--- a/oneflow/user/ops/image_batch_align_op.cpp
+++ b/oneflow/user/ops/image_batch_align_op.cpp
@@ -77,10 +77,11 @@ REGISTER_NO_GRAD_CPU_ONLY_USER_OP("image_batch_align")
       return Maybe<void>::Ok();
     })
     .SetOutputArgModifyFn([](user_op::GetOutputArgModifier GetOutputArgModifierFn,
-                             const user_op::UserOpConfWrapper& conf) {
+                             const user_op::UserOpConfWrapper& conf) -> Maybe<void> {
       user_op::OutputArgModifier* out_modifier = GetOutputArgModifierFn("out", 0);
-      CHECK(out_modifier != nullptr);
+      CHECK_OR_RETURN(out_modifier != nullptr);
       out_modifier->set_header_infered_before_compute(false);
+      return Maybe<void>::Ok();
     })
     .SetDataTypeInferFn([](user_op::InferContext* ctx) -> Maybe<void> {
       const user_op::TensorDesc& in_desc = ctx->InputTensorDesc("in", 0);
diff --git a/oneflow/user/ops/ofrecord_image_classification_reader_op.cpp b/oneflow/user/ops/ofrecord_image_classification_reader_op.cpp
index 74e51cd9c8ae4e9b8f04139a16f25cf0276048e8..2e73940718f21b1772f81672df11fe6b2b2783d1 100644
--- a/oneflow/user/ops/ofrecord_image_classification_reader_op.cpp
+++ b/oneflow/user/ops/ofrecord_image_classification_reader_op.cpp
@@ -61,13 +61,14 @@ REGISTER_NO_GRAD_CPU_ONLY_USER_OP("ofrecord_image_classification_reader")
       return Maybe<void>::Ok();
     })
     .SetOutputArgModifyFn([](user_op::GetOutputArgModifier GetOutputArgModifierFn,
-                             const user_op::UserOpConfWrapper& conf) {
+                             const user_op::UserOpConfWrapper& conf) -> Maybe<void> {
       user_op::OutputArgModifier* image_modifier = GetOutputArgModifierFn("image", 0);
-      CHECK(image_modifier != nullptr);
+      CHECK_OR_RETURN(image_modifier != nullptr);
       image_modifier->set_header_infered_before_compute(false);
       user_op::OutputArgModifier* label_modifier = GetOutputArgModifierFn("label", 0);
-      CHECK(label_modifier != nullptr);
+      CHECK_OR_RETURN(label_modifier != nullptr);
       label_modifier->set_header_infered_before_compute(false);
+      return Maybe<void>::Ok();
     })
     .SetDataTypeInferFn([](user_op::InferContext* ctx) -> Maybe<void> {
       *ctx->OutputDType("image", 0) = DataType::kTensorBuffer;
diff --git a/oneflow/user/ops/ofrecord_reader_op.cpp b/oneflow/user/ops/ofrecord_reader_op.cpp
index ab410da8a55fde4f274d8c03340ab41f84b1494f..51f139bbb2226bfbfd06710656ccabe01b258de1 100644
--- a/oneflow/user/ops/ofrecord_reader_op.cpp
+++ b/oneflow/user/ops/ofrecord_reader_op.cpp
@@ -51,10 +51,11 @@ REGISTER_NO_GRAD_CPU_ONLY_USER_OP("OFRecordReader")
       return Maybe<void>::Ok();
     })
     .SetOutputArgModifyFn([](user_op::GetOutputArgModifier GetOutputArgModifierFn,
-                             const user_op::UserOpConfWrapper& conf) {
+                             const user_op::UserOpConfWrapper& conf) -> Maybe<void> {
       user_op::OutputArgModifier* out_modifier = GetOutputArgModifierFn("out", 0);
-      CHECK(out_modifier != nullptr);
+      CHECK_OR_RETURN(out_modifier != nullptr);
       out_modifier->set_header_infered_before_compute(false);
+      return Maybe<void>::Ok();
     })
     .SetDataTypeInferFn([](user_op::InferContext* ctx) -> Maybe<void> {
       *ctx->OutputDType("out", 0) = DataType::kOFRecord;
diff --git a/oneflow/user/ops/onerec_decoder_op.cpp b/oneflow/user/ops/onerec_decoder_op.cpp
index 64094a4c753989a6bc41abfb14f19c96d8a59df2..4c59f59c338a53188029c68c68420922f8772b3a 100644
--- a/oneflow/user/ops/onerec_decoder_op.cpp
+++ b/oneflow/user/ops/onerec_decoder_op.cpp
@@ -54,10 +54,11 @@ REGISTER_NO_GRAD_CPU_ONLY_USER_OP("onerec_decoder")
       return Maybe<void>::Ok();
     })
     .SetOutputArgModifyFn([](user_op::GetOutputArgModifier GetOutputArgModifierFn,
-                             const user_op::UserOpConfWrapper& conf) {
+                             const user_op::UserOpConfWrapper& conf) -> Maybe<void> {
       user_op::OutputArgModifier* out_modifier = GetOutputArgModifierFn("out", 0);
-      CHECK(out_modifier != nullptr);
+      CHECK_OR_RETURN(out_modifier != nullptr);
       out_modifier->set_header_infered_before_compute(false);
+      return Maybe<void>::Ok();
     })
     .SetDataTypeInferFn([](user_op::InferContext* ctx) -> Maybe<void> {
       const user_op::TensorDesc& in_tensor = ctx->InputTensorDesc("in", 0);
diff --git a/oneflow/user/ops/ssp_variable_proxy_op.cpp b/oneflow/user/ops/ssp_variable_proxy_op.cpp
index 4722b2e1a100fdd5dd6a7ae8595c9a76d8a40f8c..1af7c0c41385d24afc9e2372f617512a5daf7f6a 100644
--- a/oneflow/user/ops/ssp_variable_proxy_op.cpp
+++ b/oneflow/user/ops/ssp_variable_proxy_op.cpp
@@ -47,10 +47,11 @@ REGISTER_NO_GRAD_USER_OP("ssp_variable_proxy")
       return Maybe<void>::Ok();
     })
     .SetOutputArgModifyFn([](user_op::GetOutputArgModifier GetOutputArgModifierFn,
-                             const user_op::UserOpConfWrapper& conf) {
+                             const user_op::UserOpConfWrapper& conf) -> Maybe<void> {
       user_op::OutputArgModifier* out_modifier = GetOutputArgModifierFn("ref", 0);
-      CHECK(out_modifier != nullptr);
+      CHECK_OR_RETURN(out_modifier != nullptr);
       out_modifier->set_is_mutable(true);
+      return Maybe<void>::Ok();
     });
 
 }  // namespace
diff --git a/oneflow/user/ops/tensor_buffer_ops.cpp b/oneflow/user/ops/tensor_buffer_ops.cpp
index 3b54004f632dc90006e52a21b228c41945c6491f..f1e964c50dbd97aed585da7821290462372f90a4 100644
--- a/oneflow/user/ops/tensor_buffer_ops.cpp
+++ b/oneflow/user/ops/tensor_buffer_ops.cpp
@@ -150,14 +150,15 @@ REGISTER_NO_GRAD_CPU_ONLY_USER_OP("tensor_buffer_to_list_of_tensors")
       return Maybe<void>::Ok();
     })
     .SetOutputArgModifyFn([](user_op::GetOutputArgModifier GetOutputArgModifierFn,
-                             const user_op::UserOpConfWrapper& conf) {
+                             const user_op::UserOpConfWrapper& conf) -> Maybe<void> {
       if (conf.attr<bool>("dynamic_out")) {
         FOR_RANGE(int64_t, i, 0, conf.output_size("out")) {
           user_op::OutputArgModifier* out_i_modifier = GetOutputArgModifierFn("out", i);
-          CHECK(out_i_modifier != nullptr);
+          CHECK_OR_RETURN(out_i_modifier != nullptr);
           out_i_modifier->set_header_infered_before_compute(false);
         }
       }
+      return Maybe<void>::Ok();
     })
     .SetGetSbpFn(user_op::GetSbpFnUtil::DefaultBroadcastToBroadcast);
 
@@ -194,14 +195,15 @@ REGISTER_NO_GRAD_CPU_ONLY_USER_OP("tensor_buffer_to_list_of_tensors_v2")
       return Maybe<void>::Ok();
     })
     .SetOutputArgModifyFn([](user_op::GetOutputArgModifier GetOutputArgModifierFn,
-                             const user_op::UserOpConfWrapper& conf) {
+                             const user_op::UserOpConfWrapper& conf) -> Maybe<void> {
       if (conf.attr<bool>("dynamic_out")) {
         FOR_RANGE(int64_t, i, 0, conf.output_size("out")) {
           user_op::OutputArgModifier* out_i_modifier = GetOutputArgModifierFn("out", i);
-          CHECK(out_i_modifier != nullptr);
+          CHECK_OR_RETURN(out_i_modifier != nullptr);
           out_i_modifier->set_header_infered_before_compute(false);
         }
       }
+      return Maybe<void>::Ok();
     })
     .SetGetSbpFn(user_op::GetSbpFnUtil::DefaultBroadcastToBroadcast);
 
diff --git a/oneflow/user/ops/test_ops.cpp b/oneflow/user/ops/test_ops.cpp
index 53222e5c2de8ba2a952c35680055e3c774166364..6cb2480371230d04a7af20ad116b14927a249a17 100644
--- a/oneflow/user/ops/test_ops.cpp
+++ b/oneflow/user/ops/test_ops.cpp
@@ -254,10 +254,11 @@ REGISTER_USER_OP("TestDynamicSource")
       return Maybe<void>::Ok();
     })
     .SetOutputArgModifyFn([](user_op::GetOutputArgModifier GetOutputArgModifierFn,
-                             const user_op::UserOpConfWrapper& conf) {
+                             const user_op::UserOpConfWrapper& conf) -> Maybe<void> {
       user_op::OutputArgModifier* out_modifier = GetOutputArgModifierFn("out", 0);
-      CHECK(out_modifier != nullptr);
+      CHECK_OR_RETURN(out_modifier != nullptr);
       out_modifier->set_header_infered_before_compute(false);
+      return Maybe<void>::Ok();
     });
 
 REGISTER_USER_OP("TestRandomSource")
diff --git a/oneflow/xrt/launch_op.cpp b/oneflow/xrt/launch_op.cpp
index 662f21f07adf73c99bdbd15076956a4d85982735..07b4dfb441d37dc9786172392377660ff29e0a60 100644
--- a/oneflow/xrt/launch_op.cpp
+++ b/oneflow/xrt/launch_op.cpp
@@ -24,7 +24,7 @@ limitations under the License.
 
 namespace oneflow {
 
-void XrtLaunchOp::InitFromOpConf() {
+Maybe<void> XrtLaunchOp::InitFromOpConf() {
   CHECK(op_conf().has_xrt_launch_conf());
   const auto& launch_conf = op_conf().xrt_launch_conf();
   int inputs_num = launch_conf.in().size();
@@ -38,6 +38,7 @@ void XrtLaunchOp::InitFromOpConf() {
     EnrollInputBn(absl::StrCat("in_", i))->set_is_mutable(mutability);
   }
   if (outputs_num > 0) { EnrollRepeatedOutputBn("out"); }
+  return Maybe<void>::Ok();
 }
 
 Maybe<void> XrtLaunchOp::InferLogicalOutBlobDescs(
diff --git a/oneflow/xrt/launch_op.h b/oneflow/xrt/launch_op.h
index 280da1d5c086dff866bd20ecc66f719ed13f3ef2..010c97ba47602f1e6bcba86bc2eb804661bd8b4e 100644
--- a/oneflow/xrt/launch_op.h
+++ b/oneflow/xrt/launch_op.h
@@ -24,7 +24,7 @@ namespace oneflow {
 
 class XrtLaunchOp : public Operator {
  public:
-  void InitFromOpConf() override;
+  Maybe<void> InitFromOpConf() override;
 
   Maybe<void> InferLogicalOutBlobDescs(
       const std::function<BlobDesc*(const std::string&)>& BlobDesc4BnInOp,