13 #include "grpc_client.h"
14 #include "grpc_service.pb.h"
31 auto pipe = popen((
cmd +
" 2>&1").c_str(),
"r");
32 int thisErrno = errno;
34 throw cms::Exception(
"SystemError") <<
"popen() failed with errno " << thisErrno <<
" for command: " <<
cmd;
37 constexpr
static unsigned buffSize = 128;
38 std::array<char, buffSize>
buffer;
44 thisErrno = ferror(
pipe);
46 throw cms::Exception(
"SystemError") <<
"failed reading command output with errno " << thisErrno;
50 int rv = pclose(
pipe);
51 return std::make_pair(
result, rv);
56 : verbose_(
pset.getUntrackedParameter<
bool>(
"verbose")),
59 allowAddModel_(
false),
60 startedFallback_(
false),
61 pid_(
std::to_string(::getpid())) {
74 #ifdef TRITON_ENABLE_GPU
79 servers_.emplace(std::piecewise_construct,
87 msg =
"List of models for each server:\n";
88 for (
const auto& serverPset :
pset.getUntrackedParameterSetVector(
"servers")) {
94 <<
"Not allowed to specify more than one server with same name (" << serverName <<
")";
97 std::unique_ptr<tc::InferenceServerGrpcClient>
client;
100 "TritonService(): unable to create inference context for " + serverName +
" (" +
server.url +
")");
103 inference::ServerMetadataResponse serverMetaResponse;
105 "TritonService(): unable to get metadata for " + serverName +
" (" +
server.url +
")");
107 <<
", version = " << serverMetaResponse.version();
110 inference::RepositoryIndexResponse repoIndexResponse;
112 client->ModelRepositoryIndex(&repoIndexResponse),
113 "TritonService(): unable to get repository index for " + serverName +
" (" +
server.url +
")");
117 msg += serverName +
": ";
118 for (
const auto& modelIndex : repoIndexResponse.models()) {
119 const auto&
modelName = modelIndex.name();
123 auto& modelInfo(mit->second);
124 modelInfo.servers.insert(serverName);
144 throw cms::Exception(
"DisallowedAddModel") <<
"Attempt to call addModel() outside of module constructors";
164 const auto& moduleInfo(oit->second);
167 auto& modelInfo(mit->second);
168 modelInfo.modules.erase(
id);
170 if (modelInfo.modules.empty())
181 throw cms::Exception(
"MissingModel") <<
"There are no servers that provide model " <<
model;
182 const auto& modelInfo(mit->second);
183 const auto& modelServers = modelInfo.servers;
185 auto msit = modelServers.end();
186 if (!preferred.empty()) {
187 msit = modelServers.find(preferred);
189 if (msit == modelServers.end())
190 edm::LogWarning(
"PreferredServer") <<
"Preferred server " << preferred <<
" for model " <<
model
191 <<
" not available, will choose another server";
193 const auto& serverName(msit == modelServers.end() ? *modelServers.begin() : preferred);
207 msg =
"List of models for fallback server: ";
273 throw cms::Exception(
"FallbackFailed") <<
"Starting the fallback server failed with exit code " << rv;
276 const std::string& portIndicator(
"CMS_TRITON_GRPC_PORT: ");
279 if (
pos != std::string::npos) {
280 auto pos2 =
pos + portIndicator.size();
281 auto pos3 =
output.find(
'\n', pos2);
282 const auto& portNum =
output.substr(pos2, pos3 - pos2);
283 server.url +=
":" + portNum;
285 throw cms::Exception(
"FallbackFailed") <<
"Unknown port for fallback server, log follows:\n" <<
output;
290 desc.addUntracked<
bool>(
"verbose",
false);
295 validator.addUntracked<
unsigned>(
"port");
296 validator.addUntracked<
bool>(
"useSsl",
false);
297 validator.addUntracked<
std::string>(
"rootCertificates",
"");
298 validator.addUntracked<
std::string>(
"privateKey",
"");
299 validator.addUntracked<
std::string>(
"certificateChain",
"");
301 desc.addVPSetUntracked(
"servers", validator, {});