Преобразовать тензоры безопасности обнимающего лица в задачу MediaPipe

В этом руководстве приведены инструкции по преобразованию моделей Gemma в формате Hugging Face Safetensors ( .safetensors ) в формат файла MediaPipe Task ( .task ). Это преобразование необходимо для развертывания предварительно обученных или дообученных моделей Gemma для выполнения инференции на устройствах Android и iOS с использованием API MediaPipe LLM Inference и среды выполнения LiteRT.

Блок-схема для упаковки модели "Обнимающее лицо" в файл задачи MediaPipe.

Для создания необходимого пакета задач ( .task ) вам понадобится LiteRT Torch . Этот инструмент экспортирует модели PyTorch в модели LiteRT с множественными сигнатурами ( .tflite ), которые совместимы с API вывода MediaPipe LLM и подходят для работы на процессорах в мобильных приложениях.

Итоговый файл .task представляет собой самодостаточный пакет, необходимый для MediaPipe, и включает в себя модель LiteRT, модель токенизатора и необходимые метаданные. Этот пакет необходим, поскольку токенизатор (который преобразует текстовые подсказки в векторные представления токенов для модели) должен быть упакован вместе с моделью LiteRT для обеспечения сквозного вывода.

Вот пошаговое описание процесса:

Пошаговое описание процесса

1. Получите свою модель Gemma.

У вас есть два варианта начала.

Вариант А. Использовать существующую, точно настроенную модель.

Если у вас уже подготовлена ​​доработанная модель Gemma , просто перейдите к следующему шагу.

Вариант B. Скачать официальную инструкцию по настройке модели.

Если вам нужна модель, вы можете скачать модель Джеммы с инструкциями из Hugging Face Hub.

Настройте необходимые инструменты:

python -m venv hf
source hf/bin/activate
pip install huggingface_hub[cli]

Скачать модель:

Модели на платформе Hugging Face Hub идентифицируются по идентификатору модели, обычно в формате <organization_or_username>/<model_name> . Например, чтобы загрузить официальную модель Google Gemma 3 270M с настроенными инструкциями, используйте:

hf download google/gemma-3-270m-it --local-dir "PATH_TO_HF_MODEL"
#"google/gemma-3-1b-it", etc

2. Преобразуйте и квантуйте модель в формат LiteRT.

Настройте виртуальное окружение Python и установите последнюю стабильную версию пакета LiteRT Torch:

python -m venv litert-torch
source litert-torch/bin/activate
pip install "litert-torch>=0.8.0"

Используйте следующий скрипт для преобразования Safetensor в модель LiteRT.

from litert_torch.generative.examples.gemma3 import gemma3
from litert_torch.generative.utilities import converter
from litert_torch.generative.utilities.export_config import ExportConfig
from litert_torch.generative.layers import kv_cache

pytorch_model = gemma3.build_model_270m("PATH_TO_HF_MODEL")

# If you are using Gemma 3 1B
#pytorch_model = gemma3.build_model_1b("PATH_TO_HF_MODEL")

export_config = ExportConfig()
export_config.kvcache_layout = kv_cache.KV_LAYOUT_TRANSPOSED
export_config.mask_as_input = True

converter.convert_to_tflite(
    pytorch_model,
    output_path="OUTPUT_DIR_PATH",
    output_name_prefix="my-gemma3",
    prefill_seq_len=2048,
    kv_cache_max_len=4096,
    quantize="dynamic_int8",
    export_config=export_config,
)

Учтите, что этот процесс занимает много времени и зависит от скорости обработки данных вашим компьютером. Для сравнения, на 8-ядерном процессоре 2025 модель 270M обрабатывается более 5-10 минут, а модель 1B — примерно 10-30 минут.

Итоговый результат, модель LiteRT, будет сохранен в указанную вами OUTPUT_DIR_PATH .

