Skip to main content
This tutorial shows you how to deploy Kimi K3 on CoreWeave Dedicated Inference and send your first request. Getting started with Dedicated Inference covers the same workflow, but leaves the GPU, engine, and tuning choices to you. This tutorial supplies the values CoreWeave validated for Kimi K3 on GB300. Kimi K3 is a large mixture-of-experts (MoE) model, and serving it well takes more than the defaults. The configuration in this tutorial spreads the model across 16 GB300 GPUs, enables expert parallelism and an FP8 KV cache, and pairs the model with a DSpark draft model for speculative decoding. By the end, you have an OpenAI-compatible endpoint serving Kimi K3. In this tutorial, you complete the following steps:
  1. Stage the Kimi K3 weights and the DSpark draft model in a CoreWeave AI Object Storage bucket.
  2. Grant Dedicated Inference access to that bucket.
  3. Create a gateway to expose the model.
  4. Create the deployment with the validated Kimi K3 engine configuration.
  5. Wait for the deployment to load the weights and start the engine.
  6. Send an inference request to verify the endpoint.
  7. Clean up the gateway and deployment when you’re done.

Prerequisites

Before you begin, verify that you have the following:
  • A CoreWeave account with Dedicated Inference access enabled.
  • Inference GPU quota for gb300-4x, covering the 16 GPUs this tutorial deploys. Quota is granted per organization and per instance type. Without it, creating the deployment fails with organization has no GPU quota for it, and setting a capacity class doesn’t waive the requirement. To request quota, submit a support ticket.
  • A CoreWeave API access token with the Inference Admin role.
  • The CoreWeave Intelligent CLI (cwic) installed and authenticated.
  • A CoreWeave AI Object Storage bucket for the model weights.
  • The Hugging Face CLI (hf) to download the model weights.
  • The AWS CLI, configured with Object Storage credentials, to upload weights and apply the bucket policy.
  • curl and jq for API requests and polling.
Set your API token and the CoreWeave API base URL, replacing [API-TOKEN] with your token:

Stage the model weights

Dedicated Inference uses a bring-your-own-weights (BYOW) model and doesn’t pull from Hugging Face directly. Before you create the deployment, download both models and upload them to your bucket. Kimi K3 requires two sets of artifacts: Download both repositories, pinning the revisions CoreWeave validated:
Kimi K3 is a large model, so make sure the machine you download to has enough free disk space for both sets of weights. In your bucket, both models go under a single prefix, with the draft model nested inside the main model’s path:
The draft model must live under the main model path, because only that prefix is copied into the serving container. When a deployment starts, CoreWeave mirrors everything under the model path into /tmp/model, preserving the directory structure, and speculative-config points at the resulting in-container path. This tutorial stages the draft model at speculator/Inferact/Kimi-K3-DSpark/[COMMIT]/ to match the speculative-config value in Create the deployment. If you stage it somewhere else, update both to match, or the deployment fails to start.
Upload each model with the AWS CLI. Replace [BUCKET-NAME] with your bucket, [MODEL-PATH] with the prefix you want to store the model under, and [PROFILE-NAME] with your AWS CLI profile name. The --exclude flag keeps the metadata directory that hf download writes out of the model path:
If your CoreWeave credentials are in the default AWS CLI profile, omit --profile [PROFILE-NAME]. For details about configuring a named profile, see Get started with AI Object Storage. Confirm the nested layout before you continue, while a mistake is still cheap to fix. The following command lists the draft model’s files under the speculator/ prefix:
If that listing is empty, the draft model is in the wrong place and the deployment fails on startup. The commit hashes in these paths pin the exact model revisions CoreWeave validated. If you stage a different revision of the draft model, update the directory name and the speculative-config value in the deployment command to match.

Apply the bucket policy

Dedicated Inference reads weights from Object Storage through a dedicated service account, which needs a bucket policy granting it read access. The following policy includes an AllowOrgUsers statement in addition to the inference grant. Don’t remove it: once any policy is attached, only requests it explicitly allows are permitted, so a policy that grants only the inference service account locks your own users out of the bucket with AccessDenied errors, including in the Cloud Console’s bucket viewer. Replace [BUCKET-NAME] with your bucket name, and [ORG-ID] with your CoreWeave organization ID, which you can find on the Settings page of the Cloud Console. Leave the Principal in the AllowInference statement exactly as shown. It identifies the CoreWeave Inference service account, is the same for every customer, and isn’t a value you generate:
inference-bucket-policy.json
Always include the Condition block in the AllowOrgUsers statement when using "Principal": "*". Without it, the bucket is readable by anyone on the internet, not only principals in your organization.
Save the policy as inference-bucket-policy.json and apply it with the AWS CLI. Because put-bucket-policy replaces the existing bucket policy rather than merging with it, review any policy already on the bucket before you run this:
Policy changes take a few moments to propagate. Confirm the policy applied by fetching it back:
The response includes both the AllowInference and AllowOrgUsers statements once the policy propagates. A missing or incorrect bucket policy is a common cause of deployments that fail while loading weights. For alternative tooling and how to scope access to a single prefix, see Grant inference access to your bucket.

