Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Validation support for specifying GTP commands for each binary (2) #1652

Merged
merged 8 commits into from
Aug 20, 2018
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,5 @@ training/tf/venv
leelaz-model*
*.orig
leelaz_opencl_tuning
/build-autogtp-*
/build-validation-*
1 change: 1 addition & 0 deletions autogtp/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
/*.gz
/moc_*.cpp
/moc_*.h
/autogtp.pro.user

# Weight files
/[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]*[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]
16 changes: 12 additions & 4 deletions autogtp/Game.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,12 @@
#include <QFileInfo>
#include "Game.h"

Game::Game(const QString& weights, const QString& opt, const QString& binary) :
Game::Game(const QString& weights, const QString& opt, const QString& binary,
const QStringList& commands) :
QProcess(),
m_cmdLine(""),
m_binary(binary),
m_timeSettings("time_settings 0 1 0"),
m_commands(commands),
m_resignation(false),
m_blackToMove(true),
m_blackResigned(false),
Expand Down Expand Up @@ -179,8 +180,15 @@ bool Game::gameStart(const VersionTuple &min_version) {
// check any return values.
checkVersion(min_version);
QTextStream(stdout) << "Engine has started." << endl;
sendGtpCommand(m_timeSettings);
QTextStream(stdout) << "Infinite thinking time set." << endl;
for (auto command : m_commands) {
QTextStream(stdout) << command << endl;
if (!sendGtpCommand(command))
{
QTextStream(stdout) << "GTP failed on: " << command << endl;
exit(EXIT_FAILURE);
}
}
QTextStream(stdout) << "Thinking time set." << endl;
return true;
}

Expand Down
5 changes: 3 additions & 2 deletions autogtp/Game.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ class Game : QProcess {
public:
Game(const QString& weights,
const QString& opt,
const QString& binary = QString("./leelaz"));
const QString& binary = QString("./leelaz"),
const QStringList& commands = QStringList("time_settings 0 1 0"));
~Game() = default;
bool gameStart(const VersionTuple& min_version);
void move();
Expand Down Expand Up @@ -69,7 +70,7 @@ class Game : QProcess {
};
QString m_cmdLine;
QString m_binary;
QString m_timeSettings;
QStringList m_commands;
QString m_winner;
QString m_fileName;
QString m_moveDone;
Expand Down
2 changes: 2 additions & 0 deletions validation/.gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
validation.pro.user

/Makefile
/.qmake.stash
/validation
Expand Down
80 changes: 24 additions & 56 deletions validation/Validation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,14 @@ const VersionTuple min_leelaz_version{0, 10, 0};

void ValidationWorker::run() {
do {
Game first(m_firstNet, m_firstOpts, m_firstBin);
Game first(m_engines[0].m_network, m_engines[0].m_options,
m_engines[0].m_binary, m_engines[0].m_commands);
if (!first.gameStart(min_leelaz_version)) {
emit resultReady(Sprt::NoResult, Game::BLACK);
return;
}
Game second(m_secondNet, m_secondOpts, m_secondBin);
Game second(m_engines[1].m_network, m_engines[1].m_options,
m_engines[1].m_binary, m_engines[1].m_commands);
if (!second.gameStart(min_leelaz_version)) {
emit resultReady(Sprt::NoResult, Game::BLACK);
return;
Expand Down Expand Up @@ -93,9 +95,7 @@ void ValidationWorker::run() {
emit resultReady(Sprt::Loss, m_expected);
}
// Change color and play again
m_firstNet.swap(m_secondNet);
m_firstBin.swap(m_secondBin);
m_firstOpts.swap(m_secondOpts);
std::swap(m_engines[0], m_engines[1]);
if (m_expected == Game::BLACK) {
m_expected = Game::WHITE;
} else {
Expand All @@ -109,24 +109,14 @@ void ValidationWorker::run() {
}

void ValidationWorker::init(const QString& gpuIndex,
const QString& firstNet,
const QString& secondNet,
const QString& firstBin,
const QString& secondBin,
const QString& firstOpts,
const QString& secondOpts,
const QVector<Engine>& engines,
const QString& keep,
int expected) {
m_firstOpts = firstOpts;
m_secondOpts = secondOpts;
m_engines = engines;
if (!gpuIndex.isEmpty()) {
m_firstOpts.prepend(" --gpu=" + gpuIndex + " ");
m_secondOpts.prepend(" --gpu=" + gpuIndex + " ");
m_engines[0].m_options.prepend(" --gpu=" + gpuIndex + " ");
m_engines[1].m_options.prepend(" --gpu=" + gpuIndex + " ");
}
m_firstNet = firstNet;
m_secondNet = secondNet;
m_firstBin = firstBin;
m_secondBin = secondBin;
m_expected = expected;
m_keepPath = keep;
m_state.store(RUNNING);
Expand All @@ -135,14 +125,9 @@ void ValidationWorker::init(const QString& gpuIndex,
Validation::Validation(const int gpus,
const int games,
const QStringList& gpuslist,
const QString& firstNet,
const QString& secondNet,
QVector<Engine>& engines,
const QString& keep,
QMutex* mutex,
const QString& firstBin,
const QString& secondBin,
const QString& firstOpts,
const QString& secondOpts,
const float& h0,
const float& h1) :

Expand All @@ -152,21 +137,13 @@ Validation::Validation(const int gpus,
m_games(games),
m_gpus(gpus),
m_gpusList(gpuslist),
m_firstNet(firstNet),
m_secondNet(secondNet),
m_firstBin(firstBin),
m_secondBin(secondBin),
m_firstOpts(firstOpts),
m_secondOpts(secondOpts),
m_engines(engines),
m_keepPath(keep) {
m_statistic.initialize(h0, h1, 0.05, 0.05);
m_statistic.addGameResult(Sprt::Draw);
}

void Validation::startGames() {
QString n1, n2, b1 ,b2 ,o1, o2;
int expected;
QString myGpu;
for (int gpu = 0; gpu < m_gpus; ++gpu) {
for (int game = 0; game < m_games; ++game) {
auto thread_index = gpu * m_games + game;
Expand All @@ -175,30 +152,21 @@ void Validation::startGames() {
this,
&Validation::getResult,
Qt::DirectConnection);
if (game % 2) {
n1 = m_firstNet;
n2 = m_secondNet;
b1 = m_firstBin;
b2 = m_secondBin;
o1 = m_firstOpts;
o2 = m_secondOpts;
expected = Game::BLACK;
} else {
n1 = m_secondNet;
n2 = m_firstNet;
b1 = m_secondBin;
b2 = m_firstBin;
o1 = m_secondOpts;
o2 = m_firstOpts;

auto engines = m_engines;
auto expected = Game::BLACK;
if (game & 1) {
std::swap(engines[0], engines[1]);
expected = Game::WHITE;
}
if (m_gpusList.isEmpty()) {
myGpu = "";
} else {

auto myGpu = QString("");
if (!m_gpusList.isEmpty()) {
myGpu = m_gpusList.at(gpu);
}

m_gamesThreads[thread_index].init(myGpu, n1, n2, b1, b2, o1, o2, m_keepPath, expected);
m_gamesThreads[thread_index].init(
myGpu, engines, m_keepPath, expected);
m_gamesThreads[thread_index].start();
}
}
Expand All @@ -213,7 +181,7 @@ void Validation::saveSprt() {
out << m_statistic;
out << m_results;
f.close();
m_results.printResults(m_firstNet, m_secondNet);
m_results.printResults(m_engines[0].m_network, m_engines[1].m_network);
printSprtStatus(m_statistic.status());
}

Expand All @@ -237,7 +205,7 @@ void Validation::loadSprt() {
f.close();
QFile::remove(fi.fileName());
QTextStream(stdout) << "Initial Statistics" << endl;
m_results.printResults(m_firstNet, m_secondNet);
m_results.printResults(m_engines[0].m_network, m_engines[1].m_network);
printSprtStatus(m_statistic.status());
}

Expand Down Expand Up @@ -270,7 +238,7 @@ void Validation::getResult(Sprt::GameResult result, int net_one_color) {
<< "The first net is "
<< ((status.result == Sprt::AcceptH0) ? "worse " : "better ")
<< "than the second" << endl;
m_results.printResults(m_firstNet, m_secondNet);
m_results.printResults(m_engines[0].m_network, m_engines[1].m_network);
//sendQuit();
} else {
printSprtStatus(status);
Expand Down
44 changes: 20 additions & 24 deletions validation/Validation.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,25 @@
#include "../autogtp/Game.h"
#include "Results.h"

class Engine {
public:
Engine(const QString& network,
const QString& options,
const QStringList& commands = QStringList("time_settings 0 1 0"),
const QString& binary = QString("./leelaz")) :
m_binary(binary), m_options(options),
m_network(network), m_commands(commands) {}
Engine() = default;
QString m_binary;
QString m_options;
QString m_network;
QStringList m_commands;
};

class ValidationWorker : public QThread {
Q_OBJECT
public:

enum {
RUNNING = 0,
FINISHING
Expand All @@ -39,12 +55,7 @@ class ValidationWorker : public QThread {
ValidationWorker(const ValidationWorker& w) : QThread(w.parent()) {}
~ValidationWorker() = default;
void init(const QString& gpuIndex,
const QString& firstNet,
const QString& secondNet,
const QString& firstBin,
const QString& secondBin,
const QString& firstOpts,
const QString& secondOpts,
const QVector<Engine>& engines,
const QString& keep,
int expected);
void run() override;
Expand All @@ -53,14 +64,9 @@ class ValidationWorker : public QThread {
signals:
void resultReady(Sprt::GameResult r, int net_one_color);
private:
QString m_firstNet;
QString m_secondNet;
QVector<Engine> m_engines;
int m_expected;
QString m_keepPath;
QString m_firstBin;
QString m_secondBin;
QString m_firstOpts;
QString m_secondOpts;
QAtomicInt m_state;
};

Expand All @@ -70,14 +76,9 @@ class Validation : public QObject {
public:
Validation(const int gpus, const int games,
const QStringList& gpusList,
const QString& firstNet,
const QString& secondNet,
QVector<Engine>& engines,
const QString& keep,
QMutex* mutex,
const QString& firstBin,
const QString& secondBin,
const QString& firstOpts,
const QString& secondOpts,
const float& h0,
const float& h1);
~Validation() = default;
Expand All @@ -98,12 +99,7 @@ public slots:
int m_games;
int m_gpus;
QStringList m_gpusList;
QString m_firstNet;
QString m_secondNet;
QString m_firstBin;
QString m_secondBin;
QString m_firstOpts;
QString m_secondOpts;
QVector<Engine>& m_engines;
QString m_keepPath;
void quitThreads();
void saveSprt();
Expand Down