Get Started with Inkling#
Deploy Inkling with NVIDIA NIM, using SGLang as the backend inference engine. Inkling is a vision language model from Thinking Machines. This guide covers text chat, image input, reasoning, and tool calling through the OpenAI-compatible Chat Completions API. For information about the model, refer to the Inkling model card.
NIM packages the model artifacts, deployment profiles, and runtime settings in a model-specific container. It selects a compatible profile for the detected hardware, including tensor parallelism and quantization settings. You can also select a profile explicitly, as shown in this guide.
For the general onboarding path, refer to Quickstart. The NGC Catalog page provides container release information.
Notes#
Use the following information when configuring your deployment:
Supported GPUs: The container provides six profiles covering NVIDIA H200, B200, B300, and GB300. All use NVFP4 model artifacts. H200 and B200 have performance-tuned throughput profiles with tensor-parallel size 8; generic profiles provide the additional configurations listed below.
H200 deployment: Pass
NIM_ALLOW_NVFP4_EMULATION=1at runtime to enable NVFP4 emulation. The H200 profile uses Marlin kernels. The commands below include this setting, which is also used by the release validation configuration.Multimodal input: The container enables SGLang’s multimodal support. Image requests use
image_urlcontent parts in Chat Completions messages.Reasoning and tool calling: The container configures both
--reasoning-parser inklingand--tool-call-parser inkling. The standard launch does not need additional parser flags. Parsed reasoning is returned inchoices[].message.reasoning_content, and tool calls are returned inchoices[].message.tool_calls.Reasoning effort: Use
reasoning_effortto control reasoning for a request. The introductory examples uselow. Allocate enough tokens for both reasoning and the final answer.Speculative decoding: The performance-tuned profiles configure multi-layer EAGLE with eight speculative steps, nine draft tokens, top-k 1, and rejection sampling. Use the selected profile’s settings when starting the container.
LoRA: The two throughput profiles have LoRA disabled. Separate generic profiles include LoRA variants. The launch and request examples in this guide use a profile with
feat_lora=false.
Prerequisites#
Set up the host by following Prerequisites, including the NVIDIA GPU driver, Docker, and NVIDIA Container Toolkit installation. Verify that a container can access the GPUs:
docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi
Deploy on a single node with one of the following profile configurations:
Profile Type |
GPUs |
Precision |
TP |
PP |
LoRA |
|---|---|---|---|---|---|
H200 throughput |
H200 |
NVFP4 |
8 |
1 |
No |
B200 throughput |
B200 |
NVFP4 |
8 |
1 |
No |
Generic |
B300, GB300 |
NVFP4 |
4 |
1 |
No |
Generic |
B200, B300 |
NVFP4 |
8 |
1 |
No |
Generic |
B300, GB300 |
NVFP4 |
4 |
1 |
Yes |
Generic |
B200, B300 |
NVFP4 |
8 |
1 |
Yes |
TP is the tensor-parallel size, and PP is the pipeline-parallel size. Each configuration uses TP GPUs. B300 refers to NVIDIA B300-SXM6-AC. The generic TP4 profiles require at least 279 GB of VRAM per GPU, and the generic TP8 profiles require at least 73 GB per GPU. These thresholds are profile-selection requirements; use the GPU combinations in the table. Image processing, context length, and concurrent requests require memory in addition to the model weights.
Reserve disk space for both the container image and downloaded model artifacts. Use the profiles packaged with the model-specific SGLang container when planning hardware capacity.
Configuration#
Access Credentials#
Public images and model artifacts that support keyless access do not need an NGC API key. For private or gated artifacts, follow Generate Access Credentials and export your key in the shell:
read -rsp "NGC API key: " NGC_API_KEY
export NGC_API_KEY
The Docker commands in this guide use -e NGC_API_KEY to pass the exported
key when it is set.
Model Cache#
Create a persistent cache and make it writable by the container’s group, GID 0:
export LOCAL_NIM_CACHE=~/.cache/nim
mkdir -p "$LOCAL_NIM_CACHE"
sudo chgrp -R 0 "$LOCAL_NIM_CACHE"
sudo chmod -R g+rwX "$LOCAL_NIM_CACHE"
Mount this directory at /opt/nim/.cache in every download and serving
container. Subsequent launches reuse the cached artifacts.
Installation#
Pull the Container Image#
If the image requires authentication, log in with the exported API key:
printf '%s' "$NGC_API_KEY" | docker login nvcr.io \
--username '$oauthtoken' --password-stdin
Pull the model-specific image:
docker pull nvcr.io/nim/thinkingmachines/inkling:2.1.3
Select and Download a Model Profile#
List the packaged profiles on the deployment host:
docker run --rm --gpus all \
-e NGC_API_KEY \
-e NIM_ALLOW_NVFP4_EMULATION=1 \
nvcr.io/nim/thinkingmachines/inkling:2.1.3 \
list-model-profiles
Select a compatible SGLang profile for the GPU and TP combination in the
table. For the examples in this guide, use feat_lora=false:
On H200 or B200, select
profile=throughput,tp=8, and the matching GPU tag. The H200 profile uses NVFP4 weights but does not declare aprecisiontag, so do not require aprecision=nvfp4match when selecting it.On B300, select a generic NVFP4 profile with
tp=4ortp=8.On GB300, select a generic NVFP4 profile with
tp=4.
Generic profiles do not declare a GPU or profile=throughput tag. Copy the
compatible profile ID into NIM_MODEL_PROFILE. Use that same ID when
downloading and running the model:
export NIM_MODEL_PROFILE="<compatible-profile-id>"
docker run --rm --gpus all \
-e NGC_API_KEY \
-e NIM_ALLOW_NVFP4_EMULATION=1 \
-v "$LOCAL_NIM_CACHE:/opt/nim/.cache" \
nvcr.io/nim/thinkingmachines/inkling:2.1.3 \
download-to-cache -p "$NIM_MODEL_PROFILE"
The first download can take time. For profile selection and cache management details, refer to Model Profiles and Selection and Model Download.
Run NIM#
Start the container with the profile selected in the previous step. The command exposes all host GPUs, and the selected profile determines the GPU count used:
docker run --rm --name inkling-nim --gpus all \
--shm-size=32g \
-e NGC_API_KEY \
-e NIM_ALLOW_NVFP4_EMULATION=1 \
-e NIM_MODEL_PROFILE \
-e NIM_SERVED_MODEL_NAME=thinkingmachines/Inkling-NVFP4 \
-v "$LOCAL_NIM_CACHE:/opt/nim/.cache" \
-p 8000:8000 \
nvcr.io/nim/thinkingmachines/inkling:2.1.3
Keep this terminal open and send requests from another terminal.
The launch enables NVFP4 emulation for H200. The selected profile configures SGLang’s memory fraction and kernel backends. The H200 and B200 throughput profile settings are listed below.
Verify Readiness and Model Identity#
Check the health endpoints. Readiness returns HTTP 200 after the model is loaded and the backend is ready for inference:
curl --fail http://localhost:8000/v1/health/live
curl --fail http://localhost:8000/v1/health/ready
If you set NIM_HEALTH_PORT, also publish that port in docker run and use
it for health checks. For example, -e NIM_HEALTH_PORT=8001 requires
-p 8001:8001. Inspect the served model identifier and deployment metadata:
curl --fail http://localhost:8000/v1/models
curl --fail http://localhost:8000/v1/metadata
The launch command sets NIM_SERVED_MODEL_NAME to
thinkingmachines/Inkling-NVFP4. Use this identifier in each request’s model
field. Changing the served name does not change the weights selected by the
packaged manifest and profile.
Runtime Configuration#
The throughput profiles configure the following SGLang settings:
Setting |
H200 |
B200 |
|---|---|---|
Attention backend |
|
|
FP4 GEMM backend |
|
|
MoE runner backend |
|
|
Static memory fraction ( |
|
|
These are profile settings. Inspect the final SGLang launch arguments in the
startup logs to confirm the effective configuration after applying runtime
overrides. When changing the static memory fraction, use a direct
--mem-fraction-static argument after the image name so the override applies
to the same SGLang setting as the profile.
The profiles do not set an explicit context-length cap. To limit the served
context length, add -e NIM_MAX_MODEL_LEN=32768 to the docker run command
before the image name. Choose a value that fits your workload and hardware.
Validate image requests as well as text requests after changing memory or
context settings.
For additional SGLang options, append flags after the image name in the
docker run command. This preserves environment settings packaged in the
image.
The image’s NIM_PASSTHROUGH_ARGS includes multimodal support and parser
settings. Setting this environment variable in docker run replaces the
image’s value. When adding SGLang flags, preserve the required settings:
export NIM_PASSTHROUGH_ARGS="--trust-remote-code --enable-multimodal --reasoning-parser inkling --tool-call-parser inkling"
If you use this alternative, append your flags and pass the variable with
-e NIM_PASSTHROUGH_ARGS. For configuration precedence, refer to
Advanced Configuration. Verify the effective
settings in the startup logs after applying overrides.
Interact with the API#
These examples use the OpenAI-compatible Chat Completions endpoint at
http://localhost:8000/v1/chat/completions.
Known Issues#
Requests to the Responses API (/v1/responses) can return HTTP 400 with the
following error:
texts cannot be empty and tokenizer must be initialized
Streaming requests can end with a response.failed event. Use
/v1/chat/completions for the workflows in this guide.
Send a Chat Completion Request#
Use a text prompt to verify inference:
curl --fail http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "thinkingmachines/Inkling-NVFP4",
"messages": [
{"role": "user", "content": "Explain GPU computing in one sentence."}
],
"max_tokens": 4096,
"reasoning_effort": "low"
}'
The final answer is returned in choices[0].message.content, and parsed
reasoning is returned in choices[0].message.reasoning_content. If the
response ends with finish_reason: "length" before producing an answer,
increase max_tokens or use reasoning_effort: "none".
To continue a conversation, include the previous messages and assistant
answers in the next request’s messages array.
Send an Image with a Text Prompt#
Include both text and image_url content parts. The image URL must be
reachable from the container:
curl --fail http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "thinkingmachines/Inkling-NVFP4",
"messages": [{
"role": "user",
"content": [
{"type": "text", "text": "Describe the image."},
{"type": "image_url", "image_url": {"url": "https://assets.ngc.nvidia.com/products/api-catalog/phi-3-5-vision/example1b.jpg"}}
]
}],
"max_tokens": 4096,
"reasoning_effort": "low"
}'
Use the OpenAI Python SDK#
Install the openai Python package in your client environment, then run:
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8000/v1", api_key="not-used")
response = client.chat.completions.create(
model="thinkingmachines/Inkling-NVFP4",
messages=[{"role": "user", "content": "Summarize GPU computing in one sentence."}],
max_tokens=4096,
extra_body={"reasoning_effort": "low"},
)
print(response.choices[0].message.content)
Stream a Response#
Set stream to true and use curl -N to display events as they arrive:
curl --fail -N http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "thinkingmachines/Inkling-NVFP4",
"messages": [{"role": "user", "content": "Write a short poem about a robot."}],
"max_tokens": 4096,
"reasoning_effort": "low",
"stream": true
}'
The endpoint returns Server-Sent Events (SSE). Final-answer tokens appear in
choices[].delta.content, and reasoning tokens appear in
choices[].delta.reasoning_content. The stream ends with data: [DONE].
Call a Tool#
The packaged inkling parser handles tool calls. Provide tool definitions
and allow the model to select a tool:
curl --fail http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "thinkingmachines/Inkling-NVFP4",
"messages": [{"role": "user", "content": "What is the weather in Santa Clara, CA?"}],
"tools": [{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get the current weather for a city.",
"parameters": {
"type": "object",
"properties": {"location": {"type": "string"}},
"required": ["location"]
}
}
}],
"tool_choice": "auto",
"max_tokens": 4096,
"reasoning_effort": "low"
}'
When the model selects a tool, the response includes
choices[0].message.tool_calls. Your application executes the function and
returns the result in a follow-up request. For the tool execution cycle and
MCP integration, refer to
Tool Calling and MCP Integration.