# Mistral и Mixtral

{% hint style="info" %}
**Доступны более новые версии!** Посмотрите [**Mistral Small 3.1**](https://docs.clore.ai/guides/guides_v2-ru/yazykovye-modeli/mistral-small) (24B, Apache 2.0, помещается на RTX 4090) и [**Mistral Large 3**](https://docs.clore.ai/guides/guides_v2-ru/yazykovye-modeli/mistral-large3) (675B MoE, класс фронтира).
{% endhint %}

Запускайте модели Mistral и Mixtral для высококачественной генерации текста.

{% 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>`

## Обзор моделей

| Модель              | Параметры              | VRAM  | Специализация            |
| ------------------- | ---------------------- | ----- | ------------------------ |
| Mistral-7B          | 7B                     | 8GB   | Универсальное назначение |
| Mistral-7B-Instruct | 7B                     | 8GB   | Чат/инструкция           |
| Mixtral-8x7B        | 46.7B (12.9B активных) | 24 ГБ | MoE, лучшее качество     |
| Mixtral-8x22B       | 141B                   | 80GB+ | Крупнейший MoE           |

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

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

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

**Порты:**

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

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

```bash
pip install vllm && \
python -m vllm.entrypoints.openai.api_server \
    --model mistralai/Mistral-7B-Instruct-v0.2 \
    --port 8000
```

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

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

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

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

## Варианты установки

### Использование Ollama (самый простой)

```bash

# Установите Ollama
curl -fsSL https://ollama.com/install.sh | sh

# Запустить Mistral
ollama run mistral

# Запустить Mixtral
ollama run mixtral
```

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

```bash
pip install vllm

# Запустить сервер
python -m vllm.entrypoints.openai.api_server \
    --model mistralai/Mistral-7B-Instruct-v0.2 \
    --dtype float16
```

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

```bash
pip install transformers accelerate
```

## Mistral-7B с Transformers

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

model_id = "mistralai/Mistral-7B-Instruct-v0.2"

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

messages = [
    {"role": "user", "content": "Объясните квантовые вычисления простыми словами"}
]

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

outputs = model.generate(
    inputs,
    max_new_tokens=500,
    do_sample=True,
    temperature=0.7,
    top_p=0.95
)

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

## Mixtral-8x7B

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

model_id = "mistralai/Mixtral-8x7B-Instruct-v0.1"

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

messages = [
    {"role": "user", "content": "Напишите функцию на Python для вычисления чисел Фибоначчи"}
]

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

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

print(tokenizer.decode(outputs[0], skip_special_tokens=True))
```

## Квантизированные модели (меньше VRAM)

### Квантование 4-бит

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

quantization_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_compute_dtype=torch.float16,
    bnb_4bit_quant_type="nf4"
)

model = AutoModelForCausalLM.from_pretrained(
    "mistralai/Mixtral-8x7B-Instruct-v0.1",
    quantization_config=quantization_config,
    device_map="auto"
)
```

### GGUF с llama.cpp

```bash

# Скачать модель GGUF
wget https://huggingface.co/bartowski/Mistral-7B-Instruct-v0.3-GGUF/resolve/main/Mistral-7B-Instruct-v0.3-Q4_K_M.gguf

# Запуск с llama.cpp
./main -m Mistral-7B-Instruct-v0.3-Q4_K_M.gguf \
    -p "Объясните машинное обучение" \
    -n 500
```

## vLLM сервер (продакшн)

```bash
python -m vllm.entrypoints.openai.api_server \
    --model mistralai/Mistral-7B-Instruct-v0.2 \
    --dtype float16 \
    --max-model-len 8192 \
    --gpu-memory-utilization 0.9
```

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

```python
from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:8000/v1",
    api_key="не_требуется"
)

response = client.chat.completions.create(
    model="mistralai/Mistral-7B-Instruct-v0.2",
    messages=[
        {"role": "user", "content": "Какова столица Франции?"}
    ],
    temperature=0.7,
    max_tokens=500
)

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="mistralai/Mistral-7B-Instruct-v0.2",
    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)
```

## Вызов функций

Mistral поддерживает вызов функций:

```python
from openai import OpenAI

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

tools = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "Получить погоду для местоположения",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {"type": "string"},
                    "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
                },
                "required": ["location"]
            }
        }
    }
]

