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