From f8804a7583712c7c6014c147d4d02e90934d690d Mon Sep 17 00:00:00 2001 From: liujuncheng Date: Thu, 2 Sep 2021 19:51:34 +0800 Subject: [PATCH 1/3] UserKernel remove job_desc --- oneflow/core/eager/opkernel_object.cpp | 2 +- oneflow/core/framework/op_kernel.h | 1 - .../core/framework/op_kernel_infer_cache.cpp | 4 +- .../core/framework/op_kernel_infer_cache.h | 2 +- oneflow/core/kernel/eager_kernel.h | 3 +- oneflow/core/kernel/kernel.cpp | 4 +- oneflow/core/kernel/kernel.h | 2 +- oneflow/core/kernel/user_kernel.cpp | 62 +++++++------------ oneflow/core/kernel/user_kernel.h | 3 - oneflow/user/kernels/conv_cudnn_kernels.cpp | 1 - oneflow/user/kernels/deconv_cudnn_kernel.cpp | 1 - .../user/kernels/stateful_local_opkernel.h | 4 -- 12 files changed, 31 insertions(+), 58 deletions(-) diff --git a/oneflow/core/eager/opkernel_object.cpp b/oneflow/core/eager/opkernel_object.cpp index a9dc3e66356..3e20cde159e 100644 --- a/oneflow/core/eager/opkernel_object.cpp +++ b/oneflow/core/eager/opkernel_object.cpp @@ -48,7 +48,7 @@ void OpKernelObject::NewPartialInitializedKernel( const ParallelDesc* parallel_desc) { KernelConf kernel_conf; op.GenKernelConf(BlobDesc4BnInOp, parallel_ctx, &kernel_conf); - kernel_.reset(new EagerKernel(job_desc_.get(), kernel_conf)); + kernel_.reset(new EagerKernel(kernel_conf)); } Maybe SystemOpKernelObject::ResetKernel( diff --git a/oneflow/core/framework/op_kernel.h b/oneflow/core/framework/op_kernel.h index 04f21ca4cc2..abe1edcf8d0 100644 --- a/oneflow/core/framework/op_kernel.h +++ b/oneflow/core/framework/op_kernel.h @@ -204,7 +204,6 @@ class KernelComputeContext { int32_t index) const = 0; virtual DeviceType device_type() const = 0; virtual const ParallelContext& parallel_ctx() const = 0; - virtual const JobDesc& job_desc() const = 0; virtual const std::vector>& inputs() const = 0; virtual const std::vector>& outputs() const = 0; diff --git a/oneflow/core/framework/op_kernel_infer_cache.cpp b/oneflow/core/framework/op_kernel_infer_cache.cpp index d4cd3c9115d..4953832095e 100644 --- a/oneflow/core/framework/op_kernel_infer_cache.cpp +++ b/oneflow/core/framework/op_kernel_infer_cache.cpp @@ -21,10 +21,10 @@ namespace oneflow { namespace user_op { -OpKernelInferCache::OpKernelInferCache(const KernelConf& kernel_conf, const JobDesc& job_desc) { +OpKernelInferCache::OpKernelInferCache(const KernelConf& kernel_conf, const void* scope) { const OperatorConf& op_conf = kernel_conf.op_attribute().op_conf(); std::shared_ptr op = CHECK_JUST(ConstructOp(op_conf)); - cache_key_.scope = &job_desc; + cache_key_.scope = scope; cache_key_.op_conf_sym = op->GetOpConfWithoutOpNameAndLbn(); cache_key_.ibn_idx2shape_sym.resize(op->input_bns().size()); cache_key_.dtype_signature_sym = SymbolOf(kernel_conf.dtype_signature()); diff --git a/oneflow/core/framework/op_kernel_infer_cache.h b/oneflow/core/framework/op_kernel_infer_cache.h index 341a124dca8..83c192badbb 100644 --- a/oneflow/core/framework/op_kernel_infer_cache.h +++ b/oneflow/core/framework/op_kernel_infer_cache.h @@ -34,7 +34,7 @@ class OpKernelInferCache final { using KeyStorage = std::list>; static constexpr size_t kReleaseInIndependentThreadThreshold = 4096; - OpKernelInferCache(const KernelConf& kernel_conf, const JobDesc& job_desc); + OpKernelInferCache(const KernelConf& kernel_conf, const void* scope); ~OpKernelInferCache() = default; bool IsCacheHit() const; diff --git a/oneflow/core/kernel/eager_kernel.h b/oneflow/core/kernel/eager_kernel.h index 7818465c3ae..98c09ce8ed5 100644 --- a/oneflow/core/kernel/eager_kernel.h +++ b/oneflow/core/kernel/eager_kernel.h @@ -24,7 +24,7 @@ namespace oneflow { class EagerKernel final : public Kernel { public: OF_DISALLOW_COPY_AND_MOVE(EagerKernel); - EagerKernel(const JobDesc* job_desc, const KernelConf& kernel_conf); + explicit EagerKernel(const KernelConf& kernel_conf); ~EagerKernel() = default; void Infer(std::function BnInOp2Blob) const; @@ -37,7 +37,6 @@ class EagerKernel final : public Kernel { void InitOpKernel(const KernelConf& kernel_conf); void ForwardDataContent(const KernelContext* kernel_ctx) const override { UNIMPLEMENTED(); } std::unique_ptr kernel_; - const JobDesc* job_desc_; }; } // namespace oneflow diff --git a/oneflow/core/kernel/kernel.cpp b/oneflow/core/kernel/kernel.cpp index 5dc2472272c..6f05570d0a5 100644 --- a/oneflow/core/kernel/kernel.cpp +++ b/oneflow/core/kernel/kernel.cpp @@ -35,7 +35,7 @@ Kernel::Kernel() = default; Kernel::~Kernel() = default; -void Kernel::InitBase(const JobDesc* job_desc, const KernelConf& kernel_conf) { +void Kernel::InitBase(const KernelConf& kernel_conf) { if (shape_infer_helper_) { return; } kernel_conf_ = kernel_conf; shape_infer_helper_.reset( @@ -43,7 +43,7 @@ void Kernel::InitBase(const JobDesc* job_desc, const KernelConf& kernel_conf) { } void Kernel::Init(const KernelConf& kernel_conf, KernelContext* ctx) { - InitBase(ctx->job_desc(), kernel_conf); + InitBase(kernel_conf); VirtualKernelInit(ctx); } diff --git a/oneflow/core/kernel/kernel.h b/oneflow/core/kernel/kernel.h index 2cbabdeecbf..9c26f86d465 100644 --- a/oneflow/core/kernel/kernel.h +++ b/oneflow/core/kernel/kernel.h @@ -52,7 +52,7 @@ class Kernel { protected: Kernel(); - void InitBase(const JobDesc* job_desc, const KernelConf&); + void InitBase(const KernelConf&); virtual void VirtualKernelInit(KernelContext* ctx) {} virtual void ForwardHeader(const KernelContext* ctx) const; diff --git a/oneflow/core/kernel/user_kernel.cpp b/oneflow/core/kernel/user_kernel.cpp index 363a05badad..7625bf88581 100644 --- a/oneflow/core/kernel/user_kernel.cpp +++ b/oneflow/core/kernel/user_kernel.cpp @@ -67,8 +67,7 @@ void FillTensorDescWithBlob(const Blob* blob, user_op::NaiveTensorDesc* tensor_d class UserKernelBaseContext { public: - UserKernelBaseContext(const KernelConf& kernel_conf, const JobDesc& job_desc) - : job_desc_(job_desc) { + explicit UserKernelBaseContext(const KernelConf& kernel_conf) { CHECK(kernel_conf.has_user_conf()); CHECK(kernel_conf.op_attribute().op_conf().has_user_conf()); @@ -94,7 +93,6 @@ class UserKernelBaseContext { DeviceType device_type() const { return device_type_; } const std::string& device_tag() const { return device_tag_; } const ParallelContext& parallel_ctx() const { return parallel_ctx_; } - const JobDesc& job_desc() const { return job_desc_; } const user_op::TensorDesc* TensorDesc4ArgNameAndIndex(const std::string& arg_name, int32_t index) const { auto it = arg2tensor_desc_.find(std::make_pair(arg_name, index)); @@ -112,7 +110,6 @@ class UserKernelBaseContext { std::string device_tag_; ParallelContext parallel_ctx_; HashMap, user_op::NaiveTensorDesc> arg2tensor_desc_; - const JobDesc& job_desc_; }; class KernelCreateContext final : public user_op::KernelCreateContext { @@ -132,11 +129,10 @@ class KernelCreateContext final : public user_op::KernelCreateContext { class UserKernelInitContext final : public user_op::KernelInitContext { public: - explicit UserKernelInitContext(DeviceCtx* device_ctx, const KernelConf& kernel_conf, - const JobDesc& job_desc) + explicit UserKernelInitContext(DeviceCtx* device_ctx, const KernelConf& kernel_conf) : user_op_conf_(kernel_conf.op_attribute().op_conf()), device_ctx_(device_ctx), - base_ctx_(UserKernelBaseContext(kernel_conf, job_desc)), + base_ctx_(UserKernelBaseContext(kernel_conf)), parallel_desc_(kernel_conf.op_attribute().parallel_conf_signature().op_parallel_conf()) { nd_sbp_signature_ = new cfg::NdSbpSignature(kernel_conf.op_attribute().nd_sbp_signature()); if (kernel_conf.op_attribute().has_sbp_signature()) { @@ -209,9 +205,8 @@ class UserKernelInitContext final : public user_op::KernelInitContext { class UserKernelOpInferContext : public user_op::InferContext { public: - UserKernelOpInferContext(const KernelConf& kernel_conf, const JobDesc* job_desc) + UserKernelOpInferContext(const KernelConf& kernel_conf) : user_op_conf_(kernel_conf.op_attribute().op_conf()), - job_desc_(job_desc), parallel_ctx_(kernel_conf.parallel_ctx()), nd_sbp_signature_(kernel_conf.op_attribute().nd_sbp_signature()), parallel_desc_(kernel_conf.op_attribute().parallel_conf_signature().op_parallel_conf()) { @@ -291,10 +286,6 @@ class UserKernelOpInferContext : public user_op::InferContext { const ArgVec& inputs() const override { return inputs_; } const ArgVec& outputs() const override { return outputs_; } - const JobDesc* job_desc() const override { - CHECK_NOTNULL(job_desc_); - return job_desc_; - } const ParallelContext& parallel_ctx() const override { return parallel_ctx_; }; const ParallelDesc& parallel_desc() const override { return parallel_desc_; } const cfg::SbpParallel& SbpParallel4ArgNameAndIndex(const std::string& arg_name, @@ -361,7 +352,6 @@ class UserKernelOpInferContext : public user_op::InferContext { } user_op::UserOpConfWrapper user_op_conf_; - const JobDesc* job_desc_; ArgVec inputs_; ArgVec outputs_; ParallelContext parallel_ctx_; @@ -375,12 +365,11 @@ class UserKernelOpInferContext : public user_op::InferContext { class UserKernelInferContext final : public user_op::KernelInferContext { public: - explicit UserKernelInferContext(DeviceCtx* device_ctx, const KernelConf& kernel_conf, - const JobDesc& job_desc) + explicit UserKernelInferContext(DeviceCtx* device_ctx, const KernelConf& kernel_conf) : user_op_conf_(kernel_conf.op_attribute().op_conf()), device_ctx_(device_ctx), - base_ctx_(UserKernelBaseContext(kernel_conf, job_desc)), - op_infer_ctx_(kernel_conf, &job_desc) { + base_ctx_(UserKernelBaseContext(kernel_conf)), + op_infer_ctx_(kernel_conf) { auto InitArg2Blob = [this](const PbMap& arg_map) { for (auto it = arg_map.begin(); it != arg_map.end(); ++it) { const std::string& arg_name = it->first; @@ -490,11 +479,10 @@ BnTensorPair MakeBnTensorPair(const std::string& bn, class UserKernelComputeContext final : public user_op::KernelComputeContext { public: - explicit UserKernelComputeContext(DeviceCtx* device_ctx, const KernelConf& kernel_conf, - const JobDesc& job_desc) + explicit UserKernelComputeContext(DeviceCtx* device_ctx, const KernelConf& kernel_conf) : user_op_conf_(kernel_conf.op_attribute().op_conf()), device_ctx_(device_ctx), - base_ctx_(kernel_conf, job_desc) { + base_ctx_(kernel_conf) { auto InitInOrOut = [&](const PbMap& arg_map) { for (const auto& it : arg_map) { const std::string& arg_name = it.first; @@ -552,7 +540,6 @@ class UserKernelComputeContext final : public user_op::KernelComputeContext { DeviceType device_type() const override { return base_ctx_.device_type(); } const ParallelContext& parallel_ctx() const override { return base_ctx_.parallel_ctx(); } - const JobDesc& job_desc() const override { return base_ctx_.job_desc(); } const ArgVec& inputs() const override { return base_ctx_.inputs(); } const ArgVec& outputs() const override { return base_ctx_.outputs(); } @@ -573,9 +560,9 @@ class UserKernelComputeContext final : public user_op::KernelComputeContext { class UserKernelRegContext final : public user_op::KernelRegContext { public: - explicit UserKernelRegContext(const KernelConf& kernel_conf, const JobDesc& job_desc) + explicit UserKernelRegContext(const KernelConf& kernel_conf) : user_op_conf_(kernel_conf.op_attribute().op_conf()), - base_ctx_(UserKernelBaseContext(kernel_conf, job_desc)) {} + base_ctx_(UserKernelBaseContext(kernel_conf)) {} ~UserKernelRegContext() = default; DeviceType device_type() const override { return base_ctx_.device_type(); } @@ -603,15 +590,15 @@ class UserKernelRegContext final : public user_op::KernelRegContext { UserKernel::~UserKernel() = default; void UserKernel::InitUserKernel(DeviceCtx* device_ctx) { - ctx_.reset(new UserKernelComputeContext(device_ctx, kernel_conf(), job_desc())); - infer_ctx_.reset(new UserKernelInferContext(device_ctx, kernel_conf(), job_desc())); - infer_cache_.reset(new user_op::OpKernelInferCache(kernel_conf(), job_desc())); + ctx_.reset(new UserKernelComputeContext(device_ctx, kernel_conf())); + infer_ctx_.reset(new UserKernelInferContext(device_ctx, kernel_conf())); + infer_cache_.reset(new user_op::OpKernelInferCache(kernel_conf(), this)); { const std::string& op_type_name = kernel_conf().op_attribute().op_conf().user_conf().op_type_name(); const user_op::OpKernelRegistryResult* kernel_reg_val = CHECK_JUST(user_op::UserOpRegistryMgr::Get().GetOpKernelRegistryResult( - op_type_name, UserKernelRegContext(kernel_conf(), job_desc()))); + op_type_name, UserKernelRegContext(kernel_conf()))); CHECK_NOTNULL(kernel_reg_val); KernelCreateContext create_ctx(kernel_conf()); kernel_.reset(kernel_reg_val->create_fn(&create_ctx)); @@ -619,7 +606,7 @@ void UserKernel::InitUserKernel(DeviceCtx* device_ctx) { #ifdef WITH_CUDA_GRAPHS if (ParseBooleanFromEnv("ONEFLOW_KERNEL_ENABLE_CUDA_GRAPH", false)) { - UserKernelInitContext init_ctx(device_ctx, kernel_conf(), job_desc()); + UserKernelInitContext init_ctx(device_ctx, kernel_conf()); CudaDeviceCtx* cuda_device_ctx = dynamic_cast(device_ctx); const auto* cuda_graph_support = dynamic_cast(kernel_.get()); if (cuda_device_ctx != nullptr) { @@ -637,7 +624,7 @@ void UserKernel::InitUserKernel(DeviceCtx* device_ctx) { } std::shared_ptr UserKernel::CreateOpKernelState(DeviceCtx* device_ctx) { - UserKernelInitContext init_ctx(device_ctx, kernel_conf(), job_desc()); + UserKernelInitContext init_ctx(device_ctx, kernel_conf()); return kernel_->CreateOpKernelState(&init_ctx); } @@ -682,7 +669,6 @@ bool UserKernel::IsCudaGraphSupported() const { } void UserKernel::VirtualKernelInit(KernelContext* ctx) { - job_desc_ = ctx->job_desc(); InitUserKernel(ctx->device_ctx()); CHECK(opkernel_state_.get() == nullptr); opkernel_state_ = CreateOpKernelState(ctx->device_ctx()); @@ -731,16 +717,15 @@ NEW_REGISTER_KERNEL(OperatorConf::kUserConf, UserKernel).SetIsMatchedPred([](con return true; }); -EagerKernel::EagerKernel(const JobDesc* job_desc, const KernelConf& kernel_conf) - : job_desc_(job_desc) { - InitBase(job_desc, kernel_conf); +EagerKernel::EagerKernel(const KernelConf& kernel_conf) { + InitBase(kernel_conf); InitOpKernel(kernel_conf); } void EagerKernel::InitOpKernel(const KernelConf& kernel_conf) { const std::string& op_type_name = kernel_conf.op_attribute().op_conf().user_conf().op_type_name(); auto kernel_reg_val = CHECK_JUST(user_op::UserOpRegistryMgr::Get().GetOpKernelRegistryResult( - op_type_name, UserKernelRegContext(kernel_conf, *job_desc_))); + op_type_name, UserKernelRegContext(kernel_conf))); CHECK_NOTNULL(kernel_reg_val); KernelCreateContext create_ctx(kernel_conf); kernel_.reset(kernel_reg_val->create_fn(&create_ctx)); @@ -748,7 +733,7 @@ void EagerKernel::InitOpKernel(const KernelConf& kernel_conf) { void EagerKernel::Infer(std::function BnInOp2Blob) const { if (kernel_conf().all_blobs_are_static()) { return; } - UserKernelInferContext infer_ctx(nullptr, kernel_conf(), *job_desc_); + UserKernelInferContext infer_ctx(nullptr, kernel_conf()); infer_ctx.UpdateArg2Tensor(BnInOp2Blob); auto* op_infer_ctx = dynamic_cast(infer_ctx.MutOpInferContext()); if (op_infer_ctx) { op_infer_ctx->UpdateArg2TensorDesc(BnInOp2Blob); } @@ -762,8 +747,7 @@ std::shared_ptr EagerKernel::EagerForward( if (old_opkernel_state) { new_opkernel_state = old_opkernel_state; } else { - CHECK_NOTNULL(job_desc_); - UserKernelInitContext init_ctx(device_ctx, kernel_conf(), *job_desc_); + UserKernelInitContext init_ctx(device_ctx, kernel_conf()); new_opkernel_state = kernel_->CreateOpKernelState(&init_ctx); } @@ -773,7 +757,7 @@ std::shared_ptr EagerKernel::EagerForward( } // TODO(lixinqi): refactor to a lightweight KernelComputeContext - UserKernelComputeContext compute_ctx(device_ctx, kernel_conf(), *job_desc_); + UserKernelComputeContext compute_ctx(device_ctx, kernel_conf()); compute_ctx.UpdateTensorWithCorrBlob(BnInOp2Blob); kernel_->Compute(&compute_ctx, new_opkernel_state.get()); return new_opkernel_state; diff --git a/oneflow/core/kernel/user_kernel.h b/oneflow/core/kernel/user_kernel.h index df40d23b6b6..d148f5896de 100644 --- a/oneflow/core/kernel/user_kernel.h +++ b/oneflow/core/kernel/user_kernel.h @@ -50,8 +50,6 @@ class UserKernel final : public Kernel { bool IsStateless() const override; - const JobDesc& job_desc() const { return *job_desc_; } - std::shared_ptr opkernel_state_; std::unique_ptr kernel_; std::unique_ptr ctx_; @@ -60,7 +58,6 @@ class UserKernel final : public Kernel { #ifdef WITH_CUDA_GRAPHS std::unique_ptr cuda_graph_ctx_; #endif // WITH_CUDA_GRAPHS - const JobDesc* job_desc_; }; } // namespace oneflow diff --git a/oneflow/user/kernels/conv_cudnn_kernels.cpp b/oneflow/user/kernels/conv_cudnn_kernels.cpp index d0636b19fc0..7afd04e7410 100644 --- a/oneflow/user/kernels/conv_cudnn_kernels.cpp +++ b/oneflow/user/kernels/conv_cudnn_kernels.cpp @@ -34,7 +34,6 @@ struct CudnnConvArgsAndAlgo final { CudnnConvArgs args; PerfT algo_perf; - // TODO(hanbinbin): remove arg job_desc and set cudnn_conv config as args of CudnnConvArgsAndAlgo CudnnConvArgsAndAlgo(const user_op::Tensor* x, const user_op::Tensor* w, const user_op::Tensor* y, user_op::Tensor* buf, const user_op::KernelComputeContext* ctx, DeviceCtx* device_ctx, bool has_forced_algo, int32_t forced_algo) diff --git a/oneflow/user/kernels/deconv_cudnn_kernel.cpp b/oneflow/user/kernels/deconv_cudnn_kernel.cpp index 5abbf4a12ce..4190e5e9ba3 100644 --- a/oneflow/user/kernels/deconv_cudnn_kernel.cpp +++ b/oneflow/user/kernels/deconv_cudnn_kernel.cpp @@ -31,7 +31,6 @@ struct CudnnDeConvArgsAndAlgo final { CudnnConvArgs args; PerfT algo_perf; - // TODO(hanbinbin): remove arg job_desc and set cudnn_conv config as args of // CudnnDeConvArgsAndAlgo CudnnDeConvArgsAndAlgo(const user_op::Tensor* x, const user_op::Tensor* w, const user_op::Tensor* y, user_op::Tensor* buf, diff --git a/oneflow/user/kernels/stateful_local_opkernel.h b/oneflow/user/kernels/stateful_local_opkernel.h index 79a1254a630..0d81176aed3 100644 --- a/oneflow/user/kernels/stateful_local_opkernel.h +++ b/oneflow/user/kernels/stateful_local_opkernel.h @@ -356,10 +356,6 @@ class LocalUserKernelComputeContext final : public user_op::KernelComputeContext UNIMPLEMENTED(); return *(const ParallelContext*)nullptr; } - const JobDesc& job_desc() const override { - UNIMPLEMENTED(); - return *(const JobDesc*)nullptr; - } const ArgVec& inputs() const override { return base_ctx_.inputs(); }; const ArgVec& outputs() const override { return base_ctx_.outputs(); }; From 40388e424964106fccb66526f1d3e1927095663b Mon Sep 17 00:00:00 2001 From: liujuncheng Date: Fri, 3 Sep 2021 13:58:32 +0800 Subject: [PATCH 2/3] fix --- oneflow/core/framework/op_kernel_infer_cache.cpp | 3 ++- oneflow/core/framework/op_kernel_infer_cache.h | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/oneflow/core/framework/op_kernel_infer_cache.cpp b/oneflow/core/framework/op_kernel_infer_cache.cpp index 4953832095e..5c6afc7f52b 100644 --- a/oneflow/core/framework/op_kernel_infer_cache.cpp +++ b/oneflow/core/framework/op_kernel_infer_cache.cpp @@ -57,7 +57,8 @@ void OpKernelInferCache::UpdateCacheKey(KernelInferContext* ctx) { } void OpKernelInferCache::UpdateCacheValue(KernelInferContext* ctx) { - if (cached_key2value_.size() >= max_size_) { Reset(); } + // TODO: make max size configurable + if (cached_key2value_.size() >= kReleaseInIndependentThreadThreshold) { Reset(); } auto* cache_value = new OpInferCacheValue(); cache_value->obn_idx2shape_sym.resize(ctx->outputs().size()); FOR_RANGE(int, i, 0, ctx->outputs().size()) { diff --git a/oneflow/core/framework/op_kernel_infer_cache.h b/oneflow/core/framework/op_kernel_infer_cache.h index 83c192badbb..48ad99d96b6 100644 --- a/oneflow/core/framework/op_kernel_infer_cache.h +++ b/oneflow/core/framework/op_kernel_infer_cache.h @@ -47,7 +47,6 @@ class OpKernelInferCache final { KeyType cache_key_; HashMap cached_key2value_; KeyStorage key_storage_; - size_t max_size_; }; } // namespace user_op From c7ad0991637c8b792dfe181406770ea91f2b547c Mon Sep 17 00:00:00 2001 From: liujuncheng Date: Fri, 3 Sep 2021 14:41:59 +0800 Subject: [PATCH 3/3] fix --- oneflow/core/kernel/user_kernel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/oneflow/core/kernel/user_kernel.cpp b/oneflow/core/kernel/user_kernel.cpp index 7625bf88581..a6faea52e1d 100644 --- a/oneflow/core/kernel/user_kernel.cpp +++ b/oneflow/core/kernel/user_kernel.cpp @@ -205,7 +205,7 @@ class UserKernelInitContext final : public user_op::KernelInitContext { class UserKernelOpInferContext : public user_op::InferContext { public: - UserKernelOpInferContext(const KernelConf& kernel_conf) + explicit UserKernelOpInferContext(const KernelConf& kernel_conf) : user_op_conf_(kernel_conf.op_attribute().op_conf()), parallel_ctx_(kernel_conf.parallel_ctx()), nd_sbp_signature_(kernel_conf.op_attribute().nd_sbp_signature()),