in recipes/local_prior_match/src/runtime/Init.cpp [23:110]
std::unordered_map<std::string, std::string> setFlags(int argc, char** argv) {
auto readNewFlags = [&]() {
auto oldFlagsfile = FLAGS_flagsfile;
LOG(INFO) << "Parsing command line flags";
gflags::ParseCommandLineFlags(&argc, &argv, false);
if (!FLAGS_flagsfile.empty() && FLAGS_flagsfile != oldFlagsfile) {
LOG(INFO) << "Reading flags from file " << FLAGS_flagsfile;
gflags::ReadFromFlagsFile(FLAGS_flagsfile, argv[0], true);
}
};
auto loadOldFlags = [&](const std::string& reloadPath) {
std::unordered_map<std::string, std::string> cfg;
W2lSerializer::load(reloadPath, cfg);
auto flags = cfg.find(kGflags);
if (flags == cfg.end()) {
LOG(FATAL) << "Invalid config loaded from " << reloadPath;
}
LOG(INFO) << "Reading flags from config file " << reloadPath;
gflags::ReadFlagsFromString(flags->second, gflags::GetArgv0(), true);
auto epoch = cfg.find(kEpoch);
LOG_IF(WARNING, epoch == cfg.end())
<< "Did not find epoch to start from, starting from 0.";
auto startEp = epoch == cfg.end() ? 0 : std::stoi(epoch->second);
auto startIt =
cfg.find(kIteration) == cfg.end() ? 0 : std::stoi(cfg[kIteration]);
return std::make_pair(startEp, startIt);
};
std::string runStatus = argv[1];
std::string runPath; // current experiment path
int runIdx = 1; // current #runs in this path
std::string reloadPath; // path to model to reload
std::string propPath; // path to proposal model to reload
int startEpoch = 0;
int startIter = 0;
if (runStatus == kTrainMode) {
readNewFlags();
runPath = newRunPath(FLAGS_rundir, FLAGS_runname, FLAGS_tag);
propPath = FLAGS_proposalModel;
} else if (runStatus == kContinueMode) {
runPath = argv[2];
while (fileExists(getRunFile("model_last.bin", runIdx, runPath))) {
++runIdx;
}
// this assumes that FLAGS_itersave wasn't set
reloadPath = getRunFile("model_last.bin", runIdx - 1, runPath);
LOG(INFO) << "reload path is " << reloadPath;
std::tie(startEpoch, startIter) = loadOldFlags(reloadPath);
readNewFlags();
propPath = getRunFile("prop.bin", runIdx - 1, runPath);
} else if (runStatus == kForkMode) {
reloadPath = argv[2];
loadOldFlags(reloadPath);
readNewFlags();
runPath = newRunPath(FLAGS_rundir, FLAGS_runname, FLAGS_tag);
propPath = FLAGS_proposalModel;
} else {
LOG(FATAL) << gflags::ProgramUsage();
}
std::vector<std::string> argvs;
for (int i = 0; i < argc; i++) {
argvs.emplace_back(argv[i]);
}
std::unordered_map<std::string, std::string> config = {
{kProgramName, argvs[0]},
{kCommandLine, join(" ", argvs)},
{kGflags, serializeGflags()},
{kUserName, getEnvVar("USER")},
{kHostName, getEnvVar("HOSTNAME")},
{kTimestamp, getCurrentDate() + ", " + getCurrentDate()},
{kRunIdx, std::to_string(runIdx)},
{kRunPath, runPath},
// extra fields defined in localPriorMatchOss/runtime/Defines.h
{kReloadPath, reloadPath},
{kPropPath, propPath},
{kRunStatus, runStatus},
{kStartEpoch, std::to_string(startEpoch)},
{kStartIter, std::to_string(startIter)}};
return config;
}