NVIDIA-Nemotron-3.5-Bolt-E4B-BF16 is a small language model (SLM) further post-trained from Gemma-4-E4B-it by NVIDIA. This is the full-precision (BF16) release. Nemotron-3.5-Bolt-E4B carries forward Gemma’s strong conversational capabilities and further improves multi-turn tool use, instruction following, and input grounding for fast local voice/device assistants, interactive personas, and embedded/edge interfaces. Designed for low-memory, low-TTFT operation, the model allows agents to respond quickly while preserving headroom for applications or adjacent model pipelines.
NVIDIA Nemotron™ is a family of open models with open weights, training data, and recipes, delivering leading efficiency and accuracy for building specialized AI agents.
Use the same downloaded BF16 checkpoint with its companion DFlash drafter. Run one serving configuration at a time. This example uses a single concurrent sequence and seven speculative tokens; tune these settings for your workload.
NVIDIA-Nemotron-3.5-Bolt-E4B-BF16 is the full-precision release of a general purpose reasoning and chat model, and is intended primarily for customization and post-training rather than direct production inference. It is intended to be used by developers who want to: post-train the model on their own data (SFT, RL via NeMo RL and NeMo Gym, or distillation), adapt it to a domain or task, produce quantized variants (NVFP4, W4A16, GGUF) for their own deployment targets, or run full-precision research and evaluation. English and coding languages are the primary languages, with Spanish, French, German, Italian, and Japanese also supported.
The model underwent multi-environment reinforcement learning using GRPO (Group Relative Policy Optimization) across instruction following, multi-step tool use, multi-turn conversations, and structured output environments. It utilized an asynchronous RL architecture that decouples training from inference.
Other Properties Related to Input: Maximum context length up to 64K tokens. Supported languages include English, Spanish, French, German, Italian, and Japanese, among others.
Other Properties Related to Output: Maximum context length up to 64K tokens
Our AI models are designed and/or optimized to run on NVIDIA GPU-accelerated systems. By leveraging NVIDIA's hardware (e.g. GPU cores) and software frameworks (e.g., CUDA libraries), the model achieves faster training and inference times compared to CPU-only solutions.
The integration of foundation and fine-tuned models into AI systems requires additional testing using use-case-specific data to ensure safe and effective deployment. Following the V-model methodology, iterative testing and validation at both unit and system levels are essential to mitigate risks, meet technical and functional requirements, and ensure compliance with safety and ethical standards before deployment.
For max throughput deployments, use the following configuration, no speculative decoding strategy is best for this serving configuration, and due to memory constraints the Mamba cache dtype is set as FP16:
The examples below use the OpenAI-compatible client and work with the serving backend above. Recommended sampling settings are Temperature 1.0 and Top\_P 0.95 in both thinking enabled and disabled modes.
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8000/v1", api_key="EMPTY")
MODEL = "nemotron-bolt"
Bolt-E4B exposes reasoning control through chat-template kwargs: thinking enabled (the default), thinking disabled for direct answers, and a runtime thinking budget.
Bolt-E4B supports a conversational mode. If enabled, Bolt-E4B responds concisely and without as much textual formatting. This mode is suitable for conversational and spoken interaction-based applications. Conversational mode can be toggled as follows:
response = client.chat.completions.create(
model=MODEL,
messages=[{"role": "user", "content": "What is the capital of Japan?"}],
max_tokens=16000,
temperature=1.0,
top_p=0.95,
extra_body={
"skip_special_tokens": False,
"chat_template_kwargs": {"conversational_mode": True},
}
)
print(response.choices[0].message.content)
Conversational mode can be combined with thinking enabled and disabled mode, as well as tool-calling.
In thinking enabled mode, you can control the thinking budget that Bolt-E4B uses with a two-step inference client. The client stops Bolt-E4B’s reasoning process at a defined token budget and gets a final response from the model. The budget control client can be implemented as following:
Thinking budget client implementation and usage
import copy
import requests
class BoltThinkingBudgetClient:
def __init__(self, base_url, api_key):
self.base_url = base_url.rstrip("/")
def _post(self, payload):
response = requests.post(
f"{self.base_url}/chat/completions",
json=payload,
timeout=300,
)
response.raise_for_status()
return response.json()
def chat_completion(
self,
model,
messages,
max_thinking_budget=512,
max_tokens=1024,
tools=None,
temperature=1.0,
top_p=0.95,
seed=None,
):
if max_tokens <= max_thinking_budget:
raise ValueError(
"max_tokens must be larger than max_thinking_budget"
)
original_messages = copy.deepcopy(messages)
sampling = {
"temperature": temperature,
"top_p": top_p,
}
if seed is not None:
sampling["seed"] = seed
first_payload = {
"model": model,
"skip_special_tokens": False,
"messages": original_messages,
"max_tokens": max_thinking_budget,
"chat_template_kwargs": {"enable_thinking": True},
**sampling,
}
if tools is not None:
first_payload["tools"] = tools
first_payload["tool_choice"] = "auto"
first = self._post(first_payload)
choice = first["choices"][0]
message = choice["message"]
reasoning = (
message.get("reasoning_content")
or message.get("reasoning")
or ""
)
partial_answer = message.get("content") or ""
tool_calls = message.get("tool_calls") or []
if choice.get("finish_reason") == "stop" and (
partial_answer or tool_calls
):
return {
"reasoning_content": reasoning,
"content": partial_answer,
"tool_calls": tool_calls,
"finish_reason": choice.get("finish_reason"),
"budget_forced": False,
}
used_tokens = first.get("usage", {}).get(
"completion_tokens",
max_thinking_budget,
)
remaining_tokens = max_tokens - used_tokens
if remaining_tokens <= 0:
raise ValueError("Increase max_tokens or lower the budget")
continuation_messages = copy.deepcopy(original_messages)
continuation_messages.append(
{
"role": "assistant",
"reasoning_content": reasoning,
"content": partial_answer,
}
)
second_payload = {
"model": model,
"skip_special_tokens": False,
"messages": continuation_messages,
"max_tokens": remaining_tokens,
"add_generation_prompt": False,
"continue_final_message": True,
"chat_template_kwargs": {
"enable_thinking": True,
"preserve_thinking": True,
},
**sampling,
}
if tools is not None:
second_payload["tools"] = tools
second_payload["tool_choice"] = "auto"
second = self._post(second_payload)
second_choice = second["choices"][0]
second_message = second_choice["message"]
return {
"reasoning_content": reasoning,
"content": partial_answer + (
second_message.get("content") or ""
),
"tool_calls": second_message.get("tool_calls") or [],
"finish_reason": second_choice.get("finish_reason"),
"budget_forced": True,
}
You can then use the client as:
client = BoltThinkingBudgetClient(
base_url="http://localhost:8000/v1", api_key="EMPTY"
)
MODEL = "nemotron-bolt"
result = client.chat_completion(
model=MODEL,
messages=[
{"role": "system", "content": ""},
{"role": "user", "content": "What is 2+2?"},
],
max_thinking_budget=32,
max_tokens=512,
temperature=1.0,
top_p=0.95,
seed=17,
)
print(result["content"])
# Tool-Calling Example
calculate_tip = {
"type": "function",
"function": {
"name": "calculate_tip",
"description": "Calculate the tip for a bill.",
"parameters": {
"type": "object",
"properties": {
"bill_total": {"type": "number"},
"tip_percentage": {"type": "number"},
},
"required": ["bill_total", "tip_percentage"],
"additionalProperties": False,
},
},
}
tool_result = client.chat_completion(
model=MODEL,
messages=[
{"role": "system", "content": ""},
{
"role": "user",
"content": (
"My bill is $100. Use calculate_tip to calculate an 18% tip."
),
},
],
tools=[calculate_tip],
max_thinking_budget=32,
max_tokens=512,
temperature=1.0,
top_p=0.95,
seed=23,
)
if not tool_result["tool_calls"]:
raise RuntimeError("The model did not return a parsed tool call.")
tool_call = tool_result["tool_calls"][0]
print(tool_call["function"]["name"])
print(tool_call["function"]["arguments"])
# Example output:
# calculate_tip
# {"bill_total":100,"tip_percentage":18}
Phase 1 executes an initial request to /v1/chat/completions, configuring enable_thinking=True within chat_template_kwargs alongside the designated token limit via max_thinking_budget.
Should execution terminate standardly and return complete output, the system yields this output without triggering secondary inference.
If execution halts upon reaching the designated ceiling, extract reasoning_content directly from the message object.
Construct and append an assistant role turn incorporating the extracted thought traces along with any generated output snippets.
Re-pass the function schemas while assigning preserve_thinking=True inside the template parameters.
Assign the secondary max_tokens allocation to match the remaining generation threshold.
Phase 2 dispatches to /v1/chat/completions using continue_final_message=True and add_generation_prompt=False, preserving active Gemma 4 tool and reasoning parsing modules.
Limits and Recommendations for Runtime Budget Control#
Restricted token allocations may truncate thought processes mid-sentence. While output clarity is typically maintained, task-specific output evaluation remains necessary.
The client halts execution immediately upon reaching the pre-configured initial generation ceiling, ignoring subsequent line boundaries.
Conduct systematic allocation sweeps using standard evaluation prompts prior to establishing deployment parameters.
Illustration: To maintain a strict 500-token overall threshold, evaluate unconstrained model generation metrics (e.g., averaging 200 tokens). Assigning a dedicated 300-token reasoning parameter alongside a 500-token global ceiling forces thought termination at 300 tokens, reserving 200 tokens for output synthesis.
To encourage brief output (excluding internal reasoning steps), incorporate explicit word- or sentence-count constraints within system prompts.
Bolt-E4B's chat template currently does not allow stray tool responses (messages with tool role that do not immediately follow a message with assistant role and tool_calls). However, this model can support asynchronous tool-calling with in the following manner:
Asynchronous tool-calling usage
If the model invokes a tool in message.tool_calls that has a later arriving result, respond with a tool message in the immediate next turn that acknowledges the tool-call and shows the tool result as pending.
The model can continue the conversation with the user after this acknowledgement tool result message.
Once the tool result is available, respond with a user message that provides the tool result in a structured format, prefixed with something like "TOOL RESULT:"
Example:
Later tool result completion result
{
"role": "user",
"content": "TOOL UPDATE: {\"status\":\"completed\",\"task_id\":\"task_1\",\"function\":\"build_report\",\"response\":\"Report is ready.\"}"
}
The model processes the finalized payload to resume the conversation.
Put persistent role definitions, behavioral constraints, and operating rules in the system prompt.
Use consistent headings which clearly identify the purpose of a section of the prompt, Example: ROLE, IDENTITY, INPUT FORMAT, TASK RULES, PERSONALITY, SPEECH EXAMPLES, etc.
State the primary objective clearly. Define what counts as completion for multi-step workflows.
Write instructions as conditions and actions: “After crafting succeeds, call the delivery tool.”
Remove redundant instructions rather than repeatedly adding stronger versions.
Use response-length limits that fit the application. A one- or two-sentence limit can suit spoken replies; it will not restrict tool arguments or reasoning.
Use explicit constraints (e.g., "limit responses to 1-2 sentences") instead of vague requests (e.g., "be brief").
Preserve genuine conversation history. Do not insert fabricated assistant actions, promises, or tool calls as if they occurred.
If using few-shot examples, identify them as examples. Test whether the model copies their wording or themes and adjust instructions accordingly.
Strictly adhere to standard system/user/assistant/tool turn sequences.
Define the agent and user as separate entities with separate actions, locations, possessions, and knowledge.
Explain pronouns when both entities appear in state: “In the state update following a user turn, ‘my’ refers to the user; but in a state update after an assistant turn, ‘my’ refers to you.”
Use explicit labels such as YOUR INVENTORY, PLAYER VIEW, and SHARED CHEST to reinforce ownership.
Distinguish unavailable information from empty state. An inaccessible user inventory is unknown, not empty.
Distinguish visible resources from possessed resources. A nearby item or chest does not mean the agent owns its contents.
Make character lore consistent with available information and tools. Explain any restrictions on what the character can perceive or use.
Mark state blocks clearly, for example with # CURRENT STATE.
Explain that state is operational context, not a new request or text to repeat aloud.
Share state updates via new user or system messages. The model supports consecutive user and system messages. It is important to maintain correct chronology when conveying state information/updates and continuing the conversation.
For example, for a user message that is conditioned upon a state update, the state update user or system message must come before the user response:
# CURRENT STATE
...
----------------
<actual user message>
OR in two user/system messages:
[..., {"role": "user/system", "content": "# CURRENT STATE..."}, {"role": "user", "content": "<actual user message>"}, ...]
But, for conveying an updated state that occurs after a tool is executed, the state update user or system message must come after the tool execution response:
[..., {"role": "tool", "content": "<tool execution result that updates a state>"}, {"role": "user/system", "content": "# CURRENT STATE... <state that got changed with tool execution>"}, {"role": "user", "content": "<next user message>"}, ...]
Send tools through the native tools array and read actions from message.tool_calls.
Use stable function names and parameter schemas. Describe prerequisites, argument meanings, units, defaults, effects, and failure conditions.
Make tool descriptions match actual behavior. “Drops an item toward the player” must not be described as guaranteed placement in the player’s inventory.
Time period for training data collection: 2013 to December 2025
Time period for testing data collection: 2013 to December 2025
Time period for validation data collection: 2013 to December 2025
Data Collection Method by dataset: Hybrid: Automated, Manually-Collected, Synthetic
Labeling Method by dataset: Hybrid: Automated, Manually-Labeled, Synthetic
The post-training corpus for NVIDIA-Nemotron-3.5-Bolt-E4B-BF16 consists of high-quality curated and synthetically-generated data. Primary languages used for post-training include English, French, German, Italian, Japanese, Spanish, and Chinese.
These datasets, such as FinePDFs, EssentialWeb, HotpotQA, SQuAD, and HelpSteer3, do not collectively or exhaustively represent all demographic groups (and proportionally therein). For instance, these datasets do not contain explicit mentions of demographic classes such as age, gender, or ethnicity in 64-99% of samples, depending on the source. In the subset where such terms are present, document-based datasets (FinePDFs and EssentialWeb) contain representational skews, such as references to "male" outnumbering those to "female", and mentions of "White" as the most frequent among ethnic identifiers (comprising 43-44% of ethnicity mentions). To mitigate these imbalances, we recommend considering evaluation techniques such as bias audits, fine-tuning with demographically balanced datasets, and mitigation strategies like counterfactual data augmentation to align with the desired model behavior. This evaluation used a 3,000-sample subset per dataset, identified as the optimal threshold for maximizing embedder accuracy.
During post-training, we generate synthetic data by distilling trajectories, solutions, and translations from strong teacher models and agent systems, often grounded in real tasks or documents and aggressively filtered for quality. For math, code, and science, we start from curated problem sets and use open source permissive models such as GPT-OSS-120B to produce step-by-step reasoning traces, candidate solutions, best-of-n selection traces, and verified CUDA kernels. For long-context and science, we build synthetic QA and reasoning data by retrieving passages from long documents, generating MCQ/OpenQA questions and answers, and paraphrasing them into multiple prompt/response formats to ensure diversity. Across all pipelines we stack automated verification—compilers, numerical checks, language identification—to ensure our data is high quality.
For all domains, we apply a unified data filtering pipeline to ensure that only high-quality, license-compliant, and verifiable samples are used for post-training. We first discard malformed examples using structural checks (e.g., missing tool definitions when tool calls are present). We then aggressively filter reasoning traces exhibiting pathological repetition, such as repeated n-grams within a sliding window or across the entire trajectory, which we found to be a strong indicator of malformed or low-quality reasoning. Finally, based on internal audits of synthetically generated datasets, we observed that some teacher models occasionally produce reasoning traces and final responses that implicitly align with specific political entities or promote nationalistic narratives. To mitigate this, we apply targeted keyword- and regex-based filters and remove all trajectories matching such behavior.
Alongside the model, we release our final pre-training and post-training data, as outlined in this section. For ease of analysis, there is a sample set that is ungated. For all remaining code, math and multilingual data, gating and approval is required, and the dataset is permissively licensed for model training purposes.
Synthetic Structured Outputs from Qwen3-30B-A3B-Instruct-2507, Qwen3-30B-A3B-Thinking-2507, Qwen3-235B-A22B-Instruct-2507, and Qwen3-235B-A22B-Thinking-2507
[doubtnut]; [Pile-FreeLaw]; [Llama Nemotron Dataset]; [askfilo]; [EssentialAI/essential-web-v1.0]; [Vedantu]; [auxiliary_train]; [cdquestions.com]; [AMC 8 Problems and Solutions, AMC 10 Problems and Solution, and AIME Problems and Solutions]; [AAPT]; [ICHO-IPH0 Dataset]; [LIMO dataset (Less is More for Reasoning)]
Synthetic Verilog and SystemVerilog Code from DeepSeek-R1-0528 and GPT-OSS-120B
Text
1,233,247
[Verilog/SystemVerilog seed code]
[SDR: DeepSeek R1 0528 and GPT-OSS-120B]; [Filtering: Claude 4 Sonnet]
Synthetic Aider Python Tasks from DeepSeek-R1-0528
Text
236,099
[Exercism (GitHub Python)]
[Deepseek R1 0528]
Synthetic Chat Reasoning-Off Data from GLM-5
Text
646,738
[lmarena-ai/repochat-arena-preference-4k user prompts]
[Multi-turn conversations generated by GLM-5 with best-of-4 selection via Qwen3-Nemotron-235B-A22B-GenRM]
Synthetic Chat Reasoning-On Data from GLM-5
Text
644,286
[lmarena-ai/repochat-arena-preference-4k user prompts]; [lmarena-ai/arena-expert-5k user prompts]; [lmarena-ai/arena-human-preference-55k user prompts]; [lmarena-ai/arena-human-preference-100k user prompts]; [lmarena-ai/arena-human-preference-140k user prompts]
[Multi-turn conversations generated by GLM-5 with best-of-4 selection via Qwen3-Nemotron-235B-A22B-GenRM]
Synthetic Multilingual Safety from Riva-Translate-4B-Instruct-v1.1
Text
132,067
[Safety SFT Data: Ultra]
[nvidia/Riva-Translate-4B-Instruct-v1.1]
Synthetic Science Reasoning Effort Medium
Text
502,722
[science-reasoning-effort-medium-v0]
Undisclosed
Synthetic Telecom Tool-Use Trajectories from gpt-oss-120b
Text
12,455
[Existing Tau2 telecom trajectories originally generated with DeepSeek V3.2]
[gpt-oss-120b]
Synthetic Terminal Bench Data from OpenReasoningv2
Synthetic STEM from Qwen3-235B-A22B-Instruct-2507 and gpt-oss-120b
Text
Undisclosed
[arXiv]; [National Institutes of Health ExPorter]; [BioRxiv]; [PMC Article]; [USPTO Backgrounds]; [peS2o]; Global Regulation; [CORE]; [PG-19]; [DOAB CC BY & CC BY-SA subset]; [NDLTD]
[Qwen3-235B-A22B-Instruct-2507]; [gpt-oss-120b]
Translation Data from TAUS
Text
1,618,055
[TAUS proprietary dataset]
Undisclosed
Synthetic Art of Problem Solving and Stack Exchange from gpt-oss-120b, Qwen2.5-32B-Instruct, and Goedel-Prover-V2-32B
Text
860,469
[Nemotron-Math-Proofs-v1]
[Goedel-Prover-V2-32B]
Synthetic Art of Problem Solving and Stack Exchange from gpt-oss-120b
Text
1,201,815
[Upstream released math dataset]; [AoPS]; [StackOverflow / StackExchange]
[gpt-oss-120b]
Synthetic Multilingual Science and Code data from DeepSeek-R1, DeepSeek-R1-0528, Qwen2.5-32B-Instruct, and Qwen3-235B-A22B, translated with Qwen2.5-32B-Instruct and Qwen2.5-14B-Instruct
Synthetic Multilingual Science and Code data from DeepSeek-R1, DeepSeek-R1-0528, Qwen2.5-32B-Instruct, and Qwen3-235B-A22B, translated with Qwen2.5-32B-Instruct and Qwen2.5-14B-Instruct (Stack Exchange lineage)
Synthetic Science MCQ and QA Diversity from GPT-OSS and Kimi-K2
Text
30,358
[doubtnut]; [Pile-FreeLaw]; [Llama Nemotron Dataset]; [askfilo]; [EssentialAI/essential-web-v1.0]; [Vedantu]; [auxiliary_train]; [cdquestions.com]; [AMC 8 Problems and Solutions, AMC 10 Problems and Solution, and AIME Problems and Solutions]; [AAPT]; [ICHO-IPH0 Dataset]; [LIMO dataset (Less is More for Reasoning)]
[GPT-OSS]; [Kimi-K2]
Synthetic Science HLE with Python from GPT-OSS and Kimi-K2
Text
85,184
[doubtnut]; [Pile-FreeLaw]; [Llama Nemotron Dataset]; [askfilo]; [EssentialAI/essential-web-v1.0]; [Vedantu]; [auxiliary_train]; [cdquestions.com]; [AMC 8 Problems and Solutions, AMC 10 Problems and Solution, and AIME Problems and Solutions]; [AAPT]; [ICHO-IPH0 Dataset]; [LIMO dataset (Less is More for Reasoning)]
[GPT-OSS]; [Kimi-K2]
Synthetic Science Search and Python from GPT-OSS and Kimi-K2
Text
6,179
[doubtnut]; [Pile-FreeLaw]; [Llama Nemotron Dataset]; [askfilo]; [EssentialAI/essential-web-v1.0]; [Vedantu]; [auxiliary_train]; [cdquestions.com]; [AMC 8 Problems and Solutions, AMC 10 Problems and Solution, and AIME Problems and Solutions]; [AAPT]; [ICHO-IPH0 Dataset]; [LIMO dataset (Less is More for Reasoning)]
[GPT-OSS]; [Kimi-K2]
Synthetic Science Search from GPT-OSS and Kimi-K2
Text
32,554
[doubtnut]; [Pile-FreeLaw]; [Llama Nemotron Dataset]; [askfilo]; [EssentialAI/essential-web-v1.0]; [Vedantu]; [auxiliary_train]; [cdquestions.com]; [AMC 8 Problems and Solutions, AMC 10 Problems and Solution, and AIME Problems and Solutions]; [AAPT]; [ICHO-IPH0 Dataset]; [LIMO dataset (Less is More for Reasoning)]
[GPT-OSS]; [Kimi-K2]
Synthetic Finance Reasoning from GPT-OSS-120B and Qwen3-235B-A22B-Instruct-2507
Text
326,700
[SEC filings]
[GPT-OSS-120B, Qwen3-235B-A22B-Instruct-2507]
Synthetic Science Diversity MCQ from GPT-OSS and Kimi-K2
Text
532,942
[doubtnut]; [Pile-FreeLaw]; [Llama Nemotron Dataset]; [askfilo]; [EssentialAI/essential-web-v1.0]; [Vedantu]; [auxiliary_train]; [cdquestions.com]; [AMC 8 Problems and Solutions, AMC 10 Problems and Solution, and AIME Problems and Solutions]; [AAPT]; [ICHO-IPH0 Dataset]; [LIMO dataset (Less is More for Reasoning)]
[GPT-OSS]; [Kimi-K2]
Synthetic Science Diversity OpenQ from GPT-OSS and Kimi-K2
Text
131,045
[doubtnut]; [Pile-FreeLaw]; [Llama Nemotron Dataset]; [askfilo]; [EssentialAI/essential-web-v1.0]; [Vedantu]; [auxiliary_train]; [cdquestions.com]; [AMC 8 Problems and Solutions, AMC 10 Problems and Solution, and AIME Problems and Solutions]; [AAPT]; [ICHO-IPH0 Dataset]; [LIMO dataset (Less is More for Reasoning)]
[GPT-OSS]; [Kimi-K2]
Synthetic Science Reasoning No-Tool from GPT-OSS and Kimi-K2
Text
2,085,600
[doubtnut]; [Pile-FreeLaw]; [Llama Nemotron Dataset]; [askfilo]; [EssentialAI/essential-web-v1.0]; [Vedantu]; [auxiliary_train]; [cdquestions.com]; [AMC 8 Problems and Solutions, AMC 10 Problems and Solution, and AIME Problems and Solutions]; [AAPT]; [ICHO-IPH0 Dataset]; [LIMO dataset (Less is More for Reasoning)]
import os
os.environ["HF_ENDPOINT"] = "https://freeweights.allternit.com"
from transformers import AutoModelForCausalLM, AutoTokenizer
tok = AutoTokenizer.from_pretrained("nvidia/NVIDIA-Nemotron-3.5-Bolt-E4B-4GB-BF16", revision="49843eed8db1f1c616c47af75cfd36e07aec0667")
model = AutoModelForCausalLM.from_pretrained("nvidia/NVIDIA-Nemotron-3.5-Bolt-E4B-4GB-BF16", revision="49843eed8db1f1c616c47af75cfd36e07aec0667", device_map="auto")