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

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

Блок-схема упаковки модели «Обнимающее лицо» в файл MediaPipe Task

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

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

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

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

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

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

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

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

Вариант Б. Загрузите официальную модель, настроенную по инструкции

Если вам нужна модель, вы можете загрузить настроенную по инструкции Джемму из 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 и установите последнюю стабильную версию пакета AI Edge Torch:

python -m venv ai-edge-torch
source ai-edge-torch/bin/activate
pip install "ai-edge-torch>=0.6.0"

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

from ai_edge_torch.generative.examples.gemma3 import gemma3
from ai_edge_torch.generative.utilities import converter
from ai_edge_torch.generative.utilities.export_config import ExportConfig
from ai_edge_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 : определяет общий выделенный размер рабочей памяти модели (кэша KV). Этот объём является жёстким ограничением и должен быть достаточным для хранения суммы токенов подсказки (предзаполнение) и всех сгенерированных впоследствии токенов (декодирование).
  • 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: