# Gemma 2

{% hint style="info" %}
**Доступна более новая версия!** Google выпустил [**Gemma 3**](https://docs.clore.ai/guides/guides_v2-ru/yazykovye-modeli/gemma3) в марте 2025 года — модель на 27B превосходит Llama 3.1 405B и добавляет встроенную мультимодальную поддержку. Рассмотрите возможность обновления.
{% endhint %}

Запускайте модели Gemma 2 от Google для эффективного инференса.

{% hint style="success" %}
Все примеры можно запускать на GPU-серверах, арендуемых через [CLORE.AI Marketplace](https://clore.ai/marketplace).
{% endhint %}

## Аренда на CLORE.AI

1. Посетите [CLORE.AI Marketplace](https://clore.ai/marketplace)
2. Отфильтруйте по типу GPU, объему VRAM и цене
3. Выберите **On-Demand** (фиксированная ставка) или **Spot** (цена по ставке)
4. Настройте ваш заказ:
   * Выберите Docker-образ
   * Установите порты (TCP для SSH, HTTP для веб-интерфейсов)
   * Добавьте переменные окружения при необходимости
   * Введите команду запуска
5. Выберите способ оплаты: **CLORE**, **BTC**, или **USDT/USDC**
6. Создайте заказ и дождитесь развертывания

### Доступ к вашему серверу

* Найдите данные для подключения в **Моих заказах**
* Веб-интерфейсы: используйте URL HTTP-порта
* SSH: `ssh -p <port> root@<proxy-address>`

## Что такое Gemma 2?

Gemma 2 от Google предлагает:

* Модели от 2B до 27B параметров
* Отличная производительность относительно размера
* Сильное следование инструкциям
* Эффективная архитектура

## Варианты моделей

| Модель      | Параметры | VRAM | Контекст |
| ----------- | --------- | ---- | -------- |
| Gemma-2-2B  | 2B        | 3GB  | 8K       |
| Gemma-2-9B  | 9B        | 12GB | 8K       |
| Gemma-2-27B | 27B       | 32GB | 8K       |

## Быстрое развертывание

**Docker-образ:**

```
pytorch/pytorch:2.5.1-cuda12.4-cudnn9-runtime
```

**Порты:**

```
22/tcp
8000/http
```

**Команда:**

```bash
pip install vllm && \
vllm serve google/gemma-2-9b-it --port 8000
```

## Доступ к вашему сервису

После развертывания найдите ваш `http_pub` URL в **Моих заказах**:

1. Перейдите на **Моих заказах** страницу
2. Нажмите на ваш заказ
3. Найдите `http_pub` URL (например, `abc123.clorecloud.net`)

Используйте `https://YOUR_HTTP_PUB_URL` вместо `localhost` в примерах ниже.

## Использование Ollama

```bash

# Запустить Gemma 2
ollama run gemma2

# Конкретные размеры
ollama run gemma2:2b
ollama run gemma2:9b
ollama run gemma2:27b
```

## Установка

```bash
pip install transformers accelerate torch
```

## Базовое использование

```python
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch

model_id = "google/gemma-2-9b-it"

tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
    model_id,
    torch_dtype=torch.bfloat16,
    device_map="auto"
)

messages = [
    {"role": "user", "content": "Объясните, как нейронные сети учатся."}
]

inputs = tokenizer.apply_chat_template(
    messages,
    return_tensors="pt",
    add_generation_prompt=True
).to("cuda")

outputs = model.generate(
    inputs,
    max_new_tokens=512,
    temperature=0.7,
    do_sample=True
)

response = tokenizer.decode(outputs[0][inputs.shape[1]:], skip_special_tokens=True)
print(response)
```

## Gemma 2 2B (Лёгкая)

Для развертывания на edge/мобильных устройствах:

```python
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch

model_id = "google/gemma-2-2b-it"

tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
    model_id,
    torch_dtype=torch.float16,
    device_map="auto"
)

# Быстрый инференс для простых задач
messages = [{"role": "user", "content": "Суммируйте в одном предложении: ИИ трансформирует отрасли."}]
```

## Gemma 2 27B (Лучшее качество)

```python
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
import torch

model_id = "google/gemma-2-27b-it"

# Используйте 4-битную квантование, чтобы поместиться в 24GB VRAM
quantization_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_compute_dtype=torch.bfloat16
)

tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
    model_id,
    quantization_config=quantization_config,
    device_map="auto"
)
```

## vLLM Сервер

```bash
vllm serve google/gemma-2-9b-it \
    --port 8000 \
    --dtype bfloat16 \
    --max-model-len 8192
```

### Совместимый с OpenAI API

```python
from openai import OpenAI

client = OpenAI(base_url="http://localhost:8000/v1", api_key="x")

response = client.chat.completions.create(
    model="google/gemma-2-9b-it",
    messages=[
        {"role": "user", "content": "Напишите хайку о программировании"}
    ],
    temperature=0.8
)

print(response.choices[0].message.content)
```

## Потоковая передача (Streaming)

```python
from openai import OpenAI

client = OpenAI(base_url="http://localhost:8000/v1", api_key="x")

stream = client.chat.completions.create(
    model="google/gemma-2-9b-it",
    messages=[{"role": "user", "content": "Расскажи мне короткую историю"}],
    stream=True
)

for chunk in stream:
    if chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="", flush=True)
```

## Интерфейс Gradio

```python
import gradio as gr
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch

model_id = "google/gemma-2-9b-it"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
    model_id, torch_dtype=torch.bfloat16, device_map="auto"
)

def chat(message, history, temperature):
    messages = []
    for h in history:
        messages.append({"role": "user", "content": h[0]})
        messages.append({"role": "assistant", "content": h[1]})
    messages.append({"role": "user", "content": message})

    inputs = tokenizer.apply_chat_template(messages, return_tensors="pt", add_generation_prompt=True).to("cuda")
    outputs = model.generate(inputs, max_new_tokens=512, temperature=temperature, do_sample=True)

    return tokenizer.decode(outputs[0][inputs.shape[1]:], skip_special_tokens=True)

demo = gr.ChatInterface(
    fn=chat,
    additional_inputs=[gr.Slider(0.1, 1.5, value=0.7, label="Temperature")],
    title="Gemma 2 Chat"
)

demo.launch(server_name="0.0.0.0", server_port=7860)
```

## Пакетная обработка

```python
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch

model_id = "google/gemma-2-9b-it"
tokenizer = AutoTokenizer.from_pretrained(model_id, padding_side="left")
tokenizer.pad_token = tokenizer.eos_token

model = AutoModelForCausalLM.from_pretrained(
    model_id, torch_dtype=torch.bfloat16, device_map="auto"
)

prompts = [
    "Объясните гравитацию в одном предложении.",
    "Что такое фотосинтез?",
    "Дайте определение машинному обучению.",
    "Какова скорость света?"
]

messages_batch = [[{"role": "user", "content": p}] for p in prompts]

inputs = tokenizer.apply_chat_template(
    messages_batch,
    return_tensors="pt",
    padding=True,
    add_generation_prompt=True
).to("cuda")

outputs = model.generate(inputs, max_new_tokens=128, pad_token_id=tokenizer.pad_token_id)

for i, output in enumerate(outputs):
    response = tokenizer.decode(output, skip_special_tokens=True)
    print(f"Q: {prompts[i]}")
    print(f"A: {response.split('<start_of_turn>model')[-1].strip()}\n")
```

## Производительность

| Модель              | GPU      | Токенов/с |
| ------------------- | -------- | --------- |
| Gemma-2-2B          | RTX 3060 | \~100     |
| Gemma-2-9B          | RTX 3090 | \~60      |
| Gemma-2-9B          | RTX 4090 | \~85      |
| Gemma-2-27B         | A100     | \~45      |
| Gemma-2-27B (4-бит) | RTX 4090 | \~30      |

## Сравнение

| Модель       | MMLU  | Качество | Скорость |
| ------------ | ----- | -------- | -------- |
| Gemma-2-9B   | 71.3% | Отлично  | Быстро   |
| Llama-3.1-8B | 69.4% | Хорошо   | Быстро   |
| Mistral-7B   | 62.5% | Хорошо   | Быстро   |

## Устранение неполадок

{% hint style="danger" %}
**CUDA — недостаточно памяти**
{% endhint %}

для 27B — используйте 4-битную квантование с BitsAndBytesConfig - уменьшите \`max\_new\_tokens\` - очистите кэш GPU: \`torch.cuda.empty\_cache()\`

### Медленная генерация

* Используйте vLLM для продакшен-развёртывания
* Включите Flash Attention
* Попробуйте модель 9B для более быстрого инференса

### Проблемы с качеством вывода

* Используйте версию, настроенную под инструкции (`-it` суффикс)
* Отрегулируйте температуру (рекомендуется 0.7–0.9)
* Добавьте системный промпт для контекста

### Предупреждения токенизатора

* Обновите transformers до последней версии
* Используйте `padding_side="left"` для пакетного инференса

## Оценка стоимости

Типичные ставки на маркетплейсе CLORE.AI (по состоянию на 2024):

| GPU       | Почасовая ставка | Дневная ставка | Сессия 4 часа |
| --------- | ---------------- | -------------- | ------------- |
| RTX 3060  | \~$0.03          | \~$0.70        | \~$0.12       |
| RTX 3090  | \~$0.06          | \~$1.50        | \~$0.25       |
| RTX 4090  | \~$0.10          | \~$2.30        | \~$0.40       |
| A100 40GB | \~$0.17          | \~$4.00        | \~$0.70       |
| A100 80GB | \~$0.25          | \~$6.00        | \~$1.00       |

*Цены варьируются в зависимости от провайдера и спроса. Проверьте* [*CLORE.AI Marketplace*](https://clore.ai/marketplace) *для текущих тарифов.*

**Экономьте деньги:**

* Используйте **Spot** рынок для гибких рабочих нагрузок (часто на 30–50% дешевле)
* Платите с помощью **CLORE** токенов
* Сравнивайте цены у разных провайдеров

## Дальнейшие шаги

* Llama 3.2 — модель от Meta
* Qwen2.5 - модель Alibaba
* vLLM Inference - Продакшен-сервинг


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.clore.ai/guides/guides_v2-ru/yazykovye-modeli/gemma2.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
