Оптимизация вывода модели Florence-2 с помощью ONNXRuntime C++ - оптимизация производительности для цикла генерации [закC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Оптимизация вывода модели Florence-2 с помощью ONNXRuntime C++ - оптимизация производительности для цикла генерации [зак

Сообщение Anonymous »

Я работаю над оптимизацией цикла вывода для модели Флоренции-2, используя ONNXRuntime на C++. Модель выполняет задачи, связанные с визуальным языком, и мне нужно оптимизировать цикл генерации, который обрабатывает часть модели, генерирующую язык.
Обзор текущей реализации:
< 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]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Оптимизация вывода модели Florence-2 с помощью ONNXRuntime C++ — оптимизация производительности для цикла генерации
    Anonymous » » в форуме C++
    0 Ответы
    30 Просмотры
    Последнее сообщение Anonymous
  • Проблема с Chromadb onnxruntime — Onnxruntime не найден
    Anonymous » » в форуме Python
    0 Ответы
    31 Просмотры
    Последнее сообщение Anonymous
  • Onnxruntime с Java и Spring Boot не может загрузить onnxruntime.dll
    Anonymous » » в форуме JAVA
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Onnxruntime с Java и Spring Boot не может загрузить onnxruntime.dll
    Anonymous » » в форуме JAVA
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Onnxruntime с Java и Spring Boot не может загрузить onnxruntime.dll
    Anonymous » » в форуме JAVA
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»