Недавно дообучал модель через Unsloth — это бесплатно, но требует GPU или хотя бы Colab. Работает, но есть нюанс: после обучения тебе нужно где-то хостить модель. Плюс надо разбираться с Hugging Face, квантизацией, форматами весов.
Mistral предлагает другой путь: платное облачное дообучение через la Plateforme. Загрузил датасет → запустил job → получил fine-tuned модель, доступную через тот же API. Никакой инфраструктуры, деплой включён в стоимость.
Это не лучше и не хуже Unsloth — просто другой trade-off. Если у тебя нет GPU и не хочется возиться с хостингом, Mistral API — разумный вариант.
Для кого: разработчики и инженеры, которые хотят дообучить LLM без настройки инфраструктуры. Нужен базовый Python и понимание что такое fine-tuning. Если сомневаешься нужен ли тебе вообще fine-tuning или достаточно RAG — сначала прочти это.
Почему Mistral API, а не Unsloth?
Смотри, задача звучит одинаково: «хочу дообучить модель на своих данных». Но под ней могут быть два разных сценария.
Сценарий A: у тебя есть время, GPU (или готов платить за Colab), и тебя не пугает Hugging Face. Хочешь максимально бесплатно. → Unsloth.
Сценарий B: тебе нужен быстрый результат, нет желания разбираться с инфраструктурой, и ты готов заплатить за токены. Хочешь, чтобы через час дообученная модель уже отвечала через API. → Mistral Fine-tuning API.
Я оказался в сценарии B: нужно было дообучить модель для конкретного продукта, без setup'а сервера. Потратил $1.4, получил модель через ~40 минут, сразу начал её использовать.
Ключевое отличие от Unsloth: деплой включён. Дообученная модель живёт на серверах Mistral и доступна через обычный /v1/chat/completions с твоим model ID. Не надо ничего хостить.
Что умеет Mistral Fine-tuning API
Mistral la Plateforme поддерживает fine-tuning нескольких моделей. На апрель 2026:
| Модель | Параметры | Цена обучения (за 1M токенов) |
|---|---|---|
mistral-7b-v0.3 | 7B | $2 |
mistral-small-2409 | ~22B | $3 |
open-mistral-nemo | 12B | $2 |
codestral-2405 | 22B | $4 |
Цены проверял на docs.mistral.ai. Дополнительно платишь за инференс дообученной модели — обычно немного дороже базовой.
Что поддерживается:
- conversational формат (system/user/assistant)
- supervised fine-tuning (SFT) — подстройка под примеры диалогов
- hyperparameters: количество эпох, learning rate, случайный seed
Под капотом Mistral использует LoRA — дообучает не всю модель, а небольшие адаптеры. Это дешевле полного fine-tuning и достаточно для большинства задач.
Шаг 1: Готовлю датасет в формате JSONL
Mistral принимает датасет в conversational формате — каждая строка это один JSON-объект с ключом messages.
Минимальный рабочий пример:
{"messages": [{"role": "user", "content": "Что такое квантизация модели?"}, {"role": "assistant", "content": "Квантизация — это сжатие весов модели. Вместо float32 используешь int8 или int4. Модель становится в 2-4 раза легче с минимальной потерей качества."}]}
{"messages": [{"role": "system", "content": "Ты — технический эксперт по AI. Отвечаешь коротко и конкретно."}, {"role": "user", "content": "Чем LoRA отличается от full fine-tuning?"}, {"role": "assistant", "content": "LoRA обучает только небольшие адаптерные матрицы поверх замороженных весов модели. Full fine-tuning меняет все веса. LoRA быстрее, дешевле, занимает меньше памяти — и обычно достаточно для SFT."}]}Несколько практических моментов:
Минимум примеров: официально 10, но на практике хорошие результаты начинаются от 50. Для смены стиля ответов мне хватало 80-100 примеров. Для узкодоменных задач (юридический язык, специфические форматы) — от 200.
Качество важнее количества. 50 чистых, разнообразных примеров дадут лучше результат, чем 500 похожих или зашумленных. Я проверяю каждый вручную перед загрузкой — да, это скучно, да, это обязательно.
Длина ответов: если твои ответы сильно разные по длине — нормально. Mistral справляется. Если все одинаково короткие — модель начнёт truncate длинные ответы.
Файл должен называться что-то вроде train.jsonl. Опционально можно добавить валидационный файл val.jsonl (те же 10-20% примеров) — тогда будешь видеть метрики валидации в процессе обучения.
Шаг 2: Загружаю файл через Files API
import os
from mistralai import Mistral
client = Mistral(api_key=os.environ["MISTRAL_API_KEY"])
# Загружаем тренировочный файл
with open("train.jsonl", "rb") as f:
train_file = client.files.upload(
file={
"file_name": "train.jsonl",
"content": f,
},
purpose="fine-tune"
)
print(f"Файл загружен. ID: {train_file.id}")
# Опционально: валидационный файл
# with open("val.jsonl", "rb") as f:
# val_file = client.files.upload(
# file={"file_name": "val.jsonl", "content": f},
# purpose="fine-tune"
# )После загрузки получаешь file_id вида "00edaf84-95b0-45db-8f83-f71138491f23" — он нужен для следующего шага.
Если файл не прошёл валидацию (неправильный формат, пустые поля, битый JSON), upload вернёт ошибку. Самые частые: пустое поле content в одном из примеров, или перепутанные роли (assistant вместо user).
Шаг 3: Запускаю fine-tuning job
# Запускаем обучение
job = client.fine_tuning.jobs.create(
model="open-mistral-nemo", # базовая модель
training_files=[{"file_id": train_file.id, "weight": 1}],
# validation_files=[{"file_id": val_file.id}], # если есть
hyperparameters={
"training_steps": 100, # шагов обучения (или epochs)
"learning_rate": 0.0001, # начальный LR, по умолчанию подойдёт
},
suffix="my-assistant-v1", # суффикс для имени модели
integrations=[
{
"type": "wandb", # опционально: логи в W&B
"project": "mistral-ft"
}
] if False else None # уберите if False чтобы включить
)
print(f"Job запущен. ID: {job.id}")
print(f"Статус: {job.status}")Параметры, которые меняю чаще всего:
training_steps: 50-200 для небольших датасетов. Если видишь переобучение (train loss падает, val loss растёт) — уменьши.learning_rate: по умолчанию ~0.0001, обычно трогать не нужно.suffix: будет добавлен к имени дообученной модели, чтобы ты понял что это.
Job запускается асинхронно. Получаешь ID и дальше следишь за статусом.
Шаг 4: Отслеживаю процесс и забираю модель
import time
def wait_for_job(client, job_id: str, poll_interval: int = 60):
"""Ждём завершения job, выводим статус каждую минуту."""
while True:
job = client.fine_tuning.jobs.retrieve(job_id)
print(f"Статус: {job.status} | Шаг: {job.trained_tokens or 0} токенов")
if job.status in ("SUCCESS", "FAILED", "CANCELLED"):
return job
time.sleep(poll_interval)
# Ждём завершения
finished_job = wait_for_job(client, job.id)
if finished_job.status == "SUCCESS":
fine_tuned_model = finished_job.fine_tuned_model
print(f"\n✅ Готово! Модель: {fine_tuned_model}")
print("Используй это имя в параметре model при запросах")
else:
print(f"\n❌ Ошибка: {finished_job.status}")На open-mistral-nemo с датасетом ~100 примеров, 100 шагов — у меня заняло около 35 минут. Mistral посылает email когда job завершился.
После завершения — сразу можно использовать:
# Тестируем дообученную модель
response = client.chat.complete(
model=fine_tuned_model, # "open-mistral-nemo-my-assistant-v1-..."
messages=[
{"role": "user", "content": "Объясни что такое attention mechanism"}
]
)
print(response.choices[0].message.content)Разница в ответах — если датасет был хорошим — чувствуется сразу. Модель начинает отвечать в том стиле и с той терминологией, которую ты показал в примерах.
Сколько это стоит: считаю реальный чек
Mistral берёт деньги за токены обучения. Формула простая:
стоимость = (токены в датасете) × (эпохи) × (цена за 1M токенов)
Пример: датасет 100 примеров, ~500 токенов на пример, 3 эпохи, модель open-mistral-nemo:
100 × 500 × 3 = 150,000 токенов обучения
150,000 / 1,000,000 × $2 = $0.30
Добавь плату за хранение файлов и инференс — итого мои типичные job'ы выходят $0.30 - $1.50.
Для сравнения:
| Подход | Стоимость | Инфраструктура | Деплой |
|---|---|---|---|
| Unsloth (Colab бесплатный) | $0 | GPU нужен | Сам |
| Unsloth (Colab Pro) | $10-12/месяц | GPU включён | Сам |
| Mistral Fine-tuning API | $0.30-2 за job | Нет | Включён |
| OpenAI Fine-tuning API | $0.80-8 за job | Нет | Включён |
OpenAI дороже в 2-4 раза за те же токены. Плюс у Mistral есть открытые модели (Mistral 7B, Nemo) — что важно, если проект требует воспроизводимости.
Когда API окупается: если ценишь своё время дороже $1-2, не хочешь разбираться с хостингом и нужен быстрый запуск. Unsloth бесплатен, но «бесплатный» значит «платишь своим временем».
Mistral vs Unsloth: когда платить, а когда бесплатно
| Критерий | Unsloth | Mistral API |
|---|---|---|
| Стоимость | Бесплатно (нужен GPU) | $0.30-2 за job |
| Нужен GPU | Да (Colab T4 минимум) | Нет |
| Деплой | Сам настраиваешь | Включён в стоимость |
| Скорость старта | 30-60 мин на setup | 5 минут |
| Контроль гиперпараметров | Полный | Базовый |
| Размер моделей | До 70B (с квантизацией) | 7B-22B |
| Приватность данных | Локально | Данные уходят в облако |
Если работаешь с чувствительными данными — это важный пункт. Mistral обрабатывает твой датасет на своих серверах. Для большинства задач это нормально, но для медицинских или юридических данных — используй локальный Unsloth.
Подробнее про Unsloth и дообучение без кода — в отдельной статье.
FAQ
Сколько стоит fine-tuning через Mistral API?
Зависит от размера датасета и модели. Ориентир: $0.30-1.50 за типичный job (100-300 примеров, модель Nemo или 7B, 3-5 эпох). Точные цены — на docs.mistral.ai/capabilities/fine-tuning.
Какие модели Mistral можно дообучить?
На апрель 2026: mistral-7b-v0.3, open-mistral-nemo, mistral-small-2409 и codestral-2405. Полный актуальный список — в документации.
Какой формат датасета нужен для Mistral fine-tuning?
JSONL (JSON Lines): каждая строка — отдельный JSON с ключом messages. Формат совпадает с OpenAI fine-tuning. Каждый messages — список объектов с ролями system, user, assistant.
Чем Mistral fine-tuning отличается от OpenAI fine-tuning?
Технически похожи: оба SFT через API, оба используют JSONL-датасет. Mistral дешевле в 2-4 раза и предоставляет открытые базовые модели. Минус — меньше встроенных инструментов (нет автоматической оценки результатов как у OpenAI).
Можно ли дообучить Mistral бесплатно?
Через официальный API — нет. Бесплатный вариант: Unsloth локально или на Colab. Это сложнее, зато полный контроль и без ограничений на данные. Подробнее — в гайде по Unsloth.



