9#include "bergamotmarianinterface.h"
10#include "libbergamot_debug.h"
11#include <KLocalizedString>
14#include <slimt/Response.hh>
18std::shared_ptr<marian::Options> makeOptions(
const std::string &path_to_model_dir,
const BergamotEngineUtils::SettingsInfo &settings)
20 std::shared_ptr<marian::Options> options(slimt::parseOptionsFromFilePath(path_to_model_dir +
"/config.intgemm8bitalpha.yml"));
21 options->set(
"cpu-threads", settings.numberOfThread,
"workspace", settings.memoryByThread,
"mini-batch-words", 1000,
"alignment",
"soft",
"quiet",
true);
26int countWords(std::string input)
28 const char *str = input.c_str();
33 while (*str !=
'\0') {
34 if (std::isspace(
static_cast<unsigned char>(*str))) {
36 }
else if (inSpaces) {
47struct TranslationInput {
50 slimt::ResponseOptions options;
54struct ModelDescription {
55 std::string config_file;
56 BergamotEngineUtils::SettingsInfo settings;
59constexpr const size_t kTranslationCacheSize = 1 << 16;
61BergamotMarianInterface::BergamotMarianInterface(
QObject *parent)
63 , mPendingInput(nullptr)
64 , mPendingModel(nullptr)
79 mWorke = std::thread([&]() {
80 std::unique_ptr<slimt::AsyncService> service;
81 std::shared_ptr<slimt::TranslationModel> model;
83 std::mutex internal_mutex;
86 std::unique_ptr<ModelDescription> modelChange;
87 std::unique_ptr<TranslationInput> input;
91 std::unique_lock<std::mutex> lock(mMutex);
92 mConditionVariable.wait(lock, [&] {
93 return mPendingModel || mPendingInput || mPendingShutdown;
98 modelChange = std::move(mPendingModel);
103 else if (mPendingInput)
104 input = std::move(mPendingInput);
111 Q_EMIT pendingChanged(
true);
117 slimt::AsyncService::Config serviceConfig;
118 serviceConfig.numWorkers = modelChange->settings.numberOfThread;
119 serviceConfig.cacheSize = modelChange->settings.useLocalCache ? kTranslationCacheSize : 0;
126 service = std::make_unique<slimt::AsyncService>(serviceConfig);
131 auto modelConfig = makeOptions(modelChange->config_file, modelChange->settings);
132 model = std::make_shared<slimt::TranslationModel>(modelConfig, modelChange->settings.numberOfThread);
135 std::future<int> wordCount = std::async(
145 std::move(input->text),
148 std::unique_lock<std::mutex> lock(internal_mutex);
149 translation = Translation(std::move(val));
150 mConditionVariable.notify_one();
155 std::unique_lock<std::mutex> lock(internal_mutex);
156 mConditionVariable.wait(lock, [&] {
157 return translation || mPendingShutdown || mPendingModel;
161 Q_EMIT translationReady(translation);
170 }
catch (
const std::runtime_error &e) {
174 Q_EMIT pendingChanged(
false);
180BergamotMarianInterface::~BergamotMarianInterface()
185 std::unique_lock<std::mutex> lock(mMutex);
187 mPendingShutdown =
true;
188 mPendingModel.reset();
189 mPendingInput.reset();
191 mConditionVariable.notify_one();
199void BergamotMarianInterface::translate(
const QString &str)
204 if (mModelString.isEmpty()) {
205 qCWarning(TRANSLATOR_LIBBERGAMOT_LOG) <<
" mModelString is not defined!!!";
206 Q_EMIT errorText(
i18n(
"Language model is not defined."));
210 std::unique_lock<std::mutex> lock(mMutex);
211 std::unique_ptr<TranslationInput> input(
new TranslationInput{str.
toStdString(), slimt::ResponseOptions{}});
212 input->options.alignment =
true;
213 input->options.HTML =
false;
215 std::swap(mPendingInput, input);
217 mConditionVariable.notify_one();
221QString BergamotMarianInterface::model()
const
226void BergamotMarianInterface::setModel(
const QString &pathModelDir,
const BergamotEngineUtils::SettingsInfo &settings)
228 mModelString = pathModelDir;
232 if (mModelString.isEmpty())
237 std::unique_lock<std::mutex> lock(mMutex);
238 std::unique_ptr<ModelDescription> model(
new ModelDescription{mModelString.toStdString(), settings});
239 std::swap(mPendingModel, model);
242 mConditionVariable.notify_one();
246#include "moc_bergamotmarianinterface.cpp"
Wrapper around a translation response from the bergamot service.
QString i18n(const char *text, const TYPE &arg...)
QString fromStdString(const std::string &str)
std::string toStdString() const const