Create a gateway

A gateway provides the external endpoint that routes traffic to your deployment, and it handles authentication and load balancing. Query the zones where Dedicated Inference capacity is available:
Create the gateway in one of the returned zones, replacing [ZONE-NAME]:
Body-based routing sends each request to the deployment whose model name matches the model field in the request body, following OpenAI API conventions. Save the gateway ID from gateway.spec.id in the response. This is the ID, not the name you chose:
You now have a gateway with an external endpoint, but no deployment behind it yet. You create the deployment in the next section. For the full set of gateway options, including path-based routing and custom authentication, see Create a gateway.

Create the deployment

The following command creates a single-replica Kimi K3 deployment using the engine configuration CoreWeave validated on GB300. Replace [DEPLOYMENT-NAME] with a name for the deployment, and [BUCKET-NAME] and [MODEL-PATH] with the bucket and prefix you staged the weights under.
The deployment name must be a valid hostname label: letters, digits, and hyphens only, starting and ending with a letter or digit, and no more than 63 characters. Dots aren’t allowed.

What the configuration does

The following table explains the settings that are specific to serving Kimi K3 on GB300. Rows without a leading -- are keys passed through --engine-config. The --engine-version value pins a specific runtime build. To see the versions available to your organization, run cwic inference deployment parameters or query the deployment parameters endpoint. For the full list of configuration keys the engine accepts, see Engine configuration options. Save the deployment ID, which the CoreWeave Intelligent CLI prints on success and the API returns in deployment.spec.id:
The deployment now exists and is attached to your gateway, but it can’t serve traffic until it finishes starting up.

Wait for the deployment to start

The deployment downloads the weights and starts the inference engine. Because Kimi K3 is a large model, expect this to take several minutes. CoreWeave allows up to an hour for the engine to become ready, so the following loop polls for the same period. Poll until the status reaches STATUS_READY:
The loop exits when the deployment becomes ready, fails, or reaches the one-hour timeout. If the deployment reports model path has no objects or that the bucket isn’t accessible, recheck the bucket policy, the bucket name, and the model path. If it reaches STATUS_ERROR while loading, check the engine logs as described in Observability. After the deployment is ready, retrieve the gateway endpoint from gateway.status.endpoints:
Save the endpoint, replacing [GATEWAY-ENDPOINT] with the value from the response:
The gateway’s DNS record and TLS certificate provision asynchronously and can take several minutes. If your first request fails with an SSL handshake or DNS resolution error, wait a few minutes and retry.

Send an inference request

The gateway exposes an OpenAI-compatible API. With body-based routing, set the model field to the deployment’s model name, moonshotai/Kimi-K3:
A successful response is an OpenAI-compatible chat completion, which confirms the gateway and deployment are working end to end. Beyond the standard fields, vLLM also returns engine-specific fields such as token_ids, prompt_logprobs, and kv_transfer_params. These are typically null for normal requests, so you can ignore them.
You can also use the Python openai client, replacing [GATEWAY-ENDPOINT] with your gateway endpoint and [API-TOKEN] with your API token:

Observability

Engine logs are where startup and runtime errors surface, including the weight-loading failures described in Wait for the deployment to start. Viewing them requires the Observability Viewer role in an IAM access policy. Without that role, the Grafana button in the Cloud Console is hidden. For the steps to open Grafana and run a log query, see View deployment logs. The default query returns logs for every deployment in your organization. To narrow it to this deployment, replace [DEPLOYMENT-ID] with the ID you saved earlier:
For request rate, latency, and GPU utilization, see View inference metrics.

Clean up

Delete the deployment before the gateway it’s attached to. First, delete the deployment:
Then delete the gateway:
After both commands succeed, no further charges accrue for the resources in this tutorial. The weights remain in your bucket, so if you no longer need them, delete them separately.

Next steps

To take this deployment further, see the following resources:
Last modified on August 19, 2026