diff --git a/oneflow/api/python/framework/framework.cpp b/oneflow/api/python/framework/framework.cpp
index 9255933ebd8c5e4a6d7a79c71e0bbee36832dbd8..16823882f4172ecc0dc9ec228ef2bfb7c23c2207 100644
--- a/oneflow/api/python/framework/framework.cpp
+++ b/oneflow/api/python/framework/framework.cpp
@@ -26,10 +26,11 @@ ONEFLOW_API_PYBIND11_MODULE("", m) {
   m.def("RegisterWatcherOnlyOnce", &RegisterWatcherOnlyOnce);
   m.def("LaunchJob", &LaunchJob, py::call_guard<py::gil_scoped_release>());
 
-  m.def("GetSerializedInterUserJobInfo", &GetSerializedInterUserJobInfo);
-  m.def("GetSerializedJobSet", &GetSerializedJobSet);
-  m.def("GetSerializedStructureGraph", &GetSerializedStructureGraph);
-  m.def("GetSerializedCurrentJob", &GetSerializedCurrentJob);
+  m.def("GetSerializedInterUserJobInfo",
+        []() { return py::bytes(GetSerializedInterUserJobInfo()); });
+  m.def("GetSerializedJobSet", []() { return py::bytes(GetSerializedJobSet()); });
+  m.def("GetSerializedStructureGraph", &GetSerializedStructureGraph /* a prototxt saved to file*/);
+  m.def("GetSerializedCurrentJob", []() { return py::bytes(GetSerializedCurrentJob()); });
 
   m.def("GetFunctionConfigDef", &GetFunctionConfigDef);
   m.def("GetScopeConfigDef", &GetScopeConfigDef);
diff --git a/oneflow/api/python/framework/framework.h b/oneflow/api/python/framework/framework.h
index bb211a84474017cbbbf3d440db8c4d5b235997c9..d92de3bef6d7b7a3c1cb2589b41350ea61f62a04 100644
--- a/oneflow/api/python/framework/framework.h
+++ b/oneflow/api/python/framework/framework.h
@@ -85,9 +85,7 @@ inline Maybe<std::string> GetSerializedInterUserJobInfo() {
   CHECK_OR_RETURN(GlobalProcessCtx::IsThisProcessMaster());
   CHECK_NOTNULL_OR_RETURN(Global<Oneflow>::Get());
   CHECK_NOTNULL_OR_RETURN(Global<InterUserJobInfo>::Get());
-  std::string ret;
-  google::protobuf::TextFormat::PrintToString(*Global<InterUserJobInfo>::Get(), &ret);
-  return ret;
+  return Global<InterUserJobInfo>::Get()->SerializeAsString();
 }
 
 inline Maybe<const JobSet&> GetJobSet() {
@@ -101,7 +99,7 @@ inline Maybe<const JobSet&> GetJobSet() {
   return job_ctx_mgr->job_set();
 }
 
-inline Maybe<std::string> GetSerializedJobSet() { return PbMessage2TxtString(JUST(GetJobSet())); }
+inline Maybe<std::string> GetSerializedJobSet() { return JUST(GetJobSet()).SerializeAsString(); }
 
 inline Maybe<std::string> GetSerializedCurrentJob() {
   auto* job_ctx_mgr = Global<LazyJobBuildAndInferCtxMgr>::Get();
@@ -109,7 +107,7 @@ inline Maybe<std::string> GetSerializedCurrentJob() {
   auto* job_ctx =
       JUST(job_ctx_mgr->FindJobBuildAndInferCtx(*JUST(job_ctx_mgr->GetCurrentJobName())));
   CHECK_NOTNULL_OR_RETURN(job_ctx);
-  return PbMessage2TxtString(job_ctx->job());
+  return job_ctx->job().SerializeAsString();
 }
 
 inline Maybe<std::string> GetFunctionConfigDef() {
diff --git a/oneflow/core/job/inter_user_job_info.proto b/oneflow/core/job/inter_user_job_info.proto
index 39bd36720364da0fcfa49917b09f8f98b9db9cf7..3bdc4e7db75c1429c45003eb7c9ad211e05c781b 100644
--- a/oneflow/core/job/inter_user_job_info.proto
+++ b/oneflow/core/job/inter_user_job_info.proto
@@ -4,7 +4,7 @@ package oneflow;
 message InterUserJobInfo {
   map<string, string> input_or_var_op_name2push_job_name = 1;
   map<string, string> output_or_var_op_name2pull_job_name = 2;
-  required string global_model_init_job_name = 4;
-  required string global_model_load_job_name = 5;
-  required string global_model_save_job_name = 6;
+  optional string global_model_init_job_name = 4;
+  optional string global_model_load_job_name = 5;
+  optional string global_model_save_job_name = 6;
 }
diff --git a/oneflow/python/framework/c_api_util.py b/oneflow/python/framework/c_api_util.py
index 15b3e080fc6b7eb8b7325a6ef9436036355656d0..3542305988c5a801853591ee41bee016016731a1 100644
--- a/oneflow/python/framework/c_api_util.py
+++ b/oneflow/python/framework/c_api_util.py
@@ -65,7 +65,9 @@ def InitLazyGlobalSession(config_proto):
 
 def GetInterUserJobInfo():
     inter_user_job_info = oneflow._oneflow_internal.GetSerializedInterUserJobInfo()
-    return text_format.Parse(inter_user_job_info, InterUserJobInfo())
+    ret = InterUserJobInfo()
+    ret.ParseFromString(inter_user_job_info)
+    return ret
 
 
 def JobBuildAndInferCtx_Open(job_name):
@@ -252,9 +254,13 @@ def GetInterfaceOpAttributes():
 @oneflow_export("experimental.get_job_set")
 def GetJobSet():
     job_set = oneflow._oneflow_internal.GetSerializedJobSet()
-    return text_format.Parse(job_set, job_set_pb.JobSet())
+    ret = job_set_pb.JobSet()
+    ret.ParseFromString(job_set)
+    return ret
 
 
 def GetCurrentJob():
     serialized_job = oneflow._oneflow_internal.GetSerializedCurrentJob()
-    return text_format.Parse(serialized_job, job_pb.Job())
+    ret = job_pb.Job()
+    ret.ParseFromString(serialized_job)
+    return ret