clang 20.0.0 (based on r547379) from build 12806354. Bug: http://b/379133546 Test: N/A Change-Id: I2eb8938af55d809de674be63cb30cf27e801862b Upstream-Commit: ad834e67b1105d15ef907f6255d4c96e8e733f57
69 lines
2.7 KiB
C++
69 lines
2.7 KiB
C++
//===- InteractiveModelRunner.h ---- "gym" ML model runner -----*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
|
|
#ifndef LLVM_ANALYSIS_INTERACTIVEMODELRUNNER_H
|
|
#define LLVM_ANALYSIS_INTERACTIVEMODELRUNNER_H
|
|
|
|
#include "llvm/Analysis/MLModelRunner.h"
|
|
#include "llvm/Analysis/TensorSpec.h"
|
|
#include "llvm/Analysis/Utils/TrainingLogger.h"
|
|
#include <system_error>
|
|
|
|
namespace llvm {
|
|
|
|
/// A MLModelRunner that asks for advice from an external agent, or host. It
|
|
/// uses 2 files - ideally named pipes - one to send data to that agent, and
|
|
/// one to receive advice.
|
|
/// The data exchange uses the training logger (Utils/TrainingLogger.h) format.
|
|
/// Specifically, the compiler will send the log header, set the context, and
|
|
/// send observations; the host is expected to reply with a tensor value after
|
|
/// each observation as a binary buffer that's conforming to the shape of the
|
|
/// advice. Interleaved, the data closely resembles the training log for a
|
|
/// log where we don't capture the reward signal.
|
|
///
|
|
/// Note that the correctness of the received data is the responsibility of the
|
|
/// host. In particular, if insufficient data were sent, the compiler will block
|
|
/// when waiting for an advice.
|
|
///
|
|
/// Note that the host can either open the pipes RW, or open first the pipe to
|
|
/// the compiler - i.e. the "Inbound" - and then the "Outbound", to avoid
|
|
/// deadlock. This is because the compiler first tries to open the inbound
|
|
/// (which will hang until there's a writer on the other end).
|
|
class InteractiveModelRunner : public MLModelRunner {
|
|
public:
|
|
InteractiveModelRunner(LLVMContext &Ctx,
|
|
const std::vector<TensorSpec> &Inputs,
|
|
const TensorSpec &Advice, StringRef OutboundName,
|
|
StringRef InboundName);
|
|
|
|
static bool classof(const MLModelRunner *R) {
|
|
return R->getKind() == MLModelRunner::Kind::Interactive;
|
|
}
|
|
void switchContext(StringRef Name) override {
|
|
Log->switchContext(Name);
|
|
Log->flush();
|
|
}
|
|
|
|
virtual ~InteractiveModelRunner();
|
|
|
|
private:
|
|
void *evaluateUntyped() override;
|
|
// This must be declared before InEC if we want to initialize it in the
|
|
// ctor initializer list.
|
|
int Inbound = -1;
|
|
const std::vector<TensorSpec> InputSpecs;
|
|
const TensorSpec OutputSpec;
|
|
std::error_code OutEC;
|
|
std::error_code InEC;
|
|
std::vector<char> OutputBuffer;
|
|
std::unique_ptr<Logger> Log;
|
|
};
|
|
} // namespace llvm
|
|
#endif // LLVM_ANALYSIS_INTERACTIVEMODELRUNNER_H
|