--- license: mit language: - ru - en base_model: - ai-sage/GigaChat3-10B-A1.8B-bf16 pipeline_tag: text-generation tags: - moe library_name: transformers --- # GigaChat3-10B-A1.8B Представляем `GigaChat3-10B-A1.8B` — диалоговую модель семейства GigaChat. Модель основана на архитектуре Mixture-of-Experts (MoE) с 10B общих и 1.8B активных параметров. Архитектура включает **Multi-head Latent Attention (MLA)** и **Multi-Token Prediction (MTP)**, за счет чего модель оптимизирована для высокой пропускной способности (throughput) при инференсе. Модель обучена поверх нашей базовой версии ([GigaChat3-10B-A1.8B-base](https://huggingface.co/ai-sage/GigaChat3-10B-A1.8B-base)) с помощью высококачественных SFT-данных. Данная версия предназначена для высокопроизводительного инференса в fp8, модель в bf16 — [GigaChat3-10B-A1.8B](https://huggingface.co/ai-sage/GigaChat3-10B-A1.8B-bf16). Больше подробностей [в хабр статье](https://habr.com/en/companies/sberdevices/articles/968904/). ## Архитектура модели `GigaChat3-10B-A1.8B` использует кастомную MoE-архитектуру: ### Multi-head Latent Attention (MLA) Вместо стандартного Multi-head Attention модель использует MLA. MLA обеспечивает эффективный инференс за счет сжатия Key-Value (KV) кэша в латентный вектор, что значительно снижает требования к памяти и ускоряет обработку. ### Multi-Token Prediction (MTP) Модель обучена с использованием задачи Multi-Token Prediction (MTP). Это позволяет модели предсказывать несколько токенов за один проход, что ускоряет генерацию до 40% с помощью техник спекулятивной/параллельной генерации. ## Данные для обучения Модель обучена на 20Т токенов. Мы добавили 10 языков — от китайского и арабского до узбекского и казахского, а также расширили набор источников: книги, академические данные, датасеты по коду и математике. Все данные проходят дедупликацию, языковую фильтрацию и автоматические проверки качества при помощи эвристик и классификаторов. Ключевой вклад в качество внесла синтетика: мы сгенерировали около 5,5 триллионов токенов синтетических данных. В корпус входят вопросы-ответы к текстам, цепочки reverse-prompt для структурирования данных, LLM-заметки с комментариями от модели внутри текстов, миллионы синтетических задач с решениями по математике и олимпиадному программированию (с синтетическими тестами) на основе PromptCot. ## Инференс Одно из ключевых преимуществ `GigaChat3-10B-A1.8B` — скорость инференса. Модель (особенно в режиме MTP) демонстрирует пропускную способность, сопоставимую с пропускной способностью значительно меньших dense‑моделей. Мы измеряли с помощью vLLM v0.11.0, на типе bfloat16 c `batch_size=1`. [Ссылка на код.](https://gist.github.com/ajpqs/ce941aa6f0f48ef36a65cb87a2a1d726) |**Модель**|**request_throughput**|**output_throughput**|**total_token_throughput**|**mean_ttft_ms**| |---|---|---|---|---| |`Qwen3-1.7B`|1.689|357.308|726.093|11.824| |**`mtp-GigaChat3-10B-A1.8B-base`**|**1.533**|**333.620**|**678.894**|**26.345**| |**`GigaChat3-10B-A1.8B-base`**|**1.077**|**234.363**|**476.912**|**31.053**| |`Qwen3-4B`|0.978|206.849|420.341|14.947| |`Qwen3-8B`|0.664|140.432|285.375|16.663| |`YandexGPT-5-Lite-8B-pretrain`|0.641|147.305|300.269|16.711| ## Бенчмарки Хотя модель имеет 10 миллиардов параметров, её прямые аналоги — модели размером 3–4 миллиарда параметров. Однако благодаря высокой скорости генерации мы также сравниваем её с ещё более компактными моделями. | Метрика | GigaChat 3 Lightning | Qwen3-1.7B-Instruct | Qwen3-4B-Instruct-2507 | SmolLM3 | | ------------------------- | ---------------------: | -----------------------: | ---------------------: | ------: | | MMLU_RU_FIVE_SHOT | **0.6833** | 0.4876 | 0.5972 | 0.4998 | | RUBQ_ZERO_SHOT | **0.6516** | 0.2557 | 0.3170 | 0.6363 | | MMLU_PRO_EN_FIVE_SHOT | 0.6061 | 0.410 | **0.6849** | 0.5013 | | MMLU_EN_FIVE_SHOT | **0.7403** | 0.60 | 0.7080 | 0.5992 | | BBH_THREE_SHOT | 0.4525 | 0.3317 | **0.7165** | 0.4161 | | SuperGPQA | 0.2731 | 0.2092 | **0.3745** | 0.2459 | | MATH_500_FOUR_SHOT | 0.7000 | 0.7520 | **0.8880** | 0.8020 | | GPQA_COT_ZERO_SHOT | 0.3502 | 0.2651 | **0.5370** | 0.3704 | | LiveCodeBench_ZERO_SHOT | 0.2031 | 0.0794 | **0.3046** | 0.1656 | | HUMAN_EVAL_PLUS_ZERO_SHOT | 0.6951 | 0.6280 | **0.8780** | 0.7012 | ## Как проверить метрики модели ```shell # lm-eval[api]==0.4.9.1 # sglang[all]==0.5.5 # или # vllm==0.11.2 export HF_ALLOW_CODE_EVAL=1 # sglang server up # 10B python -m sglang.launch_server --model-path --host 127.0.0.1 --port 30000 --dtype auto --mem-fraction-static 0.88 --trust-remote-code --allow-auto-truncate --speculative-algorithm EAGLE --speculative-num-steps 1 --speculative-eagle-topk 1 --speculative-num-draft-tokens 2 # mmlu pro check python -m lm_eval --model sglang-generate --output_path --batch_size 16 --model_args base_url=http://127.0.0.1:30000/generate,num_concurrent=16,tokenized_requests=True,max_length=131072,tokenizer= --trust_remote_code --confirm_run_unsafe_code --num_fewshot 5 --tasks mmlu_pro ``` ## Пример использования (Quickstart) ### 1. `transformers` ```python import torch from transformers import AutoTokenizer, AutoModelForCausalLM, GenerationConfig model_name = "ai-sage/GigaChat3-10B-A1.8B" tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.bfloat16, device_map="auto") model.generation_config = GenerationConfig.from_pretrained(model_name) messages = [ {"role": "user", "content": "Докажи теорему о неподвижной точке"} ] input_tensor = tokenizer.apply_chat_template(messages, add_generation_prompt=True, return_tensors="pt") outputs = model.generate(input_tensor.to(model.device), max_new_tokens=1000) result = tokenizer.decode(outputs[0][input_tensor.shape[1]:], skip_special_tokens=False) print(result) ``` ### 2. `vLLM` Запуск сервера ```shell # VLLM DeepGemm conflicts with our hidden dim size. # Fix: Disable it via env var (VLLM_USE_DEEP_GEMM=0). VLLM_USE_DEEP_GEMM=0 vllm serve ai-sage/GigaChat3-10B-A1.8B \ --dtype "auto" \ --speculative-config '{"method": "mtp", "num_speculative_tokens": 1, "disable_padded_drafter_batch": false}' ``` Пример запроса ```shell curl http://localhost:8000/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "ai-sage/GigaChat3-10B-A1.8B", "messages": [ { "role": "user", "content": "Докажи теорему о неподвижной точке" } ], "max_tokens": 400, "temperature": 0 }' ``` ### 3. `SGLang` Запуск сервера ```shell python -m sglang.launch_server \ --model-path ai-sage/GigaChat3-10B-A1.8B \ --host 0.0.0.0 \ --port 30000 \ --dtype auto \ --mem-fraction-static 0.88 \ --speculative-algorithm EAGLE \ --speculative-num-steps 1 \ --speculative-eagle-topk 1 \ --speculative-num-draft-tokens 2 ``` Пример запроса ```shell curl http://localhost:30000/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "ai-sage/GigaChat3-10B-A1.8B", "messages": [ { "role": "user", "content": "Докажи теорему о неподвижной точке" } ], "max_tokens": 1000, "temperature": 0 }' ``` ## Function call ### 1. `transformers`
Click for a dropdown ```python import torch from transformers import AutoTokenizer, AutoModelForCausalLM, GenerationConfig import json import re REGEX_FUNCTION_CALL_V3 = re.compile(r"function call<\|role_sep\|>\n(.*)$", re.DOTALL) REGEX_CONTENT_PATTERN = re.compile(r"^(.*?)<\|message_sep\|>", re.DOTALL) def parse_function_and_content(completion_str: str): """ Using the regexes the user provided, attempt to extract function call and content. Returns (function_call_str_or_None, content_str_or_None) """ function_call = None content = None m_func = REGEX_FUNCTION_CALL_V3.search(completion_str) if m_func: try: function_call = json.loads(m_func.group(1)) if isinstance(function_call, dict) and "name" in function_call and "arguments" in function_call: if not isinstance(function_call["arguments"], dict): function_call = None else: function_call = None except json.JSONDecodeError: function_call = None # will return raw string in failed attempt of function calling return function_call, completion_str m_content = REGEX_CONTENT_PATTERN.search(completion_str) if m_content: content = m_content.group(1) else: # as a fallback, everything before the first message_sep marker if present if "<|message_sep|>" in completion_str: content = completion_str.split("<|message_sep|>")[0] else: content = completion_str return function_call, content model_name = "ai-sage/GigaChat3-10B-A1.8B" tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.bfloat16, device_map="auto") model.generation_config = GenerationConfig.from_pretrained(model_name) tools = [ { "type": "function", "function": { "name": "get_weather", "description": "Получить информацию о текущей погоде в указанном городе.", "parameters": { "type": "object", "properties": { "city": { "type": "string", "description": "Название города (например, Москва, Казань)." } }, "required": ["city"] } } } ] messages = [ {"role": "user", "content": "Какая сейчас погода в Москве?"} ] input_tensor = tokenizer.apply_chat_template(messages, tools=tools, add_generation_prompt=True, return_tensors="pt") outputs = model.generate(input_tensor.to(model.device), max_new_tokens=1000) result = parse_function_and_content(tokenizer.decode(outputs[0][input_tensor.shape[1]:], skip_special_tokens=False))[0] print(result) ```
### 2. `vLLM` Соберите dev версию, коммит>=[21bb323](https://github.com/vllm-project/vllm/tree/21bb323542bad9d7a7206d949f33734caf48c40c)) Запуск сервера ```shell # VLLM DeepGemm conflicts with our hidden dim size. # Fix: Disable it via env var (VLLM_USE_DEEP_GEMM=0). VLLM_USE_DEEP_GEMM=0 vllm serve ai-sage/GigaChat3-10B-A1.8B \ --dtype "auto" \ --speculative-config '{"method": "mtp", "num_speculative_tokens": 1, "disable_padded_drafter_batch": false}' \ --enable-auto-tool-choice \ --tool-call-parser gigachat3 ``` Пример запроса ```shell curl http://localhost:8000/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "ai-sage/GigaChat3-10B-A1.8B", "temperature": 0, "messages": [ { "role": "user", "content": "Какая сейчас погода в Москве?" } ], "tools": [ { "type": "function", "function": { "name": "get_weather", "description": "Получить информацию о текущей погоде в указанном городе.", "parameters": { "type": "object", "properties": { "city": { "type": "string", "description": "Название города (например, Москва, Казань)." } }, "required": ["city"] } } } ] }' ``` ### 3. `SGLang` Соберите dev версию на данной ветке - https://github.com/sgl-project/sglang/pull/14765. Запуск сервера ```shell python -m sglang.launch_server \ --model-path ai-sage/GigaChat3-10B-A1.8B \ --host 0.0.0.0 \ --port 30000 \ --dtype auto \ --mem-fraction-static 0.88 \ --speculative-algorithm EAGLE \ --speculative-num-steps 1 \ --speculative-eagle-topk 1 \ --speculative-num-draft-tokens 2 --tool-call-parser gigachat3 ``` Пример запроса ```shell curl http://localhost:30000/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "ai-sage/GigaChat3-10B-A1.8B", "temperature": 0, "messages": [ { "role": "user", "content": "Какая сейчас погода в Москве?" } ], "tools": [ { "type": "function", "function": { "name": "get_weather", "description": "Получить информацию о текущей погоде в указанном городе.", "parameters": { "type": "object", "properties": { "city": { "type": "string", "description": "Название города (например, Москва, Казань)." } }, "required": ["city"] } } } ] }' ```