in src/autotune.cc [383:475]
void Autotune::train(const Args& autotuneArgs) {
std::ifstream validationFileStream(autotuneArgs.autotuneValidationFile);
if (!validationFileStream.is_open()) {
throw std::invalid_argument("Validation file cannot be opened!");
}
printSkippedArgs(autotuneArgs);
bool sizeConstraintWarning = false;
int verbose = autotuneArgs.verbose;
Args bestTrainArgs(autotuneArgs);
Args trainArgs(autotuneArgs);
trainArgs.verbose = 0;
strategy_ = std::unique_ptr<AutotuneStrategy>(
new AutotuneStrategy(trainArgs, autotuneArgs.seed));
startTimer(autotuneArgs);
while (keepTraining(autotuneArgs.autotuneDuration)) {
trials_++;
trainArgs = strategy_->ask(elapsed_);
LOG_VAL(Trial, trials_)
printArgs(trainArgs, autotuneArgs);
ElapsedTimeMarker elapsedTimeMarker;
double currentScore = std::numeric_limits<double>::quiet_NaN();
try {
fastText_->train(trainArgs);
bool sizeConstraintOK = quantize(trainArgs, autotuneArgs);
if (sizeConstraintOK) {
const auto& metricLabel = autotuneArgs.getAutotuneMetricLabel();
Meter meter(!metricLabel.empty());
fastText_->test(
validationFileStream, autotuneArgs.autotunePredictions, 0.0, meter);
currentScore = getMetricScore(
meter,
autotuneArgs.getAutotuneMetric(),
autotuneArgs.getAutotuneMetricValue(),
metricLabel);
if (bestScore_ == kUnknownBestScore || (currentScore > bestScore_)) {
bestTrainArgs = trainArgs;
bestScore_ = currentScore;
strategy_->updateBest(bestTrainArgs);
}
} else {
sizeConstraintFailed_++;
if (!sizeConstraintWarning && trials_ > 10 &&
sizeConstraintFailed_ > (trials_ / 2)) {
sizeConstraintWarning = true;
std::cerr << std::endl
<< "Warning : requested model size is probably too small. "
"You may want to increase `autotune-modelsize`."
<< std::endl;
}
}
} catch (DenseMatrix::EncounteredNaNError&) {
// ignore diverging loss and go on
} catch (std::bad_alloc&) {
// ignore parameter samples asking too much memory
} catch (TimeoutError&) {
break;
} catch (FastText::AbortError&) {
break;
}
LOG_VAL_NAN(currentScore, currentScore)
LOG_VAL(train took, elapsedTimeMarker.getElapsed())
}
if (timer_.joinable()) {
timer_.join();
}
if (bestScore_ == kUnknownBestScore) {
std::string errorMessage;
if (sizeConstraintWarning) {
errorMessage =
"Couldn't fulfil model size constraint: please increase "
"`autotune-modelsize`.";
} else {
errorMessage =
"Didn't have enough time to train once: please increase "
"`autotune-duration`.";
}
throw std::runtime_error(errorMessage);
} else {
std::cerr << std::endl;
std::cerr << "Training again with best arguments" << std::endl;
bestTrainArgs.verbose = verbose;
LOG_VAL(Best selected args, 0)
printArgs(bestTrainArgs, autotuneArgs);
fastText_->train(bestTrainArgs);
quantize(bestTrainArgs, autotuneArgs);
}
}