std::map<token, id> token_to_id;
std::map<id, token> id_to_token;
+ // used to avoid memory allocations during sampling
+ // TODO: move to whisper_context in the future
+ std::vector<std::pair<double, whisper_vocab::id>> probs_id;
+
id token_eot = 50256;
id token_sot = 50257;
id token_prev = 50360;
std::string word;
std::vector<char> tmp;
+
+ tmp.reserve(128);
+
for (int i = 0; i < n_vocab; i++) {
uint32_t len;
read_safe(fin, len);
vocab.id_to_token[i] = word;
}
}
+
+ wctx.logits.reserve(vocab.n_vocab*model.hparams.n_text_ctx);
+ wctx.probs.reserve(vocab.n_vocab*model.hparams.n_text_ctx);
+
+ vocab.probs_id.reserve(n_vocab);
}
{
std::string name;
std::vector<char> tmp(length); // create a buffer
- fin.read( &tmp[0], tmp.size() ); // read to buffer
+ fin.read(&tmp[0], tmp.size()); // read to buffer
name.assign(&tmp[0], tmp.size());
if (model.tensors.find(name) == model.tensors.end()) {
// the most basic sampling scheme - select the top token
static whisper_token_data whisper_sample_best(
- const whisper_vocab & vocab,
+ whisper_vocab & vocab,
const float * probs,
bool force_timestamp,
bool is_initial) {
0, 0, 0.0f, 0.0f, 0.0f, -1, -1, 0.0f,
};
- int n_logits = vocab.id_to_token.size();
+ const int n_logits = vocab.n_vocab;
- std::vector<std::pair<double, whisper_vocab::id>> probs_id;
- probs_id.reserve(n_logits);
+ auto & probs_id = vocab.probs_id;
+ probs_id.clear();
for (int i = 0; i < n_logits; i++) {
probs_id.emplace_back(probs[i], i);
}
std::vector<float> even;
std::vector<float> odd;
+ even.reserve(N/2);
+ odd.reserve(N/2);
+
for (int i = 0; i < N; i++) {
if (i % 2 == 0) {
even.push_back(in[i]);
std::vector<std::pair<float, int>> probs_id;
for (const auto & kv : g_lang) {
const auto token_lang = whisper_token_lang(ctx, kv.second.first);
- probs_id.emplace_back( ctx->probs[token_lang], kv.second.first );
+ probs_id.emplace_back(ctx->probs[token_lang], kv.second.first);
}
// sort descending