A single data-center GPU is often far more than one workload needs. A small inference model might use 8 GB of an 80 GB card, while the rest of the GPU, which you are paying for, sits idle. NVIDIA Multi-Instance GPU (MIG) solves that by partitioning one physical GPU into several smaller, fully isolated GPUs, each with its own dedicated compute, memory and memory bandwidth.
This tutorial shows you how to do it on a GPU dedicated server running Linux: check support, enable MIG mode, choose profiles, create instances, run containers on them, make the setup survive reboots, and monitor it. Every command comes from NVIDIA's MIG documentation and works the same on bare metal, which is why MIG is a natural fit for dedicated servers, where you control the driver and the host.
Short answer: enable MIG with sudo nvidia-smi -i 0 -mig 1, create instances with
sudo nvidia-smi mig -cgi <profiles> -C, then
point each workload at its own MIG device using the MIG-<UUID> shown by nvidia-smi -L. On Hopper and newer GPUs, MIG mode does
not persist across reboots, so automate it with NVIDIA's mig-parted tool.
Last updated October 2026 and checked against NVIDIA's Multi-Instance
GPU User Guide (revised September 2026). Profile names, driver minimums and
supported GPUs change with new hardware, so confirm them on your own server with
nvidia-smi mig -lgip.
What MIG is and why use it
Which GPUs support MIG
MIG vs time-slicing vs MPS
Before you start
Step 1: Confirm your GPU and driver
Step 2: Enable MIG mode
Step 3: Choose your MIG profiles
Step 4: Create GPU instances and compute instances
Step 5: Verify the MIG devices
Step 6: Run workloads on MIG devices
Step 7: Make your MIG layout persistent
Step 8: Monitor MIG devices
Step 9: Change or remove your MIG layout
MIG on Kubernetes and Slurm
Troubleshooting
When MIG is not the right tool
FAQ
MIG is a hardware feature of NVIDIA data-center GPUs, introduced with the Ampere generation. It divides one GPU into as many as seven independent GPU instances. Each instance gets its own streaming multiprocessors (SMs), its own slice of memory, and its own paths through the memory system. A job running in one instance cannot read another instance's memory, and a crash or memory overrun in one instance does not take down its neighbors.
That hardware-level isolation is what separates MIG from software sharing. It gives you predictable performance (quality of service) and clean separation between tenants, teams or services.
Common reasons to partition a GPU dedicated server this way:
Several small inference services on one card, each with guaranteed memory instead of fighting over it.
Multi-tenant setups, such as a hosting business, a research group or an internal platform team giving each user a dedicated slice.
Development, testing and CI, where many people need "a GPU" but nobody needs a whole one.
Higher utilization. Instead of one lightly loaded workload per GPU, you fill the card with right-sized workloads.
MIG needs administrator access to the host, because you enable it at the driver level. That is trivial on a dedicated server with root access, and usually not possible on shared or virtualized GPU services where the provider controls the hardware. If you are weighing server options, our GPU dedicated servers for AI workload-matching guide explains how to match GPU memory and compute to your workload.
MIG works only on GPUs starting with the NVIDIA Ampere generation (compute capability 8.0 or higher), and only on products NVIDIA lists as supported. According to NVIDIA's current documentation:
| GPU family | Examples | Maximum MIG instances |
|---|---|---|
| Ampere | A100 (40 GB and 80 GB), A30 | 7 (A100), 4 (A30) |
| Hopper | H100 (80 GB, 94 GB, 96 GB), H200 (141 GB), H20 | 7 |
| Blackwell, data center | B200 (180 GB), GB200 | 7 |
| Blackwell, workstation/server | RTX PRO 6000 Blackwell (96 GB), RTX PRO 5000 Blackwell (48 GB), RTX PRO 4500 Blackwell (32 GB) | 4 (RTX PRO 6000), 2 (RTX PRO 5000 and 4500) |
GeForce RTX cards and GPUs that are not on NVIDIA's supported list, as of this writing, cannot use MIG. If you plan to buy or rent hardware specifically for partitioning, compare options in our guides to B200 vs H100 dedicated servers and the NVIDIA RTX PRO 6000 Blackwell on dedicated servers.
MIG is one of several ways to share a GPU. Picking the right one depends on how much isolation you need.
| Feature | MIG | Time-slicing | CUDA MPS |
|---|---|---|---|
| How it shares | Hardware partitions with dedicated compute and memory | Processes take turns on the whole GPU | Cooperating processes run kernels concurrently |
| Memory isolation | Yes, per instance | No, memory is shared | Limited |
| Fault isolation | Yes | No | Limited |
| Predictable performance | Yes | No | Partial |
| Hardware support | Supported GPUs only | Most NVIDIA GPUs | Most NVIDIA GPUs |
| Flexibility | Fixed profile sizes | Any number of clients | Any number of cooperating clients |
| Best for | Multi-tenant or mixed workloads needing guarantees | Light, bursty or development use | Several processes from the same team or application |
MIG and MPS can also be combined: NVIDIA documents running one MPS server per MIG instance for workloads that benefit from it.
You need:
A dedicated server with a supported NVIDIA GPU from the table above.
Root or sudo access to the host.
A Linux distribution supported by CUDA. This guide uses Ubuntu Server 24.04 (see our Ubuntu Server overview if you are setting one up).
A recent NVIDIA data-center driver. NVIDIA recommends the latest. Documented minimums include R525 or later for A100/A30, R570 (570.133.20 or later) for B200, and R575 (575.51.03 or later) for RTX PRO 6000 and RTX PRO 5000 Blackwell.
For containers: Docker and the NVIDIA Container Toolkit (v2.5.0 or
later of the original nvidia-docker2 package, or any
current toolkit release).
No running GPU workloads or monitoring agents using the GPU at the moment you enable MIG, so the driver can apply the change cleanly.
If you have an RTX PRO 6000 or RTX PRO 5000 Blackwell workstation-class card, there are two extra requirements: the GPU's vBIOS must meet NVIDIA's minimum version, and for the Workstation and Max-Q Workstation editions the display mode must be switched from graphics to compute with NVIDIA's DisplayModeSelector tool before MIG can be enabled. On a single-card system that disables physical display output, so make sure you have SSH access first.
Check that the driver sees your GPU and shows the MIG mode state:
nvidia-smi
nvidia-smi --query-gpu=index,name,driver_version,mig.mode.current --format=csv
You should see your GPU model, a driver version that meets the minimum above, and Disabled in the MIG column. MIG is off by default.
If nvidia-smi is not found or reports no
devices, finish your driver and CUDA installation first. A step-by-step driver setup is
the first prerequisite for every other GPU tutorial.
Enable MIG on a specific GPU by index (here, GPU 0):
sudo nvidia-smi -i 0 -mig 1
A successful run prints Enabled MIG Mode for GPU .... Confirm it:
nvidia-smi -i 0 --query-gpu=pci.bus_id,mig.mode.current --format=csv
Omit -i to apply the change to every GPU
in the server. Behavior differs by GPU generation, and the difference matters later:
Hopper and newer (H100, H200, B200, RTX PRO Blackwell): enabling MIG does not require a GPU reset. However, MIG mode is not persistent across reboots. It lasts only while the driver's kernel modules stay loaded, so unloading and reloading the driver disables it.
Ampere (A100, A30): the driver attempts a GPU reset to apply the change, and MIG mode does persist across reboots. You must disable it explicitly to return the GPU to normal mode.
If the command warns that MIG mode is "in pending enable state" because the
GPU is in use by another client, stop whatever is using the GPU (CUDA jobs, monitoring
agents such as DCGM, or even another nvidia-smi
session), then retry. Rebooting also makes the change take effect.
A profile defines the size of a GPU instance. Names follow the
pattern Ng.Mgb, where N is the number of compute
slices and M is the memory in gigabytes. So 3g.40gb
means three compute slices and roughly 40 GB of memory.
List the profiles your GPU supports:
nvidia-smi mig -lgip
The output shows each profile's ID, how many instances you can create, its memory, and its SM count. To see how instances can physically be placed on the GPU, list the placements:
nvidia-smi mig -lgipp
For reference, the main profiles on an H100 80 GB look like this. Other GPUs
use different sizes, so always trust -lgip on your
own machine:
| Profile | Compute slices | Approx. memory | Max instances |
|---|---|---|---|
| 1g.10gb | 1 of 7 | 10 GB | 7 |
| 1g.20gb | 1 of 7 | 20 GB | 4 |
| 2g.20gb | 2 of 7 | 20 GB | 3 |
| 3g.40gb | 3 of 7 | 40 GB | 2 |
| 4g.40gb | 4 of 7 | 40 GB | 1 |
| 7g.80gb | 7 of 7 | 80 GB | 1 |
How to pick sizes. Memory is usually the limiting factor, so size by VRAM first:
A 7-billion-parameter model in 16-bit precision needs roughly 14 GB for the weights alone, before the KV cache and framework overhead. That does not fit a 10 GB slice, but a 4-bit quantized version of the same model typically does.
Leave headroom for context length, batch size and CUDA overhead. A slice that is exactly the size of your weights will run out of memory under real traffic.
Partition for the workloads you have, not an idealized layout. Common
layouts are two halves (3g.40gb × 2), seven small slices
(1g.10gb × 7), or a mix such as
4g.40gb + 2g.20gb + 1g.10gb.
Creating MIG devices takes two layers: GPU instances (GIs), which
carve out memory and SMs, and compute instances (CIs), which are the schedulable compute
inside a GI. The -C flag creates a default compute
instance for each GPU instance automatically.
You can name profiles by ID (for example 9), by short name (3g.40gb), or by full name (MIG 3g.40gb). Create two
equal halves on an H100 80 GB:
sudo nvidia-smi mig -cgi 3g.40gb,3g.40gb -C
Or seven small instances for lightweight inference:
sudo nvidia-smi mig -cgi 1g.10gb,1g.10gb,1g.10gb,1g.10gb,1g.10gb,1g.10gb,1g.10gb -C
Or a mixed layout:
sudo nvidia-smi mig -cgi 4g.40gb,2g.20gb,1g.10gb -C
Two practical notes from NVIDIA's documentation:
Order can matter for mixed layouts. If the driver cannot place a
profile it reports Insufficient Resources. Listing the largest
profile first avoids this, and on A100 40 GB the 3g.20gb profile must come first.
Enabling MIG mode is not enough. Without creating GPU instances and compute instances, CUDA workloads cannot run on the GPU at all.
List the MIG devices and their UUIDs:
nvidia-smi -L
You will see the parent GPU followed by one MIG ... Device N: (UUID: MIG-xxxxxxxx-...) line per
instance. Copy these UUIDs, because that is how you assign workloads.
To inspect the layers separately:
sudo nvidia-smi mig -lgi # GPU instances
sudo nvidia-smi mig -lci # compute instances
nvidia-smi # MIG devices table with per-instance memory
Directly on the host
Select a MIG device with the CUDA_VISIBLE_DEVICES environment variable, using the
MIG UUID:
CUDA_VISIBLE_DEVICES=MIG-<UUID-1> python inference_a.py &
CUDA_VISIBLE_DEVICES=MIG-<UUID-2> python inference_b.py &
Each process sees only its own slice and its own memory limit. A single CUDA process works with one MIG device, so you cannot combine slices into one larger device. If a job needs more memory or compute, choose a bigger profile instead.
In Docker containers
With the NVIDIA Container Toolkit installed, give each container its own MIG
device with the --gpus flag, using either the MIG
UUID or the GPUindex:MIGindex format:
# By UUID
sudo docker run --rm --gpus '"device=MIG-<UUID-1>"' \
nvidia/cuda:<tag>-base-ubuntu24.04 nvidia-smi -L
# By GPU index and MIG device index (GPU 0, MIG device 1)
sudo docker run --rm --gpus '"device=0:1"' \
nvidia/cuda:<tag>-base-ubuntu24.04 nvidia-smi -L
Replace <tag> with a current CUDA
image tag from Docker Hub. Inside each container, nvidia-smi -L lists exactly one MIG device. This is
the cleanest way to hand a dedicated slice to each tenant, team or service. For larger
container platforms, see our guide to dedicated servers as the foundation for Kubernetes
clusters.
This is the step most tutorials skip, and it is why a working MIG setup can seem to vanish after a reboot. Two separate things are involved:
The MIG devices themselves are never persistent. GPU instances and
compute instances you create with nvidia-smi mig are gone after a
reboot or GPU reset.
On Hopper and newer GPUs, MIG mode is also not persistent. On Ampere it is.
So after a reboot you must re-enable MIG mode (on Hopper+) and recreate the
layout. NVIDIA's recommended tool for this is MIG Partition Editor (mig-parted), which applies a declarative layout and
can run as a systemd service at startup.
A minimal configuration file looks like this:
version: v1
mig-configs:
all-disabled:
- devices: all
mig-enabled: false
two-halves:
- devices: all
mig-enabled: true
mig-devices:
"3g.40gb": 2
seven-small:
- devices: all
mig-enabled: true
mig-devices:
"1g.10gb": 7
Apply a named layout:
sudo nvidia-mig-parted apply -f config.yaml -c two-halves
Install mig-parted from NVIDIA's
repository at github.com/nvidia/mig-parted, and follow its README to run the layout as a
boot-time service. After a reboot, run nvidia-smi -L
and confirm the MIG devices are back before starting any workload.
Note that MIG UUIDs can change when instances are recreated. Scripts and
container definitions that hard-code a MIG-<UUID> need to look it up again, or use the
stable GPUindex:MIGindex form where it fits.
Plain nvidia-smi shows
per-instance memory and which process is running where, but it does not attribute GPU
utilization to individual MIG devices, and utilization often shows N/A. For real
per-instance metrics, NVIDIA recommends DCGM (Data Center GPU Manager) version 3 or
later.
A common production setup is DCGM exporting metrics to Prometheus, with Grafana dashboards per MIG instance, so you can see which tenant is saturating its slice. For tooling options and how GPU metrics fit into the rest of your server monitoring, see our overview of dedicated server management tools.
You can reconfigure MIG dynamically while the GPU stays in MIG mode, but only when no workload is using the instances you are changing. Stop jobs and containers first. Then destroy the compute instances, followed by the GPU instances:
sudo nvidia-smi mig -dci && sudo nvidia-smi mig -dgi
Create a new layout with Step 4, or return the GPU to normal operation:
sudo nvidia-smi -i 0 -mig 0
If you schedule workloads rather than assigning them by hand, MIG integrates with the common orchestrators:
Kubernetes: supported through the NVIDIA device plugin (v0.7.0 or later) and, in practice, the NVIDIA GPU Operator, which includes tooling to manage MIG layouts across nodes. Each MIG instance appears as a schedulable resource.
Slurm: version 21.08 and later can use MIG devices as generic resources.
Both are best set up after you have the single-server workflow in this guide working.
| Symptom | Likely cause | Fix |
|---|---|---|
| MIG mode is in pending enable state ... In use by another client | A process or agent holds the GPU | Stop CUDA jobs and GPU-using services such as DCGM, retry the command, or reboot |
| Insufficient Resources when creating instances | Requested profiles do not fit the placement rules | Check nvidia-smi mig -lgipp, list the
largest profile first, reduce the layout |
| MIG disabled after a reboot (Hopper, Blackwell) | MIG mode is not persistent on these GPUs | Re-enable at boot with mig-parted |
| No MIG devices after a reboot | GPU and compute instances are never persistent | Recreate the layout automatically at startup |
| CUDA app reports no device or uses the wrong GPU | Pointing at a GPU index instead of a MIG UUID, or compute instances were not created | Use CUDA_VISIBLE_DEVICES=MIG-<UUID>,
and confirm you used -C or created
CIs |
| GPU utilization shows N/A | nvidia-smi cannot attribute utilization to MIG devices | Use DCGM for per-instance metrics |
| Cannot enable MIG on RTX PRO workstation cards | Display mode is graphics, or vBIOS is below the minimum | Switch to compute mode with DisplayModeSelector and update the vBIOS |
| MIG enabled but pending inside a VM with passthrough (Ampere) | The hypervisor does not allow a GPU reset | Reboot the VM so MIG mode can take effect |
MIG is excellent for isolation, but it is not always the best choice:
Large training jobs that need the full GPU, all of its memory, or multi-GPU scaling over NVLink. Partitioning only gets in the way, and these jobs belong on whole GPUs.
Workloads that do not fit any profile. MIG offers fixed sizes, so odd-sized needs can waste a slice.
Graphics or non-CUDA workloads, since MIG is about partitioning compute for CUDA applications.
Unsupported GPUs, including GeForce cards. There, time-slicing or MPS are your options.
If you are still choosing hardware for AI work, our guide to choosing GPU dedicated servers for machine learning covers memory, bandwidth and workload fit in more depth.
NVIDIA Multi-Instance GPU (MIG) is a hardware feature that partitions one supported data-center GPU into up to seven isolated GPU instances. Each instance has dedicated compute, memory and bandwidth, so workloads sharing the card cannot interfere with one another.
NVIDIA's supported list includes the A100 and A30, the H100, H200 and H20, the B200 and GB200, and the RTX PRO 6000, 5000 and 4500 Blackwell cards. GeForce RTX cards are not supported.
Up to seven on A100, H100, H200 and B200, four on A30 and RTX PRO 6000 Blackwell, and two on RTX PRO 5000 and 4500 Blackwell. The real number depends on the profiles you choose.
The MIG devices you create never persist, so you
must recreate them after a reboot. MIG mode itself persists on Ampere GPUs but
not on Hopper and newer, so on those you re-enable it too. Use NVIDIA's mig-parted to automate both.
Yes. With the NVIDIA Container Toolkit, pass a
specific MIG device to a container with --gpus '"device=MIG-<UUID>"'. Kubernetes
supports MIG through the NVIDIA device plugin and GPU Operator.
No. A CUDA process works with a single MIG device. If one job needs more memory or compute, create a larger profile for it, or use the whole GPU.
For isolation, yes. MIG gives each workload its own memory and compute and contains faults, while time-slicing shares everything and offers no memory isolation. Time-slicing is more flexible and works on more GPUs, so it suits light or development workloads.
You need root access to the host and control of the NVIDIA driver, because MIG is enabled at the driver level. A dedicated GPU server gives you that. Shared or virtualized GPU services generally do not.
MIG turns one expensive GPU into several right-sized, isolated ones,
so each workload gets guaranteed memory and compute and your hardware stays busy. The
workflow is short: enable MIG mode, pick profiles, create GPU and compute instances,
assign each workload its own MIG-<UUID>, and
automate the layout with mig-parted so it survives
reboots.
Start with a simple layout, such as two halves or seven small slices, verify
it with nvidia-smi -L, and add DCGM monitoring
before you put real tenants on it. If you are planning a deployment, you can compare GPU
dedicated server options at COLO BIRD, where you get full root access to configure MIG,
containers and monitoring your way.
Last reviewed: October 2026. This tutorial is revisited when NVIDIA
changes MIG-supported GPUs, driver requirements or nvidia-smi mig behavior. For the full reference,
see NVIDIA's Multi-Instance GPU User Guide.