response = client.chat.completions.create(
    model="mistralai/Mistral-7B-Instruct-v0.2",
    messages=[{"role": "user", "content": "Какая погода в Париже?"}],
    tools=tools
)

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

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

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

model_id = "mistralai/Mistral-7B-Instruct-v0.2"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
    model_id,
    torch_dtype=torch.float16,
    device_map="auto"
)

def chat(message, history, temperature, max_tokens):
    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").to("cuda")

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

    response = tokenizer.decode(outputs[0], skip_special_tokens=True)
    # Извлечь ответ ассистента
    return response.split("[/INST]")[-1].strip()

demo = gr.ChatInterface(
    fn=chat,
    additional_inputs=[
        gr.Slider(0.1, 2.0, value=0.7, label="Temperature"),
        gr.Slider(100, 2000, value=500, step=100, label="Макс токенов")
    ],
    title="Mistral-7B Chat"
)

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

## Сравнение производительности

### Пропускная способность (токенов/сек)

| Модель            | RTX 3060 | RTX 3090 | RTX 4090 | A100 40GB |
| ----------------- | -------- | -------- | -------- | --------- |
| Mistral-7B FP16   | 45       | 80       | 120      | 150       |
| Mistral-7B Q4     | 70       | 110      | 160      | 200       |
| Mixtral-8x7B FP16 | -        | -        | 30       | 60        |
| Mixtral-8x7B Q4   | -        | 25       | 50       | 80        |
| Mixtral-8x22B Q4  | -        | -        | -        | 25        |

### Время до первого токена (TTFT)

| Модель        | RTX 3090 | RTX 4090 | A100  |
| ------------- | -------- | -------- | ----- |
| Mistral-7B    | 80 мс    | 50 мс    | 35 мс |
| Mixtral-8x7B  | -        | 150ms    | 90 мс |
| Mixtral-8x22B | -        | -        | 200ms |

### Длина контекста vs VRAM (Mistral-7B)

| Контекст | FP16  | Q8    | Q4    |
| -------- | ----- | ----- | ----- |
| 4K       | 15GB  | 9 ГБ  | 5 ГБ  |
| 8K       | 18GB  | 11 ГБ | 7 ГБ  |
| 16K      | 24 ГБ | 15GB  | 9 ГБ  |
| 32K      | 36 ГБ | 22GB  | 14 ГБ |

## Требования к VRAM

| Модель        | FP16   | 8-бит | 4-бит |
| ------------- | ------ | ----- | ----- |
| Mistral-7B    | 14 ГБ  | 8GB   | 5 ГБ  |
| Mixtral-8x7B  | 90 ГБ  | 45 ГБ | 24 ГБ |
| Mixtral-8x22B | 180 ГБ | 90 ГБ | 48GB  |

## Сценарии использования

### Генерация кода

```python
prompt = """
Напишите класс на Python для REST API клиента с:
- Обработка аутентификации
- Логика повторных попыток
- Обработка ошибок
"""
```

### Анализ данных

```python
prompt = """
Проанализируйте эти данные и предоставьте выводы:
Продажи Q1: $100K
Продажи Q2: $150K
Продажи Q3: $120K
Продажи Q4: $200K
"""
```

### Творческое письмо

```python
prompt = """
Напишите короткий рассказ об ИИ, который становится самосознающим,
в стиле Айзека Азимова.
"""
```

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

### Недостаточно памяти

* Использовать 4-битную квантизацию
* Использовать Mistral-7B вместо Mixtral
* Уменьшить max\_model\_len

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

* Использовать vLLM для продакшна
* Включить flash attention
* Использовать тензорный параллелизм для нескольких GPU

### Плохое качество вывода

* Отрегулируйте температуру (0.1-0.9)
* Использовать вариант instruct
* Лучшие системные подсказки

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

Типичные ставки на маркетплейсе 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** токенов
* Сравнивайте цены у разных провайдеров

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

* [vLLM](https://docs.clore.ai/guides/guides_v2-ru/yazykovye-modeli/vllm) - Продуктивный сервис
* [Ollama](https://docs.clore.ai/guides/guides_v2-ru/yazykovye-modeli/ollama) - Легкое развёртывание
* [DeepSeek-V3](https://docs.clore.ai/guides/guides_v2-ru/yazykovye-modeli/deepseek-v3) - Лучшая модель для рассуждений
* [Qwen2.5](https://docs.clore.ai/guides/guides_v2-ru/yazykovye-modeli/qwen25) - Многоязычная альтернатива
