resource.cpp 6.1 KB
Newer Older
W
wangguibao 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14
// Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

W
wangguibao 已提交
15
#include "predictor/framework/resource.h"
W
wangguibao 已提交
16
#include <string>
W
wangguibao 已提交
17 18
#include "predictor/common/inner_common.h"
#include "predictor/framework/infer.h"
W
wangguibao 已提交
19
#include "predictor/framework/kv_manager.h"
W
wangguibao 已提交
20 21 22 23
namespace baidu {
namespace paddle_serving {
namespace predictor {

W
wangguibao 已提交
24 25
using configure::ResourceConf;

W
wangguibao 已提交
26 27 28
// __thread bool p_thread_initialized = false;

static void dynamic_resource_deleter(void* d) {
W
sdk-cpp  
wangguibao 已提交
29
#if 1
W
wangguibao 已提交
30
  LOG(INFO) << "dynamic_resource_delete on " << bthread_self();
W
sdk-cpp  
wangguibao 已提交
31
#endif
W
wangguibao 已提交
32
  delete static_cast<DynamicResource*>(d);
W
wangguibao 已提交
33 34 35 36 37 38
}

DynamicResource::DynamicResource() {}

DynamicResource::~DynamicResource() {}

39
int DynamicResource::initialize() { return 0; }
W
wangjiawei04 已提交
40

41
std::shared_ptr<RocksDBWrapper> Resource::getDB() { return db; }
W
wangguibao 已提交
42

W
wangguibao 已提交
43
int DynamicResource::clear() { return 0; }
W
wangguibao 已提交
44 45

int Resource::initialize(const std::string& path, const std::string& file) {
W
wangguibao 已提交
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
  ResourceConf resource_conf;
  if (configure::read_proto_conf(path, file, &resource_conf) != 0) {
    LOG(ERROR) << "Failed initialize resource from: " << path << "/" << file;
    return -1;
  }

  // mempool
  if (MempoolWrapper::instance().initialize() != 0) {
    LOG(ERROR) << "Failed proc initialized mempool wrapper";
    return -1;
  }
  LOG(WARNING) << "Successfully proc initialized mempool wrapper";

  if (FLAGS_enable_model_toolkit) {
    int err = 0;
    std::string model_toolkit_path = resource_conf.model_toolkit_path();
    if (err != 0) {
      LOG(ERROR) << "read model_toolkit_path failed, path[" << path
                 << "], file[" << file << "]";
      return -1;
W
wangguibao 已提交
66
    }
W
wangguibao 已提交
67 68 69 70 71
    std::string model_toolkit_file = resource_conf.model_toolkit_file();
    if (err != 0) {
      LOG(ERROR) << "read model_toolkit_file failed, path[" << path
                 << "], file[" << file << "]";
      return -1;
W
wangguibao 已提交
72
    }
W
wangguibao 已提交
73 74 75 76 77
    if (InferManager::instance().proc_initialize(
            model_toolkit_path.c_str(), model_toolkit_file.c_str()) != 0) {
      LOG(ERROR) << "failed proc initialize modeltoolkit, config: "
                 << model_toolkit_path << "/" << model_toolkit_file;
      return -1;
W
wangguibao 已提交
78
    }
W
wangguibao 已提交
79 80 81 82 83 84

    if (KVManager::instance().proc_initialize(
            model_toolkit_path.c_str(), model_toolkit_file.c_str()) != 0) {
      LOG(ERROR) << "Failed proc initialize kvmanager, config: "
                 << model_toolkit_path << "/" << model_toolkit_file;
    }
W
wangguibao 已提交
85 86 87 88 89 90
  }

  if (THREAD_KEY_CREATE(&_tls_bspec_key, dynamic_resource_deleter) != 0) {
    LOG(ERROR) << "unable to create tls_bthread_key of thrd_data";
    return -1;
  }
91
  // init rocksDB instance
W
wangjiawei04 已提交
92 93 94 95
  if (db.get() == nullptr) {
    db = RocksDBWrapper::RocksDBWrapperFactory("kvdb");
  }

W
wangguibao 已提交
96 97
  THREAD_SETSPECIFIC(_tls_bspec_key, NULL);
  return 0;
W
wangguibao 已提交
98 99 100
}

int Resource::thread_initialize() {
W
wangguibao 已提交
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
  // mempool
  if (MempoolWrapper::instance().thread_initialize() != 0) {
    LOG(ERROR) << "Failed thread initialized mempool wrapper";
    return -1;
  }
  LOG(WARNING) << "Successfully thread initialized mempool wrapper";

  // infer manager
  if (FLAGS_enable_model_toolkit &&
      InferManager::instance().thrd_initialize() != 0) {
    LOG(ERROR) << "Failed thrd initialized infer manager";
    return -1;
  }

  DynamicResource* p_dynamic_resource =
      reinterpret_cast<DynamicResource*>(THREAD_GETSPECIFIC(_tls_bspec_key));
  if (p_dynamic_resource == NULL) {
    p_dynamic_resource = new (std::nothrow) DynamicResource;
    if (p_dynamic_resource == NULL) {
      LOG(ERROR) << "failed to create tls DynamicResource";
      return -1;
W
wangguibao 已提交
122
    }
W
wangguibao 已提交
123 124 125 126 127
    if (p_dynamic_resource->initialize() != 0) {
      LOG(ERROR) << "DynamicResource initialize failed.";
      delete p_dynamic_resource;
      p_dynamic_resource = NULL;
      return -1;
W
wangguibao 已提交
128 129
    }

W
wangguibao 已提交
130 131 132 133 134
    if (THREAD_SETSPECIFIC(_tls_bspec_key, p_dynamic_resource) != 0) {
      LOG(ERROR) << "unable to set tls DynamicResource";
      delete p_dynamic_resource;
      p_dynamic_resource = NULL;
      return -1;
W
wangguibao 已提交
135
    }
W
wangguibao 已提交
136
  }
W
sdk-cpp  
wangguibao 已提交
137
#if 0
W
wangguibao 已提交
138
    LOG(INFO) << "Successfully thread initialized dynamic resource";
W
sdk-cpp  
wangguibao 已提交
139
#else
W
wangguibao 已提交
140 141 142
  LOG(INFO) << bthread_self()
            << ": Successfully thread initialized dynamic resource "
            << p_dynamic_resource;
W
wangguibao 已提交
143

W
sdk-cpp  
wangguibao 已提交
144
#endif
W
wangguibao 已提交
145
  return 0;
W
wangguibao 已提交
146 147 148
}

int Resource::thread_clear() {
W
wangguibao 已提交
149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
  // mempool
  if (MempoolWrapper::instance().thread_clear() != 0) {
    LOG(ERROR) << "Failed thread clear mempool wrapper";
    return -1;
  }

  // infer manager
  if (FLAGS_enable_model_toolkit &&
      InferManager::instance().thrd_clear() != 0) {
    LOG(ERROR) << "Failed thrd clear infer manager";
    return -1;
  }

  DynamicResource* p_dynamic_resource =
      reinterpret_cast<DynamicResource*>(THREAD_GETSPECIFIC(_tls_bspec_key));
  if (p_dynamic_resource == NULL) {
W
sdk-cpp  
wangguibao 已提交
165
#if 0
W
wangguibao 已提交
166 167
    LOG(ERROR) << "tls dynamic resource shouldn't be null after "
        << "thread_initialize";
W
sdk-cpp  
wangguibao 已提交
168
#else
W
wangguibao 已提交
169 170 171
    LOG(ERROR)
        << bthread_self()
        << ": tls dynamic resource shouldn't be null after thread_initialize";
W
sdk-cpp  
wangguibao 已提交
172
#endif
W
wangguibao 已提交
173 174 175 176 177 178 179 180 181 182
    return -1;
  }
  if (p_dynamic_resource->clear() != 0) {
    LOG(ERROR) << "Failed to invoke dynamic resource clear";
    return -1;
  }

  LOG(INFO) << bthread_self() << "Resource::thread_clear success";
  // ...
  return 0;
W
wangguibao 已提交
183 184 185
}

int Resource::reload() {
W
wangguibao 已提交
186 187 188 189 190 191 192
  if (FLAGS_enable_model_toolkit && InferManager::instance().reload() != 0) {
    LOG(ERROR) << "Failed reload infer manager";
    return -1;
  }

  // other resource reload here...
  return 0;
W
wangguibao 已提交
193 194 195
}

int Resource::finalize() {
W
wangguibao 已提交
196 197 198 199 200
  if (FLAGS_enable_model_toolkit &&
      InferManager::instance().proc_finalize() != 0) {
    LOG(ERROR) << "Failed proc finalize infer manager";
    return -1;
  }
W
wangguibao 已提交
201

W
wangguibao 已提交
202
  THREAD_KEY_DELETE(_tls_bspec_key);
W
wangguibao 已提交
203

W
wangguibao 已提交
204
  return 0;
W
wangguibao 已提交
205 206
}

W
wangguibao 已提交
207 208 209
}  // namespace predictor
}  // namespace paddle_serving
}  // namespace baidu