From 68e701d038cbfbcd384f2299834d8cecca173b83 Mon Sep 17 00:00:00 2001 From: Federico Kamelhar Date: Fri, 18 Sep 2026 14:15:52 -0400 Subject: [PATCH 1/2] OCI: offer the H100, H200, L40S, A100-v2, B200, B300 and RTX PRO shapes `SUPPORTED_SHAPE_FAMILIES` in the OCI backend still listed only the GPU shapes that existed when Bare Metal support was added (#1325): GPU3, GPU4 and A10. Every newer NVIDIA shape from the gpuhunt catalog was filtered out by `_supported_instances`, so `dstack apply` could never select an OCI H100, H200, L40S, A100-v2, B200, B300 or RTX PRO 6000 instance even with quota in place. #2343 asked for H100 and was closed as not a priority; the only real blocker at the time, Fabric Manager in the OS images (#2348), was fixed in #2355, and the images now install the open kernel modules and Fabric Manager for the whole CUDA driver line. Add those families. They are all x86-64 hosts with NVIDIA GPUs, which is what the published `dstack-cuda-*` Marketplace images run. Two groups of GPU shapes from the catalog are intentionally still left out, with the reason recorded next to the list so it is not mistaken for an omission: * BM.GPU.MI300X.8 and BM.GPU.MI355X.8 (AMD Instinct): dstack publishes no ROCm image in OCI Marketplace, and `create_instance` picks the CUDA image for every GPU offer. * BM.GPU.GB200.4 and BM.GPU.GB300.4 (Grace superchips): arm64 hosts, and the OCI images are x86-64 only. Also document why `SUPPORTED_REGIONS` is a fixed set of seven regions: the Marketplace community listings that carry the dstack images are regional, and those are the regions they are published in (verified: the `dstack-cuda-0.14` listing is visible in us-chicago-1 and absent in ca-toronto-1). Widening the set requires publishing the images first. Note that the catalog side needs dstackai/gpuhunt to collect the newer shapes; without that, this change only affects H100, H200, L40S and A100-v2, which the catalog already carries. --- .../_internal/core/backends/oci/compute.py | 14 ++++ .../core/backends/oci/configurator.py | 4 +- .../core/backends/oci/test_compute.py | 66 +++++++++++++++++++ 3 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 src/tests/_internal/core/backends/oci/test_compute.py diff --git a/src/dstack/_internal/core/backends/oci/compute.py b/src/dstack/_internal/core/backends/oci/compute.py index ab9be4908b..f5f839771b 100644 --- a/src/dstack/_internal/core/backends/oci/compute.py +++ b/src/dstack/_internal/core/backends/oci/compute.py @@ -35,6 +35,13 @@ from dstack._internal.core.models.resources import Memory, Range from dstack._internal.core.models.runs import JobProvisioningData, Requirements +# Shape families that dstack's x86-64 OCI Marketplace images can run. GPU shapes are limited to +# NVIDIA GPUs on x86-64 hosts because the images ship CUDA drivers only. Other GPU shapes from +# the gpuhunt catalog are deliberately left out: +# - BM.GPU.MI300X.*, BM.GPU.MI355X.* (AMD Instinct): no ROCm image is published, and +# `create_instance` picks the CUDA image for any GPU offer. +# - BM.GPU.GB200.*, BM.GPU.GB300.* (Grace superchips): arm64 hosts, no arm64 image is published. +# See https://docs.oracle.com/en-us/iaas/Content/Compute/References/computeshapes.htm SUPPORTED_SHAPE_FAMILIES = [ "VM.Standard2.", "BM.Standard2.", @@ -48,6 +55,13 @@ "BM.GPU4.", "VM.GPU.A10.", "BM.GPU.A10.", + "BM.GPU.A100-v2.", + "BM.GPU.L40S.", + "BM.GPU.H100.", + "BM.GPU.H200.", + "BM.GPU.B200.", + "BM.GPU.B300.", + "BM.GPU.RTXPRO.", ] CONFIGURABLE_DISK_SIZE = Range[Memory](min=Memory.parse("50GB"), max=Memory.parse("32TB")) diff --git a/src/dstack/_internal/core/backends/oci/configurator.py b/src/dstack/_internal/core/backends/oci/configurator.py index 95696330e7..8fc6aa57c3 100644 --- a/src/dstack/_internal/core/backends/oci/configurator.py +++ b/src/dstack/_internal/core/backends/oci/configurator.py @@ -28,7 +28,9 @@ ) from dstack._internal.core.models.common import validate_extra_ignore, validate_json_extra_ignore -# where dstack images are published +# Regions where dstack publishes its VM images as OCI Marketplace community listings +# (see scripts/oci_image_tools.py). Listings are regional, so instances can only be launched +# in regions that have the images. Extend this set only together with publishing the images. SUPPORTED_REGIONS = frozenset( [ "eu-frankfurt-1", diff --git a/src/tests/_internal/core/backends/oci/test_compute.py b/src/tests/_internal/core/backends/oci/test_compute.py new file mode 100644 index 0000000000..51644c7c3b --- /dev/null +++ b/src/tests/_internal/core/backends/oci/test_compute.py @@ -0,0 +1,66 @@ +import pytest + +from dstack._internal.core.backends.oci.compute import _supported_instances +from dstack._internal.core.models.backends.base import BackendType +from dstack._internal.core.models.instances import ( + InstanceOffer, + InstanceType, + Resources, +) + + +def make_offer(shape_name: str) -> InstanceOffer: + return InstanceOffer( + backend=BackendType.OCI, + instance=InstanceType( + name=shape_name, + resources=Resources(cpus=8, memory_mib=64 * 1024, gpus=[], spot=False), + ), + region="us-chicago-1", + price=1.0, + ) + + +class TestSupportedInstances: + @pytest.mark.parametrize( + "shape_name", + [ + "VM.Standard2.1", + "BM.Standard.E5.192", + "VM.GPU3.1", + "BM.GPU4.8", + "VM.GPU.A10.1", + "BM.GPU.A10.4", + "BM.GPU.A100-v2.8", + "BM.GPU.L40S.4", + "BM.GPU.H100.8", + "BM.GPU.H200.8", + "BM.GPU.B200.8", + "BM.GPU.B300.8", + "BM.GPU.RTXPRO.8", + ], + ) + def test_supported(self, shape_name: str): + assert _supported_instances(make_offer(shape_name)) + + @pytest.mark.parametrize( + "shape_name", + [ + # Flex shapes need OCPU/memory configuration + "VM.Standard.E4.Flex", + "VM.Optimized3.Flex", + # Ampere A1 Arm CPUs and Grace superchips: no arm64 image + "VM.Standard.A1.Flex", + "BM.Standard.A1.160", + "BM.GPU.GB200.4", + "BM.GPU.GB300.4", + # AMD Instinct: no ROCm image + "BM.GPU.MI300X.8", + "BM.GPU.MI355X.8", + # Deprecated families + "BM.GPU2.2", + "VM.GPU2.1", + ], + ) + def test_unsupported(self, shape_name: str): + assert not _supported_instances(make_offer(shape_name)) From 1bf33cd1de7d855f4d058dca6e83379eba74d8e8 Mon Sep 17 00:00:00 2001 From: Federico Kamelhar Date: Wed, 23 Sep 2026 23:45:50 -0400 Subject: [PATCH 2/2] Leave the Blackwell shapes out until they are tested BM.GPU.B200.*, BM.GPU.B300.* and BM.GPU.RTXPRO.* are x86-64 NVIDIA hosts that the published images should run, and the images carry an R580 driver, which supports Blackwell. None of them has been run through dstack on real hardware though, so hold them back rather than advertise offers nobody has confirmed. The families that stay (A100-v2, L40S, H100, H200) are the ones the gpuhunt catalog already carries today. --- src/dstack/_internal/core/backends/oci/compute.py | 6 +++--- src/tests/_internal/core/backends/oci/test_compute.py | 7 ++++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/dstack/_internal/core/backends/oci/compute.py b/src/dstack/_internal/core/backends/oci/compute.py index f5f839771b..e08935c112 100644 --- a/src/dstack/_internal/core/backends/oci/compute.py +++ b/src/dstack/_internal/core/backends/oci/compute.py @@ -41,6 +41,9 @@ # - BM.GPU.MI300X.*, BM.GPU.MI355X.* (AMD Instinct): no ROCm image is published, and # `create_instance` picks the CUDA image for any GPU offer. # - BM.GPU.GB200.*, BM.GPU.GB300.* (Grace superchips): arm64 hosts, no arm64 image is published. +# - BM.GPU.B200.*, BM.GPU.B300.*, BM.GPU.RTXPRO.* (Blackwell): x86-64 NVIDIA hosts that the +# images should run, but they have not been tested on real hardware yet, so they are left +# out until someone with quota can confirm a run on them. # See https://docs.oracle.com/en-us/iaas/Content/Compute/References/computeshapes.htm SUPPORTED_SHAPE_FAMILIES = [ "VM.Standard2.", @@ -59,9 +62,6 @@ "BM.GPU.L40S.", "BM.GPU.H100.", "BM.GPU.H200.", - "BM.GPU.B200.", - "BM.GPU.B300.", - "BM.GPU.RTXPRO.", ] CONFIGURABLE_DISK_SIZE = Range[Memory](min=Memory.parse("50GB"), max=Memory.parse("32TB")) diff --git a/src/tests/_internal/core/backends/oci/test_compute.py b/src/tests/_internal/core/backends/oci/test_compute.py index 51644c7c3b..3ca12bcb0c 100644 --- a/src/tests/_internal/core/backends/oci/test_compute.py +++ b/src/tests/_internal/core/backends/oci/test_compute.py @@ -35,9 +35,6 @@ class TestSupportedInstances: "BM.GPU.L40S.4", "BM.GPU.H100.8", "BM.GPU.H200.8", - "BM.GPU.B200.8", - "BM.GPU.B300.8", - "BM.GPU.RTXPRO.8", ], ) def test_supported(self, shape_name: str): @@ -57,6 +54,10 @@ def test_supported(self, shape_name: str): # AMD Instinct: no ROCm image "BM.GPU.MI300X.8", "BM.GPU.MI355X.8", + # Blackwell: not tested on real hardware yet + "BM.GPU.B200.8", + "BM.GPU.B300.8", + "BM.GPU.RTXPRO.8", # Deprecated families "BM.GPU2.2", "VM.GPU2.1",