111 const std::vector<std::span<const llama_token>>& prompts,
112 std::vector<float*>& output,
115 if (!ctx)
throw std::runtime_error(
"logits::process_chunks - NULL context");
116 if (prompts.size() != output.size())
117 throw std::runtime_error(
"logits::process_chunks - prompts/output size mismatch");
118 if (prompts.empty())
return;
120 const int32_t seq_max =
static_cast<int32_t
>(llama_n_seq_max(ctx));
121 const int32_t batch_limit =
static_cast<int32_t
>(llama_n_batch(ctx));
122 const int32_t n =
static_cast<int32_t
>(prompts.size());
125 for (int32_t group_start = 0; group_start < n; group_start += seq_max) {
126 int32_t group_size = std::min(seq_max, n - group_start);
129 auto chunks =
decode::bin_pack(&prompts[group_start], group_size, batch_limit);
130 if (chunks.empty())
continue;
132 for (
const auto& chunk : chunks) {
133 if (chunk.oversized) {
134 int32_t gi = group_start + chunk.indices[0];
135 llama_seq_id seq =
static_cast<llama_seq_id
>(chunk.indices[0]);
138 static_cast<int32_t
>(prompts[gi].size()),
139 0, batch_limit, seq) != 0)
140 throw std::runtime_error(
"logits::process_chunks - decode::many failed");
142 std::memcpy(output[gi],
get(ctx, -1), n_vocab *
sizeof(
float));
147 std::vector<decode::ScatterItem> scatter_items(chunk.indices.size());
148 for (
size_t k = 0; k < chunk.indices.size(); ++k) {
149 int32_t gi = group_start + chunk.indices[k];
150 scatter_items[k].tokens = prompts[gi];
151 scatter_items[k].start_pos = 0;
152 scatter_items[k].seq_id =
static_cast<llama_seq_id
>(chunk.indices[k]);
153 scatter_items[k].output_logits =
true;
157 static_cast<int32_t
>(scatter_items.size()),
159 throw std::runtime_error(
"logits::process_chunks - decode::scatter failed");
163 for (
size_t k = 0; k < scatter_items.size(); ++k) {
164 int32_t gi = group_start + chunk.indices[k];
165 int32_t item_n =
static_cast<int32_t
>(scatter_items[k].tokens.size());
166 std::memcpy(output[gi],
get(ctx, cursor + item_n - 1), n_vocab *
sizeof(
float));
172 for (int32_t s = 0; s < group_size; ++s) {