Настройте следующие значения в соответствии с ограничениями по объему памяти и производительности целевого устройства.

  • kv_cache_max_len : Определяет общий размер рабочей памяти модели (кэш ключ-значение). Эта емкость является жестким ограничением и должна быть достаточной для хранения суммарной суммы токенов запроса (предварительное заполнение) и всех последующих сгенерированных токенов (декодирование).
  • prefill_seq_len : Задает количество токенов во входном запросе для предварительного заполнения фрагментами. При обработке входного запроса с использованием предварительного заполнения фрагментами вся последовательность (например, 50 000 токенов) вычисляется не сразу; вместо этого она разбивается на управляемые сегменты (например, фрагменты по 2048 токенов), которые последовательно загружаются в кэш, чтобы предотвратить ошибку нехватки памяти.
  • quantize : строка для выбранных схем квантования. Ниже приведен список доступных рецептов квантования для Gemma 3.
    • none : Нет квантования
    • fp16 : Веса FP16, активации FP32 и вычисления с плавающей запятой для всех операций.
    • dynamic_int8 : активации FP32, веса INT8 и вычисления целых чисел.
    • weight_only_int8 : активации FP32, веса INT8 и вычисления с плавающей запятой.

3. Создайте пакет задач из LiteRT и токенизатора.

Настройте виртуальное окружение Python и установите пакет Python mediapipe :

python -m venv mediapipe
source mediapipe/bin/activate
pip install mediapipe

Для сборки модели используйте библиотеку genai.bundler :

from mediapipe.tasks.python.genai import bundler
config = bundler.BundleConfig(
    tflite_model="PATH_TO_LITERT_MODEL.tflite",
    tokenizer_model="PATH_TO_HF_MODEL/tokenizer.model",
    start_token="<bos>",
    stop_tokens=["<eos>", "<end_of_turn>"],
    output_filename="PATH_TO_TASK_BUNDLE.task",
    prompt_prefix="<start_of_turn>user\n",
    prompt_suffix="<end_of_turn>\n<start_of_turn>model\n",
)
bundler.create_bundle(config)

Функция bundler.create_bundle создает файл .task , содержащий всю необходимую информацию для запуска модели.

4. Вывод результатов с помощью Mediapipe на Android

Инициализируйте задачу с основными параметрами конфигурации:

// Default values for LLM models
private object LLMConstants {
    const val MODEL_PATH = "PATH_TO_TASK_BUNDLE_ON_YOUR_DEVICE.task"
    const val DEFAULT_MAX_TOKEN = 4096
    const val DEFAULT_TOPK = 64
    const val DEFAULT_TOPP = 0.95f
    const val DEFAULT_TEMPERATURE = 1.0f
}

// Set the configuration options for the LLM Inference task
val taskOptions = LlmInference.LlmInferenceOptions.builder()
    .setModelPath(LLMConstants.MODEL_PATH)
    .setMaxTokens(LLMConstants.DEFAULT_MAX_TOKEN)
    .build()

// Create an instance of the LLM Inference task
llmInference = LlmInference.createFromOptions(context, taskOptions)
llmInferenceSession =
    LlmInferenceSession.createFromOptions(
        llmInference,
        LlmInferenceSession.LlmInferenceSessionOptions.builder()
            .setTopK(LLMConstants.DEFAULT_TOPK)
            .setTopP(LLMConstants.DEFAULT_TOPP)
            .setTemperature(LLMConstants.DEFAULT_TEMPERATURE)
            .build(),
    )

Для генерации текстового ответа используйте метод generateResponse() .

val result = llmInferenceSession.generateResponse(inputPrompt)
logger.atInfo().log("result: $result")

Для потоковой передачи ответа используйте метод generateResponseAsync() .

llmInferenceSession.generateResponseAsync(inputPrompt) { partialResult, done ->
    logger.atInfo().log("partial result: $partialResult")
}

Для получения дополнительной информации см. руководство по LLM Inference для Android .

Следующие шаги

Создавайте и исследуйте больше возможностей с помощью моделей Gemma: