Обзор текущей реализации:
< ul>
[*]Поддерживает кэш перекрестного внимания между визуальными и языковыми компонентами.
[*]Использует отдельные сеансы внедрения и декодера.
[*]Обрабатывает кодировщик. кэширование значений ключа декодера
[*]Реализует различные процессоры логитов, включая неповторяющиеся ngram и обязательные токены BOS/EOS.
Вот текущая реализация цикла генерации:
Вот текущая реализация цикла генерации:
р>
Код: Выделить всё
std::vector Florence2Model::generate_loop_v3(
const std::vector &prefill_logits_data,
const std::vector &prefill_logits_shape,
const std::vector &decoder_key_data,
const std::vector &decoder_key_shapes,
const std::vector &decoder_value_data,
const std::vector &decoder_value_shapes,
const std::vector &encoder_key_data,
const std::vector &encoder_key_shapes,
const std::vector &encoder_value_data,
const std::vector &encoder_value_shapes,
const DenseTensor &encoder_hidden_states,
const DenseTensor &attention_mask,
const Ort::RunOptions &run_options,
const int64_t sequence_length)
{
std::cout beginning_of_sequence();
if (!bos_token)
{
throw std::runtime_error("Beginning of sequence token not found");
}
logits_processors.push_back(std::make_unique(
tokenizer_->token_to_id(*bos_token)));
auto eos_token = tokenizer_->get_tokens()->end_of_sequence();
if (!eos_token)
{
throw std::runtime_error("End of sequence token not found");
}
const int64_t eos_token_id = tokenizer_->token_to_id(*eos_token);
logits_processors.push_back(std::make_unique(
max_length, eos_token_id));
// Initialize stopping criteria
std::vector stopping_criteria;
stopping_criteria.push_back(std::make_unique(max_length));
// Store persistent copies
std::vector decoder_key_copies;
std::vector decoder_val_copies;
std::vector encoder_key_copies;
std::vector encoder_val_copies;
// Make persistent copies
for (int i = 0; i < 6; i++)
{
decoder_key_copies.push_back(decoder_key_data[i]);
decoder_val_copies.push_back(decoder_value_data[i]);
encoder_key_copies.push_back(encoder_key_data[i]);
encoder_val_copies.push_back(encoder_value_data[i]);
}
// Get initial logits data
const float *logits_data_ac = prefill_logits_data.data();
float *logits_data = (float *)logits_data_ac;
auto logits_dims = prefill_logits_shape;
// Initialize decoder KVs
std::vector decoder_kv;
for (int i = 0; i < 6; i++)
{
decoder_kv.push_back(Ort::Value::CreateTensor(
memory_info,
decoder_key_copies[i].data(),
decoder_key_copies[i].size(),
decoder_key_shapes[i].data(),
decoder_key_shapes[i].size()));
decoder_kv.push_back(Ort::Value::CreateTensor(
memory_info,
decoder_val_copies[i].data(),
decoder_val_copies[i].size(),
decoder_value_shapes[i].data(),
decoder_value_shapes[i].size()));
}
while (!std::all_of(is_done.begin(), is_done.end(), [](bool b)
{ return b; }))
{
// Process logits for each batch
for (int64_t batch_index = 0; batch_index < batch_size; ++batch_index)
{
if (is_done[batch_index])
{
continue;
}
std::vector last_logits(logits_data + (logits_dims[2] * (logits_dims[1] - 1)),
logits_data + (logits_dims[2] * logits_dims[1]));
// Apply logits processors
for (const auto &processor : logits_processors)
{
processor->process(
batch_index,
all_input_ids[batch_index],
last_logits,
logits_dims);
}
// Use beam search sampler instead of greedy selection
auto sampled_tokens = sampler.sample(
batch_index,
last_logits,
logits_dims);
// Take best token from beam search
for (const auto &[token, score] : sampled_tokens)
{
std::cout
Есть ли какие-либо оптимизации, специфичные для Флоренции-2? для интерфейса на языке видения?
[*]Как я могу уменьшить накладные расходы на выделение памяти, сохраняя при этом механизм перекрестного внимания?
[*]Каков наилучший метод управления кэш-значение кодера-декодера в моделях языка видения?
[/list]
Окружающая среда:
[list]
[*]ONNXRuntime-версия: 1.20.0
[*]Стандарт C++: C++17
[*]Платформа: Android/ПК
[/list]
Я заметил, что большая часть времени тратится на распределение тензоров и вычисления перекрестного внимания. Будем очень признательны за любые предложения по повышению производительности при сохранении точности модели.
Подробнее здесь: [url]https://stackoverflow.com/questions/79302122/optimizing-florence-2-model-inference-with-onnxruntime-c-performance-optimiz[/url]